当前位置: 首页 > news >正文

Java连接顺丰开放平台

今天使用Java去访问顺丰的开放平台时,JSON转换一直不成功,最终发现是
在这里插入图片描述
可以看到这里是

"apiResultData": "{\"success\": .........

它是以 " 开头的!!!如果是对象的话,那么json是这样的:

"address": {"street": "123 Main St","city": "Anytown","state": "CA","zip": "12345"}

对象是以 { 开头 !!!
然后我一天的bug都是因为,我的接收对象使用了

 private static class RouteQueryResponse {public String apiResponseID;public String apiErrorMsg;public String apiResultCode;public ApiResultData apiResultData;
}

这里的apiResultData应该是String类型

那么言归正传,这里是要讲Java连接顺丰开放平台,那么首先是需要认证,认证的话 顺丰认证 有两种方式,OAuth2 和 数字签名,这里我实践发现,第二种一直是服务不可用,所以这里只能用前一种。

看一下官网的请求示例
在这里插入图片描述
他发的请求是

https://sfapi-sbox.sf-express.com/oauth2/accessToken?partnerID=XXXXXXXX&grantType=password&secret=0705GuswG6BwiTTEbYMkIkZHxxxxxxxxx

所以我们只要拼接一下即可。
然后他响应成功是返回accessToken,我们直接存到缓存里即可,后面请求其他接口必须使用这个accessToken

public String SFToken(Object request) throws IOException {// TODO SF-获取签名-数字签名认证说明//目前是测试方式获得String url = "https://sfapi-sbox.sf-express.com/oauth2/accessToken?partnerID=" + partnerId + "&grantType=password&secret=" + verifyTestCode;HttpPost post = new HttpPost(url);post.setHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8");String response = httpClient.execute(post);log.info("#sf-Token response, {}", JsonUtils.toStr(response));SFTokenResponseBody str = JsonUtils.fromStr(response, SFTokenResponseBody.class);//把accessToken放到cache中,2小时cacheManager.put(CommonCacheManager.CacheType.SF_ACCESS_TOKEN_V2, "accessTokenv2", str.getAccessToken(), 120 * 60);return str.getAccessToken();}
@Data
@AllArgsConstructor
public class SFTokenResponseBody {String accessToken;String refreshToken;public SFTokenResponseBody(){}
}

partnerIdverifyTestCode都是你注册顺丰时发给你的。
httpClient和JsonUtils均可使用其他的平替
放到cache中的那一句代码可以自己进行修改

这只是认证,然后拿到了accessToken,可以去请求其他接口。

这里先看一下通用的方法:

 public void setCommonParams(HttpPost httpPost, SFCommonReq req) throws UnsupportedEncodingException {httpPost.setHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8");List<NameValuePair> params = new ArrayList<>();params.add(new BasicNameValuePair("accessToken", req.getAccessToken()));params.add(new BasicNameValuePair("partnerID", req.getPartnerID()));params.add(new BasicNameValuePair("requestID", req.getRequestID()));params.add(new BasicNameValuePair("serviceCode", req.getServiceCode()));params.add(new BasicNameValuePair("timestamp", req.getTimestamp()));params.add(new BasicNameValuePair("msgData", req.getMsgData()));UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "UTF-8");httpPost.setEntity(entity);}

顺丰下订单

官网是
下订单
看到这里的
公共请求,我们需要创建一个这样的类,使用内部类即可。
然后响应的json也需要一个对象接收。
然后代码如下:


public SFOrderResponseBody orderV2(int orderId, int cityId, ExpressAddressDTO expressAddressDTO) throws IOException {// SF-下订单接口-速运类APISFCommonReq req = SFCommonReq.builder().partnerID(partnerId).requestID(UUID.randomUUID().toString()).serviceCode(serviceCode.makeOrder).timestamp(String.valueOf(System.currentTimeMillis())).accessToken(getOrGenerateToken()) //这里只是从缓存获取accessToken.build();HashMap<String, String> msgData = new HashMap<>();msgData.put("language", "zh-CN");LinkedList<CargoDetails> cargoDetails = new LinkedList<>();CargoDetails details = new CargoDetails();details.setName(expressAddressDTO.getName());cargoDetails.add(details);ContactInfo contactInfo = new ContactInfo();contactInfo.setAddress(expressAddressDTO.getAddress());contactInfo.setTel(expressAddressDTO.getPhone());contactInfo.setCity(districtService.findById(cityId).getName());contactInfo.setContact(expressAddressDTO.getName());//只能发到中国contactInfo.setCountry("CN");contactInfo.setCounty(expressAddressDTO.getDistrictName());contactInfo.setMobile(expressAddressDTO.getPhone());// "postCode":"580058",不用填//找到省contactInfo.setProvince(districtService.findByCode(districtService.findById(cityId).getCode()).getName());msgData.put("cargoDetails", String.valueOf(cargoDetails));msgData.put("contactInfoList", String.valueOf(Collections.singletonList(contactInfo)));msgData.put("orderId", String.valueOf(orderId));//顺丰特快msgData.put("expressTypeId", String.valueOf(1));//1:寄方付 2:收方付 3:第三方付msgData.put("payMethod", String.valueOf(2));msgData.put("isReturnRoutelabel", String.valueOf(1));req.setMsgData(JsonUtils.toStr(msgData));//沙箱URLHttpPost httpPost = new HttpPost("https://sfapi-sbox.sf-express.com/std/service");setCommonParams(httpPost, req);log.info("发送的请求是:" + httpPost);String s = httpClient.execute(httpPost);try {// 解析 JSON 格式的响应createOrderResponse cor = JsonUtils.fromStr(s, createOrderResponse.class);//特殊处理createOrderResponse.ApiResultData apiResultData = JsonUtils.fromStr(cor.getApiResultData(), createOrderResponse.ApiResultData.class);if (!"A1000".equals(cor.getApiResultCode())) {//请求失败log.error("请求失败,响应是:" + s);SFOrderResponseBody sfOrderResponseBody = new SFOrderResponseBody();sfOrderResponseBody.setRetry(true);sfOrderResponseBody.setOrderId(s);return sfOrderResponseBody;}//请求成功Boolean success = apiResultData.getSuccess();SFOrderResponseBody sfOrderResponseBody = new SFOrderResponseBody();if (success) {sfOrderResponseBody.setOrderId(apiResultData.getMsgData().getOrderId());sfOrderResponseBody.setRetry(false);} else {sfOrderResponseBody.setRetry(true);}return sfOrderResponseBody;} catch (Exception e) {e.printStackTrace();SFOrderResponseBody sfOrderResponseBody = new SFOrderResponseBody();sfOrderResponseBody.setRetry(true);sfOrderResponseBody.setOrderId("异常是" + e + ",响应是" + s);return sfOrderResponseBody;}}@Data@Builder@AllArgsConstructor@NoArgsConstructorprivate static class SFCommonReq {String partnerID;String requestID;String serviceCode;String timestamp;String accessToken;String msgData;}private static class serviceCode {//下单private static final String makeOrder = "EXP_RECE_CREATE_ORDER";//查询路径private static final String route = "EXP_RECE_SEARCH_ROUTES";//查询订单private static final String searchOrder = "EXP_RECE_SEARCH_ORDER_RESP";private static final String print = "COM_RECE_CLOUD_PRINT_WAYBILLS";private static final String cloudPrint = "COM_PUSH_CLOUD_PRINT_WAYBILLS";}@Dataprivate static class CargoDetails {@NotNullprivate BigDecimal amount;@NotNullprivate BigDecimal count;@NotNullprivate String currency;private String goodPrepardNo;private String hsCode;@NotNullprivate String name;private String productRecordNo;@NotNullprivate String sourceArea;private String taxNo;@NotNullprivate String unit;@NotNullprivate BigDecimal weight;}public class ExpressAddressDTO implements Serializable {Integer districtId;String districtName;String phone;String address;String name;
}@Dataprivate static class ContactInfo {private String address;private String city;private String contact;private Integer contactType;private String country;private String county;private String mobile;private String postCode;private String province;private String tel;}@Data   //这个就是接收的对象private static class createOrderResponse {public String apiErrorMsg;public String apiResponseID;public String apiResultCode;public String apiResultData;@Dataprivate static class ApiResultData {public Boolean success;public String errorCode;public String errorMsg;public MsgData msgData;@Dataprivate static class MsgData {public String orderId;public String originCode;public String destCode;public Integer filterResult;public String remark;public String url;public String paymentLink;public Boolean isUpstairs;public Boolean isSpecialWarehouseService;public String mappingMark;public String agentMailno;public Object returnExtraInfoList;public List<WaybillNoInfo> waybillNoInfoList;public List<RouteLabelInfo> routeLabelInfo;public Object contactInfoList;@Dataprivate static class WaybillNoInfo {public Integer waybillType;public String waybillNo;}@Dataprivate static class RouteLabelInfo {public String code;public RouteLabelData routeLabelData;public String message;@Dataprivate static class RouteLabelData {public String waybillNo;public String sourceTransferCode;public String sourceCityCode;public String sourceDeptCode;public String sourceTeamCode;public String destCityCode;public String destDeptCode;public String destDeptCodeMapping;public String destTeamCode;public String destTeamCodeMapping;public String destTransferCode;public String destRouteLabel;public String proName;public String cargoTypeCode;public String limitTypeCode;public String expressTypeCode;public String codingMapping;public String codingMappingOut;public String xbFlag;public String printFlag;public String twoDimensionCode;public String proCode;public String printIcon;public String abFlag;public String destPortCode;public String destCountry;public String destPostCode;public String goodsValueTotal;public String currencySymbol;public String cusBatch;public String goodsNumber;public String errMsg;public String checkCode;public String proIcon;public String fileIcon;public String fbaIcon;public String icsmIcon;public String destGisDeptCode;public Object newIcon;}}}}}

路由查询接口

和上面类似,也是创建json的接收类,然后设置一下请求,这里不放完整代码了,最后放整个类的代码

//沙箱环境String url = "https://sfapi-sbox.sf-express.com/std/service";HttpPost post = new HttpPost(url);SFCommonReq req = SFCommonReq.builder().partnerID(partnerId).requestID(UUID.randomUUID().toString()).serviceCode(serviceCode.route).timestamp(String.valueOf(System.currentTimeMillis())).accessToken(getOrGenerateToken()).build();HashMap<String, String> msgData = new HashMap<>();msgData.put("language", "zh-CN");msgData.put("trackingType", String.valueOf(1));msgData.put("trackingNumber", mailNo);req.setMsgData(JsonUtils.toStr(msgData));setCommonParams(post, req);log.info("发送的请求是:" + post);String s = httpClient.execute(post);try {// 解析 JSON 格式的响应RouteQueryResponse rqr = JsonUtils.fromStr(s, RouteQueryResponse.class);if (!"A1000".equals(rqr.getApiResultCode())) {//请求失败log.error("请求失败,响应是:" + s);SFResponse<SFRouteInfos> response = new SFResponse<>();response.setBody(null);SFResponseHead head = new SFResponseHead();head.setCode("500");head.setMessage("请求失败了,返回的响应是" + s);response.setHead(head);return response;}//请求成功//特殊处理RouteQueryResponse.ApiResultData apiResultData = JsonUtils.fromStr(rqr.getApiResultData(), RouteQueryResponse.ApiResultData.class);

订单结果查询接口

链接

//沙箱环境String url = "https://sfapi-sbox.sf-express.com/std/service";HttpPost post = new HttpPost(url);SFCommonReq req = SFCommonReq.builder().partnerID(partnerId).requestID(UUID.randomUUID().toString()).serviceCode(serviceCode.searchOrder).timestamp(String.valueOf(System.currentTimeMillis())).accessToken(getOrGenerateToken()).build();OrderSearchReqDto orderSearchReqDto = new OrderSearchReqDto();orderSearchReqDto.setOrderId(String.valueOf(orderId));orderSearchReqDto.setSearchType(String.valueOf(1));orderSearchReqDto.setLanguage("zh-CN");req.setMsgData(JsonUtils.toStr(orderSearchReqDto));setCommonParams(post, req);String s = httpClient.execute(post);
@Data
private static class OrderSearchReqDto {String orderId;//查询类型:1正向单 2退货单String searchType;//响应报文的语言, 缺省值为zh-CNString language;}

顺丰云打印

链接是 云打印

这里采用的是同步,也就是访问了,顺丰就返回文件url

String url = "https://sfapi-sbox.sf-express.com/std/service";HttpPost post = new HttpPost(url);SFCommonReq req = SFCommonReq.builder().partnerID(partnerId).requestID(UUID.randomUUID().toString()).serviceCode(serviceCode.print).timestamp(String.valueOf(System.currentTimeMillis())).accessToken(getOrGenerateToken()).build();PrintTemplate template = PrintTemplate.builder().sync(true) //设置同步.templateCode(templateCode).version("2.0").build();Document document = new Document();document.setMasterWaybillNo(String.valueOf(orderId));LinkedList<Document> documents = new LinkedList<>();template.setDocuments(documents);req.setMsgData(JsonUtils.toStr(template));setCommonParams(post, req);String s = httpClient.execute(post);@Data@AllArgsConstructor@NoArgsConstructor@Builderprivate static class PrintTemplate {//关联云打印接口后,点击查看,可在接口详情页获取模板编码private String templateCode;//版本号,传固定值:2.0private String version;//pdf格式private String fileType;private List<Document> documents;//true: 同步,false: 异步,默认异步private Boolean sync;private ExtJson extJson;}@Data@AllArgsConstructor@NoArgsConstructorprivate static class Document {private String masterWaybillNo;private String branchWaybillNo;private String backWaybillNo;private String seq;private String sum;private Boolean isPrintLogo;private String remark;private String waybillNoCheckType;private String waybillNoCheckValue;private String customData;}

相关文章:

Java连接顺丰开放平台

今天使用Java去访问顺丰的开放平台时&#xff0c;JSON转换一直不成功&#xff0c;最终发现是 可以看到这里是 "apiResultData": "{\"success\": .........它是以 " 开头的&#xff01;&#xff01;&#xff01;如果是对象的话&#xff0c;那么…...

前端三剑客 - HTML

前言 前面都是一些基础的铺垫&#xff0c;现在就正式进入到web开发环节了。 我们的目标就是通过学习 JavaEE初阶&#xff0c;搭建出一个网站出来。 一个网站分成两个部分&#xff1a; 前端&#xff08;客户端&#xff09; 后端&#xff08;服务器&#xff09; 通常这里的客户端…...

【计算机视觉 | 自然语言处理】BLIP:统一视觉—语言理解和生成任务(论文讲解)

文章目录 一、前言二、试玩效果三、研究背景四、模型结构五、Pre-training objectives六、CapFilt架构七、Experiment八、结论 一、前言 今天我们要介绍的论文是 BLIP&#xff0c;论文全名为 Bootstrapping Language-Image Pre-training for Unified Vision-Language Understa…...

c++基础-运算符

目录 1关系运算符 2运算符优先级 3关系表达式的书写 代码实例&#xff1a; 下面是面试中可能遇到的问题&#xff1a; 1关系运算符 C中有6个关系运算符&#xff0c;用于比较两个值的大小关系&#xff0c;它们分别是&#xff1a; 运算符描述等于!不等于<小于>大于<…...

美术馆c++

题目&#xff1a; 杜老师非常喜欢玩一种叫做“美术馆”的数字游戏&#xff0c;蜗蜗看了之后决定也来试一试&#xff0c;他改编了这个游戏&#xff0c;规则如下&#xff1a; 有一个 n&#xfffd; 行 m&#xfffd; 列的方格&#xff0c;每一个格子中有一个数&#xff0c;数字…...

浅谈MySQL索引以及执行计划

MySQL索引及执行计划 &#x1f42a;索引的作用&#x1f42b;索引的分类&#xff08;算法&#xff09;&#x1f999;BTREE索引算法演变&#x1f992;Btree索引功能上的分类4.1 辅助索引4.2 聚集索引4.3 辅助索引和聚集索引的区别 &#x1f418;辅助索引分类&#x1f98f;索引树高…...

在c++项目中使用rapidjson(有具体的步骤,十分详细) windows10系统

具体的步骤&#xff1a; 先下载rapidjson的依赖包 方式1&#xff1a;直接使用git去下载 地址&#xff1a;git clone https://github.com/miloyip/rapidjson.git 方式2&#xff1a;下载我上传的依赖包 将依赖包引入到项目中 1 将解压后的文件放在你c项目中 2 将rapidjson文…...

编译方式汇总:Makefile\configure\autogen.sh\configure.ac、Makefile.am文件

一、前言 文章目的&#xff1a;针对各种开源项目&#xff0c;由于部分项目文档写的不够详细&#xff0c;&#xff08;或者是我太菜了&#xff09;&#xff0c;没有进行详细的介绍怎么编译该项目&#xff0c;导致花费过多时间在查找如何编译该项目上。因此该篇文章针对目前遇到的…...

explicit关键字

explicit关键字只能用来修饰构造函数。使用explicit可以禁止编译器自动调用拷贝初始化&#xff0c;还可以禁止编译器对拷贝函数的参数进行隐式转换。 那么什么是隐式转换呢&#xff1f; 类 命名 参数&#xff1b; //有参构造类 命名 命名对象&#xff1b; //拷贝构造&#x…...

[优雅的面试] 你了解python的对象吗

前情提要&#xff1a;小编面试&#xff0c;结果面试官着急去吃饭~又约了这次来面&#xff0c;不晓得又会问什么问题呢&#xff1f; 面试官大佬&#xff1a;小伙子来的挺准时的(赞赏的表情~)&#xff0c;今天咱们接着聊哈&#xff0c;小伙子&#xff0c;你有对象了没&#xff1f…...

【hello Linux】线程概念

目录 1. 线程概念的铺设 2. Linux线程概念 2.1 什么是线程 2.2 线程的优点 2.3 线程的缺点 2.4 线程异常 2.5 线程用途 3. Linux进程VS线程 4. Linux线程控制 4.1 POSIX线程库 4.2 创建线程 4.3 进程ID和线程ID 4.4 线程终止 4.5 线程等待 4.6 分离线程 Linux&#x1f337; 1…...

JavaWeb07(MVC应用01[家居商城]连接数据库)

目录 一.什么是MVC设计模式&#xff1f; 1.2 MVC设计模式有什么优点&#xff1f; 二.MVC运用&#xff08;家居商城&#xff09; 2.1 实现登录 2.2 绑定轮播【随机三个商品】 2.2.1 效果预览 index.jsp 2.3 绑定最新上架&热门家居 2.3.1 效果预览 2.3.2 代码实现 数据…...

如何使用电商API接口API接口如何应用

使用API接口 API&#xff08;应用程序接口&#xff09;是现代软件开发中必不可少的一部分&#xff0c;它通常允许软件与其他软件或服务进行交互。使用API可以大大提高软件的灵活性和可扩展性&#xff0c;并允许您轻松添加新的功能和服务&#xff0c;因此&#xff0c;API接口的…...

【移动端网页布局】流式布局案例 ⑥ ( 多排按钮导航栏 | 设置浮动及宽度 | 设置图片样式 | 设置文本 )

文章目录 一、多排按钮导航栏样式及核心要点1、实现效果2、总体布局设计3、设置浮动及宽度4、设置图片样式5、设置文本 二、完整代码实例1、HTML 标签结构2、CSS 样式3、展示效果 一、多排按钮导航栏样式及核心要点 1、实现效果 要实现下面的导航栏效果 ; 2、总体布局设计 该导…...

1. 先从云计算讲起

本章讲解知识点 什么是云计算&#xff1f; 为什么要用云计算&#xff1f; 物理服务器与云服务器对比 云计算服务类型 云计算部署类型 1. 什么是云计算&#xff1f; 云计算是一种通过计算机网络以服务的方式提供动态可伸缩的虚拟化资源的计算模式。按照服务层次分为IaaS、…...

ZooKeeper安装与配置集群

简介: ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;它提供了一个分布式环境中的高可用性、高性能、有序访问的数据存储&#xff0c;可以让分布式应用程…...

浅谈Mysql的RR和RC隔离级别的主要区别

MySQL默认为RR级别 首先默认RR是因为mysql为了保证在主从同步过程中数据的安全的问题&#xff08;涉及到binlog三种格式&#xff09;。 就是说两个并发事务数AB&#xff0c;A先开启事物最后提交也是最后&#xff0c;事务B开启和提交都在A内部&#xff0c;由于隔离级别不同&…...

Build生成器模式

设计模式简述 设计模式的核心在于提供了相关问题的解决方案&#xff0c;使得人们可以更加简单方便地复用成功的设计和体系结构。 生成器模式&#xff08;创建型设计模式&#xff09; 意图&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以…...

C++程序设计——常见C++11新特性

一、列表初始化 1.C98中{}的初始化问题 在C98中&#xff0c;允许使用花括号{}对数组元素进行统一的列表初始化值设定&#xff0c;比如&#xff1a; 但是对于一些自定义类型&#xff0c;就无法使用这样的方式进行初始化了&#xff0c;比如&#xff1a; 就无法通过编译&#xff…...

Rust main 函数返回值类型不能是 String

是的&#xff0c;Rust 的 main 函数返回值类型不能是 String。 Rust 的 main 函数只能返回以下几种类型之一&#xff1a; ()&#xff1a;表示空类型&#xff0c;不返回任何值。i32&#xff1a;表示程序的退出码&#xff0c;通常非零值表示执行失败&#xff0c;0 表示执行成功…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...