SpringBoot使用菜鸟物流云打印电子面单

article/2025/9/18 16:43:52

菜鸟物流云属于淘宝开放平台的一部分,淘宝开发平台提供了很多种对接接口,包括商品、销售单等等,几乎涉及到的业务都在该平台上开放了接口。
淘宝开放平台提供了两种快递面单接口,一种是淘宝商家TOP接口,一种是菜鸟物流云Link接口。这里主要是LINK,具体介绍请查看淘宝开发平台的文档:

文章目录

  • 前期准备
  • 一、jar
  • 二、工具类
      • 1.可根据需要再整理
      • 2. controller
      • 3. 订单展示页面
  • 三 、 END

前期准备

先贴一下API链接 电子面单接入口
下面是主要用到的
在这里插入图片描述

“电子面单业务基本介绍”—可查看各个公司的cpCode
先按照“ISV软件商接入”流程走一遍,然后主要用到的API都在“电子面单LINK接口总览”

一、jar

在“ISV软件商接入”中1.9.1 物流云SDK下载,直接复制到浏览器地址栏打开即可下载

二、工具类

1.可根据需要再整理

import com.google.common.collect.Maps;
import com.taobao.pac.sdk.cp.PacClient;
import com.taobao.pac.sdk.cp.SendSysParams;
import com.taobao.pac.sdk.cp.dataobject.request.CLOUDPRINT_STANDARD_TEMPLATES.CloudprintStandardTemplatesRequest;
import com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_DISCARD.TmsWaybillDiscardRequest;
import com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_GET.*;
import com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_SUBSCRIPTION_QUERY.TmsWaybillSubscriptionQueryRequest;
import com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_UPDATE.Recipient;
import com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_UPDATE.TmsWaybillUpdateRequest;
import com.taobao.pac.sdk.cp.dataobject.response.CLOUDPRINT_STANDARD_TEMPLATES.CloudprintStandardTemplatesResponse;
import com.taobao.pac.sdk.cp.dataobject.response.CLOUDPRINT_STANDARD_TEMPLATES.StandardTemplateResult;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_DISCARD.TmsWaybillDiscardResponse;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_GET.TmsWaybillGetResponse;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_GET.WaybillCloudPrintResponse;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_SUBSCRIPTION_QUERY.AddressDto;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_SUBSCRIPTION_QUERY.TmsWaybillSubscriptionQueryResponse;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_SUBSCRIPTION_QUERY.WaybillApplySubscriptionInfo;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_SUBSCRIPTION_QUERY.WaybillBranchAccount;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_UPDATE.TmsWaybillUpdateResponse;
import com.wr.business.entity.Order;
import com.wr.business.entity.Sender;
import lombok.extern.log4j.Log4j2;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;/*** @Author: 可乐伢* @Date: 2021-4-12 19:59*/
@Log4j2
public class WaybillUtils {/*** 线上环境请求url*/private final static String ONLINE_URL = "http://link.cainiao.com/gateway/link.do";/*** 线上环境appKey,物流云控制台查看*/private final static String ONLINE_APP_KEY = "";/*** 线上环境secretKey,物流云控制台查看*/private final static String ONLINE_SECRET_KEY = "";/*** 线上环境token,token是商家在物流云平台授权ISV后生成的授权码,目前需要商家配置在ISV的软件中*/private final static String ONLINE_TOKEN = "";/*** 查询电子面单订购关系以及账户情况 获取发货地址* @return*/public static AddressDto waybillSubscriptionQuery(){PacClient client = new PacClient(ONLINE_APP_KEY, ONLINE_SECRET_KEY, ONLINE_URL);SendSysParams params = new SendSysParams();params.setFromCode(ONLINE_TOKEN);TmsWaybillSubscriptionQueryRequest request = new TmsWaybillSubscriptionQueryRequest();TmsWaybillSubscriptionQueryResponse tmsWaybillSubscriptionQueryResponse = client.send(request, params);if(!tmsWaybillSubscriptionQueryResponse.isSuccess()){log.info("errorCode:" + tmsWaybillSubscriptionQueryResponse.getErrorCode() + "errorMessage:" + tmsWaybillSubscriptionQueryResponse.getErrorMsg());return null;}List<WaybillApplySubscriptionInfo> wasiList=tmsWaybillSubscriptionQueryResponse.getWaybillApplySubscriptionCols();log.info(wasiList);List<WaybillBranchAccount> wbaList;if(null!=wasiList&&wasiList.size()>0){wbaList=wasiList.get(0).getBranchAccountCols();if(null!=wbaList&&wbaList.size()>0){if(null!=wbaList.get(0).getShippAddressCols()&&wbaList.get(0).getShippAddressCols().size()>0){return wbaList.get(0).getShippAddressCols().get(0);}}}return null;}/*** 设置发件人信息* @param addressDto* @return*/public static UserInfoDto setSender(Sender sender,AddressDto addressDto){//根据业务设置一个默认的发件人姓名String name=sender!=null?sender.getSenderName():"xxx";//发件人信息UserInfoDto senderInfo = new UserInfoDto();//发件人姓名senderInfo.setName(name);//发件人固定电话senderInfo.setPhone(sender.getMobile());//发件人手机号senderInfo.setMobile(sender.getMobile());//寄件地址,这里的地址需要是卖家订购电子面单服务时使用的订购地址,具体可以通过TMS_WAYBILL_SUBSCRIPTION_QUERY接口获取com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_GET.AddressDtosendAddress = new com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_GET.AddressDto();sendAddress.setProvince(addressDto.getProvince());sendAddress.setCity(addressDto.getCity());sendAddress.setDistrict(addressDto.getDistrict());sendAddress.setTown(addressDto.getTown());sendAddress.setDetail(addressDto.getDetail());senderInfo.setAddress(sendAddress);return senderInfo;}/*** 设置订单信息* @param objectId 请求id(与参数传入时相同)* @param templateUrl* @param orderCodes* @param items* @param receiver* @return*/public static  List<TradeOrderInfoDto> setOrderList(String objectId, String templateUrl,List<String> orderCodes, List<Item> items,UserInfoDto receiver){//收件信息ArrayList<TradeOrderInfoDto> tradeOrderInfoDtos = new ArrayList<TradeOrderInfoDto>();TradeOrderInfoDto tradeOrderInfoDto = new TradeOrderInfoDto();tradeOrderInfoDto.setObjectId(objectId);//打印模板的url,参见白皮书tradeOrderInfoDto.setTemplateUrl(templateUrl);//设置订单OrderInfoDto orderInfoDto = new OrderInfoDto();orderInfoDto.setOrderChannelsType("OTHERS");orderInfoDto.setTradeOrderList(orderCodes);tradeOrderInfoDto.setOrderInfo(orderInfoDto);//设置包裹PackageInfoDto packageInfoDto = new PackageInfoDto();packageInfoDto.setItems(items);tradeOrderInfoDto.setPackageInfo(packageInfoDto);//设置收货人tradeOrderInfoDto.setRecipient(receiver);tradeOrderInfoDtos.add(tradeOrderInfoDto);return tradeOrderInfoDtos;}/*** 获取打印模板* 韵达快递标准模板 http://cloudprint.cainiao.com/template/standard/401/193* 韵达快递标准三联模板 http://cloudprint.cainiao.com/template/standard/76303/59* 韵达快递便携式模板 http://cloudprint.cainiao.com/template/standard/278831/12* 韵达快递标准模板(蓝牙版) http://cloudprint.cainiao.com/template/standard/285424/5* 韵达便携式(高度160) http://cloudprint.cainiao.com/template/standard/288357/2* 韵达快递一联单 http://cloudprint.cainiao.com/template/standard/288658/17* 韵达蓝牙一联单 http://cloudprint.cainiao.com/template/standard/300202/10* @param cpCode 配送公司编码* @return*/public static List<StandardTemplateResult> getTemplates(String cpCode){List<StandardTemplateResult> templateResults=new ArrayList<>();PacClient client = new PacClient(ONLINE_APP_KEY, ONLINE_SECRET_KEY, ONLINE_URL);//关闭日志打印client.getLogger().setLogEnable(false);SendSysParams params = new SendSysParams();params.setFromCode(ONLINE_TOKEN);CloudprintStandardTemplatesRequest request = new CloudprintStandardTemplatesRequest();//TmsWaybillSubscriptionQueryRequest request1 = new TmsWaybillSubscriptionQueryRequest();//配送公司编码request.setCpCode(cpCode);//TmsWaybillSubscriptionQueryResponse tmsWaybillSubscriptionQueryResponse = client.send(request, params);CloudprintStandardTemplatesResponse response = client.send(request, params);if (!response.isSuccess()) {log.info("errorCode:" + response.getErrorCode() + "errorMessage:"+ response.getErrorMsg());return templateResults;}return response.getData();}/***通过物流云获取电子面单* @return*/public static Map<String,Object> getWaybill(Sender sender, Order order){PacClient client = new PacClient(ONLINE_APP_KEY, ONLINE_SECRET_KEY, ONLINE_URL);SendSysParams params = new SendSysParams();params.setFromCode(ONLINE_TOKEN);TmsWaybillGetRequest request = new TmsWaybillGetRequest();//配送公司编码request.setCpCode("");com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_SUBSCRIPTION_QUERY.AddressDtoaddressDto=waybillSubscriptionQuery();UserInfoDto senderInto=setSender(sender,addressDto);request.setSender(senderInto);String objectId = UUID.randomUUID().toString().replaceAll("-","");//根据cpCode查询模板List<StandardTemplateResult> templateResults=getTemplates("");log.info("**************templateResults--begin******************");for(int i=0;i<templateResults.get(0).getStandardTemplateDOs().size();i++){log.info(templateResults.get(0).getStandardTemplateDOs().get(i));}log.info("**************templateResults--end******************");String templateUrl="http://cloudprint.cainiao.com/template/standard/288658/17";if(null!=templateResults&&templateResults.size()>0){if(null!=templateResults.get(0).getStandardTemplateDOs()&&templateResults.get(0).getStandardTemplateDOs().size()>0){String templateName=templateResults.get(0).getStandardTemplateDOs().get(0).getStandardTemplateName();//这里只能根据templateName来匹配自己业务需求的模板,可多试几次,这里用韵达的为例if("韵达快递一联单".equals(templateName)){templateUrl =templateResults.get(0).getStandardTemplateDOs().get(0).getStandardTemplateUrl();}}}List<String> orderCodes=new ArrayList<>();//订单列表,这里的场景是一个订单获取一个面单号orderCodes.add(order.getOrderNo());List<Item> items=new ArrayList<>();Item item = new Item();//设置一个商品的名字item.setName("");if(null!=order.getProduct()){item.setName(order.getProduct().getProName());}item.setCount(1);items.add(item);UserInfoDto receiver = new UserInfoDto();receiver.setName(order.getConsignee());receiver.setMobile(order.getConsigneePhone());com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_GET.AddressDto receiveAddress =new com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_GET.AddressDto();receiver.setAddress(receiveAddress);receiveAddress.setProvince(order.getProvince());receiveAddress.setCity(order.getCity());receiveAddress.setDistrict(order.getDistrict());receiveAddress.setDetail(order.getAddress());List<TradeOrderInfoDto> tradeOrderInfoDtos=setOrderList(objectId,templateUrl,orderCodes,items,receiver);request.setTradeOrderInfoDtos(tradeOrderInfoDtos);TmsWaybillGetResponse response = client.send(request, params);Map<String,Object> map= Maps.newHashMap();map.put("code","FAIL");map.put("message","");map.put("waybillResponse",null);if(!response.isSuccess()){log.info("errorCode:" + response.getErrorCode() + ",errorMessage:" + response.getErrorMsg());map.put("message",response.getErrorMsg());return map;}List<WaybillCloudPrintResponse> waybillResponses = response.getWaybillCloudPrintResponseList();log.info(response);if(null!=waybillResponses&&waybillResponses.size()>0){if (objectId.equals(waybillResponses.get(0).getObjectId())) {map.put("code","SUCCESS");map.put("message","");map.put("waybillResponse",waybillResponses.get(0));return map;}}return map;}/*** 以下几个方法,小伙伴可以参考一下-_-*//*** 更新电子面单信息* @param cpCode 配送公司编码* @param waybillCode 面单号* @param recipientMobile 收货人手机号* @return*/public String updateWaybill(String cpCode,String waybillCode,String recipientMobile){PacClient client = new PacClient(ONLINE_APP_KEY, ONLINE_SECRET_KEY, ONLINE_URL);SendSysParams params = new SendSysParams();params.setFromCode(ONLINE_TOKEN);//更新一下面单上的收件人手机号TmsWaybillUpdateRequest request = new TmsWaybillUpdateRequest();//配送公司编码request.setCpCode(cpCode);//面单号request.setWaybillCode(waybillCode);Recipient recipient = new Recipient();recipient.setMobile(recipientMobile);request.setRecipient(recipient);TmsWaybillUpdateResponse tmsWaybillUpdateResponse = client.send(request, params);if(!tmsWaybillUpdateResponse.isSuccess()){log.info("errorCode:" + tmsWaybillUpdateResponse.getErrorCode() + "errorMessage:" + tmsWaybillUpdateResponse.getErrorMsg());return "fail";}String newPrintData = tmsWaybillUpdateResponse.getPrintData();log.info(newPrintData);return "success";}/*** 取消电子面单* @param cpCode 配送公司编码* @param waybillCode 面单号* @return*/public String cancelWaybill(String cpCode,String waybillCode){PacClient client = new PacClient(ONLINE_APP_KEY, ONLINE_SECRET_KEY, ONLINE_URL);SendSysParams params = new SendSysParams();params.setFromCode(ONLINE_TOKEN);TmsWaybillDiscardRequest request = new TmsWaybillDiscardRequest();//配送公司编码request.setCpCode(cpCode);request.setWaybillCode(waybillCode);TmsWaybillDiscardResponse tmsWaybillDiscardResponse = client.send(request, params);if(!tmsWaybillDiscardResponse.isSuccess()) {log.info("errorCode:" + tmsWaybillDiscardResponse.getErrorCode() + ",errorMessage:" + tmsWaybillDiscardResponse.getErrorMsg());return "fail";}return "true";}
}

2. controller


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_GET.WaybillCloudPrintResponse;
import com.wr.business.entity.Order;
import com.wr.business.entity.Printer;
import com.wr.business.entity.Sender;
import com.wr.business.entity.Waybill;
import com.wr.business.service.OrderService;
import com.wr.business.service.PrinterService;
import com.wr.business.service.SenderService;
import com.wr.business.service.ShopService;
import com.wr.business.service.WaybillService;
import com.wr.business.strategy.util.WaybillUtils;
import com.wr.common.annotation.Log;
import com.wr.common.core.controller.BaseController;
import com.wr.common.core.domain.AjaxResult;
import com.wr.common.core.page.TableDataInfo;
import com.wr.common.enums.BusinessType;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** @Author: 可乐伢* @Date: 2021-4-12 19:59*/
@Controller
@RequestMapping(value = "/pet/order")
public class OrderController extends BaseController {private String prefix = "modules/order";/*** 订单*/@AutowiredOrderService orderService;/*** 电子面单*/@AutowiredWaybillService waybillService;/*** 发件人*/@AutowiredSenderService senderService;/*** 打印机*/@AutowiredPrinterService printerService;/*** 跳转至列表页*/@RequiresPermissions("xxx:order:view")@GetMapping(value = "")public String toPage(ModelMap map) {//发件人信息,一班就一条数据,所以这里可以不用list,直接查一个实体类就可以了List<Sender> senders=senderService.selectSenderList();if(senders.size()>0){map.put("senderId",senders.get(0).getId());}else {map.put("senderId",0);}//打印机Printer printer=printerService.getOne();map.put("printer",printer);return prefix + "/isvOrder";}/*** 获取数据*/@RequiresPermissions(value = "xxx:order:list")@PostMapping(value = "list")@ResponseBodypublic TableDataInfo list(Order order) {startPage();List<Order> list = orderService.selectOrderList(order);return getDataTable(list);}/*** 主要做的是一次打印多个单,有相同的收件人的订单是会合单的*/@RequiresPermissions(value = "xxx:order:print")@PostMapping("/getListData")@ResponseBodypublic AjaxResult getListData(String ids){/*** 发件人信息,一班就一条数据,所以这里可以不用list,* 直接用一个实体类就可以了*/List<Sender> senders=senderService.selectSenderList();Sender sender=new Sender();if(null!=senders&&senders.size()>0){sender=senders.get(0);}//所勾选的订单集合List<Order> orders=orderService.selectOrderListByIds(ids);//存放相同收件人的订单idList<Long> idSame=new ArrayList<>();//返回用于打印的数据List<Map<String,JSONObject>> mapList=new ArrayList<>();Map<String,JSONObject> map;if(null!=orders){for(int i=0;i<orders.size();i++){if(!idSame.contains(orders.get(i).getId())){map=Maps.newHashMap();//获取打印面单上半部分Map<String,Object> responseMap=WaybillUtils.getWaybill(sender,orders.get(i));if("FAIL".equals(responseMap.get("code"))){return AjaxResult.error((String) responseMap.get("message"));}WaybillCloudPrintResponse response= (WaybillCloudPrintResponse) responseMap.get("waybillResponse");String result= response.getPrintData();JSONObject waybillJson=JSON.parseObject(result);updateWaybill(response.getWaybillCode(),orders.get(i));map.put("waybillJson",waybillJson);//获取商品名String proNameI="";//获取雕刻信息String sculptureI="";String custom=proNameI+":"+sculptureI;for(int j=i+1;j<orders.size();j++){//consignee 收件人boolean c=orders.get(i).getConsignee().equals(orders.get(j).getConsignee());//address 收件人地址boolean a=orders.get(i).getAddress().equals(orders.get(j).getAddress());//consigneePhone 收件人电话boolean cp=orders.get(i).getConsigneePhone().equals(orders.get(j).getConsigneePhone());//合单,更新自定义区if(c&&a&&cp){/*** 做一些其他的业务处理*/String proNameJ="";String sculptureJ="";custom+="\n"+proNameJ+":"+sculptureJ;idSame.add(orders.get(j).getId());}}String customData="{ \"data\" : { \"detail\" : \""+custom+"\" }," +" \"templateURL\" : \"http://cloudprint.cainiao.com/template/customArea/9012100/4\"}";JSONObject customJson=JSON.parseObject(customData);map.put("customData",customJson);mapList.add(map);}}return AjaxResult.success(mapList);}return AjaxResult.error("数据有误");}

3. 订单展示页面

<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head><th:block th:include="include :: header('订单列表')" />
</head>
<body class="gray-bg">
<div class="container-div"><div class="row"><div class="btn-group-sm" id="toolbar" role="group"><input id="senderId" th:value="${senderId}" type="hidden"><a class="btn btn-warning" onclick="printOrder()" shiro:hasPermission="pet:order:print"><i class="glyphicon glyphicon-print"></i> 打印电子面单</a></div><div class="col-sm-12 select-table table-striped"><table id="bootstrap-table" data-mobile-responsive="true" style="word-break:break-all; word-wrap:break-word;"></table></div></div>
</div>
<th:block th:include="include :: footer" />
<script th:inline="javascript">//一些权限var consigneeFlag = [[${@permission.hasPermi('pet:order:consignee')}]];var editFlag = [[${@permission.hasPermi('pet:order:edit')}]];var viewFlag = [[${@permission.hasPermi('pet:order:list')}]];var removeFlag = [[${@permission.hasPermi('pet:order:remove')}]];//请求controller地址的前缀var prefix = ctx + "pet/order";$(function() {var options = {url: prefix + "/list",modalName: "订单",removeUrl: prefix + "/remove/{id}",showSearch: false,showExport: false,showColumns: false,//显示指定表格中的列showToggle: false,clickToSelect:true,pageList:[10, 50, 100,500],columns: [{checkbox: true},{field : 'id',title : '序号'},/*这里根据业务需求来展示要展示的字段*/{title: '操作',align: 'center',formatter: function(value, row, index) {var actions = [];/*根据业务需求来添加操作按钮,这里就先给一个删除*/actions.push('<li style="margin-bottom: 5px"><a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" οnclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i> 订单作废</a></li>');return actions.join('');}}]};$.table.init(options);});//打印机var printer = [[${printer}]];//打开webSocket连接var socket = new WebSocket('ws://localhost:13528');//如果是https的话,端口是13529//socket = new WebSocket('wss://localhost:13529');// 打开Socketsocket.onopen = function(event) {// 监听消息socket.onmessage = function(event) {console.log('Client received a message',event);};// 监听Socket的关闭socket.onclose = function(event) {console.log('Client notified socket has closed',event);};};//打印电子面单function printOrder() {var idList = $('#bootstrap-table').bootstrapTable('getAllSelections');if(idList.length>0){var ids="";for (var i = 0; i < idList.length; i++) {if(i!=idList.length-1){ids+=idList[i].id+",";}else {ids+=idList[i].id;}}var index = layer.load(1, {shade: 0.5,content:"正在打印,请勿操作...",success: function (layero) {layero.find('.layui-layer-content').css({'padding': '10px 45px','width': '200px','color':'#fff'});$.ajax({url:"/pet/order/getListData",dataType:"json",type:"post",data:{ids:ids},async:false,success:function (result) {if(result.code==0){for(var i=0;i<result.data.length;i++){doPrint(result.data[i].waybillJson,result.data[i].customData);}}else {layer.alert(result.msg, {icon: 2,title: "系统提示",btn: ['确认'],btnclass: ['btn btn-primary']});}}});}});setTimeout(function(){layer.close(index);}, 2000);$.table.refresh();}else {$.modal.alert("请选择数据", modal_status.FAIL)}}/*** 打印电子面单* printer 指定要使用那台打印机* waybillJson 电子面单上半部分* customData 自定义区域*/function doPrint(waybillJson,customData){var request = getRequestObject("print");request.task = new Object();request.task.taskID = getUUID(8,10);request.task.preview = false;request.task.printer =printer.portName;var documents = new Array();var doc = new Object();doc.documentID = getUUID(8,10);var contents = new Array();contents[0]=waybillJson;contents[1]=customData;doc.contents= contents;documents.push(doc);request.task.documents=documents;socket.send(JSON.stringify(request));}/*** 获取请求的UUID,指定长度和进制,如* getUUID(8, 2)   //"01001010" 8 character (base=2)* getUUID(8, 10) // "47473046" 8 character ID (base=10)* getUUID(8, 16) // "098F4D35"。 8 character ID (base=16)**/function getUUID(len, radix) {var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');var uuid = [], i;radix = radix || chars.length;if (len) {for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];} else {var r;uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';uuid[14] = '4';for (i = 0; i < 36; i++) {if (!uuid[i]) {r = 0 | Math.random()*16;uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];}}}return uuid.join('');}//构造request对象function getRequestObject(cmd) {var request  = new Object();request.requestID=getUUID(8, 16);request.version="1.0";request.cmd=cmd;return request;}window.onbeforeunload=function(e){socket.close();}
</script>
</body>
</html>

三 、 END

感谢大佬们支持!!!


http://chatgpt.dhexx.cn/article/WRHS61K1.shtml

相关文章

菜鸟学设计模式——小单例有大秘密

欢迎大家关注我的新书《Spring Boot趣味实战课》 京东 当当 天猫 单例模式大家并不陌生&#xff0c;也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗&#xff1f;今天我带大家一起来看看我眼中的单例&#xff0c;可能会跟你的认识有所不同。 下面是…

项目菜鸟成长为老鸟之路

【背景】 从去年12月份开始加入廊坊市市委组织部考核系统的维护,到今天正式验收完重构文档,算是一个项目的完美阶段性结项。 维护工作(纯三层架构)——》重构阶段性完结(MVCWCFEF映射架构)&#xff0c;它经历了历史的变革。 项目菜鸟(刚入维护)——》中级老鸟(重构完结…

菜鸟驿站进军万亿社区市场

文&#xff5c;祝颖丽 编辑&#xff5c;斯问 “老板娘&#xff0c;取一下快递。”“取件码多少&#xff1f;” “老板娘&#xff0c;我的紫甘蓝到了吗&#xff1f;”“在后面货架上。” “老板娘&#xff0c;团购的东西总共多少钱&#xff1f;” “480。” 6月23日&#xff0c;…

《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

欢迎关注微信账号&#xff1a;java那些事&#xff1a;csh624366188.每天一篇java相关的文章 在众多朋友的支持和鼓励下&#xff0c;《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中&#xff0c;难…

“菜鸟”程序员和“大神”程序员差距在哪里

点击上方“程序员大咖”&#xff0c;选择“置顶公众号” 关键时刻&#xff0c;第一时间送达&#xff01; 刚刚走出就业的程序员&#xff0c;技术是刚刚起步的基点。那下面我们就聊一聊有关技术的东西。首先请您先想想这几个问题。现在社会上有很多程序员&#xff0c;那您是否可…

Java程序员从笨鸟到菜鸟全部博客目录

本文来自&#xff1a;曹胜欢博客专栏。转载请注明出处&#xff1a;http://blog.csdn.net/csh624366188 欢迎关注微信账号&#xff1a;java那些事&#xff1a;csh624366188.每天一篇java相关的文章 大学上了一年半&#xff0c;接触java也一年半了&#xff0c;虽然中间也有其他东…

html 菜鸟驿站,菜鸟驿站

项目背景 菜鸟驿站是由阿里巴巴旗下菜鸟网络牵头&#xff0c;建立的面向社区、校园的第三方末端物流服务平台。在服务物流行业的同时&#xff0c;持续提升末端运作效率&#xff0c;并为用户提供包裹暂存、代寄等服务&#xff0c;致力于为消费者提供多元化的最后一公里服务。 菜…

cai鸟驿站管理系统

cai鸟驿站管理系统 需求&#xff1a;要求实现登陆&#xff0c;完成管理员对员工的管理&#xff0c;以及员工对订单的管理。如果登陆成功。根据登陆用户的权限&#xff0c;进入不同的界面。如果用户以管理员身份登陆系统&#xff0c;则进入管理员管理员工的界面。 功能&#xf…

软件测试——文档测试

从三月份进入公司实习&#xff0c;眨眼间已是七月中了&#xff0c;研一的下半学期恍惚间就结束了。 从前对软件测试的认知局限于黑盒测试、白盒测试&#xff0c;进入公司才知道我所了解的只是“冰山一角”。上个月参与了一个项目&#xff0c;花费了一周左右的时间——对文档。这…

软件的接口设计图_软件工程中的分析、设计与实例

>软件开发>>软件维护"],[20,"\n","24:\"1uh9\"|33:1"],[20,"问题定义>>可行性研究>>需求分析>>概要设计>>详细设计>>编码和单元测试>>综合测试>>软件维护"],[20,"\n&qu…

如何写好软件任务书

一、前言 我们在平常工作中可能会遇到这样的场景&#xff0c;领导跟你讲了我们这个产品大概要做成啥样&#xff0c;然后画了一张简图&#xff0c;就将任务给你&#xff0c;开始出方案设计&#xff0c;需求设计&#xff0c;架构设计&#xff0c;这个时候很多人往往会无从下手。…

软件架构设计概述

1、软件架构设计 软件架构的研究内容主要涉及软件架构描述、软件架构设计、软件架构风格、软件架构评价和软件架构的形成方法等。 软件架构设计解决好软件的设计、复用、质量和维护等方面的实际问题&#xff1b;解决各类关键的重复问题的通用方案&#xff08;复用性&#xff…

软件设计师-5.软件工程基础知识

5.1 软件工程概述 5.1.1 软件生存周期 软件&#xff1a;包含程序、数据及相关文档。 软件工程&#xff1a;涉及到软件开发、维护、管理等多方面的原理、工具与环境。最终的目的是开发高质量的软件。 目的&#xff1a;提高软件生产率、提高软件质量、降低软件成本。 声明周…

软件设计文档示例模板 - 学习/实践

1.应用场景 主要用于学习&#xff0c;以及书写软件设计文档。 2.学习/操作 1.文档阅读 加餐 | 软件设计文档示例模板-极客时间 2.整理输出 在第9篇文章中&#xff0c;我讲了每种UML模型图的画法&#xff0c;以及这些画法分别适用于什么样的设计阶段&#xff0c;我们也可以将…

来给你的CSDN博客换个皮肤~

进入CDSN官网&#xff0c;登录自己的账号&#xff0c;点击内容管理。 进入首页&#xff0c;选择博客设置 进入页面后&#xff0c;可修改博客标题、添加博客描述、修改博客皮肤&#xff0c;还可以修改默认编辑器。 来呀&#xff0c;一起换皮肤啊~

cdsn怎么查看我的关注(我关注过谁)

登录后点开链接 https://my.csdn.net/my/follow 如下图&#xff1a;

CDPN解读

关于6-DoF的一些基础的知识点请看上一篇博客。 Related work 从RGB图像中识别6-DoF的方法分为直接法和间接法。 1. 间接法 即不是直接的从RGB图像中恢复出6-DoF的信息&#xff0c;而是现在2维RGB图像和它的3维的模型上建立点到点的对应关系&#xff0c;然后通过数学的方法将…

2023年7月江苏/北京/深圳CDGA/CDGP数据治理认证招生

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

CDSN发文章

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

CDC-ECM 和 RNDIS

HomeCategoriesTagsAboutFeed CDC-ECM 和 RNDIS Category: network Tags: network linux wifi ###1. USB-CDC USB协议中的的CDC类是USB通信设备类 (Communication Device Class) 的简称, CDC类是USB组织定义的一类专门给各种通信设备&#xff08;电信通信设备和中…