【乐企】有关乐企能力测试接口对接(详细)

news2024/9/21 2:32:21

1、申请密钥

在这里插入图片描述

2、验证本地服务器与乐企服务器的连通性

乐企服务器生产和测试域名均为:https://lqpt.chinatax.gov.cn:8443。开发者可以在“能力中心”查看基础公用能力详情,按照能力接入和开发指引完成接口对接,验证服务器连通性和证书配置正确性。

能力编码:能力是乐企平台提供某一具体业务的形式,某一具体能力由一个或多个相互关联的服务(接口)和调用规则组成,能力编码是乐企平台对某一具体能力的唯一识别编号,可在能力订阅请求页面和测试中心详情页查询:

服务编码:服务是构成乐企平台某一具体能力的接口,服务(接口)分为实时和异步,实时接口可实时返回请求所需数据,异步接口返回流水号或批次流水号,可在处理完成后调用对应查询接口获得所需数据,服务编码是乐企平台某一具体能力中的服务(接口)的唯一识别码,可在能力详情页面和测试中心详情页查询。

用例编码:用例是乐企能力订阅沙箱测试的场景及要求描述,用例编码是乐企平台某一具体能力用例的唯一识别码,可在测试中心详情页查询。用例编码在沙箱能力请求的报文头中,和沙箱环境测试标识配套,两者互斥使用,用例编码仅在乐企沙箱订阅测试使用。
在这里插入图片描述

接口开发背景:

是帮助别的公司搭建乐企平台,客户在申请乐企资质的时候 填写的ip是他们自己服务器的ip(内网ip)还需要使用VPN访问,这就给本地开发测试造成很大的麻烦,我们这边的解决思路是:在客户的内网环境的nginx配置代理:

location /leqi-api/ {

​ proxy_pass https://lqpt.chinatax.gov.cn:8843/

}

之后本地通过url进行请求,url对应的ip是客户的内网ip(但凡是公网ip都不用这么麻烦!)

3、后端代码

基础入参:

 @Data
public class BaseLeQiReq {
    private String url;
    /**
     * 能力编码
     */
    private String nlbm;
    /**
     * 服务编码
     */
    private String fwbm;
    /**
     * 用例编码
     */
    private String ylbm;
    /**
     * 接入单位id
     */
    private String jrdybm;
    /**
     * 使用单位id
     */
    private String sydwbm;

    /**
     * 请求参数(单个对象)
     */
    private JSONObject param;
    /**
     * 请求参数(数组)
     */
    private List<JSONObject> paramList;
}

基础出参

@Data
public class BaseLeQiResp {
    private ResponseData Response;

    @Data
    public static class ResponseData {
        private String RequestId;
        /**
         * 成功数据
         * returncode: "00"
         */
        private String Data;
        /**
         * 失败数据(存在Error节点标识失败)
         */
        private JSONObject Error;
    }
}

加密工具类(直接按照乐企平台给出的示例代码即可)


import org.apache.commons.lang3.ObjectUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.bouncycastle.util.encoders.Hex;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;


/**
 * User: yanjun.hou
 * Date: 2024/8/27 09:51
 * Description:
 */
public class SM4Util {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    private static final Charset ENCODING = StandardCharsets.UTF_8;
    public static final String ALGORITHM_NAME = "SM4";
    // 加密算法/分组加密模式/分组填充方式
    // PKCS5Padding-以8个字节为一组进行分组加密
    // 定义分组加密模式使用:PKCS5Padding
    public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";


    /**
     * 生成ECB暗号
     *
     * @param algorithmName 算法名称
     * @param mode          模式
     * @param key           密码
     * @explain ECB模式(电子密码本模式:Electronic codebook)
     */
    private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception {
        Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);
        Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);
        cipher.init(mode, sm4Key);
        return cipher;
    }

    /**
     * sm4加密
     *
     * @param hexKey   16进制密钥(忽略大小写)
     * @param paramStr 待加密字符串
     * @return 返回Base64后加密字符串
     * @explain 加密模式:ECB
     */
    public static String encryptEcb(String hexKey, String paramStr) throws Exception {
        // 16进制字符串-->byte[]
        byte[] keyData = ByteUtils.fromHexString(hexKey);
        // String-->byte[]
        byte[] srcData = paramStr.getBytes(ENCODING);
        // 加密后的数组
        byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData);
        // byte[]-->hexString
        String cipherText = Base64.getEncoder().encodeToString(cipherArray);
        return cipherText;
    }

    /**
     * 加密模式为ECB
     *
     * @param key  2进制密钥
     * @param data 2进制原文
     * @return 二进制密文
     */
    public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception {
        Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(data);
    }

    /**
     * sm4解密
     *
     * @param hexKey     16进制密钥
     * @param cipherText 16进制的加密字符串(忽略大小写)
     * @return 解密后的字符串
     * @explain 解密模式:采用ECB
     */
    @SuppressWarnings("UnnecessaryLocalVariable")
    public static String decryptEcb(String hexKey, String cipherText) throws Exception {
        // hexString-->byte[]
        byte[] keyData = ByteUtils.fromHexString(hexKey);
        // hexString-->byte[]
        byte[] cipherData = Base64.getDecoder().decode(cipherText);
        // 解密
        byte[] srcData = decrypt_Ecb_Padding(keyData, cipherData);
        // 接收解密后的字符串 byte[]-->String
        String decryptStr = new String(srcData, ENCODING);
        return decryptStr;
    }

    /**
     * sm4解密
     *
     * @param key        2进制密钥
     * @param cipherText 2进制密文
     * @return 解密后的2进制原文
     */
    public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception {
        Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key);
        return cipher.doFinal(cipherText);
    }
}

调用接口工具类


import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.leqi.domain.req.BaseLeQiReq;
import com.ruoyi.leqi.domain.resp.BaseLeQiResp;
import netscape.javascript.JSObject;
import org.apache.commons.lang3.ObjectUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;
import java.util.UUID;


/**
 * User: yanjun.hou
 * Date: 2024/8/27 09:59
 * Description:
 */
public class InvokeLeQiUtils {
    static Logger logger = LoggerFactory.getLogger(InvokeLeQiUtils.class);
    static String secret = "xxx";//乐企秘钥
    static String jrdwptbh = "xxx";//接入单位id
    static String sydwptbh = "xxx";//使用单位id
    static String ylbm = "911001";//用例编码
    static String nsrsbh = "xxx";//纳税人识别号
    static String reqUrl = "https://lqpt.chinatax.gov.cn:8443/access/sandbox/v2/invoke";//沙箱环境

    public static JSONObject invokeApi(BaseLeQiReq baseLeQiReq) {
        String nlbm = baseLeQiReq.getNlbm();
        String fubm = baseLeQiReq.getFwbm();
        if (ObjectUtils.isNotEmpty(baseLeQiReq.getUrl())) {
            reqUrl = baseLeQiReq.getUrl();
        }
        String url = String.format("%s/%s/%s", reqUrl, nlbm, fubm);
        if (reqUrl.contains("kzfw")) {//如果是控制服务,则不拼接能力编码
            url = String.format("%s/%s", reqUrl, fubm);
        }
        if (ObjectUtils.isNotEmpty(baseLeQiReq.getYlbm())) {
            ylbm = baseLeQiReq.getYlbm();
        }

        return invoke(url, baseLeQiReq, secret, jrdwptbh, sydwptbh, ylbm);
    }

    /**
     * 调用乐企接口
     *
     * @param url         接口地址
     * @param baseLeQiReq
     * @param key         密钥
     * @param jrdwptbh    接入单位ID
     * @param sydwptbh    使用单位ID
     * @param ylbm        用例编码
     * @return
     */
    private static JSONObject invoke(String url, BaseLeQiReq baseLeQiReq, String key, String jrdwptbh, String sydwptbh, String ylbm) {
        try {
            if (ObjectUtils.isNotEmpty(baseLeQiReq.getFwbm())) {
                switch (baseLeQiReq.getFwbm()) {
                    case "QDFPPLFM":
                        handlerParams(baseLeQiReq, jrdwptbh, sydwptbh);
                    case "XZTHSXED":
                        handlerParams(baseLeQiReq, jrdwptbh, sydwptbh);
                    default:
                }
            }
            String param = JSON.toJSONString(baseLeQiReq.getParam());
            //如果接口接收的参数是list 比如【数字化电子发票上传】接口
            if (ObjectUtils.isNotEmpty(baseLeQiReq.getParamList())) {
                param = JSON.toJSONString(baseLeQiReq.getParamList());
            }
            String encParam = SM4Util.encryptEcb(key, param);

            logger.info(String.format("InvokeLeQiUtils | invoke 请求乐企服务地址:%s ;请求乐企原始报文:%s ;请求乐企加密报文:%s ;", url, param, encParam));

            HttpRequest request = HttpRequest.post(url)
                    .header("Content-Type", "application/json;charset=UTF-8")
                    .header("fwbm", baseLeQiReq.getFwbm())//添加服务编码
                    .header("jrdwptbh", jrdwptbh)//添加接入平台编号
                    .header("sydwptbh", sydwptbh)//添加使用平台编号
                    .header("nlbm", baseLeQiReq.getNlbm())//添加能力编码
                    .header("ylbm", ylbm)//添加用例编码
                    .header("access_signature", "")// 添加访问签名
                    .header("sxcsbz", "") // 添加沙箱测试标志
                    .charset(StandardCharsets.UTF_8)
                    .timeout(90000);//超时,毫秒;
            if (ObjectUtils.isNotEmpty(encParam)) {
                request.body(encParam);
            }

            String encRes = request.execute().body();


            logger.info(String.format("InvokeLeQiUtils | invoke 请求乐企响应加密报文:%s ", encRes));


            JSONObject jsonObject = JSON.parseObject(encRes);
            if (ObjectUtils.isEmpty(jsonObject.getString("body"))) {
                return jsonObject;
            }
            if (!"200".equals(jsonObject.getString("httpStatusCode"))) {
                return jsonObject;
            }
            BaseLeQiResp resp = JSON.parseObject(jsonObject.getString("body"), BaseLeQiResp.class);
            if (ObjectUtils.isEmpty(resp.getResponse()) || ObjectUtils.isEmpty(resp.getResponse().getData())) {
                return JSONObject.parseObject(JSON.toJSONString(resp));
            }

            String decRes = SM4Util.decryptEcb(key, resp.getResponse().getData());

            logger.info(String.format("InvokeLeQiUtils | invoke 请求乐企响应解密报文:%s ;", decRes));

            return JSON.parseObject(decRes);
        } catch (Exception e) {
            logger.error(String.format("InvokeLeQiUtils | invoke 请求乐企接口异常,异常信息:%s ", e));
            throw new RuntimeException(e);
        }
    }

    /**
     * 处理参数缺失,按照规则提供默认值
     * @param baseLeQiReq
     * @param jrdwptbh
     * @param sydwptbh
     */
    private static void handlerParams(BaseLeQiReq baseLeQiReq, String jrdwptbh, String sydwptbh) {
        if (ObjectUtils.isNotEmpty(baseLeQiReq.getParam())) {
            JSONObject param = baseLeQiReq.getParam();
            if (ObjectUtils.isEmpty(param.getString("ywlsh"))) {
                param.put("ywlsh", sydwptbh + jrdwptbh + UUID.randomUUID().toString().replaceAll("-", ""));
            }
        }
    }

}

4、接口调用

示例图

在这里插入图片描述

说明:其中参数中的【url】使用的是对应在乐企申请资质的时候报备的ip 由于我们这边的特殊性质(内网+不是自己服务器ip)所以加了这个url进行转发,实际情况看自己使用(我代码里有判断,如果参数存在url则按照url请求,否则按照税局的沙箱环境地址请求);

响应参数:我这边只取了乐企接口返回的body解密的数据

首先调用【开票控制服务】的几个接口

1、获取数字化电子发票批量预赋码信息

{
	"nlbm": "202007",
	"fwbm": "QDFPPLFM",
	"param": {
		"nsrsbh": "x x x x",
		"lysl": "5000",
		"ywlsh": ""
	},
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

2、查询授信额度

{
    "nlbm": "202007",
    "fwbm": "CXSXED",
    "param": {
        "nsrsbh": "x x x x"
    },
    "url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

3、下载或退回授信额度

{
	"nlbm": "202007",
	"fwbm": "XZTHSXED",
	"param": {
		"nsrsbh": "x x x x",
		"ptbh": "x x x x",
		"sqlx": "0",
		"sqed": "1100.00",
		"ywlsh": ""
	},
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

4、调整授信额度有效期

{
	"nlbm": "202007",
	"fwbm": "TZSXEDYXQ",
	"param": {
		"xsfnsrsbh": "x x x x",
		"sxedsq": "2024-08"
	},
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

5、查询纳税人风险信息

{
    "nlbm": "202007",
    "fwbm": "CXNSRFXXX",
    "param": {
        "nsrsbh": "x x x x"
    },
    "url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

6、查询纳税人基本信息

{
    "nlbm": "202007",
    "fwbm": "CXNSRJBXX",
    "param": {
        "nsrsbh": "x x x x"
    },
    "url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

7、查询可用税率信息

{
	"nlbm": "202007",
	"fwbm": "CXKYSL",
	"param": {},
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

8、查询税收分类编码信息

{
	"nlbm": "202007",
	"fwbm": "CXSSFLBM",
	"param": {
		"nsrsbh": "x x x x",
		"sjc": "",
		"sjswjgdm": "14200000000"
	},
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

9、查询数字化电子红字确认单列表信息

{
	"nlbm": "202007",
	"fwbm": "CXQDHZQRDLB",
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke",
	"param": {
		"yhjslx": "0",
		"xsfnsrsbh": "x x x x",
		"xsfmc": "****集团有限责任公司",
		"gmfnsrsbh": "",
		"gmfmc": "",
		"lrfsf": "0",
		"lrrqq": "2024-01-01",
		"lrrqz": "2024-09-01",
		"lzfpdm": "",
		"lzfphm": "",
		"hzfpxxqrdbh": "",
		"hzqrxxztDm": "",
		"fppzDm": "",
		"pageNumber": "1",
		"pageSize": "10"
	}
}

10、查询数字化电子红字确认单明细信息

{
	"nlbm": "202007",
	"fwbm": "CXQDHZQRDMX",
	"param": {
		"uuid": "321312312312312 ",
		"xsfnsrsbh": "x x x x"
	}
}

11、数字化电子发票上传

{
	"nlbm": "202007",
	"fwbm": "QDFPSC",
	"paramList": [
		{
			"fphm": "24997000006472271411",//对应【获取数字化电子发票批量预赋码信息】起始号段 【开始>=该值<=结束】都可以 
			"lzfpbz": "0",
			"ptbh": "x x x x",
			"fppz": "02",
			"gmfzrrbz": "N",
			"tdys": "",
			"qyDm": "420600000000",
			"cezslxDm": "",
			"sgfplxDm": "",
			"ckywsyzcDm": "",
			"zzsjzjtDm": "",
			"xsfnsrsbh": "x x x x",
			"xsfmc": "***有限责任公司",
			"xsfdz": "",
			"xsfdh": "",
			"xsfkhh": "",
			"xsfzh": "",
			"gmfnsrsbh": "9******372095",//对应[税控蓝票初始化的购方税号]
			"gmfmc": "北京***科技有限公司",
			"gmfdz": "",
			"gmfdh": "",
			"gmfkhh": "",
			"gmfzh": "",
			"gmfjbr": "",
			"jbrsfzjhm": "",
			"gmfjbrlxdh": "",
			"hjje": 100,
			"hjse": 13,
			"jshj": 113,
			"skyhmc": "",
			"skyhzh": "",
			"jsfs": "",
			"ysxwfsd": "",
			"kpr": "张三",
			"kprzjhm": "412725****57***",
			"kprzjlx": "201",
			"dylzfphm": "",
			"hzqrxxdbh": "",
			"hzqrduuid": "",
			"bz": "备注",
			"ip": "报备乐企对应ip",
			"macdz": "20-16-1E-00-02-12",
			"cpuid": "",
			"zbxlh": "",
			"kprq": "2024-08-28 11:11:11",
			"sfzsxsfyhzhbq": "",
			"sfzsgmfyhzhbq": "",
			"skrxm": "",
			"fhrxm": "",
			"fpmxList": [
				{
					"mxxh": "1",
					"dylzfpmxxh": "",
					"hwhyslwfwmc": "*信息技术服务*技术服务费",
					"spfwjc": "信息技术服务",
					"xmmc": "技术服务费",
					"ggxh": "",
					"dw": "",
					"sl": "1",
					"dj": "100",
					"je": 100,
					"slv": 0.13,
					"se": 13,
					"hsje": 113,
					"kce": "",
					"sphfwssflhbbm": "3040201010000000000",
					"fphxz": "00",
					"yhzcbs": ""
				}
			],
			"fjysList": [
				{
					"fjysmc": "",
					"fjyslx": "",
					"fjysz": ""
				}
			]
		}
	],
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

12、查询数字化电子发票上传结果

{
	"nlbm": "202007",
	"fwbm": "CXQDFPSCJG",
	"param": {
		"sllsh": "902aedfe8dc141928b170bf3fd8bd0fd"
	},
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

13、数字化电子红字确认单申请

{
	"nlbm": "202007",
	"fwbm": "QDHZQRDSQ",
	"param": {
		"lrfsf": "0",
		"xsfnsrsbh": "x x x x",
		"xsfmc": "****集团有限责任公司",
		"gmfnsrsbh": "91990****372095",
		"gmfmc": "北京**科技有限公司",
		"lzfpdm": "",
		"lzfphm": "24997000006472271411",
		"sfzzfpbz": "N",
		"lzkprq": "2024-08-28 11:11:11",
		"lzhjje": "113.00",
		"lzhjse": "13.00",
		"lzfppzDm": "01",
		"lzfpTdyslxDm": "",
		"hzcxje": "-100.00",
		"hzcxse": "-13.00",
		"chyyDm": "01",
		"hzqrdmxList": [
			{
				"lzmxxh": "1",
				"xh": "1",
				"sphfwssflhbbm": "3040201010000000000",
				"hwhyslwfwmc": "*信息技术服务*技术开发费",
				"spfwjc": "信息技术服务",
				"xmmc": "技术开发费",
				"ggxh": "",
				"dw": "",
				"fpspdj": "",
				"fpspsl": "",
				"je": "100.00",
				"sl1": "0.13",
				"se": "13"
			}
		]
	},
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

14、数字化电子红字确认单确认

{
	"nlbm": "202007",
	"fwbm": "QDHZQRDQR",
	"param": {
		"xsfnsrsbh": "x x x x",
		"uuid": "9d1c747182d043b892bcf9e4816b7cfe",
		"hzqrdbh": "99000024088000309024",
		"qrlx": "C"
	},
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

15、上传发票汇总确认信息

{
	"nlbm": "202007",
	"fwbm": "SCFPHZQRXX",
	"param": {
		"xsfnsrsbh": "x x x x",
		"xsfsjswjgdm": "14200000000",
		"ywlx": "0",
		"ptbh": "x x x x",
		"yf": "2024-08",
		"lzfpsl": "0",
		"lzfpje": "0.00",
		"lzfpse": "0.00",
		"hzfpsl": "0",
		"hzfpje": "0.00",
		"hzfpse": "0.00"
	},
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

16、查询发票汇总确认信息

{
	"nlbm": "202007",
	"fwbm": "CXFPHZQRXX",
	"param": {
		"xsfnsrsbh": "x x x x",
		"xsfsjswjgdm": "14200000000",
		"ptbh": "x x x x",
		"yf": "2024-08"
	},
	"url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

17、查询差额征税编码

{
  "nlbm": "202007",
  "fwbm": "CXCEZSBM",
  "param": {},
  "url": "http://报备乐企对应ip端口/leqi-api/access/sandbox/v2/invoke"
}

5、最后测试效果图

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2082311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

给一个web网站,如何开展测试?

前言 Web测试是指针对Web应用程序(网站或基于Web的系统)进行的测试活动&#xff0c;以确保其质量、性能、安全性、可用性和兼容性等方面符合预期标准。Web测试涵盖了从前端用户界面(UI)到后端逻辑和数据库的各个方面&#xff0c;确保Web应用程序在不同环境和条件下都能正常运行…

参会投稿 | 第三届先进传感与智能制造国际学术会议(ASIM 2024)

第三届先进传感与智能制造国际会议&#xff08;The 3rd International Conference on Advanced Sensing, Intelligent Manufacturing&#xff09;&#xff0c;由江汉大学、西安交通大学和山东大学主办&#xff0c;由江西省机械工程学会、东华理工大学机械与电子工程学院等联合协…

Hibernate 批量插入速度慢的原因和解决方法

由于业务需要一次性连续写入超过10k条以上的新数据&#xff0c;当对象超过10个成员变量以后&#xff0c;整个写入过程居然需要长达35秒&#xff0c;这个速度是不能接受的&#xff0c;故此研究了一下怎么开启Hibernate批量写入的功能。 我这边使用的是Hibernate 5.6.15 在网上…

推动光模块技术发展:从400G、800G到1.6T

随着数据通信领域的持续发展&#xff0c;对于更快、更高传输速率的需求也在不断增长。作为现代数据传输的基石&#xff0c;光模块技术不断进步以满足这一需求。其中一项重大进展是网络速率从400G提升到800G&#xff0c;并将向1.6T继续发展。让我们深入探讨这些技术的演变&#…

Java语言程序设计基础篇_编程练习题***17.9 (地址簿)

目录 题目&#xff1a;***17.9 (地址簿) 习题思路 代码示例 结果展示 题目&#xff1a;***17.9 (地址簿) 编写程序用于存储、返回、增加&#xff0c;以及更新如图 17-20 所示的地址薄。使用固定长度的字符串来存储地址中的每个属性。使用随机访问文件来读取和写人一个地址…

刚刚认证!网络主播成为国家新职业,易播易赚打造打造职业入门全新模式

近期&#xff0c;人力资源和社会保障部会同国家市场监督管理总局、国家统计局日前增设网络主播为国家新职业&#xff0c;这标志着网络主播的职业身份在“国家确定职业分类”上首次得以确立。 据人社部此前印发的《关于加强新职业培训工作的通知》表示&#xff0c;新职业从业者可…

代码随想录算法训练营第二十三天| 39. 组合总和 40.组合总和II 131.分割回文串

目录 一、LeetCode 39. 组合总和思路&#xff1a;C代码 二、LeetCode 40.组合总和II思路C代码 三、LeetCode 131.分割回文串思路C代码 总结 一、LeetCode 39. 组合总和 题目链接&#xff1a;LeetCode 39. 组合总和 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学…

直播平台直播API集成之快手篇

前言: 本篇我们来介绍如何使用快手 的直播API创建直播。 准备工作: 1、你首先得有个快手账号; 2、创建快手应用,填写应用审核信息,等待应用创建审核通过,应用成功创建后在开发与上线前还要提前做好API权限申请,如果你只需要获取用户基本信息,以及得到直播API的访问权限…

Python | Leetcode Python题解之第377题组合总和IV

题目&#xff1a; 题解&#xff1a; class Solution:def combinationSum4(self, nums: List[int], target: int) -> int:dp [1] [0] * targetfor i in range(1, target 1):for num in nums:if num < i:dp[i] dp[i - num]return dp[target]

合宙LuatOS产品规格书——Air700EMQ

Air700EMQ是合宙通信的LTE Cat.1bis通信模块&#xff0c; 依托移芯EC716E平台&#xff0c;支持先进的LTE 3GPP Rel.13技术。 主要特点如下&#xff1a; 1. 技术平台与标准支持&#xff1a; Air700EMQ采用移芯EC716E平台&#xff0c;基于先进的LTE技术。支持LTE 3GPP Releas…

leetcode234. 回文链表(java实现)

题目描述&#xff1a; 本道题的思路可以使用集合先存储链表的值&#xff0c;然后进行判断即可。 总体思路比较简单。 代码实现&#xff1a; class Solution {public boolean isPalindrome(ListNode head) {List<Integer> res new ArrayList();ListNode cur head;whil…

3分钟快速本地搭建RSShub服务器并结合内网穿透实现无公网IP远程访问

文章目录 前言1. Docker 安装2. Docker 部署Rsshub3. 本地访问Rsshub4. Linux安装Cpolar5. 配置公网地址6. 远程访问Rsshub7. 固定Cpolar公网地址8. 固定地址访问 前言 今天和大家分享的是如何在本地快速简单部署Rsshub工具&#xff0c;并结合cpolar内网穿透工具使用公网地址远…

Remote Sensing(MDPI)期刊投稿历程(CV方向)

一、期刊简介 期刊官网&#xff1a;https://www.mdpi.com/journal/remotesensing 影响因子&#xff08;2024&#xff09;&#xff1a;4.2 分区&#xff1a;JCR:Q1。中科院二区 版面费&#xff1a;2700瑞士法郎&#xff08;约21000rmb&#xff09; 二、投稿时间线 2024.06.20…

科研绘图系列:R语言对角线矩阵图(corrplot plot)

介绍 对角线矩阵图(Diagonal Matrix Plot)是一种特殊类型的图表,用于可视化对角线矩阵中的元素。对角线矩阵是一种方阵,其中非对角线上的元素都是零,而对角线上的元素可以是任意值。这种矩阵在数学和计算机科学中非常有用,尤其是在线性代数、特征值问题和对角化等操作中…

C语言中的野指针

野指针是指指针指向的位置是随机的&#xff0c;不明确的&#xff0c;未知的&#xff0c;没有限制的。 野指针的成因 指针未初始化 如上图&#xff0c;指针没有初始化&#xff0c;则指针指向的地址是随机的&#xff0c;若该地址已经被其他程序占用&#xff0c;且对指针进行解引…

C++入门基础(内容太干,噎住了)

文章目录 1.缺省参数 2.函数重载 2.1重载条件&#xff1a; 1.参数类型不同 2.参数个数不同 3.参数类型顺序不同 2.2不做重载条件情况&#xff1a; 1.返回值相同时 2.当全缺省遇见无参数 3.引用 3.1引用特性&#xff1a; 3.2引用的使用 1.缺省参数 1.缺省参数是声明…

中庸就是五五开,各打五十大板吗

中庸指的是&#xff0c;人生行事应该把握一个度&#xff0c;既不过分&#xff0c;也无不及&#xff0c;以中为贵&#xff0c;以和为美。 中庸关键在于“中”&#xff0c;要求适中适度、恰如其分。 《论语•先进》中提到&#xff0c;有一次&#xff0c;子路问孔子&#xff0c;…

Springboot中使用Elasticsearch(部署+使用+讲解 最完整)

Elasticsearch&#xff1a;用于数据存储、计算和搜索 Mysql&#xff1a;擅长事务类型操作&#xff0c;可以确保数据的安全和一致性 Elasticsearch&#xff1a;擅长海量数据的搜索、分析、计算 基于这个特点我打算改造用户方面的功能&#xff0c;基于用户量比较多&#xff0c;…

电影《名侦探柯南:百万美元的五棱星》 观后感

上周看了电影《名侦探柯南&#xff1a;百万美元的五棱星》,个人觉得这可能是相对于柯南系列的重度粉丝来说是相当不错的&#xff0c;对于自己这个外行的人来说&#xff0c;可能有些故事背景并不了解&#xff0c;以及里边出场的人物并不熟悉&#xff0c;整体看下来觉得算是中规中…

复习Vue笔记

笔记来源于黑马程序员相关上课笔记 基于脚手架创建前端工程 环境要求 node.js&#xff1a;前端项目的运行环境&#xff08;相当于Java的运行环境JDK&#xff09; npm&#xff1a;JS的包管理工具/器 npm腾讯镜像&#xff1a;npm config set registry http://mirrors.cloud.te…