[苍穹外卖]-11数据可视化接口开发

news2024/12/22 23:01:43

ECharts

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

入门案例: 使用Echarts, 前端关注图表的配置, 不同的配置影响展示的效果, 后端关注图表所需要的数据格式

<!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>

营业额统计接口

需求分析

业务规则

  1. 营业额是指订单状态为已完成的订单金额总计
  2. 基于可视化报表展示营业数据, x轴是日期, y轴是营业额
  3. 根据时间选择区间, 展示每天的营业额数据

接口设计

设计VO: 根据接口的返回值, 设计TurnoverReportVO对象, 用于封装返回给前端的数据

@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;

}

Controller: 新建controller/admin/ReportController

/** * 数据统计相关接口
 */
@RestController
@RequestMapping("/admin/report")
@Api(tags = "数据统计相关接口")
@Slf4j
public class ReportController {

    @Autowired
    private 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) {
        log.info("营业额数据统计:{},{}", begin, end);
        return Result.success(reportService.getTurnoverStatistics(begin, end));
    }
}

Service: 新建ReportService接口以及实现类

public interface ReportService {
    /**
     * 统计指定时间区间内的营业额数据
     * @param begin
     * @param end
     * @return
     */
    TurnoverReportVO getTurnoverStatistics(LocalDate begin, LocalDate end);
}
@Service
public class ReportServiceImpl implements ReportService {

    @Autowired
    private OrderMapper orderMapper;

    /**
     * 统计指定时间区间内的营业额数据
     *
     * @param begin
     * @param end
     * @return
     */
        public TurnoverReportVO getTurnoverStatistics(LocalDate begin, LocalDate end) {
        // 当前集合用于存放从begin到end范围内的每天日期
        List<LocalDate> dateList = new ArrayList<>();

        dateList.add(begin);

        while (!begin.equals(end)) {
            // 计算日期:  开始日期+1,就是后一天的数据
            begin = begin.plusDays(1);
            dateList.add(begin);
        }
             // 当前集合用于存放日期范围内每天的营业额
        List<Double> turnoverList = new ArrayList<>();
        for (LocalDate date : dateList) {
            // 查询date日期对应的营业额数据
            LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN); // 计算一天的开始时间
            LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX); // 计算一天的结束时间

            // 查询语句
            // 查询当天的00:00和23.59之间的并且状态是已完成的营业额,然后求和
            // select sum(amount) from orders where order_time > beginTime and order_time < endTime and status = 5
            Map map = new HashMap<>();
            map.put("begin", beginTime);
            map.put("end", endTime);
            map.put("status", Orders.COMPLETED);
            Double turnover = orderMapper.sumByMap(map);
            turnover = turnover == null ? 0.0 : turnover;
            turnoverList.add(turnover);
        }
            // 封装并返回数据
        return TurnoverReportVO.builder()
                .dateList(StringUtils.join(dateList, ","))
                .turnoverList(StringUtils.join(turnoverList, ","))
                .build();
    }
}
  1. 日期对象是可以计算的, 使用 plusDays(1) 方法在开始日期的基础上加一天, 得到后一天的日期
  2. 得到日期集合之后, 通过StringUtils工具类的join()方法, 把日期集合转成逗号分隔的字符串
  3. 查询数据时, 我们可以先根据需求把sql写出来, 然后再去拼凑需要的参数, 这样编码会比较顺畅

Mapper

@Mapper
public interface OrderMapper {
    /**
     * 根据动态条件统计营业额数据
     * @param map
     * @return
     */
    Double sumByMap(Map map);

}
<?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.OrderMapper">

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

功能测试

用户统计接口

需求分析

业务规则

  1. 基于折线图展示用户数据, X轴为日期, Y轴为用户数
  2. 根据选择的时间区间, 展示每天的用户总量和新增的用户量

接口设计

设计VO: 根据接口的返回值, 设计VO实体类,用于封装返回给前端的数据

@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;

}

controller


/** * 数据统计相关接口
 */
@RestController
@RequestMapping("/admin/report")
@Api(tags = "数据统计相关接口")
@Slf4j
public class ReportController {

    @Autowired
    private ReportService reportService;

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

service

public interface ReportService {
   /**
     * 统计指定时间区间内的用户数据
     * @param begin
     * @param end
     * @return
     */
    UserReportVO getUserStatistics(LocalDate begin, LocalDate end);
}
@Service
public class ReportServiceImpl implements ReportService {
   /**
     * 统计指定时间区间内的用户数据
     *
     * @param begin
     * @param end
     * @return
     */
    public UserReportVO getUserStatistics(LocalDate begin, LocalDate end) {
        // 存放从begin到end之间的每天对应的日期
        List<LocalDate> dateList = new ArrayList<>();
        dateList.add(begin);

        while (!begin.equals(end)) {
            begin = begin.plusDays(1);
            dateList.add(begin);
        }
        // 存放每天的新增用户数量
        // select count(id) from user where create_time < ? and create_time > ?
        List<Integer> newUserList = new ArrayList<>();
        // 存放每天的总用户数量
         // select count(id) from user where create_time < ?
        List<Integer> totalUserList = new ArrayList<>();
        for (LocalDate date : dateList) {
            LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN); // 得到一天的开始时间
            LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX); // 得到一天的结束时间
            Map map = new HashMap<>();
            map.put("end", endTime);
            // 根据结束时间查询用户总数
            Integer totalUser = userMapper.countByMap(map);
            // 根据开始和结束时间查询新增用户数
            map.put("begin", beginTime);
            Integer newUser = userMapper.countByMap(map);
             totalUserList.add(totalUser);
            newUserList.add(newUser);
        }

        // 封装返回结果
        return UserReportVO
                .builder()
                .dateList(StringUtils.join(dateList, ','))
                .newUserList(StringUtils.join(newUserList, ','))
                .totalUserList(StringUtils.join(totalUserList, ','))
                .build();
    }
}
  1. 先把数据查出来放在集合中, 然后再把集合处理成逗号分隔的字符串

mapper

@Mapper
public interface OrderMapper {
    /**
     * 根据动态条件统计用户数量
     * @param map
     * @return
     */
    Integer countByMap(Map map);
}
<?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.OrderMapper">
    <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>              
</mapper>

功能测试

订单统计接口

需求分析

业务规则

  1. 有效订单是"已完成"的订单
  2. 基于可视化图表展示数据, x轴为日期, y轴为订单数量
  3. 根据选择的时间区间, 展示每天的订单总数和有效订单数
  4. 展示所选区间内的有效订单数, 总订单数,订单完成率, 订单完成率 =(有效订单数/总订单数 )*100%

接口设计

设计VO: 根据接口返回的结果设计VO实体类

@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;

}

controller

/** * 数据统计相关接口
 */
@RestController
@RequestMapping("/admin/report")
@Api(tags = "数据统计相关接口")
@Slf4j
public class ReportController {

    @Autowired
    private ReportService reportService;

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

service

public interface ReportService {
   /**
     * 统计指定时间区间内的订单数据
     * @param begin
     * @param end
     * @return
     */
    OrderReportVO getOrderStatistics(LocalDate begin, LocalDate end);
}
@Service
public class ReportServiceImpl implements ReportService {
   /**
     * 统计指定时间区间内的订单数据
     *
     * @param begin
     * @param end
     * @return
     */
    public OrderReportVO getOrderStatistics(LocalDate begin, LocalDate end) {
        // 存放从begin到end之间的每天对应的日期
        List<LocalDate> dateList = new ArrayList<>();

        dateList.add(begin);
              while (!begin.equals(end)) {
            begin = begin.plusDays(1);
            dateList.add(begin);
        }

        // 存放每天的订单总数
        // select count(id) from order where order_time > ? and order_time < ?
        List<Integer> orderCountList = new ArrayList<>();
        // 存放每天的有效订单数
        // select count(id) from order where order_time > ? and order_time < ? and ststus = 5
        List<Integer> validOrderCountList = new ArrayList<>();
        // 遍历时间集合, 查询每天的有效订单数和订单总数
        for (LocalDate date : dateList) {
            // 查询每天的订单总数
            LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);  // 计算一天的开始使劲
            LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);  // 计算一天的结束时间
            Integer orderCount = getOrderCount(beginTime, endTime, null);
            orderCountList.add(orderCount);
             // 查询每天的有效订单数
            Integer validOrderCount = getOrderCount(beginTime, endTime, Orders.COMPLETED);
            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, ","))
                .validOrderCount(validOrderCount)
                .totalOrderCount(totalOrderCount)
                .orderCompletionRate(orderCompletionRate)
                .build();
    }
      /**
     * 根据条件统计订单数量
     *
     * @param begin
     * @param end
     * @return
     */
    private Integer getOrderCount(LocalDateTime begin, LocalDateTime end, Integer status) {
        HashMap map = new HashMap();
        map.put("begin", begin);
        map.put("end", end);
        map.put("status", status);

        return orderMapper.countByMap(map);
    }
}
  1. 每日订单总数和每日有效订单数, 我们可以通过查询数据库得到
  2. 这里我们通过stream流遍历集合中的数据, 进行求和, 得的订单总数和有效订单总数

mapper

@Mapper
public interface OrderMapper {
    /*** 根据动态条件统计用户数量
     * @param map
     * @return
     */
    Integer countByMap(Map map); 
}
<?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.OrderMapper">
    <select id="countByMap" resultType="java.lang.Integer">
        select count(id) from orders
        <where>
            <if test="begin != null">
                and order_time &gt; #{begin}
            </if>
            <if test="end != null">
                and order_time &lt; #{end}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
        </where>
    </select>                
</mapper>                          

测试

销量排名Top10

需求分析

业务规则

  1. 根据时间选择区间, 展示销量前10的商品(包括菜品和套餐)
  2. 基于可视化图表的柱状图展示商品销量
  3. 销量是指商品销售的份数

接口设计

设计VO: 根据接口的返回结果设计VO实体类

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

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

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

}

comtroller

/** * 数据统计相关接口
 */
@RestController
@RequestMapping("/admin/report")
@Api(tags = "数据统计相关接口")
@Slf4j
public class ReportController {

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

设计DTO: 设计GoodsSalesDTO用来封装单条的查询结果

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class GoodsSalesDTO implements Serializable {
    //商品名称, 例如"可乐鸡翅"
    private String name;

    //销量, 例如"100"
    private Integer number;
}

service

public interface ReportService {
   /**
     * 统计指定时间区间内的销量排名前10商品
     * @param begin
     * @param end
     * @return
     */
    SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end);
}
@Service
public class ReportServiceImpl implements ReportService {
   /**
     * 统计指定时间区间内的销量排名前10商品
     *
     * @param begin
     * @param end
     * @return
     */
    public SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end) {
        LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN); //计算一天的开始时间
        LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX); //计算一天的结束时间

        // 查询数据, 例如[{可乐鸡翅: 100}]
        List<GoodsSalesDTO> salesTop10 = orderMapper.getSalesTop10(beginTime, endTime);
        // 把所有name封装到List集合中
        List<String> names = salesTop10.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList());
        // 把集合中的name使用,分割转成String
        String nameList = StringUtils.join(names, ",");
        // 把所有number封装到List集合中
        List<Integer> numbers = salesTop10.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList());
        String numberList = StringUtils.join(numbers, ",");

        return SalesTop10ReportVO
                        .builder()
                .nameList(nameList)
                .numberList(numberList)
                .build();
        }
}

  1. 数据库查询出来的数据被封装到数组对象中, 和前端需要的数据不符, 所有我们我们要转换一下
  2. 使用遍历的方式转换是比较麻烦, 所以这里使用stream流的形式操作集合
  3. 最终把数组中每个对象的name值封装成一个逗号分隔的字符串, 例如"可乐鸡翅,红烧肉,烤鸭"
  4. 把数组中每个对象的number值封装成一个逗号分隔的字符串, 例如"100,50,88"
  5. 最终把这两个字符串封装到VO对象中,返回给前端使用

mapper

@Mapper
public interface OrderMapper {
    /**
     * 统计指定区间内的销量排名前10
     * @param begin
     * @param end
     * @return
     */
    List<GoodsSalesDTO> getSalesTop10(LocalDateTime begin, LocalDateTime end);
}
<?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.OrderMapper">
     <select id="getSalesTop10" resultType="com.sky.dto.GoodsSalesDTO">
        select od.name, sum(od.number) number
        from order_detail od,orders o
        where od.order_id = o.id and o.status = 5
        <if test="begin != null">
            and o.order_time &gt; #{begin}
        </if>
        <if test="end != null">
            and o.order_time &lt; #{end}
        </if>
        group by od.name
        order by number desc
        limit 0,10
    </select>                  
</mapper>
  1. 数据可视化的核心还是数据, 所以重点就是sql的编写
  2. 对于复杂的查询, 我们可以现在sql工具中写好查询语句, 测试好之后在改造成动态sql
  3. selset od.name, sum(od.number) number from order_detail od, orders o where od.order_id = o.id and o.order_time > '2020-01-01 00:00:00' and o.order_time < '2021-01-01 00:00:00'

group by od.name

order by number desc

limit 0,10

测试

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

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

相关文章

“架构建模驱动企业管理数字化转型大会”圆满落幕,上海斯歌发布重磅成果!

2024年 9 月 10 日&#xff0c;由上海博阳精讯信息科技有限公司&#xff08;后文简称“博阳精讯”&#xff09;与华为云计算技术有限公司主办&#xff0c;上海斯歌信息技术有限公司&#xff08;后文简称“上海斯歌”&#xff09;、北京凡得科技有限公司&#xff08;“后文简称凡…

【题解】CF1986G1

目录 翻译思路代码关于G2的想法 翻译 原题链接 思路 数据很大&#xff0c;显然两边同时处理&#xff0c;所以要从 p i i \frac{p_{i}}{i} ipi​​下手。   要让 p i i ∗ p j j \frac{p_{i}}{i} * \frac{p_{j}}{j} ipi​​∗jpj​​是整数&#xff0c;每个 p i i \frac{p_…

Leetcode 二叉树中根遍历

采用递归算法&#xff0c;并且用一个向量来存储节点值。 算法C代码如下&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}*…

GLSL 棋盘shader

今日永杰开金 float size 100.;vec2 checkerboard mod(floor(gl_FragCoord.xy / size), 2.);float c mod(checkerboard.x checkerboard.y, 2.);gl_FragColor vec4(vec3(c), 1);或 vec2 uv floor(S * p.xy * vec2(iResolution.x / iResolution.y, 1) / iResolution.xy); …

文件的常用操作

目录 一、文件的常用操作 1、创建文件 2、读文件 3、写文件 4、删除文件 一、文件的常用操作 1、创建文件 需求&#xff1a;在d盘的a目录下创建hi.txt文件&#xff0c;a目录已经创建好 # 需求&#xff1a;在d盘的a目录下创建hi.txt文件&#xff0c;a目录已经创建好 &qu…

RuoYi-Vue3使用minio图片预览不了的问题

参照官网配置好之后&#xff0c;图片预览不了 1、参照官网修改前端src\components\ImageUpload\index.vue 2、如果图片预览不了&#xff0c;发现是Minio后台返回的url地址内部包括逗号 与代码里split(",")冲突了&#xff0c; 解决方法是改成分号 多个图片可以预览了…

重大消息!LLMWorld 推出开源应用广场,100 多个前沿 AI 应用引关注

宝藏网站LLM World 上线了开源应用广场&#xff0c;汇聚了 100 多个前沿的 AI 应用。 开源应用的出现降低了技术门槛&#xff0c;无论是专业开发者还是普通爱好者&#xff0c;都能在此轻松接触先进的人工智能技术&#xff0c;进行学习和实践。 期待 LLMWorld 能持续汇聚更多优…

在Linux系统中如何创建一个新用户

在Linux系统下创建一个新用户既可以用图形桌面系统&#xff0c;也可以用字符终端命令行的方式来建立。 一、在图形桌面下建立一个新用户“xiaodu”。 如图1&#xff0c;打开设置界面&#xff0c;选中“账户”选项。 图1 选中账户选项 进入“账户”选项后&#xff0c;如图2&a…

初学者指南:如何在Windows 11中自定义任务栏颜色,全面解析!

Windows任务栏如何修改颜色&#xff1f;任务栏可以说是电脑桌面上比较不“起眼”的东西&#xff0c;但是也有不少小伙伴会想要将自己的电脑任务栏设置得好看&#xff0c;比如说修改电脑任务栏透明度&#xff0c;以及修改任务栏颜色。 电脑任务栏设置可以修改任务栏颜色&#xf…

mysql学习教程,从入门到精通,SQL ORDER BY 子句(14)

1、SQL ORDER BY 子句 在本教程中&#xff0c;您将学习如何对SELECTSQL查询返回的数据进行排序。 1.1、对结果集排序 通常&#xff0c;当您使用SELECT语句从表中获取数据时&#xff0c;结果集中的行没有任何特定的顺序。如果要按特定顺序排列结果集&#xff0c;则可以在语句…

镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态

当今企业数据管理日益规范化&#xff0c;数据应用系统随着数据类型与数量的增长不断细分&#xff0c;为了提升市场竞争力与技术实力&#xff0c;数据领域软件服务商与上下游伙伴的紧密对接与合作显得尤为重要。通过构建完善的生态系统&#xff0c;生态内企业间能够整合资源、共…

只有C盘的windows系统通过磁盘分区分出D盘

为什么要从C盘中分出D盘&#xff1f; windows电脑的一个良好的操作规范是&#xff1a;C盘是系统盘&#xff0c;D盘是软件盘&#xff0c;E盘是数据盘&#xff0c;软件一般安装在D盘&#xff0c;大家的一些数据资料可以放在E盘&#xff0c;软件大家一般按照在C盘系统盘&#xff…

GD - GD32350R_EVAL - PWM实验和验证3 - EmbeddedBuilder - 无源蜂鸣器 - 用PMOS来控制

文章目录 GD - GD32350R_EVAL - PWM实验和验证3 - EmbeddedBuilder - 无源蜂鸣器 - 用PMOS来控制概述笔记失败图成功图蜂鸣器管脚波形总结END GD - GD32350R_EVAL - PWM实验和验证3 - EmbeddedBuilder - 无源蜂鸣器 - 用PMOS来控制 概述 以前做了一个实验&#xff0c;用PMOS来…

电阻、电容、电感的封装大小分别与什么参数有关?

电阻封装大小与电阻值、额定功率有关&#xff1b; 电容封装大小与电容值、额定电压有关&#xff1b; 电感封装大小与电感量、额定电流有关。

4款高效的视频剪辑工具,帮你记录精彩瞬间。

随着各种主流媒体的流行&#xff0c;视频剪辑对与很多人来说都不是难题。因为相较于那些专业门槛相对较高的剪辑工具&#xff0c;现在有很多的剪辑工具使用起来都很简单&#xff0c;也完全能够满足大部分的剪辑需求。这次&#xff0c;我便要帮大家盘点4款专业、简单、易用的视频…

绕过CDN查找真实IP方法

1、前言 在新型涉网案件中&#xff0c;我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集&#xff0c;但是现在网站大多都部署了CDN&#xff0c;将资源部署分发到边缘服务器 实现均衡负载&#xff0c;降低网络堵塞&#xff0c;让用户能够更快地访问自己…

AI智能体:一步步教你制作扣子工作流

这是一篇关于字节智能体平台扣子制作工作流的笔记。 完整智能体可参考&#xff1a;基于扣子(Coze)打造第一个智能体——个性化对话机器人 使用工作流优化机器人输出 1 旅游机器人的业务流程 提到工作流&#xff0c;不要感觉有什么高大上的&#xff0c;工作流本质就是我们完…

根据NVeloDocx Word模板引擎生成Word(六-结束)

前面几篇已经把E6开发平台配套的Word模版隐藏NVeloDocx的基础用法介绍了一遍&#xff0c;这些基础用法基本上可以完全覆盖实际业务的绝大部分需求。所以我们这一篇就介绍一些边边角角的内容&#xff0c;给本系列来一个首尾。 本篇的主要内容有&#xff1a; 1、汇总计算&#…

Nacos1.X中对NacosNamingService的实现

Nacos服务注册与发现的实现原理图 服务注册与发现的功能&#xff1a; 服务实例启动时注册到服务注册表、关闭时则注销&#xff08;服务注册&#xff09;服务注册中心根据服务实例定时发送的心跳包&#xff0c;实现健康检测&#xff08;健康检查BeatReactor中的BeatTask&#x…

打造最佳自闭症患全寄宿学校:为孩子的未来保驾护航

在自闭症儿童教育的广阔领域里&#xff0c;寻找一所能够全方位关注孩子成长、为他们的未来奠定坚实基础的学校&#xff0c;是许多家庭的心愿。广州的星贝育园自闭症儿童寄宿制学校&#xff0c;正是这样一所致力于成为最佳的自闭症儿童全寄宿学校&#xff0c;它以独特的教育理念…