苍穹外卖11(Apache ECharts前端统计,营业额统计,用户统计,订单统计,销量排名Top10)

目录

一、Apache ECharts【前端】

1. 介绍

2. 入门案例

二、营业额统计

1. 需求分析和设计

1 产品原型

2 业务规则

3 接口设计

2. 代码开发

3. 功能测试

三、用户统计

1. 需求分析和设计

1 产品原型

2 业务规则

3 接口设计

2. 代码开发

 3. 功能测试

四、订单统计

1. 需求分析和设计

1 产品原型

2 业务规则

3 接口设计

2. 代码开发

3. 功能测试

五、销量排名Top10

1. 需求分析和设计

1 产品原型

2 业务规则

3 接口设计

2. 代码开发

3. 功能测试


一、Apache ECharts【前端】

1. 介绍

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

常见效果展示:

1). 柱形图

 

2). 饼形图  

3). 折线图

总结:不管是哪种形式的图形,最本质的东西实际上是数据,它其实是对数据的一种可视化展示。

2. 入门案例

Apache Echarts官方提供的快速入门:快速上手 - 使用手册 - 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: {
          data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
        },
        yAxis: {},
        series: [
          {
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      };

      // 使用刚指定的配置项和数据显示图表。
      myChart.setOption(option);
    </script>
  </body>
</html>

测试:使用浏览器方式打开即可。

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

二、营业额统计

1. 需求分析和设计

1 产品原型

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

原型图 :

2 业务规则

  • 营业额,指订单状态为已完成的订单金额合计

  • 基于可视化报表的折线图展示营业额数据,X轴为日期,Y轴为营业额

  • 根据时间选择区间,展示每天的营业额数据

3 接口设计

通过上述原型图,设计出对应的接口。

注意:具体返回数据一般由前端来决定,前端展示图表,具体折现图对应数据是什么格式,是有固定的要求的。 所以说,后端需要去适应前端,它需要什么格式的数据,我们就给它返回什么格式的数据。

2. 代码开发

//在sky-pojo模块,TurnoverReportVO.java已定义

package com.sky.vo;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TurnoverReportVO implements Serializable {

    //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03
    private String dateList;

    //营业额,以逗号分隔,例如:406.0,1520.0,75.0
    private String turnoverList;

}


--------------
//创建ReportController
//根据接口定义创建ReportController:

package com.sky.controller.admin;

import com.sky.result.Result;
import com.sky.service.ReportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;

@RestController
@Api(tags = "数据统计相关接口")
@RequestMapping("/admin/report")
public class ReportController {
    @Autowired
    private ReportService reportService;

    @GetMapping("/turnoverStatistics")
    @ApiOperation("营业额统计接口")
    public Result turnoverStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                                     @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
        return reportService.turnoverStatistics(begin, end);
    }
}


-------------
//创建ReportService

package com.sky.service;

import com.sky.result.Result;

import java.time.LocalDate;

public interface ReportService {
    /**
     * 统计营业额
     * @param begin
     * @param end
     * @return
     */
    Result turnoverStatistics(LocalDate begin, LocalDate end);
}


-------------
//ReportServiceImpl

package com.sky.service.impl;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sky.mapper.OrderMapper;
import com.sky.result.Result;
import com.sky.service.ReportService;
import com.sky.vo.TurnoverReportVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ReportServiceImpl implements ReportService {
    @Autowired
    private OrderMapper orderMapper;

    @Override
    public Result turnoverStatistics(LocalDate begin, LocalDate end) {
        TurnoverReportVO vo = new TurnoverReportVO();

        List<LocalDate> dateList = new ArrayList<>();
        List<Double> amountList = new ArrayList<>();
        while (!(begin.isAfter(end))) {
            //1. 把日期添加到dateList里
            dateList.add(begin);
            //2. 查询这一天的营业额,添加到amountList里
            LocalDateTime startOfDay = LocalDateTime.of(begin, LocalTime.MIN);
            LocalDateTime endOfDay = LocalDateTime.of(begin, LocalTime.MAX);
            Double amount = orderMapper.sumAmountByDate(startOfDay, endOfDay);
            amount = amount == null ? 0D : amount;
            amountList.add(amount);

            //3. 到下一天
            begin = begin.plusDays(1);
        }

        //dateList 日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03
        String dateListStr = dateList.stream()
                .map(localDate -> localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
                .collect(Collectors.joining(","));
        vo.setDateList(dateListStr);

        //turnoverList  营业额,以逗号分隔,例如:406.0,1520.0,75.0
        String turnoverListStr = amountList.stream()
                .map(Object::toString)
                .collect(Collectors.joining(","));
        vo.setTurnoverList(turnoverListStr);
        return Result.success(vo);
    }
}


------------
//OrderMapper

@Select("select sum(amount) from orders where status = 5 and order_time between #{start} and #{end}")
Double sumAmountByDate(LocalDateTime start, LocalDateTime end);

3. 功能测试

可以通过如下方式进行测试:

  • 接口文档测试

  • 前后端联调测试

启动服务器,启动nginx,直接采用前后端联调测试。

进入数据统计模块

1). 查看近7日营业额统计

 

2). 查看近30日营业额统计

 

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

 也可通过断点方式启动,查看每步执行情况。

三、用户统计

1. 需求分析和设计

1 产品原型

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

原型图 :

2 业务规则

  • 基于可视化报表的折线图展示用户数据,X轴为日期,Y轴为用户数

  • 根据时间选择区间,展示每天新增用户量,和截止到当天的用户总量和

3 接口设计

根据上述原型图设计接口。

2. 代码开发

//在sky-pojo模块,UserReportVO.java已定义

package com.sky.vo;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserReportVO implements Serializable {

    //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03
    private String dateList;

    //用户总量,以逗号分隔,例如:200,210,220
    private String totalUserList;

    //新增用户,以逗号分隔,例如:20,21,10
    private String newUserList;

}


--------------
//ReportController

@GetMapping("/userStatistics")
@ApiOperation("用户统计接口")
public Result userStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                             @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
    return reportService.userStatistics(begin, end);
}


-------------
//ReportService

    /**
     * 统计用户
     * @param begin
     * @param end
     * @return
     */
    Result userStatistics(LocalDate begin, LocalDate end);

------------
//ReportServiceImpl

@Override
public Result userStatistics(LocalDate begin, LocalDate end) {
    UserReportVO vo = new UserReportVO();

    List<LocalDate> dateList = new ArrayList<>();
    List<Integer> totalCountList = new ArrayList<>();
    List<Integer> newCountList = new ArrayList<>();
    while (!(begin.isAfter(end))) {
        //把日期加到dateList集合里
        dateList.add(begin);

        //获取截止到当天的用户总量 select count(*) from user where create_time <= 当天日期
        LocalDateTime endOfDay = LocalDateTime.of(begin, LocalTime.MAX);
        Integer totalCount = userMapper.countByDate(null, endOfDay);
        totalCountList.add(totalCount==null?0:totalCount);

        //获取当天的新用户数量 select count(*) from user where create_time between 当天日期开始时间 and 当天日期结束时间
        LocalDateTime startOfDay = LocalDateTime.of(begin, LocalTime.MIN);
        Integer newCount = userMapper.countByDate(startOfDay, endOfDay);
        newCountList.add(newCount==null?0:newCount);

        //到下一天
        begin = begin.plusDays(1);
    }

    //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03
    String dateListStr = dateList.stream()
        .map(date -> date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
        .collect(Collectors.joining(","));
    vo.setDateList(dateListStr);

    //用户总量,以逗号分隔,例如:200,210,220
    String totalListStr = totalCountList.stream()
        .map(Objects::toString)
        .collect(Collectors.joining(","));
    vo.setTotalUserList(totalListStr);

    //新增用户,以逗号分隔,例如:20,21,10
    String newListStr = newCountList.stream()
        .map(Objects::toString)
        .collect(Collectors.joining(","));
    vo.setNewUserList(newListStr);

    return Result.success(vo);
}


-------------
//UserMapper

/**
 * 统计指定日期范围内的用户数量
 */
Integer countByDate(LocalDateTime startOfDay, LocalDateTime endOfDay);


-------------
//UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sky.mapper.UserMapper">
    <select id="countByDate" resultType="int">
        select count(*) from user
        <where>
            <if test="startOfDay!=null">
                and create_time >= #{startOfDay}
            </if>
            <if test="endOfDay!=null">
                and create_time &lt;= #{endOfDay}
            </if>
        </where>
    </select>
</mapper>

 3. 功能测试

可以通过如下方式进行测试:

  • 接口文档测试

  • 前后端联调测试

进入数据统计模块

1). 查看近7日用户统计

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

2). 查看近30日用户统计

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

也可通过断点方式启动,查看每步执行情况。

四、订单统计

1. 需求分析和设计

1 产品原型

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

原型图:

2 业务规则

  • 有效订单,指状态为 “已完成” 的订单

  • 基于可视化报表的折线图展示订单数据,X轴为日期,Y轴为订单数量

  • 根据时间选择区间,展示每天的订单总数和有效订单数

  • 展示所选时间区间内的有效订单数、总订单数、订单完成率,订单完成率 = 有效订单数 / 总订单数 * 100%

3 接口设计

根据上述原型图设计接口。

2. 代码开发

//在sky-pojo模块,OrderReportVO.java已定义

package com.sky.vo;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderReportVO implements Serializable {

    //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03
    private String dateList;

    //每日订单数,以逗号分隔,例如:260,210,215
    private String orderCountList;

    //每日有效订单数,以逗号分隔,例如:20,21,10
    private String validOrderCountList;

    //订单总数
    private Integer totalOrderCount;

    //有效订单数
    private Integer validOrderCount;

    //订单完成率
    private Double orderCompletionRate;

}


--------------
//ReportController

@GetMapping("/ordersStatistics")
@ApiOperation("订单统计接口")
public Result orderStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                              @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
    return reportService.orderStatistics(begin, end);
}


--------------
//ReportService

    /**
     * 统计订单
     * @param begin
     * @param end
     * @return
     */
    Result orderStatistics(LocalDate begin, LocalDate end);


--------------
//ReportServiceImpl

@Override
public Result orderStatistics(LocalDate begin, LocalDate end) {
    OrderReportVO vo = new OrderReportVO();
    List<LocalDate> dateList = new ArrayList<>();
    List<Integer> countList = new ArrayList<>();
    List<Integer> completeCountList = new ArrayList<>();

    while (!(begin.isAfter(end))) {
        //把日期添加到dateList里
        dateList.add(begin);

        //统计当天的订单数量
        LocalDateTime startOfDay = LocalDateTime.of(begin, LocalTime.MIN);
        LocalDateTime endOfDay = LocalDateTime.of(begin, LocalTime.MAX);
        Integer count = orderMapper.countStatistics(startOfDay, endOfDay, null);
        countList.add(count==null?0:count);

        //统计当天的有效订单数量
        Integer completeCount = orderMapper.countStatistics(startOfDay, endOfDay, Orders.COMPLETED);
        completeCountList.add(completeCount == null ? 0 : completeCount);

        //到下一天
        begin = begin.plusDays(1);
    }

    //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03
    String dateListStr = dateList.stream()
        .map(date -> date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
        .collect(Collectors.joining(","));
    vo.setDateList(dateListStr);

    //每日订单数,以逗号分隔,例如:260,210,215   select count(*) from orders where order_time >= ? and order_time <= ?
    String countListStr = countList.stream()
        .map(Objects::toString)
        .collect(Collectors.joining(","));
    vo.setOrderCountList(countListStr);

    //每日有效订单数,以逗号分隔,例如:20,21,10   select count(*) from orders where order_time >= ? and order_time <= ? and status = 5
    String completeListStr = completeCountList.stream()
        .map(Objects::toString)
        .collect(Collectors.joining(","));
    vo.setValidOrderCountList(completeListStr);

    //订单总数  select count(*) from orders
    Integer totalCount = countList.stream().reduce(Integer::sum).orElse(0);
    vo.setTotalOrderCount(totalCount);

    //有效订单数 select count(*) from orders where status = 5
    Integer completeCount = completeCountList.stream().reduce(Integer::sum).orElse(0);
    vo.setValidOrderCount(completeCount);

    //订单完成率 有效订单数/订单总数
    if (totalCount == 0) {
        vo.setOrderCompletionRate(0D);
    }else{
        vo.setOrderCompletionRate(1.0 * completeCount/totalCount);
    }

    return Result.success(vo);
}


-----------
//OrderMapper

/**
 * 根据日期范围和状态,统计订单数量
 */
Integer countStatistics(LocalDateTime startOfDay, LocalDateTime endOfDay, Integer status);


------------
//OrderMapper.xml

    <select id="countStatistics" resultType="int">
        select count(*) from orders
        <where>
            <if test="startOfDay!=null">
                and order_time >= #{startOfDay}
            </if>
            <if test="endOfDay!=null">
                and order_time &lt;= #{endOfDay}
            </if>
            <if test="status!=null">
                and status = #{status}
            </if>
        </where>
    </select>    

3. 功能测试

可以通过如下方式进行测试:

  • 接口文档测试

  • 前后端联调

重启服务,直接采用前后端联调测试。

进入数据统计模块

1). 查看近7日订单统计

2). 查看近30日订单统计

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

也可通过断点方式启动,查看每步执行情况

五、销量排名Top10

1. 需求分析和设计

1 产品原型

所谓销量排名,销量指的是商品销售的数量。项目当中的商品主要包含两类:一个是套餐,一个是菜品,所以销量排名其实指的就是菜品和套餐销售的数量排名。通过柱形图来展示销量排名,这些销量是按照降序来排列,并且只需要统计销量排名前十的商品。

原型图:

2 业务规则

  • 根据时间选择区间,展示销量前10的商品(包括菜品和套餐)

  • 基于可视化报表的柱状图降序展示商品销量

  • 此处的销量为商品销售的份数

3 接口设计

2. 代码开发

//在sky-pojo模块,SalesTop10ReportVO.java已定义

package com.sky.vo;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SalesTop10ReportVO implements Serializable {

    //商品名称列表,以逗号分隔,例如:鱼香肉丝,宫保鸡丁,水煮鱼
    private String nameList;

    //销量列表,以逗号分隔,例如:260,215,200
    private String numberList;

}


-------------
//ReportController

@GetMapping("/top10")
@ApiOperation("查询销量排名top10接口")
public Result top10Dishes(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                          @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
    return reportService.top10Dishes(begin, end);
}


-------------
//ReportService

    /**
     * 查询销量排名top10接口
     * @param begin
     * @param end
     * @return
     */
    Result top10Dishes(LocalDate begin, LocalDate end);


------------
//ReportServiceImpl

@Override
public Result top10Dishes(LocalDate begin, LocalDate end) {
    SalesTop10ReportVO vo = new SalesTop10ReportVO();

    LocalDateTime start = LocalDateTime.of(begin, LocalTime.MIN);
    LocalDateTime stop = LocalDateTime.of(end, LocalTime.MAX);

    List<GoodsSalesDTO> salesTop10 = orderMapper.salesTop10(start, stop);

    //商品名称列表,以逗号分隔,例如:鱼香肉丝,宫保鸡丁,水煮鱼
    String names = salesTop10.stream()
        .map(GoodsSalesDTO::getName)
        .collect(Collectors.joining(","));
    vo.setNameList(names);

    //销量列表,以逗号分隔,例如:260,215,200
    String numbers = salesTop10.stream()
        .map(GoodsSalesDTO::getNumber)
        .map(Objects::toString)
        .collect(Collectors.joining(","));
    vo.setNumberList(numbers);

    return Result.success(vo);
}


-------------
//OrderMapper

/**
* 查询商品销量前10名
* @param begin
* @param end
*/
List<GoodsSalesDTO> salesTop10(LocalDateTime start, LocalDateTime stop);

------------
//OrderMapper.xml

<select id="salesTop10" resultType="com.sky.dto.GoodsSalesDTO">
    select od.name as name, sum(od.number) as number from orders o, order_detail od
    <where>
        o.id = od.order_id and o.status = 5
        <if test="start!=null">
            and o.order_time >= #{start}
        </if>
        <if test="stop!=null">
            and o.order_time &lt;= #{stop}
        </if>
    </where>
    group by od.name
    order by number desc
    limit 10
</select>

3. 功能测试

可以通过如下方式进行测试:

  • 接口文档测试

  • 前后端联调

重启服务,直接采用前后端联调测试。

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

若查询的某一段时间没有销量数据,则显示不出效果。

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

也可通过断点方式启动,查看每步执行情况。  

       

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MacOS初识SIP——解决快捷指令sh脚本报错Operation not permitted

前言 因为一些原因&#xff0c;设计了一套快捷指令&#xff0c;中间涉及到一个sh脚本的运行&#xff0c;通过快捷指令运行时就会报错&#xff1a;operation not permitted 奇怪的是在快捷指令窗口下运行一切正常&#xff0c;但是从其他地方直接调用&#xff0c;例如通过Comma…

网络安全:重要性与应对措施

1. 网络安全的重要性 随着互联网的普及和信息技术的快速发展&#xff0c;网络安全问题已经变得日益突出。网络攻击者可以通过各种手段窃取个人信息、破坏系统、传播病毒等&#xff0c;给个人和社会带来巨大的损失。因此&#xff0c;网络安全已经成为信息化时代的重要问题之一。…

上门服务小程序|上门服务系统|上门服务软件开发流程

在如今快节奏的生活中&#xff0c;上门服务小程序的需求越来越多。它们向用户提供了方便、高效的服务方式&#xff0c;解决了传统服务行业中的很多痛点。如果你也想开发一个上门服务小程序&#xff0c;以下是开发流程和需要注意的事项。 1、确定需求&#xff1a;在开始开发之前…

SCI一区 | Matlab实现OOA-TCN-BiGRU-Attention鱼鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现OOA-TCN-BiGRU-Attention鱼鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现OOA-TCN-BiGRU-Attention鱼鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

如何将h5网页打包成iOS苹果IPA文件

哈喽&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;最近有很多小伙伴都被难住了&#xff0c;是什么问题给他们都难住了呢&#xff0c;许多小伙伴都说想要把h5网页打包成iOS苹果IPA文件&#xff0c;但是却不知道具体怎么操作&#xff0c;是怎么样的一个流程…

蓝桥杯每日一题(背包dp,线性dp)

//3382 整数拆分 将 1,2,4,8看成一个一个的物品&#xff0c;以完全背包的形式放入。 一维形式&#xff1a;f]0]1; #include<bits/stdc.h> using namespace std; //3382整数拆分 const int N1e610, M5e510; int mod1e9; int f[N],n; int main() {cin>>n;//转化为完…

appium+jenkins实例构建

自动化测试平台 Jenkins简介 是一个开源软件项目&#xff0c;是基于java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 前面我们已经开完测试脚本&#xff0c;也使用bat 批处…

从零开始学习:如何使用Selenium和Python进行自动化测试?

安装selenium 打开命令控制符输入&#xff1a;pip install -U selenium 火狐浏览器安装firebug&#xff1a;www.firebug.com&#xff0c;调试所有网站语言&#xff0c;调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件&#xff0c;实现简单的浏览器操 作的录制与回…

【微服务】------微服务架构技术栈

目前微服务早已火遍大江南北&#xff0c;对于开发来说&#xff0c;我们时刻关注着技术的迭代更新&#xff0c;而项目采用什么技术栈选型落地是开发、产品都需要关注的事情&#xff0c;该篇博客主要分享一些目前普遍公司都在用的技术栈&#xff0c;快来分享一下你当前所在用的技…

PS入门|如何使用“主体”功能进行抠图?

前言 前段时间讲到给各种图标和LOGO抠图的办法&#xff0c;分别使用的是 钢笔工具蒙版 PS入门&#xff5c;规规矩矩的图形怎么抠出来&#xff1f; 魔棒工具蒙版 PS入门&#xff5c;黑白色的图标怎么抠成透明背景 色阶蒙版 PS入门&#xff5c;目标比较复杂&#xff0c;但背景…

数据中台系统架构的探索之路:生产管理企业的数字化转型引擎-亿发

当前制造业面临着诸多问题。 1、系统繁杂&#xff0c;涉及多个子系统和应用&#xff0c;导致信息孤岛和数据孤立现象普遍存在。 2、其次是业务流程冗长&#xff0c;造成生产过程中的信息传递和协同困难&#xff0c;影响效率和质量。 3、数据应用问题也十分突出&#xff0c;包…

android平台下opencv的编译--包含扩展模块

由于项目需要使用安卓平台下opencv的扩展库&#xff0c;对于通用的opencv库&#xff0c; opencv官网提供了android的SDK 但未能提供扩展库&#xff0c;因此需要自己进行源码编译。本文记录android平台下opencv及其扩展库的交叉编译。 前提&#xff1a;主机已安装android-ndk交…

mybatis-plus与mybatis同时使用别名问题

在整合mybatis和mybatis-plus的时候发现一个小坑&#xff0c;单独使用mybatis&#xff0c;配置别名如下&#xff1a; #配置映射文件中指定的实体类的别名 mybatis.type-aliases-packagecom.jk.entity XML映射文件如下&#xff1a; <update id"update" paramete…

vue2 使用vue-org-tree demo

1.安装 npm i vue2-org-tree npm install -D less-loader less安装 less-loader出错解决办法&#xff0c;直接在package.json》devDependencies下面加入less和less-loader版本&#xff0c;然后执行npm i &#xff0c;我用的nodejs版本是 16.18.0&#xff0c;“webpack”: “^4…

Redis的双写一致性问题

双写一致性问题 1.先删除缓存或者先删除数据库都可能出现脏数据。 2.删除两次缓存&#xff0c;可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离&#xff0c;读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

java Web在线考试管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 在线考试管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

DDoS攻击包含哪些层面?如何防护?

DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;是一种通过向目标服务器发送大量流量或请求&#xff0c;以使其无法正常工作的网络攻击手段。DDoS攻击涉及多个层面&#xff0c;在实施攻击时对网络基础架构、网络协议、应用层等进行攻击。下面将详细介绍DDoS攻击的层面。 1…

CentOS 7 升级 5.4 内核

MatrixOne 推荐部署使用的操作系统为 Debian 11、Ubuntu 20.04、CentOS 9 等 Kernel 内核版本高于 5.0 的操作系统。随着 CentOS 7 的支持周期接近尾声&#xff0c;社区不少小伙伴都在讨论用以替换的 Linux 操作系统&#xff0c;经过问卷调查&#xff0c;我们发现小伙伴们的操作…

eclipse .project

.project <?xml version"1.0" encoding"UTF-8"?> <projectDescription> <name>scrm-web</name> <comment></comment> <projects> </projects> <buildSpec> <buil…

C++数据结构与算法——贪心算法难题

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…
最新文章