苍穹外卖day11笔记

news2024/11/24 20:09:52

今日首先介绍前端技术Apache ECharts,说明后端需要准备的数据,然后讲解具体统计功能的实现,包括营业额统计、用户统计、订单统计、销量排名。

一、ECharts

是什么

ECharts是一款基于 Javascript 的数据可视化图表库。我们用它来展示图表数据。

入门案例

步骤

1). 引入echarts.js 文件

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

3). 初始化echarts实例

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

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

代码

js文件在黑马对应项目自取。

测试用的html代码:

<!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: '班级出勤人数'
        },
        tooltip: {},
        legend: {

          data: ['人数']
        },
        xAxis: {
          type: 'category',
          data: ['星期1', '星期2', '星期3', '星期4', '星期5']
        },
        yAxis: {
          type: 'value'
        },
        series: [
          {
            name: '人数',
            type: 'line',
            data: [160, 71, 66, 73, 68],
            smooth: true

          }
        ]
      };

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

结果页面如下:

然后我们打开ECharts官网Apache ECharts 选择一个图案来试着改一下。

首先进入官网,点击所有示例。

然后点击一个自己喜欢的样式:

复制左边的代码到原代码的option位置:

复制后代码如下:

<!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: 'Stacked Area Chart'
  },
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'cross',
      label: {
        backgroundColor: '#6a7985'
      }
    }
  },
  legend: {
    data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']
  },
  toolbox: {
    feature: {
      saveAsImage: {}
    }
  },
  grid: {
    left: '3%',
    right: '4%',
    bottom: '3%',
    containLabel: true
  },
  xAxis: [
    {
      type: 'category',
      boundaryGap: false,
      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    }
  ],
  yAxis: [
    {
      type: 'value'
    }
  ],
  series: [
    {
      name: 'Email',
      type: 'line',
      stack: 'Total',
      areaStyle: {},
      emphasis: {
        focus: 'series'
      },
      data: [120, 132, 101, 134, 90, 230, 210]
    },
    {
      name: 'Union Ads',
      type: 'line',
      stack: 'Total',
      areaStyle: {},
      emphasis: {
        focus: 'series'
      },
      data: [220, 182, 191, 234, 290, 330, 310]
    },
    {
      name: 'Video Ads',
      type: 'line',
      stack: 'Total',
      areaStyle: {},
      emphasis: {
        focus: 'series'
      },
      data: [150, 232, 201, 154, 190, 330, 410]
    },
    {
      name: 'Direct',
      type: 'line',
      stack: 'Total',
      areaStyle: {},
      emphasis: {
        focus: 'series'
      },
      data: [320, 332, 301, 334, 390, 330, 320]
    },
    {
      name: 'Search Engine',
      type: 'line',
      stack: 'Total',
      label: {
        show: true,
        position: 'top'
      },
      areaStyle: {},
      emphasis: {
        focus: 'series'
      },
      data: [820, 932, 901, 934, 1290, 1330, 1320]
    }
  ]
};

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

页面展示结果如下:

总结

传输的两列数据,分别是下标和数据。在如下位置:

二、营业额统计

查看接口文档

分析

控制层

控制层只要接收数据传给业务层,返回VO(已经有设计好的TurnoverReportVO了)就可以。重点在业务层和持久层。

业务层

具体要处理得到两类,或者说两列数据,包括:

  1. 日期列表
  2. 营业额列表

所以步骤便是:

  1. 获取日期列表
  2. 获取日期对应的营业额的列表
  3. 封装返回 

持久层

那么持久层需要的操作就在第2步,即:

  • 根据日期查找当日营业额

之后几个案例都是大差不差的层次结构,除了数据的种类要求不同。

 具体代码

控制层

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

    @Autowired
    private ReportService reportService;

    @GetMapping("/turnoverStatistics")
    public Result turnoverStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                                     @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
        TurnoverReportVO turnoverReportVO = reportService.turnoverStatistics(begin, end);
        return Result.success(turnoverReportVO);
    }
}

业务层

@Service
public class ReportServiceImpl implements ReportService {

    @Autowired
    private OrdersMapper ordersMapper;

    @Override
    public TurnoverReportVO turnoverStatistics(LocalDate begin, LocalDate end) {
        // 1. 获取日期列表
        List<LocalDate> list = getDateList(begin, end);
        // 2. 查询每日营业额
        List<Double> result = new ArrayList<>();
        Double turnover;
        LocalDateTime dayBegin;
        LocalDateTime dayEnd;
        if (list != null && list.size() > 0) {
            dayBegin = LocalDateTime.of(list.get(0), LocalTime.MIN);  // 知识点2和3
            dayEnd = LocalDateTime.of(list.get(0), LocalTime.MAX);  // 知识点2和3
        } else {
            return new TurnoverReportVO();
        }
        for (LocalDate localDate : list) {
            Map<String, Object> map = new HashMap<>();
            map.put("status", Orders.COMPLETED);
            map.put("begin", dayBegin);
            map.put("end", dayEnd);
            turnover = ordersMapper.sumByMap(map);  // 知识点4
            result.add(turnover == null ? 0 : turnover);

            dayBegin = dayBegin.plusDays(1);
            dayEnd = dayEnd.plusDays(1);
        }
        // 3. 返回
        TurnoverReportVO turnoverReportVO = new TurnoverReportVO();
        turnoverReportVO.setDateList(StringUtils.join(list, ","));
        turnoverReportVO.setTurnoverList(StringUtils.join(result, ","));
        return turnoverReportVO;
    }

    private List<LocalDate> getDateList(LocalDate begin, LocalDate end) {
        List<LocalDate> list = new ArrayList<>();
        while (begin.compareTo(end) <= 0) {  // 知识点1
            list.add(begin);
            begin = begin.plusDays(1);
        }
        return list;
    }
}

4个知识点

这里体现了4个知识点:

  1. 日期之间用compareTo比较
  2. LocalDate和LocalTime组合成LocalDateTime,用LocalDateTime的of方法
  3. LocalTime.MIN与LocalTime.MAX
  4. 用Map封装数据交给mapper查找。

持久层

直接上xml文件了:

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

三、用户统计

接口文档

 分析所需数据

由于三层的架构都大差不差,所以直接介绍所需数据的不同。

  1. 日期列表
  2. 新增用户数列表
  3. 总用户数列表

具体代码

控制层

@GetMapping("/userStatistics")
public Result userStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                                 @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
    UserReportVO userReportVO = reportService.userStatistics(begin, end);
    return Result.success(userReportVO);
}

业务层

@Override
public UserReportVO userStatistics(LocalDate begin, LocalDate end) {
    // 1. 获取日期列表
    List<LocalDate> dateList = getDateList(begin, end);
    // 2. 获取用户数量列表
    List<Integer> newUserList = new ArrayList<>();
    List<Integer> totalUserList = new ArrayList<>();

    LocalDateTime dayBegin;
    LocalDateTime dayEnd;

    if (dateList != null && dateList.size() > 0) {
        dayBegin = LocalDateTime.of(dateList.get(0), LocalTime.MIN);
        dayEnd = LocalDateTime.of(dateList.get(0), LocalTime.MAX);
    } else {
        return new UserReportVO();
    }
    Integer totalUser;
    Integer newUser;
    for (LocalDate localDate : dateList) {
        Map<String, Object> map = new HashMap<>();
        map.put("end", dayEnd);
        totalUser = userMapper.countByMap(map);
        totalUserList.add(totalUser == null ? 0 : totalUser);
        map.put("begin", dayBegin);
        newUser = userMapper.countByMap(map);
        newUserList.add(newUser == null ? 0 : newUser);

        dayBegin = dayBegin.plusDays(1);
        dayEnd = dayEnd.plusDays(1);
    }
    // 3. 返回
    UserReportVO userReportVO = new UserReportVO();
    userReportVO.setDateList(StringUtils.join(dateList, ","));
    userReportVO.setNewUserList(StringUtils.join(newUserList, ","));
    userReportVO.setTotalUserList(StringUtils.join(totalUserList, ","));
    return userReportVO;
}

3个注意的点

第一点,获取日期列表可以抽取出来,供营业额统计、用户统计共同调用。

小tips,抽取函数的快捷键是 ctrl + alt + m 哦。

第二点,持久层的两次查找,可以巧妙的用一个函数来完成的。用动态sql的if判断,分为有begin时间的判断和没有begin时间的判断进行处理。具体看下面持久层代码。

第三点,两个统计都要判断持久层查到的结果是不是null,是的话要归为0哦。

持久层

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

四、订单统计

接口文档

所需数据

  1. 日期列表
  2. 所有订单每日总数列表
  3. 所有订单总数
  4. 有效订单每日总数列表
  5. 有效订单总数
  6. 订单完成率

具体代码

控制层

@GetMapping("/ordersStatistics")
public Result ordersStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                               @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
    OrderReportVO orderReportVO = reportService.ordersStatistics(begin, end);
    return Result.success(orderReportVO);
}

业务层

@Override
public OrderReportVO ordersStatistics(LocalDate begin, LocalDate end) {
    OrderReportVO orderReportVO = new OrderReportVO();
    // 1. 日期列表
    List<LocalDate> dateList = getDateList(begin, end);
    if (dateList == null) {
        return orderReportVO;
    }
    // 2. 订单数列表
    List<Integer> totalOrderList = new ArrayList<>();
    // 3. 有效订单数列表
    List<Integer> validOrderList = new ArrayList<>();
    // 4. 订单总数
    Integer totalOrderCount = 0;
    // 5. 有效订单总数
    Integer validOrderCount = 0;
    for (LocalDate localDate : dateList) {
        Map map = new HashMap();
        map.put("begin", LocalDateTime.of(localDate, LocalTime.MIN));
        map.put("end", LocalDateTime.of(localDate, LocalTime.MAX));
        Integer total = ordersMapper.countByMap(map);
        total = total == null ? 0 : total;
        map.put("status", Orders.COMPLETED);
        Integer valid = ordersMapper.countByMap(map);
        valid = valid == null ? 0 : valid;
        totalOrderList.add(total);
        validOrderList.add(valid);
        totalOrderCount += total;
        validOrderCount += valid;
    }
    // 6. 订单完成率
    Double completionR = 0.0;
    if (totalOrderCount != null) {
        completionR = validOrderCount * 1.0 / totalOrderCount;
    }

    orderReportVO.setDateList(StringUtils.join(dateList, ","));
    orderReportVO.setOrderCountList(StringUtils.join(totalOrderList, ","));
    orderReportVO.setValidOrderCountList(StringUtils.join(validOrderList, ","));
    orderReportVO.setTotalOrderCount(totalOrderCount);
    orderReportVO.setValidOrderCount(validOrderCount);
    orderReportVO.setOrderCompletionRate(completionR);

    return orderReportVO;
}

1个注意的巩固知识点

还是用动态sql来巧妙的满足一个函数查询两种不同的数据,即status的if判断是否查询。

持久层

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

没啥好说的,算一个巩固练习。

五、销量排名top10

接口文档

所需数据

  1. 商品名列表
  2. 销量列表

具体代码

控制层

@GetMapping("/top10")
public Result top10(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                    @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
    SalesTop10ReportVO salesTop10ReportVO = reportService.top10(begin, end);
    return Result.success(salesTop10ReportVO);
}

业务层

@Override
public SalesTop10ReportVO top10(LocalDate begin, LocalDate end) {
    List<GoodsSalesDTO> goodsSalesDTOS = ordersMapper.countSaleTop10(LocalDateTime.of(begin, LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX));
    if (goodsSalesDTOS == null) {
        return new SalesTop10ReportVO();
    }

    List<String> nameList = new ArrayList<>();
    List<Integer> numberList = new ArrayList<>();
    for (GoodsSalesDTO goodsSalesDTO : goodsSalesDTOS) {
        nameList.add(goodsSalesDTO.getName());
        numberList.add(goodsSalesDTO.getNumber());
    }  // 思考:这里可不可以简写?


    SalesTop10ReportVO salesTop10ReportVO = new SalesTop10ReportVO();
    salesTop10ReportVO.setNameList(StringUtils.join(nameList, ","));
    salesTop10ReportVO.setNumberList(StringUtils.join(numberList, ","));
    return salesTop10ReportVO;
}

2个注意的点

第一个,下面持久层的多表查询。

第二个,查询到DTO后,对象数据到两列数据的转换。

  • 法一,普通方法,老老实实用两个List添加。
  • 法二,流方法。值得练习,公司中可能会见到、用到很多,资深程序员必备。

练习:用流的写法完成查询数据到两个列表数据的转换

尝试用流的写法完成。

答案如下:

@Override
public SalesTop10ReportVO top10(LocalDate begin, LocalDate end) {
    List<GoodsSalesDTO> goodsSalesDTOS = ordersMapper.countSaleTop10(LocalDateTime.of(begin, LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX));
    if (goodsSalesDTOS == null) {
        return new SalesTop10ReportVO();
    }

//        List<String> nameList = new ArrayList<>();
//        List<Integer> numberList = new ArrayList<>();
//        for (GoodsSalesDTO goodsSalesDTO : goodsSalesDTOS) {
//            nameList.add(goodsSalesDTO.getName());
//            numberList.add(goodsSalesDTO.getNumber());
//        }
    // ==========注意这里的写法==========
    List<String> nameList = goodsSalesDTOS.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList());
    List<Integer> numberList = goodsSalesDTOS.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList());
    // ==========注意上面的写法==========

    SalesTop10ReportVO salesTop10ReportVO = new SalesTop10ReportVO();
    salesTop10ReportVO.setNameList(StringUtils.join(nameList, ","));
    salesTop10ReportVO.setNumberList(StringUtils.join(numberList, ","));
    return salesTop10ReportVO;
}

持久层

<select id="countSaleTop10" resultType="com.sky.dto.GoodsSalesDTO">
    select t2.name, sum(t2.number) as number
    from orders as t1
             inner join order_detail as t2
                        on t1.id = t2.order_id
    where t1.status = 5
      and t1.order_time >= #{begin}
      and t1.order_time &lt;= #{end}
    group by t2.name
    order by number desc limit 0, 10;
</select>

复习

1.ECharts最少需要准备几列数据?

2.LocalDateTime的比较,以及比较接口讲解的复习

3.日期时间的拼接、时间在一天的最大、最小值

4.Map封装数据进行查找的代码手法

5.统计中,持久层查询为null的归0化处理;

6.查找增量与总量时的简写mapper查询。

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

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

相关文章

leetcode每日一练-第121题-买卖股票的最佳时机

一、思路 动态规划 二、解题方法 维护两个变量&#xff1a;一个表示当前最低的股票价格 minPrice&#xff0c;另一个表示当前最大的利润 maxProfit。 遍历数组中的每个价格&#xff0c;对于每个价格&#xff0c;更新 minPrice 和 maxProfit。具体做法是&#xff0c;如果当前…

【Linux】TCP协议——传输层

目录 TCP协议 谈谈可靠性 TCP协议格式 序号与确认序号 窗口大小 六个标志位 确认应答机制&#xff08;ACK&#xff09; 超时重传机制 连接管理机制 三次握手 四次挥手 流量控制 滑动窗口 拥塞控制 延迟应答 捎带应答 面向字节流 粘包问题 TCP异常情况 TC…

【RTT驱动框架分析06】-pwn驱动框架分析+pwm驱动实现

pwm pwm应用程序开发 访问 PWM 设备API 应用程序通过 RT-Thread 提供的 PWM 设备管理接口来访问 PWM 设备硬件&#xff0c;相关接口如下所示&#xff1a; 函数描述rt_device_find()根据 PWM 设备名称查找设备获取设备句柄rt_pwm_set()设置 PWM 周期和脉冲宽度rt_pwm_enable…

橙河网络:2023年,我看谁还在做实体行业?

大家好&#xff0c;我是橙河老师&#xff0c;今天讲一讲实体行业。 现在实体行业还好干吗&#xff1f; 肯定是不好干了。 别的不扯&#xff0c;这几年很多大佬&#xff0c;能把老百姓干的事儿都干了。 一天收入上百万的演员&#xff0c;在直播间卖着九块九的东西&#xff0…

学习笔记-JVM-工具包(JVM分析工具)

常用工具 JDK工具 ① jps: JVM Process status tool&#xff1a;JVM进程状态工具&#xff0c;查看进程基本信息 ② jstat: JVM statistics monitoring tool &#xff1a; JVM统计监控工具&#xff0c;查看堆&#xff0c;GC详细信息 ③ jinfo&#xff1a;Java Configuration I…

MATLAB实现两组数据的延时对齐效果

博主在某次实验中&#xff0c;相同的实验条件下分别采集了两组数据&#xff0c;发现两组数据存在一个延时&#xff0c;如下图所示&#xff1a; 本文记录消除这个延时&#xff0c;实现相同数据状态的对齐效果&#xff0c;采用MATLAB自带的xcorr函数实现&#xff0c;具体步骤如下…

vteam透明屏,在场景化应用中,有哪些特点表现?

vteam透明屏是一种新型的显示技术&#xff0c;它采用透明材料制成&#xff0c;可以在显示内容的同时保持背景的透明度。 这种屏幕可以应用于各种领域&#xff0c;如广告、零售、展览等&#xff0c;具有很大的潜力和市场前景。 vteam透明屏的特点之一是其高透明度。与传统的显…

五、web应用程序技术——web功能

文章目录 一、服务器端功能1.1 SQL1.2 XML1.3 web服务 二、客户端功能2.1 HTML2.2 超链接2.3 表单2.4 CSS2.5 JavaScript2.6 文档对象模型2.7 Ajax2.8 JSON2.9 同源策略2.10浏览器拓展技术 一、服务器端功能 早期的web站点由各种静态资源组成&#xff0c;如HTML页面与图片。当用…

主数据管理案例-中国外运

1、 背景介绍及难点分析 作为世界领先的物流行业整合商、端到端的全程供应链解决方案和一站式物流服务提供商&#xff0c;中国外运非常重视信息化建设&#xff0c;先后投资建设了 300多个信息系统&#xff0c;为中国外运的内部管理和业务运作提供 IT 支持和保障。 由于缺乏统一…

当我准备出门时,发现了......我可以用Python实现12306自动买票

前言 不知道大家有没有之前碰到这样的情况&#xff0c;打算去某一个地方当你规划好了时间准备去买票的时候&#xff0c;你想要的那一列往往没有你想要的票了&#xff0c;尤其是国庆七天假和春节半月假&#xff0c;有时候甚至买不到规定计划时间内的票&#xff0c;真的是太烦躁…

数据分析-python学习 (1)numpy相关

内容为&#xff1a;https://juejin.cn/book/7240731597035864121的学习笔记 导包 import numpy as np numpy数组创建 创建全0数组&#xff0c;正态分布、随机数组等就不说了&#xff0c;提供了相应的方法通过已有数据创建有两种 arr1np.array([1,2,3,4,5]) 或者datanp.loadt…

vxe-grid\table 自定义动态列排序设置

实现动态加载的表格数据&#xff0c;根据设置动态控制指定的某些字段排序功能&#xff1b;如下图所示&#xff1b; 代码实现&#xff1a;标签内添加属性&#xff1b; :sort-config"{trigger:cell, defaultSort: {field: , order: desc}, orders:[desc, asc]}" sort-…

LinuxC编程——线程

目录 一、概念二、进程与线程的区别⭐⭐⭐三、线程资源四、函数接口4.1 线程创建4.2 线程退出4.3 线程回收4.3.1 阻塞回收4.3.2 非阻塞回收 4.4 pthread_create之传参4.5 练习 一、概念 是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程。 进程与线程都参与cpu的统一…

这些可以将音频翻译成文字的工具你值得拥有

你是否曾经遇到过这样的情景&#xff1a;你收到了一段包含外国人发言内容的会议音频&#xff0c;但是由于自己的外语水平一般而却无法理解其中的外语内容&#xff1f;别担心&#xff0c;现在有一些神奇的翻译音频文件的软件可以帮助你解决这个问题&#xff01;如果你还不知道翻…

电脑必备的3款简单好用小工具,建议收藏使用!

​在当今社会&#xff0c;电脑已成为我们工作、学习和娱乐的重要工具。除了拥有一台电脑&#xff0c;一些小工具的加入可以大大提升我们的效率和使用体验。 整理了 3 款比较实用的软件&#xff0c;个人觉得非常实用。&#xff0c;它们将让你的电脑使用更加便捷、高效。不管你是…

使用Prisma访问数据库

首先&#xff0c;确保你已经安装了 Prisma CLI。你可以使用以下命令进行安装&#xff1a; npm install prisma --save-dev接下来&#xff0c;你需要初始化 Prisma 项目&#xff0c;最后一个参数需要指定数据库类型&#xff0c;如postgresql&#xff0c;sqlist&#xff0c;mysql…

深入浅出对话系统——检索式对话系统进阶方法

引言 本文介绍检索式对话系统进阶方法&#xff0c;主要介绍两篇论文工作。 Fine-grained Post-training for Improving Retrieval-based Dialogue Systems 这里的post-training是定义在pre-training和fine-turning中间的阶段&#xff0c;具体的思想是用一些特定领域的数据去…

ControlNet

2023.8.10 Adding Conditional Control to Text-to-Image Diffusion Models 对于 T2I 扩散模型添加 条件控制 相关联比较大的几篇论文&#xff1a; 0.Abstract 可以为预训练的扩散模型提供额外的输入条件控制。不需要很多计算资源。 即使在小数据集上&#xff0c;也具有鲁棒…

中间人攻击与 RADIUS 身份验证

在数字时代&#xff0c;中间人&#xff08;MitM&#xff09;攻击已成为一种日益严重的威胁。根据网络安全风险投资公司的网络安全统计数据&#xff0c;预计到2025年&#xff0c;网络犯罪每年将给世界造成10.5万亿美元的损失&#xff0c;比2015年的3万亿美元大幅增加。这种令人震…

企业微信消息模板通过中转页面(h5)判断跳转pc还是跳小程序

需求&#xff1a;甲方要根据不同的端跳转不同端的详情页面&#xff0c;为什么要这样&#xff0c;是应为每次在PC端点击消息&#xff0c;都要扫码登录进入小程序&#xff0c;不想进入小程序&#xff0c;要打开PC端 1、在pc端的微信中点击消息&#xff0c;则打开PC后台管理系统 …