news 2026/2/3 3:30:35

【苍穹外卖-day12】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【苍穹外卖-day12】

0. 今日总结

  1. 实现了工作台各项数据的显示
  2. 了解了Apache POI:用于交互Microsoft的工具库
  3. 基于Apache POI实现了导出运营数据excel报表

1. 工作台

1.1 需求分析和设计

1.2 代码开发

  • controller

    packagecom.sky.controller.admin;importcom.sky.result.Result;importcom.sky.service.WorkspaceService;importcom.sky.vo.BusinessDataVO;importcom.sky.vo.DishOverViewVO;importcom.sky.vo.OrderOverViewVO;importcom.sky.vo.SetmealOverViewVO;importio.swagger.annotations.Api;importio.swagger.annotations.ApiOperation;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.time.LocalDate;@RestController@RequestMapping("/admin/workspace")@Api(tags="工作台相关接口")@Slf4jpublicclassWorkspaceController{@AutowiredprivateWorkspaceServiceworkspaceService;/** * 今日运营数据 * * @return */@GetMapping("/businessData")@ApiOperation("今日运营数据")publicResult<BusinessDataVO>businessData(){log.info("今日运营数据:{}",LocalDate.now());BusinessDataVObusinessDataVO=workspaceService.businessData();returnResult.success(businessDataVO);}/** * 查询套餐总览 * * @return */@GetMapping("/overviewSetmeals")@ApiOperation("查询套餐总览")publicResult<SetmealOverViewVO>overviewData(){log.info("查询套餐总览");SetmealOverViewVOsetmealOverViewVO=workspaceService.overviewData();returnResult.success(setmealOverViewVO);}/** * 查询菜品总览 * * @return */@GetMapping("/overviewDishes")@ApiOperation("查询菜品总览")publicResult<DishOverViewVO>dishOverviewData(){log.info("查询菜品总览");DishOverViewVOdishOverViewVO=workspaceService.dishOverviewData();returnResult.success(dishOverViewVO);}/** * 查询订单管理数据 * @return */@GetMapping("/overviewOrders")@ApiOperation("查询订单管理数据")publicResult<OrderOverViewVO>orderOverviewData(){log.info("查询订单管理数据");OrderOverViewVOorderOverViewVO=workspaceService.orderOverviewData();returnResult.success(orderOverViewVO);}}
  • service

    packagecom.sky.service.impl;importcom.sky.constant.StatusConstant;importcom.sky.entity.Orders;importcom.sky.entity.Setmeal;importcom.sky.mapper.DishMapper;importcom.sky.mapper.OrderMapper;importcom.sky.mapper.SetmealMapper;importcom.sky.mapper.UserMapper;importcom.sky.service.WorkspaceService;importcom.sky.vo.BusinessDataVO;importcom.sky.vo.DishOverViewVO;importcom.sky.vo.OrderOverViewVO;importcom.sky.vo.SetmealOverViewVO;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.LocalTime;importjava.util.HashMap;importjava.util.List;importjava.util.Map;@ServicepublicclassWorkspaceServiceImplimplementsWorkspaceService{@AutowiredprivateUserMapperuserMapper;@AutowiredprivateOrderMapperorderMapper;@AutowiredprivateSetmealMappersetmealMapper;@AutowiredprivateDishMapperdishMapper;/** * 今日运营数据 * * @return */@OverridepublicBusinessDataVObusinessData(){LocalDatetoday=LocalDate.now();LocalDateTimebegin=LocalDateTime.of(today,LocalTime.MIN);LocalDateTimeend=LocalDateTime.of(today,LocalTime.MAX);Mapmap=newHashMap();map.put("begin",begin);map.put("end",end);//新增用户数IntegernewUsers=userMapper.countByMap(map);//订单完成率//总订单数map.put("status",null);doubletotalOrders=orderMapper.getByBeginAndEnd(map);//有效订单数map.put("status",Orders.COMPLETED);doubletotalCompletionOrders=orderMapper.getByBeginAndEnd(map);//订单完成率doubleorderCompletionRate=totalCompletionOrders/totalOrders;//营业额Doublesum=orderMapper.sumByMap(map);//平均客单价doubleunitPrice=0.0;if(totalCompletionOrders!=0){unitPrice=sum/totalCompletionOrders;}returnBusinessDataVO.builder().newUsers(newUsers).validOrderCount((int)totalCompletionOrders).orderCompletionRate(orderCompletionRate).turnover(sum).unitPrice(unitPrice).build();}/** * 查询套餐总览 * * @return */@OverridepublicSetmealOverViewVOoverviewData(){Integersold;Integerdiscontinued;Integerstatus;status=StatusConstant.ENABLE;sold=setmealMapper.countByStatus(status);status=StatusConstant.DISABLE;discontinued=setmealMapper.countByStatus(status);returnSetmealOverViewVO.builder().sold(sold).discontinued(discontinued).build();}/** * 查询菜品总览 * * @return */@OverridepublicDishOverViewVOdishOverviewData(){Integersold;Integerdiscontinued;Integerstatus;status=StatusConstant.ENABLE;sold=dishMapper.countByStatus(status);status=StatusConstant.DISABLE;discontinued=dishMapper.countByStatus(status);returnDishOverViewVO.builder().sold(sold).discontinued(discontinued).build();}/** * 查询订单管理数据 * * @return */@OverridepublicOrderOverViewVOorderOverviewData(){LocalDatetoday=LocalDate.now();LocalDateTimebegin=LocalDateTime.of(today,LocalTime.MIN);LocalDateTimeend=LocalDateTime.of(today,LocalTime.MAX);Mapmap=newHashMap();map.put("begin",begin);map.put("end",end);map.put("status",null);//所有订单doubleallOrders=orderMapper.getByBeginAndEnd(map);//已取消订单map.put("status",Orders.CANCELLED);doublecancelledOrders=orderMapper.getByBeginAndEnd(map);//已完成订单map.put("status",Orders.COMPLETED);doublecompletedOrders=orderMapper.getByBeginAndEnd(map);//待派送订单map.put("status",Orders.CONFIRMED);doubledeliveredOrders=orderMapper.getByBeginAndEnd(map);//待接单订单map.put("status",Orders.TO_BE_CONFIRMED);doublewaitingOrders=orderMapper.getByBeginAndEnd(map);returnOrderOverViewVO.builder().allOrders((int)allOrders).cancelledOrders((int)cancelledOrders).completedOrders((int)completedOrders).deliveredOrders((int)deliveredOrders).waitingOrders((int)waitingOrders).build();}}
  • mapper

    @Select("select count(id) from dish where status = #{status}")IntegercountByStatus(Integerstatus);
    @Select("select count(id) from setmeal where status = #{status}")IntegercountByStatus(Integerstatus);

1.3 功能测试

2. Apache POI

2.1 介绍

  • 介绍

    Apache POl是一个处理Microsoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Microsoft Office各种文件进行读写操作。
    一般情况下,POI都是用于操作 Excel 文件。

  • 应用场景

    1. 银行网银系统导出交易明细
    2. 各种业务系统导出Excel报表
    3. 批量导入业务数据

2.2 入门案例

  1. 导入maven坐标

  2. 通过POI向文件中写入内容

    publicstaticvoidwrite()throwsIOException{XSSFWorkbookexcel=newXSSFWorkbook();XSSFSheetsheet=excel.createSheet("info");XSSFRowrow=sheet.createRow(1);//创建单元格,写入文件内容row.createCell(1).setCellValue("姓名");row.createCell(2).setCellValue("城市");//创建一个新行row=sheet.createRow(2);row.createCell(1).setCellValue("张三");row.createCell(2).setCellValue("北京");//创建一个新行row=sheet.createRow(3);row.createCell(1).setCellValue("李四");row.createCell(2).setCellValue("南京");//通过输出流吧内存中的excel文件写入磁盘FileOutputStreamout=newFileOutputStream(newFile("D:\\gjh\\java\\javaFile\\info.xlsx"));excel.write(out);//关闭资源out.close();excel.close();}

  3. 通过POI从xlsx文件读取内容

    publicstaticvoidread()throwsException{FileInputStreaminput=newFileInputStream(newFile("D:\\gjh\\java\\javaFile\\info.xlsx"));XSSFWorkbookexcel=newXSSFWorkbook(input);//读取excel文件中的第一个sheetXSSFSheetsheet=excel.getSheetAt(0);//获取sheet页中最后一行行号intlastRowNum=sheet.getLastRowNum();for(inti=1;i<=lastRowNum;i++){//获得某一行XSSFRowrow=sheet.getRow(i);//获得单元格StringcellValue1=row.getCell(1).getStringCellValue();StringcellValue2=row.getCell(2).getStringCellValue();System.out.println(cellValue1+" "+cellValue2);}//关闭资源excel.close();input.close();}

3. 导出运营数据Excel报表

3.1 需求分析和设计

3.2 代码开发

  • controller层

    HttpServletResponse是一个对前端的回信工具,常规情况下,如果返回数据是JSON类型的数据,则Spring MVC会调用HttpServletResponse自动封装并返回,但是这里返回值是void类型,我们要做的也是输出报表而非将数据返回给前端,因此获取HttpServletResponse对象,自行进行响应操作

  • service层

    @OverridepublicvoidexportBusinessData(HttpServletResponseresponse){//1.查询数据库,获取营业数据,查询最近30天的数据LocalDatedateBegin=LocalDate.now().minusDays(30);LocalDatedateEnd=LocalDate.now().minusDays(1);LocalDateTimebegin=LocalDateTime.of(dateBegin,LocalTime.MIN);LocalDateTimeend=LocalDateTime.of(dateEnd,LocalTime.MAX);//查询概览数据BusinessDataVObusinessDataVO=workspaceService.businessData(begin,end);//2.通过POI将数据写入excel文件中InputStreamin=this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");//基于模板文件创建一个新的excel文件try{XSSFWorkbookexcel=newXSSFWorkbook(in);//获取表格文件的Sheet页XSSFSheetsheet=excel.getSheet("sheet1");//填充数据--时间,第二行sheet.getRow(1).getCell(1).setCellValue("时间:"+dateBegin+"至"+dateEnd);//获取第四行XSSFRowrow=sheet.getRow(3);row.getCell(2).setCellValue(businessDataVO.getTurnover());row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());row.getCell(6).setCellValue(businessDataVO.getNewUsers());//获取第五行row=sheet.getRow(4);row.getCell(2).setCellValue(businessDataVO.getValidOrderCount());row.getCell(4).setCellValue(businessDataVO.getUnitPrice());//填充明细数据for(inti=0;i<30;i++){LocalDatedate=dateBegin.plusDays(i);//查询某一天的营业数据BusinessDataVObusinessData=workspaceService.businessData(LocalDateTime.of(date,LocalTime.MIN),LocalDateTime.of(date,LocalTime.MAX));//获取某一行if(businessData!=null){row=sheet.getRow(7+i);row.getCell(1).setCellValue(date.toString());row.getCell(2).setCellValue(businessData.getTurnover());row.getCell(3).setCellValue(businessData.getValidOrderCount());row.getCell(4).setCellValue(businessData.getOrderCompletionRate());row.getCell(5).setCellValue(businessData.getUnitPrice());row.getCell(6).setCellValue(businessData.getNewUsers());}}//3.通过输出流将Excel文件下载到客户端浏览器//通过response对象获取输出流ServletOutputStreamout=response.getOutputStream();excel.write(out);//关闭资源out.close();excel.close();}catch(IOExceptione){thrownewRuntimeException(e);}}
  1. 获取最近三十天的起始天和结束天的LocalDateTime对象

  2. 调用workspaceService的businessData的方法,查询概览数据

  3. 通过POI将数据写入excel中

    1. 通过反射技术获取当前类的类加载器,然后让它从类路径(classpath)的根目录开始,根据提供的相对路径去查找资源文件,并返回一个可用于读取文件内容的输入流

    2. 创建excel文件,基于刚刚获取的模板的输入流

    3. 填充运营数据报表时间和概览数据

    4. 循环30次填充三十天的每天明细数据

  4. 通过response对象获取输出流,并将刚刚准备好的的数据通过excel.write写到输出流中(excel.write(out)方法的本质,是将内存中构建好的XSSFWorkbook对象,按照Office Open XML (OOXML) 标准格式(即.xlsx文件的本质)序列化成一连串的字节,并直接写入到这个网络流中)

3.3 功能测试

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/27 9:26:15

C# AES加密在医疗系统中的真实应用案例(含完整源码与审计建议)

第一章&#xff1a;医疗系统中C# AES加密的应用背景 在现代医疗信息系统中&#xff0c;患者数据的隐私性和完整性至关重要。随着电子病历&#xff08;EMR&#xff09;、远程诊疗和健康数据云存储的普及&#xff0c;敏感信息如身份证号、诊断记录和用药历史面临更高的泄露风险。…

作者头像 李华
网站建设 2026/1/31 17:08:32

java计算机毕业设计球鞋商城系统小程序 基于SpringBoot的潮鞋微商城小程序设计与实现 JavaWeb限量球鞋交易平台小程序开发

计算机毕业设计球鞋商城系统小程序n1wr89 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“排队抽签”搬到微信入口&#xff0c;当“限量发售”被压缩成一次指尖轻点&#xff…

作者头像 李华
网站建设 2026/1/28 10:46:35

Wan2.2-T2V-A14B能否生成黑白老电影风格?怀旧滤镜测试

Wan2.2-T2V-A14B能否生成黑白老电影风格&#xff1f;怀旧滤镜测试 在短视频泛滥、视觉刺激饱和的今天&#xff0c;一种反向的审美正在悄然兴起&#xff1a;人们开始怀念那些画面模糊、节奏缓慢、带着胶片颗粒与轻微抖动的老电影。那种不属于这个时代的“不完美”&#xff0c;反…

作者头像 李华
网站建设 2026/1/31 23:14:02

终极指南:原神自动化工具BetterGI完整使用手册

终极指南&#xff1a;原神自动化工具BetterGI完整使用手册 【免费下载链接】better-genshin-impact &#x1f368;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动派遣 | 一键强化 - UI Automation Testing Tools For Genshi…

作者头像 李华
网站建设 2026/2/2 9:17:19

在Linux中如何查看内存使用情况?

内存是Linux系统高效运行的核心资源&#xff0c;实时监控和分析内存使用情况&#xff0c;是排查系统卡顿、优化性能、避免 OOM(内存溢出)故障的关键。那么如何查看Linux内存使用情况?我们通过这篇文章来介绍一下。1.使用free命令查看内存概览free是最常用的查看内存使用情况的…

作者头像 李华