SpringBoot+SSM项目实战 苍穹外卖(11) Apache ECharts

继续上一节的内容,本节学习Apache ECharts,实现营业额统计、用户统计、订单统计和销量排名Top10功能。

数据统计效果图:

在这里插入图片描述

目录

  • Apache ECharts
    • 入门案例
  • 营业额统计
  • 用户统计
  • 订单统计
  • 销量排名Top10

Apache ECharts

Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。

在这里插入图片描述

常见效果:柱形图、饼形图、折线图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述




入门案例

Apache Echarts官方提供的快速入门

实现步骤:

1). 引入echarts.js 文件(当天资料已提供)

2). 为 ECharts 准备一个设置宽高的 DOM

3). 初始化echarts实例

4). 指定图表的配置项和数据

5). 使用指定的配置项和数据显示图表

在这里插入图片描述

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>ECharts</title><!-- 引入刚刚下载的 ECharts 文件 --><script src="echarts.js"></script></head><body><!-- 为 ECharts 准备一个定义了宽高的 DOM --><div id="main" style="width: 600px;height:400px;"></div><script type="text/javascript">// 基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('main'));// 指定图表的配置项和数据var option = {title: { // 图表标题text: 'ECharts 入门示例'},tooltip: {},legend: { // 图例data: ['销量']},xAxis: { // x轴data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']},yAxis: {},series: [ // y轴数据{name: '销量',type: 'bar', // 指定柱状图类型data: [5, 20, 36, 10, 10, 20]}]};// 使用刚指定的配置项和数据显示图表。myChart.setOption(option);</script></body>
</html>

在这里插入图片描述

使用Echarts,重点在于研究当前图表所需的数据格式。通常是需要后端提供符合格式要求的动态数据,然后响应给前端来展示图表。






营业额统计

营业额统计基于折现图来展现,并且按照天来展示的,不管光标放在哪个点上,就会把具体的数值展示出来。并且日期并不是固定写死的,是由上边时间选择器来决定。比如选择是近7天、或者是近30日,或者是本周,就会把相应这个时间段之内的每一天日期通过横坐标展示。

在这里插入图片描述

业务规则:营业额指订单状态为已完成的订单金额合计、基于可视化报表的折线图展示营业额数据,X轴为日期,Y轴为营业额、根据时间选择区间,展示每天的营业额数据

通过上述原型图,设计出对应的接口。具体返回数据一般由前端来决定,前端展示图表,具体折现图对应数据是什么格式,是有固定的要求的。所以后端需要去适应前端,它需要什么格式的数据,我们就给它返回什么格式的数据。

请添加图片描述

根据接口定义设计对应的VO,在sky-pojo模块,TurnoverReportVO.java已定义。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TurnoverReportVO implements Serializable {//日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03private String dateList;//营业额,以逗号分隔,例如:406.0,1520.0,75.0private String turnoverList;}

根据接口定义创建admin.ReportController:

/*** 报表*/
@RestController
@RequestMapping("/admin/report")
@Slf4j
@Api(tags = "统计报表相关接口")
public class ReportController {@Autowiredprivate ReportService reportService;/*** 营业额数据统计** @param begin* @param end* @return*/@GetMapping("/turnoverStatistics")@ApiOperation("营业额数据统计")public Result<TurnoverReportVO> turnoverStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate end) {return Result.success(reportService.getTurnover(begin, end));}}

创建ReportServiceImpl实现类,实现getTurnover方法:

@Service
@Slf4j
public class ReportServiceImpl implements ReportService {@Autowiredprivate OrderMapper orderMapper;/*** 根据时间区间统计营业额* @param begin* @param end* @return*/public TurnoverReportVO getTurnover(LocalDate begin, LocalDate end) {//dateList用于存放从begin到end范围内的每天的日期List<LocalDate> dateList = new ArrayList<>();dateList.add(begin);while (!begin.equals(end)){begin = begin.plusDays(1);//日期计算,获得指定日期后1天的日期dateList.add(begin);}List<Double> turnoverList = new ArrayList<>();for (LocalDate date : dateList) { //计算每个日期该天的营业额//查询data日期对应的营业额 要求状态为"已完成"的订单金额合计//给data日期加上时分秒 因为数据库里存的是LocalDateTime类型 而data是LocalDate类型LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);//LocalTime.MIN对应一天开始的时刻'00:00'LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);//LocalTime.MAX对应一天结束的时刻'23:59:59.999999999'Map map = new HashMap();map.put("status", Orders.COMPLETED);map.put("begin",beginTime);map.put("end", endTime);Double turnover = orderMapper.sumByMap(map);turnover = turnover == null ? 0.0 : turnover;turnoverList.add(turnover);}//数据封装return TurnoverReportVO.builder().dateList(StringUtils.join(dateList,",")) //指定分隔符拼接list里的字符串.turnoverList(StringUtils.join(turnoverList,",")).build();}
}

在OrderMapper接口声明sumByMap方法:

/*** 根据动态条件统计营业额* @param map*/
Double sumByMap(Map map);

在OrderMapper.xml文件中编写动态SQL:

<select id="sumByMap" resultType="java.lang.Double">select sum(amount) from orders<where><if test="status != null">and status = #{status}</if><if test="begin != null">and order_time <![CDATA[>]]>= #{begin}</if><if test="end != null">and order_time <![CDATA[<]]>= #{end}</if></where>
</select>

这里日期的大于等于和小于等于因为是占位符,原本需要用一些占位符代替:

>=写成&gt;=
<=写成&lt;=

我使用了CDATA区,这种写法也可以,可以参考:java特殊文件 属性文件properties和XML文件

进入数据统计模块查看近7日营业额统计

在这里插入图片描述

进入开发者模式,查看返回数据

在这里插入图片描述






用户统计

通过折线图来展示用户的数量,蓝色线代表的是用户总量,绿色线代表的是新增用户数量,具体到每一天。所以说用户统计主要统计两个数据,一个是总的用户数量,另外一个是新增用户数量。

在这里插入图片描述

业务规则:基于可视化报表的折线图展示用户数据,X轴为日期,Y轴为用户数、根据时间选择区间,展示每天的用户总量和新增用户量数据

请添加图片描述

根据用户统计接口的返回结果设计VO,在sky-pojo模块,UserReportVO.java已定义

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserReportVO implements Serializable {//日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03private String dateList;//用户总量,以逗号分隔,例如:200,210,220private String totalUserList;//新增用户,以逗号分隔,例如:20,21,10private String newUserList;}

ReportController中创建userStatistics方法:

/*** 用户数据统计* @param begin* @param end* @return*/
@GetMapping("/userStatistics")
@ApiOperation("用户数据统计")
public Result<UserReportVO> userStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){return Result.success(reportService.getUserStatistics(begin,end));
}

在ReportServiceImpl实现类中实现getUserStatistics方法:

/*** 根据时间区间统计用户数量* @param begin* @param end* @return*/
public UserReportVO getUserStatistics(LocalDate begin, LocalDate end) {//dateList用于存放从begin到end范围内的每天的日期List<LocalDate> dateList = new ArrayList<>();dateList.add(begin);while (!begin.equals(end)){begin = begin.plusDays(1);//日期计算,获得指定日期后1天的日期dateList.add(begin);}List<Integer> newUserList = new ArrayList<>(); //新增用户数List<Integer> totalUserList = new ArrayList<>(); //总用户数for (LocalDate date : dateList) {//计算每个日期该天的新增用户数量和总用户数量//给data日期加上时分秒 因为数据库里存的是LocalDateTime类型 而data是LocalDate类型LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);//LocalTime.MIN对应一天开始的时刻'00:00'LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);//LocalTime.MAX对应一天结束的时刻'23:59:59.999999999'//新增用户数量 select count(id) from user where create_time >= ? and create_time <= ?Integer newUser = getUserCount(beginTime, endTime);//总用户数量 select count(id) from user where  create_time <= ?Integer totalUser = getUserCount(null, endTime);newUserList.add(newUser);totalUserList.add(totalUser);}return UserReportVO.builder().dateList(StringUtils.join(dateList,",")).newUserList(StringUtils.join(newUserList,",")).totalUserList(StringUtils.join(totalUserList,",")).build();
}

在ReportServiceImpl实现类中创建私有方法getUserCount:

/*** 根据时间区间统计用户数量* @param beginTime* @param endTime* @return*/
private Integer getUserCount(LocalDateTime beginTime, LocalDateTime endTime) {Map map = new HashMap();map.put("begin",beginTime);map.put("end", endTime);return userMapper.countByMap(map);
}

在UserMapper接口中声明countByMap方法:

/*** 根据动态条件统计用户数量* @param map* @return*/
Integer countByMap(Map map);

在UserMapper.xml文件中编写动态SQL:

<select id="countByMap" resultType="java.lang.Integer">select count(id) from user<where><if test="begin != null">and create_time &gt;= #{begin}</if><if test="end != null">and create_time &lt;= #{end}</if></where>
</select>

进入数据统计模块,查看近7日用户统计

在这里插入图片描述

进入开发者模式,查看返回数据

在这里插入图片描述






订单统计

通过一个折现图来展现订单,蓝色的线代表的是订单总数,而下边这根绿色的线代表的是有效订单数,即状态是已完成的订单,分别反映的是每一天的数据。上面还有3个数字,分别是订单总数、有效订单、订单完成率,它指的是整个时间区间之内总的数据。

业务规则:有效订单指状态为 “已完成” 的订单、基于可视化报表的折线图展示订单数据,X轴为日期,Y轴为订单数量、根据时间选择区间,展示每天的订单总数和有效订单数、展示所选时间区间内的有效订单数、总订单数、订单完成率,订单完成率 = 有效订单数 / 总订单数 * 100%

在这里插入图片描述

请添加图片描述

根据订单统计接口的返回结果设计VO,在sky-pojo模块,OrderReportVO.java已定义

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderReportVO implements Serializable {//日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03private String dateList;//每日订单数,以逗号分隔,例如:260,210,215private String orderCountList;//每日有效订单数,以逗号分隔,例如:20,21,10private String validOrderCountList;//订单总数private Integer totalOrderCount;//有效订单数private Integer validOrderCount;//订单完成率private Double orderCompletionRate;}

在ReportController中根据订单统计接口创建orderStatistics方法:

/*** 订单数据统计* @param begin* @param end* @return*/
@GetMapping("/ordersStatistics")
@ApiOperation("用户数据统计")
public Result<OrderReportVO> orderStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate end){return Result.success(reportService.getOrderStatistics(begin,end));
}

在ReportServiceImpl实现类中实现getOrderStatistics方法:

/*** 根据时间区间统计订单数量* @param begin* @param end* @return*/
public OrderReportVO getOrderStatistics(LocalDate begin, LocalDate end){//dateList用于存放从begin到end范围内的每天的日期List<LocalDate> dateList = new ArrayList<>();dateList.add(begin);while (!begin.equals(end)){begin = begin.plusDays(1);//日期计算,获得指定日期后1天的日期dateList.add(begin);}//每天订单总数集合List<Integer> orderCountList = new ArrayList<>();//每天有效订单数集合List<Integer> validOrderCountList = new ArrayList<>();for (LocalDate date : dateList) {//计算每个日期该天的总订单数和有效订单数//给data日期加上时分秒 因为数据库里存的是LocalDateTime类型 而data是LocalDate类型LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);//LocalTime.MIN对应一天开始的时刻'00:00'LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);//LocalTime.MAX对应一天结束的时刻'23:59:59.999999999'//查询每天的总订单数 select count(id) from orders where order_time >= ? and order_time <= ?Integer orderCount = getOrderCount(beginTime, endTime, null);//查询每天的有效订单数 select count(id) from orders where order_time >= ? and order_time <= ? and status = ?Integer validOrderCount = getOrderCount(beginTime, endTime, Orders.COMPLETED);orderCountList.add(orderCount);validOrderCountList.add(validOrderCount);}//时间区间内的总订单数Integer totalOrderCount = orderCountList.stream().reduce(Integer::sum).get();//时间区间内的总有效订单数Integer validOrderCount = validOrderCountList.stream().reduce(Integer::sum).get();//订单完成率Double orderCompletionRate = 0.0;if(totalOrderCount != 0){orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount;}return OrderReportVO.builder().dateList(StringUtils.join(dateList, ",")).orderCountList(StringUtils.join(orderCountList, ",")).validOrderCountList(StringUtils.join(validOrderCountList, ",")).totalOrderCount(totalOrderCount).validOrderCount(validOrderCount).orderCompletionRate(orderCompletionRate).build();}

在ReportServiceImpl实现类中提供私有方法getOrderCount:

/*** 根据时间区间统计指定状态的订单数量* @param beginTime* @param endTime* @param status* @return*/
private Integer getOrderCount(LocalDateTime beginTime, LocalDateTime endTime, Integer status) {Map map = new HashMap();map.put("status", status);map.put("begin",beginTime);map.put("end", endTime);return orderMapper.countByMap(map);
}

在OrderMapper接口中声明countByMap方法:

/***根据动态条件统计订单数量* @param map*/
Integer countByMap(Map map);

在OrderMapper.xml文件中编写动态SQL:

<select id="countByMap" resultType="java.lang.Integer">select count(id) from orders<where><if test="status != null">and status = #{status}</if><if test="begin != null">and order_time &gt;= #{begin}</if><if test="end != null">and order_time &lt;= #{end}</if></where>
</select>

进入数据统计模块查看近7日订单统计

在这里插入图片描述

进入开发者模式,查看返回数据

在这里插入图片描述






销量排名Top10

销量排名指的就是菜品和套餐销售的数量排名。通过柱形图来展示销量排名,这些销量是按照降序来排列,并且只需要统计销量排名前十的商品。

在这里插入图片描述

业务规则:根据时间选择区间,展示销量前10的商品(包括菜品和套餐)、基于可视化报表的柱状图降序展示商品销量、此处的销量为商品销售的份数

请添加图片描述

根据销量排名接口的返回结果设计VO,在sky-pojo模块,SalesTop10ReportVO.java已定义

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SalesTop10ReportVO implements Serializable {//商品名称列表,以逗号分隔,例如:鱼香肉丝,宫保鸡丁,水煮鱼private String nameList;//销量列表,以逗号分隔,例如:260,215,200private String numberList;}

在ReportController中根据销量排名接口创建top10方法:

/*** 销量排名统计* @param begin* @param end* @return*/
@GetMapping("/top10")
@ApiOperation("销量排名统计")
public Result<SalesTop10ReportVO> top10(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){return Result.success(reportService.getSalesTop10(begin,end));
}

在ReportServiceImpl实现类中实现getSalesTop10方法:

/*** 查询指定时间区间内的销量排名top10* @param begin* @param end* @return* */
public SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end){//给data日期加上时分秒 因为数据库里存的是LocalDateTime类型 而data是LocalDate类型LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN);//LocalTime.MIN对应一天开始的时刻'00:00'LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX);//LocalTime.MAX对应一天结束的时刻'23:59:59.999999999'List<GoodsSalesDTO> goodsSalesDTOList = orderMapper.getSalesTop10(beginTime, endTime);String nameList = StringUtils.join(goodsSalesDTOList.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList()),",");String numberList = StringUtils.join(goodsSalesDTOList.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList()),",");return SalesTop10ReportVO.builder().nameList(nameList).numberList(numberList).build();
}

在OrderMapper接口中声明getSalesTop10方法:

/*** 查询商品销量排名* @param begin* @param end*/
List<GoodsSalesDTO> getSalesTop10(LocalDateTime begin, LocalDateTime end);

在OrderMapper.xml文件中编写动态SQL:

<select id="getSalesTop10" resultType="com.sky.dto.GoodsSalesDTO">select od.name name,sum(od.number) number from order_detail od ,orders owhere od.order_id = o.idand o.status = 5<if test="begin != null">and order_time &gt;= #{begin}</if><if test="end != null">and order_time &lt;= #{end}</if>group by nameorder by number desclimit 0, 10
</select>

这个select需要注意,返回的是List类型,并且查询语句也容易写错。

查看近30日销量排名Top10统计

请添加图片描述

进入开发者模式,查看返回数据

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

家居行业如何制定小红书策略,品牌营销须知

凭借出色的品牌传播力&#xff0c;平台一直以来都备受关注。那么作为运营&#xff0c;进入小红书后&#xff0c;该如何利用好各方特性和优势&#xff0c;进行传播呢?今天我们就和大家一起分享下家居行业如何制定小红书策略&#xff0c;品牌营销须知&#xff01; 一、小红书平台…

可应用于电脑主板等产品上的精密基准电路WL431 输出电压可设定 响应速度快

WL431为三端可调节精密基准源。通过两个外接电阻&#xff0c;输出电压可在Vref约2.5 V )到36V连续调节。该电路输出阻抗小(0.2Q)。 开启特性好&#xff0c;在许多应用场合&#xff0c;它能较好地替换齐纳极管。 主要特点&#xff1a;● 温度系数 50pmC ● 在…

自学Python笔记总结(更新中……)

自学Python笔记总结 网址数据类型类型查看类型&#xff0c;使用type内置类标识符 输出输入语句format函数的语法及用法数据类型的转换运算符算数运算符赋值运算符的特殊场景拆包 比较运算符逻辑运算符 与 短路位运算符运算符优先级 程序流程控制分支语句pass 占位 循环语句 whi…

[DM8] 达梦8配置兼容Oracle

查看版本信息 select *&#xff0c;id_code from v$version; 查询解释&#xff1a; DM Database Server 64 V8 1-1-190-21.03.12-136419-ENT 64 版本位数标识&#xff0c;64表示为64位版本&#xff0c;无64则表示为32位版本 V8 大版本号&#xff0c;目前主要是V7、V8 1-1-190…

行为型设计模式——状态模式

状态模式 状态模式是比较简单的设计模式&#xff0c;它的主要作用是减少代码中大量的 if-else 或者 switch-case 等逻辑判断&#xff08;俗称屎山&#xff09;。它将每个状态定义为一个类&#xff0c;而每个状态类有自己对应的方法&#xff0c;因此当需要根据状态执行逻辑代码…

【Web】什么是 XSS 攻击,如何避免?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Web ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 常见方法&#xff1a; 结语 我的其他博客 前言 在当今数字化时代&#xff0c;网络安全成为信息技术领域中的一项至关重要的任务。X…

【hcie-cloud】【20】容器详解【容器介绍,容器工作机制、容器常用命令说明】【上】

文章目录 前言容器是什么虚拟化技术的四个特点容器也是一种虚拟化技术容器是怎么实现虚拟化的&#xff1f;容器对比虚拟机有哪些优势&#xff1f;容器对比虚拟机有哪些不足&#xff1f;容器不仅是一种虚拟化技术&#xff0c;更重要的是一种应用打包机制容器提供的是PaaS服务常见…

jetlinks 规则编排中的函数节点使用 js 脚本格式化输出当前系统时间的坑

网上搜到的都是类似如下这种&#xff1a; // 获取当前时间 var date new Date();// 格式化输出当前时间 var year date.getFullYear(); var month date.getMonth(); var day date.getDate(); var hour date.getHours(); var minute date.getMinutes(); var second date.…

linux 网络文件共享服务

存储类型 DAS 直连式存储 SAN 存储区域网络 NAS 网络附近存储 FTP文件传输协议 文件传输协议 FTP 早期的三个应用级协议之一&#xff0c;基于c/s架构 数据传输格式&#xff1a;二进制&#xff08;默认&#xff09;和文本 tcp 21端口&#xff08;权限&#xff0c;…

网上申请的电话卡,为什么要快递员激活呢

在网上购买的流量卡&#xff0c;快递员不仅仅只是派送&#xff0c;其实很多时候快递员还负责给你激活流量卡。 那么问题就来了&#xff0c;很多朋友可能因为时间问题&#xff0c;或者比较担心个人隐私问题&#xff0c;比较反感让快递员面对面激活&#xff0c;那么如果遇到快递员…

自媒体必备的8个素材网站,免费可商用。

自媒体必备的8个素材网站&#xff0c;视频、音效、音频、图片等素材非常齐全&#xff0c;免费下载&#xff0c;无需担心侵权&#xff0c;赶紧收藏起来吧~ 视频素材 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频…

vue前端开发自学练习,Props数据传递-类型校验,默认值的设置!

vue前端开发自学练习,Props数据传递-类型校验,默认值的设置&#xff01; 实际上&#xff0c;vue开发框架的时候&#xff0c;充分考虑到了前端开发人员可能会遇到的各种各样的情况&#xff0c;比如大家经常遇到的&#xff0c;数据类型的校验&#xff0c;再比如&#xff0c;默认…

leetcode 349 两个数组的集合

题目 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#xff1a; 输入&#xff1a…

【51单片机系列】51单片机的中断系统使用总结一

本文是在学习51单片机的中断系统的简单性总结&#xff0c;着重于51单片机的中断系统的工作原理及如何使用。 文章目录 一、中断原理简单介绍二、 外部中断相关介绍2.1 与外部中断相关的寄存器2.2、外部中断0使用示例2.3、外部中断1使用示例 三、定时器中断相关介绍3.1、51单片机…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)HttpRequest模块 解析http请求协议

一、HTTP响应报文格式 HTTP/1.1 200 OK Bdpagetype: 1 Bdqid: 0xf3c9743300024ee4 Cache-Control: private Connection: keep-alive Content-Encoding: gzip Content-Type: text/html;charsetutf-8 Date: Fri, 26 Feb 2021 08:44:35 GMT Expires: Fri, 26 Feb 2021 08:44:35 GM…

python 爬虫 request get或post传参

爬虫传参 import requestsurl http://www.xxx# get 或 post 传参数据 data {"pageNo": 1652,"pageSize": 10, }headers {Cookie: ,Host: ,Origin: ,Referer: ,User-Agent: , }# get 请求 # res requests.get( # url, # paramsdata, # hea…

获取本地IP网卡信息

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、获取本地IP&#xff0c;以及全部网卡信息总结 前言 一、获取本地IP&#xff0c;以及全部网卡信息 const os require(node:os) function getIPAdress(){/…

UML-用例图

提示&#xff1a;用例图是软件建模的开始&#xff0c;软件建模中的其他图形都将以用例图为依据。用例图列举了系统所需要实现的所有功能&#xff0c;除了用于软件开发的需求分析阶段&#xff0c;也可用于软件的系统测试阶段。 UML-用例图 一、用例图的基础知识1.用例图的构成元…

接口测试总结(2024版)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 1、什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xf…