【SSM】医疗健康平台-管理端-统计分析

知识目标

  • 了解ECharts,能够说出ECharts的作用

  • 掌握会员数量统计的实现,能够使用Echarts绘制会员数量统计图形报表

  • 掌握套餐预约占比统计的实现,能够使用Echarts绘制套餐预约占比统计图形报表

  • 掌握运营数据报表的实现

通过对数据进行统计分析,可以更直观地反映出健康管理机构的运营情况,有利于管理者了解用户需求,完善体检产品,从而提高服务质量。医疗健康管理端的统计分析包括会员数量统计、套餐预约占比统计和运营数据统计。接下来,本模块将对管理端的统计分析进行详细讲解。

9-1 会员数量统计

会员信息是医疗健康的核心数据之一,其中会员数量的变化趋势能够反映出医疗健康的部分运营情况。本任务需要在report_member.html 页面通过折线图展示最近一年内每月的会员数量。

ECharts下载

ECharts(Enterprise Charts,商业级数据图表)是一个基于 JavaScript 的开源可视化图表库,它最初由百度团队开发,于 2018 年初捐赠给 Apache 基金会,成为 ASF 孵化级项目。ECharts 可以流畅地运行在 PC 和移动设备上,兼容当前绝大部分浏览器,例如Chrome、Firefox、Safari 等,它的底层依赖轻量级的矢量图形库 ZRender,可提供直观、交互丰富、可高度个性化定制的数据可视化图表。

在 ECharts 官网首页,单击菜单栏“下载”下拉列表框中的“下载”按钮,进入 ECharts 下载页面。

从 GitHub 下载 ECharts时,ECharts 提供了多个扩展名为.js 的文件。其中,echarts.common.js 包含常见的图表和组件;echarts.min.js 包含最常用的图表和组件;echarts.js 包含所有的图表和组件,是最完整的,建议初学者选择 echarts.js 文件下载。

将下载的 echarts.js添加到 backend的plugins/echarts 目录下。

ECharts官方示例

在ECharts官网中提供了很多的示例,可以通过这些官方示例查看图表的使用方法和图表效果。在ECharts 官网首页,单击“示例”按钮,进入ECharts图表示例页面。

ECharts 图表示例页面左侧导航栏展示了多种图表分类,用户可以根据类型进行查看,每种类型的图表有多种展示方式,如果想查看某一图表的 JavaScript 代码,直接单击对应图表即可查看。

可以通过编辑代码中的数据,测试折线图的图表效果。例如,将 series 中 data 数组的值全部修改为 100,效果如下。

ECharts快速上手

(1)引入ECharts

创建一个名称为echarts_example的HTML文件,在文件中引入echarts.js,并定义一个DOM容器。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <!-- 引入刚刚下载的 ECharts 文件 -->
    <script src="D:/echarts/echarts.js"></script>
</head>
<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="main" style="width: 600px;height:400px;"></div>
</body>
</html>

(2)绘制图表

使用折线图展示最近一周内最高气温的变化情况。 在echarts_example.html页面中绘制折线图图表,基于DOM使用echarts.init( )方法初始化 echarts 实例,并通过 setOption( )方法生成简单的折线图。

<script type="text/javascript">
    var myChart = echarts.init(document.getElementById('main'));
    var option = {
        title: {            text: 'ECharts入门示例'        },
        tooltip: {},
        legend: {            data: ['一周内的温度变化']        },
        xAxis: {//横轴
            data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
            name:'星期'
        },
        yAxis: {            name:'摄氏度'        },//纵轴
        series: [
            {   name: '一周内的温度变化',
                type: 'line',
                data: [10, 5, 11, 17, 1, 8, 9]
            }
        ]
    };
    myChart.setOption(option);
</script>

(3)测试效果

(1)提交查询会员数量的请求

在report_member.html页面中,可以通过 echarts.js中的 echarts.init( )方法初始化容器 chart1,然后使用 Axios 发送异步请求获取图表需要的会员数量,最后调用setOption( )方法生成折线图。

<script src="../js/axios-0.18.0.js"></script>
<script src="../plugins/echarts/echarts.js"></script>
<script type="text/javascript">
    // 基于准备好的DOM,初始化echarts实例
    var myChart1 = echarts.init(document.getElementById('chart1'));
    axios.get("/report/getMemberReport.do").then((res)=>{
        myChart1.setOption(
            {
                ......省略title、tooltip、legend
                xAxis: { data: res.data.data.months },
                yAxis: { type:'value' },
                series: [{
                    name: '会员数量',
                    type: 'line',
                    data: res.data.data.memberCount
                }]
            });});
</script>

(2)实现查询会员数量控制器

在 controller 包下创建控制器类 ReportController,在类中定义getMemberReport( )方法,用于接收和处理获取会员数量的请求。

(1)动态获取当前日期之前 12 个月的年份和月份,并封装到集合中;

(2)根据月份查询对应的会员数量;

(3)返回查询提示信息和会员数据。

/**
 * 数据统计分析管理
 */
@RestController
@RequestMapping("/report")
public class ReportController {
    @Autowired
    private MemberService memberService;
    @Autowired
    private SetmealService setmealService;
    //获取会员数量统计数据
    @RequestMapping("/getMemberReport")
    public Result getMemberReport(){
        try{
            //动态获取过去1年的12个月,并封装到集合中
            List<String> months = new ArrayList<>();
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MONTH,-12);//add方法用于计算
            for(int i = 0;i<12;i++){
                calendar.add(Calendar.MONTH,1);//add方法用于计算
                months.add(DateUtils.parseDate2String(
                        calendar.getTime(),"yyyy.MM"));
            }
            //根据月份查询对应的会员数量
            List<Integer> memberCount = memberService.
                    findMemberCountByMonths(months);
            Map<String,Object> data = new HashMap<>();//用于封装结果
            data.put("months",months);//月份
            data.put("memberCount",memberCount);//会员数量
            return new Result(true, MessageConstant.
                    GET_MEMBER_NUMBER_REPORT_SUCCESS,data);
        }catch (Exception e){
            e.printStackTrace();
            return new Result(false, MessageConstant.
                    GET_MEMBER_NUMBER_REPORT_FAIL);
        }
    }
}

(3)创建查询会员数量服务

在 MemberService 接口中定义 findMemberCountByMonths( )方法,用于查询会员数量。

List<Integer> findMemberCountByMonths(List<String> months);    //获取会员数量统计数据

(4)实现查询会员数量服务

在 MemberServiceImpl 类中重写MemberService 接口的 findMemberCountByMonths( )方法,用于查询会员数量。

 //根据月份查询会员数量
    public List<Integer> findMemberCountByMonths(List<String> months) {
        List<Integer> memberCounts = new ArrayList<>();
        if(months != null && months.size() > 0){
            for (String month : months) {//2019.01
                String beginTime = month + ".1";//每月第一天
                String endTime = month + ".31";//每月最后一天
                String[] strings = month.split("\\.");//分割数据month
                String[] strings1 = {"4","6","9","11","04","06","09"};//30天
                if (Integer.parseInt(strings[0]) % 4 != 0 && (strings[1].equals("02") || strings[1].equals("2"))){
                    endTime = month + ".28";//不是闰年
                }else if (Integer.parseInt(strings[0]) % 4 == 0 && (strings[1].equals("02") || strings[1].equals("2"))){
                    endTime = month + ".29";//闰年
                }else if (Arrays.asList(strings1).contains(strings[1])){
                    endTime = month + ".30";//每月只有30天
                }
                Map<String,String> map = new HashMap<>();//封装查询参数
                map.put("begin",beginTime);
                map.put("end",endTime);
                Integer memberCount = memberDao.findMemberCountBeforeDate(map);
                memberCounts.add(memberCount);
            }
        }
        return memberCounts;
    }

(5)实现持久层查询会员数量

在 MemberDao 接口中定义 findMemberCountBeforeDate( )方法,用于根据指定日期范围查询会员数量。

//根据月份查找会员
     Integer findMemberCountBeforeDate(Map<String,String> map);

在 MemberDao.xml 映射文件中使用select元素映射查询语句,根据指定日期范围查询会员数量。

 <!--根据日期统计会员数,统计指定日期之前的会员数-->
    <select id="findMemberCountBeforeDate" parameterType="map" resultType="int">
        SELECT count(id) FROM t_member WHERE regTime BETWEEN #{begin} AND #{end}
    </select>

给数据库表中增加模拟数据

INSERT INTO `t_order` VALUES ('1', '1', '2021-10-08', '微信预约', '未到诊', '1');
INSERT INTO `t_order` VALUES ('2', '2', '2021-10-11', '客户端预约', '未到诊', '1');
INSERT INTO `t_order` VALUES ('3', '3', '2021-10-11', '微信预约', '未到诊', '1');
INSERT INTO `t_order` VALUES ('4', '4', '2021-10-11', '客户端预约', '未到诊', '1');
INSERT INTO `t_order` VALUES ('5', '5', '2021-10-13', '微信预约', '未到诊', '1');
INSERT INTO `t_order` VALUES ('6', '6', '2021-10-15', '微信预约', '未到诊', '2');
INSERT INTO `t_order` VALUES ('7', '7', '2021-10-09', '微信预约', '未到诊', '2');
INSERT INTO `t_order` VALUES ('8', '8', '2021-10-20', '微信预约', '未到诊', '2');
INSERT INTO `t_order` VALUES ('9', '9', '2021-10-18', '微信预约', '未到诊', '2');
INSERT INTO `t_order` VALUES ('10', '10', '2021-10-08', '微信预约', '未到诊', '2');
INSERT INTO `t_order` VALUES ('11', '1', '2021-11-08', '微信预约', '未到诊', '3');
INSERT INTO `t_order` VALUES ('12', '2', '2021-10-17', '客户端预约', '已到诊', '3');
INSERT INTO `t_order` VALUES ('13', '3', '2021-10-16', '微信预约', '未到诊', '3');
INSERT INTO `t_order` VALUES ('14', '4', '2021-10-18', '客户端预约', '已到诊', '4');
INSERT INTO `t_order` VALUES ('15', '5', '2021-10-19', '微信预约', '未到诊', '4');
INSERT INTO `t_order` VALUES ('16', '6', '2021-10-25', '微信预约', '未到诊', '4');
INSERT INTO `t_order` VALUES ('17', '7', '2021-10-19', '微信预约', '未到诊', '6');
INSERT INTO `t_order` VALUES ('18', '8', '2021-10-22', '微信预约', '未到诊', '6');
INSERT INTO `t_order` VALUES ('19', '9', '2021-10-28', '微信预约', '未到诊', '6');
INSERT INTO `t_order` VALUES ('20', '10', '2021-10-28', '微信预约', '未到诊', '6');
INSERT INTO `t_order` VALUES ('21', '2', '2021-10-28', '微信预约', '未到诊', '6');

(6)测试会员数量统计

启动服务,在浏览器中访问http://localhost:8080/backend/pages/report_member.html。

9-2 套餐预约占比统计

体检套餐是健康管理机构的重要产品,通过分析各个套餐的预约占比,可以了解不同群体的体检需求,进而可优化套餐结构。图形报表中的饼图可以对各项数据的大小和其占比情况进行直观展示,因此我们可以通过饼图展示套餐预约占比。

(1)提交查询套餐预约数量的请求

可以通过 echarts. js中的echarts.init( )方法初始化在 report_setmeal.html 页面的DOM容器chart1,然后使用Axios发送异步请求获取套餐预约数量,最后调用setOption( )方法生成饼图。

(2)实现查询套餐预约数量控制器

在 ReportController 类中定义 getSetmealReport( )方法,用于接收和处理获取套餐预约数量的请求。

    //获取套餐占比统计数据
    @RequestMapping("/getSetmealReport")
    public Result getSetmealReport(){
        try{
            List<String> setmealNames = new ArrayList<>();//封装套餐名称集合
            //套餐名称和预约数量集合
            List<Map> setmealCount = setmealService.getSetmealReport();
            if(setmealCount != null && setmealCount.size() > 0){
                for (Map map : setmealCount) {
                    String name = (String) map.get("name");//套餐名称
                    setmealNames.add(name);
                }
            }
            Map<String,Object> map = new HashMap<>();//封装返回结果
            map.put("setmealNames",setmealNames);
            map.put("setmealCount",setmealCount);
            return new Result(true, MessageConstant.
                    GET_SETMEAL_COUNT_REPORT_SUCCESS,map);
        }catch (Exception e){
            e.printStackTrace();
            return new Result(false, MessageConstant.
                    GET_SETMEAL_COUNT_REPORT_FAIL);
        }
    }

(3)创建查询套餐预约数量服务

在 SetmealService 接口中定义 getSetmealReport( )方法,用于查询套餐预约数量。

List<Map> getSetmealReport();//查询套餐预约占比情况

(4)实现查询套餐预约数量服务

在SetmealServiceImpl 类中重写 SetmealService 接口的 getSetmealReport( )方法,用于查询套餐预约数量。

//查询套餐预约占比情况
    public List<Map> getSetmealReport() {
        return setmealDao.getSetmealReport();//调用持久化方法,查询套餐预约占比
    }

(5)实现持久层查询套餐预约数量

在 SetmealDao 接口中定义 getSetmealReport( )方法,用于查询套餐预约数量。

List<Map> getSetmealReport();    //查询套餐预约占比

在 SetmealDao.xml 映射文件中使用select元素映射查询语句,根据套餐id查询套餐预约数量。

 <!--查询套餐预约占比数据-->
    <select id="getSetmealReport" resultType="map">
      SELECT s.name,count(o.setmeal_id) AS value FROM t_order o,t_setmeal s
        WHERE o.setmeal_id = s.id
        GROUP BY s.name
    </select>

(6)测试套餐预约占比统计

启动服务,在浏览器中访http://localhost:8080/backend/pages/report_setmeal.html。

9-3 运营数据统计

医疗健康的运营数据包括会员数据、预约到诊数据和热门套餐三部分内容,通过对运营数据进行统计与分析,能够及时发现运营过程中存在的问题,从而更好地完善体检产品和服务。

在浏览器中访问report_business.html 页面。

 

 

 

(1)提交查询运营数据的请求

要实现访问 report_business.html 页面时展示运营数据,可以将查询操作定义在钩子函数 created( )中, created( )函数在 Vue 对象初始化完成后自动执行。

<script src="../js/axios-0.18.0.js"></script>
<script>
    var vue = new Vue({
        ......
        created() {
            axios.get("/report/getBusinessReportData.do").then((res)=>{
                this.reportData = res.data.data;
            })
        }
    })
</script>

(2)实现查询运营数据控制器

在ReportController 类中定义 getBusinessReportData( )方法,用于接收和处理查询运营数据的请求。

    @Autowired //注入服务
    private ReportService reportService;
    //获取运营统计数据
    @RequestMapping("/getBusinessReportData")
    public Result getBusinessReportData(){
        try{
            Map<String,Object> map = reportService.getBusinessReportData();
            return new Result(true, MessageConstant.
                    GET_BUSINESS_REPORT_SUCCESS,map);
        }catch (Exception e){
            e.printStackTrace();
            return new Result(false, MessageConstant.GET_BUSINESS_REPORT_FAIL);
        }
    }

(3)创建查询运营数据服务

在service 包下创建服务接口 ReportService,在接口中定义getBusinessReportData( )方法,用于查询运营数据。

/**
 * 数据统计分析接口
 */
public interface ReportService {
    //获取运营数据
     Map<String,Object> getBusinessReportData()throws Exception;
}

(4)实现查询运营数据服务

在service.impl 包下创建 ReportService 接口的实现类ReportServiceImpl,重写 ReportService 接口的 getBusinessReportData( )方法,用于查询运营数据。 首先动态获取系统当前时间、本周一的时间、本月第一天的时间,用于查询数据; 调用接口MemberDao、OrderDao中的方法查询表格中需要的数据; 将查询返回的结果封装到 Map 集合中返回。

/**
 * 数据统计分析服务接口实现类
 */
@Service("reportService")
@Transactional
public class ReportServiceImpl implements ReportService {
    @Autowired
    private MemberDao memberDao;
    @Autowired
    private OrderDao orderDao;
    //获取运营数据
    public Map<String, Object> getBusinessReportData() throws Exception {
        //获得当前系统时间
        String today = DateUtils.parseDate2String(DateUtils.getToday());
        //动态获得本周一的日期
        String thisWeekMonday = DateUtils.
                parseDate2String(DateUtils.getThisWeekMonday());
        //动态获得本月第一天的日期
        String firstDay4ThisMonth = DateUtils.
                parseDate2String(DateUtils.getFirstDay4ThisMonth());
        //今日新增会员数
        Integer todayNewMember = memberDao.findMemberCountByDate(today);
        //总会员数据
        Integer totalMember = memberDao.findMemberTotalCount();
        //本周新增会员数
        Integer thisWeekNewMember = memberDao.
                findMemberCountAfterDate(thisWeekMonday);
        //本月新增会员数
        Integer thisMonthNewMember = memberDao.
                findMemberCountAfterDate(firstDay4ThisMonth);
        //今日预约数
        Integer todayOrderNumber = orderDao.findOrderCountByDate(today);
        //今日到诊数
        Integer todayVisitsNumber = orderDao.findVisitsCountByDate(today);
        //本周预约数
        Integer thisWeekOrderNumber = orderDao.
                findOrderCountAfterDate(thisWeekMonday);
        //本周到诊数
        Integer thisWeekVisitsNumber = orderDao.
                findVisitsCountAfterDate(thisWeekMonday);
        //本月预约数
        Integer thisMonthOrderNumber = orderDao.
                findOrderCountAfterDate(firstDay4ThisMonth);
        //本月到诊数
        Integer thisMonthVisitsNumber = orderDao.
                findVisitsCountAfterDate(firstDay4ThisMonth);
        List<Map> hotSetmeal = orderDao.findHotSetmeal();//热门套餐
        //定义map集合,将所有查询结果封装到集合中
        Map<String,Object> result = new HashMap<>();
        result.put("reportDate",today);
        result.put("todayNewMember",todayNewMember);
        result.put("totalMember",totalMember);
        result.put("thisWeekNewMember",thisWeekNewMember);
        result.put("thisMonthNewMember",thisMonthNewMember);
        result.put("todayOrderNumber",todayOrderNumber);
        result.put("thisWeekOrderNumber",thisWeekOrderNumber);
        result.put("thisMonthOrderNumber",thisMonthOrderNumber);
        result.put("todayVisitsNumber",todayVisitsNumber);
        result.put("thisWeekVisitsNumber",thisWeekVisitsNumber);
        result.put("thisMonthVisitsNumber",thisMonthVisitsNumber);
        result.put("hotSetmeal",hotSetmeal);
        return result;//返回查询结果
    }
}

(5)实现持久层查询会员数量

在 MemberDao 接口中定义查询会员数量的相关方法。

Integer findMemberCountByDate(String date);//今日新增会员数
      Integer findMemberTotalCount();//总会员数
     //根据日期统计会员数,统计指定日期之后的会员数
      Integer findMemberCountAfterDate(String thisWeekMonday);

在 MemberDao.xml 映射文件中使用select元素映射查询语句,分别根据日期查询新增会员数、查询总会员数、根据指定日期范围查询会员数。

<!--根据日期统计会员数-->
    <select id="findMemberCountByDate" parameterType="string" resultType="int">
         SELECT count(id) FROM t_member WHERE regTime = #{value}
    </select>

    <!--总会员数-->
    <select id="findMemberTotalCount" resultType="java.lang.Integer">
         SELECT count(id) FROM t_member
    </select>

    <!--根据日期统计会员数,统计指定日期之后的会员数-->
    <select id="findMemberCountAfterDate" parameterType="string" resultType="int">
         SELECT count(id) FROM t_member WHERE regTime &gt;= #{value}
    </select>

(6)实现持久层查询体检预约数

在 OrderDao 接口中定义查询预约数和到诊数的相关方法。

Integer findOrderCountByDate(String today);//今日预约数
      Integer findVisitsCountByDate(String today);//今日到诊数
     //本周、本月预约数
      Integer findOrderCountAfterDate(String thisWeekMonday);
     //本周、本月到诊数
      Integer findVisitsCountAfterDate(String thisWeekMonday);
      List<Map> findHotSetmeal();//热门套餐

在OrderDao.xml 映射文件中使用select元素映射查询语句,查询运营数据。

<!--根据日期统计预约数-->
    <select id="findOrderCountByDate" parameterType="string" resultType="int">
        SELECT count(id) FROM t_order WHERE orderDate = #{value}
    </select>

    <!--根据日期统计到诊数-->
    <select id="findVisitsCountByDate" parameterType="string" resultType="int">
        SELECT count(id) FROM t_order
            WHERE orderDate = #{value} AND orderStatus = '已到诊'
    </select>

    <!--根据日期统计预约数,统计指定日期之后的预约数-->
    <select id="findOrderCountAfterDate" parameterType="string" resultType="int">
        SELECT count(id) FROM t_order WHERE orderDate &gt;= #{value}
    </select>

    <!--根据日期统计到诊数,统计指定日期之后的到诊数-->
    <select id="findVisitsCountAfterDate" parameterType="string" resultType="int">
        SELECT count(id) FROM t_order
             WHERE orderDate &gt;= #{value} AND orderStatus = '已到诊'
    </select>

    <!--热门套餐,查询前5条-->
    <select id="findHotSetmeal" resultType="map">
        SELECT s.name, count(o.id) setmeal_count ,count(o.id)/(SELECT count(id)
          FROM t_order) proportion
          FROM t_order o INNER JOIN t_setmeal s ON s.id = o.setmeal_id
          GROUP BY o.setmeal_id
          ORDER BY setmeal_count DESC
          LIMIT 0,4
    </select>

(7)测试运营数据统计

启动服务,在浏览器中访问 http://localhost:8080/backend/pages/report_business.html。

模块小结

本模块主要对管理端的统计分析进行了讲解。首先讲解了 ECharts 的使用,然后运用 ECharts 实现了会员数量统计和套餐预约占比统计,最后实现了运营数据统计。希望通过本模块的学习,可以熟悉 ECharts的使用,能够独立实现统计分析模块功能。

 

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

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

相关文章

Games101 透视投影矩阵推导

目录 齐次坐标 透视投影 透视投影的四棱锥体挤压为正交投影的长方体 变换规定 转换过程 观察1 观察2 关于任意一点挤压后向哪里移动的问题&#xff0c;简单推导了一下 齐次坐标 如下&#xff0c;(x, y, z, 1) 表示空间中的xyz点&#xff0c;让它每个分量乘以k&#…

使用Hugging Face获取BERT预训练模型

【图书推荐】《从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM》_《从零开始大模型开发与微调:基于pytorch与chatglm》-CSDN博客 BERT是一个预训练模型&#xff0c;其基本架构和存档都有相应的服务公司提供下载服务&#xff0c;而Hugging Face是一家目前专门免费提…

如何应对UI测试自动化的不稳定循环!

以下为作者观点&#xff1a; 当我加入UI自动化团队时&#xff0c;我很高兴能为新功能的自动化测试用例开发做出贡献。然而&#xff0c;我很快意识到团队花费了大量时间来修复之前迭代中不稳定的测试。这种情况让我感到困惑&#xff0c;因为当自动化测试脚本已知不稳定时&#…

HRSC2016 :推动光学遥感图像细粒度船舶检测的创新引擎(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 摘要&a…

LabVIEW在核磁共振实验室的应用

​核磁共振&#xff08;NMR&#xff09;实验室在进行复杂的核磁共振实验时&#xff0c;需要一个高效、灵活且易于操作的实验控制和数据采集系统。传统的NMR实验系统往往使用专门的硬件和软件&#xff0c;存在系统封闭、扩展性差、维护成本高等问题。为了解决这些问题&#xff0…

java设计模式(五)建造者模式(Builder Pattern)

1、模式介绍&#xff1a; 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许你创建一个复杂对象的表示&#xff0c;同时隐藏了创建细节。该模式将对象的构建过程和表示分离&#xff0c;使得相同的构建过程可以创建不同的表示。 2、应…

低成本的PS5存储扩容方案,铠侠SD10 PCle4.0固态硬盘扩容报告

低成本的PS5存储扩容方案&#xff0c;铠侠SD10 PCle4.0固态硬盘扩容报告 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于入手PS5的游戏玩家来说&#xff0c;机器到手第一步&#xff0c;那就是订阅索尼PlayStation Plus会员&#xff0c;可以尽情的玩耍上百款游戏3A大作&#xf…

web刷题记录

[HDCTF 2023]SearchMaster 打开环境&#xff0c;首先的提示信息就是告诉我们&#xff0c;可以用post传参的方式来传入参数data 首先考虑的还是rce&#xff0c;但是这里发现&#xff0c;不管输入那种命令&#xff0c;它都会直接显示在中间的那一小行里面&#xff0c;而实际的命令…

L59---101.对称二叉树(广搜)---Java版

1.题目描述 2.思路和知识点 &#xff08;1)根节点为空&#xff1a; 如果根节点为空&#xff0c;树是对称的。 (2)递归检查&#xff1a; isMirror 方法递归检查两个子树是否是镜像对称的。 (3)辅助函数 isMirror&#xff1a; 1)如果两个节点都为空&#xff0c;它们是镜像对称的…

Java中特殊文件和日志技术

特殊文件和日志技术 特殊文件&#xff1a;Properties属性文件 特点&#xff1a; 特点一&#xff1a;都是键值对 特点二&#xff1a;键不能重复 特点三&#xff1a;文件后缀一般是Properties 作用&#xff1a; …

涵盖多项功能的文件外发系统,了解一下

伴随着业务范围的不断扩大&#xff0c;信息化的迅速发展&#xff0c;企业与客户、供应商等合作伙伴之间的文件交换也愈加频繁&#xff0c;尤其涉及到核心数据&#xff0c;像核心技术、设计图纸等敏感数据&#xff0c;对其的保护也是越发重视。文件外发系统&#xff0c;应运而生…

2024年河北省特岗教师报名流程详细图解

最近有很多学员们问特岗教师具体的报名流程 给大家安排! 特岗报名步骤 第步: 电脑搜索“河北特岗招聘”登录进行注册 第步:注册后重新登录 第步: 根据个人情况选择填写自己的学历 第步:填写个人信息 (需要上传的电子版的照片、普通话证、学历证书、教资证等) 第步:选择岗位报名…

【大数据技术原理与应用(概念、存储、处理、分析与应用)】第2章-大数据处理架构 Hadoop习题与知识回顾

文章目录 单选题多选题知识点回顾什么是Hadoop&#xff1f;Hadoop有哪些特性&#xff1f;Hadoop生态系统是怎么样的&#xff1f;(1) HDFS(2) HBase(3) MapReduce(4) Hive(5) Pig(6) Mahout(7) Zookeeper(8) Flume(9) Sqoop(10) Ambari 单选题 1、下列哪个不属于Hadoop的特性&am…

MySQL索引优化解决方案--索引优化(4)

排序优化 尽量避免使用Using FileSort方式排序。order by语句使用索引最左前列或使用where子句与order by子句条件组合满足索引最左前列。where子句中如果出现索引范围查询会导致order by索引失效。 优化案例 联表查询优化 分组查询优化 慢查询日志

2024年上半年软件设计师上午真题及答案解析

1.在计算机网络协议五层体系结构中&#xff0c;( B )工作在数据链路层。 A.路由器 B.以太网交换机 C.防火墙 D.集线器 网络层&#xff1a;路由器、防火墙 数据链路层&#xff1a;交换机、网桥 物理层&#xff1a;中继器、集线器 2.软件交付之后&#xff…

C++ | Leetcode C++题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; class Solution { public:int calculateMinimumHP(vector<vector<int>>& dungeon) {int n dungeon.size(), m dungeon[0].size();vector<vector<int>> dp(n 1, vector<int>(m 1, INT_MAX));dp[n][m …

并发编程-04synchronized原理

并发编程-04synchronized原理 一 synchronized基础 1.1 并发安全问题 在学习synchronized原理之前&#xff0c;我们先要了解synchronized是干嘛用的&#xff0c;什么场景下需要使用它&#xff0c;以及它的使用方式有哪些&#xff1f;接下来我们去根据一个业务场景去了解下sy…

如何高效利用iCloud指南

苹果公司提供的iCloud服务是一个强大的云平台&#xff0c;它不仅允许存储数据&#xff0c;还支持跨设备的无缝同步和备份。通过充分利用iCloud&#xff0c;用户可以在多个设备上高效地访问和管理工作文件、照片、应用程序数据等等。具体分析如下&#xff1a; iCloud基础了解和配…

mysql workbench使用schema视图导出表和列结构到excel

目的&#xff1a;导出所有表和列的名字和注释 很多时候没有正规的数据库文档&#xff0c;为了快速交流啊&#xff0c;需要一个快捷的基础。数据库建表的时候可能有注释&#xff0c;也可能没有注释。有当然好&#xff0c;查看注释就能清楚很多&#xff0c;没有的话最好一个一个补…

这表单时而能使,时而不能使【debug】

项目地址&#xff1a;StrongBySteps-GitHub(一个学习记录与时间管理系统。) 这表单时而能使&#xff0c;时而不能使 在没有填写“绑定子任务”时&#xff0c;修改计划用时&#xff0c;比如我填写的是10。显示修改成功&#xff0c;但实际上并没有修改&#xff08;还是5&#xf…