一、引言
业务场景重要性
数据驱动决策:日活、订单趋势、商品热度等指标对运营的价值
可视化需求:Apache ECharts在前端动态图表展示中的关键作用(简略介绍)
技术栈概览
前端可视化:Apache ECharts(折线图/柱状图)
后端框架:SpringBoot + MyBatis
数据存储:MySQL
二、接口设计概览
接口类型 | 路径 | 核心参数 | 返回数据结构 |
---|---|---|---|
营业额统计 | /admin/report/turnoverStatistics | date (日期范围) |
Result<TurnoverReportVO> |
用户统计 | /admin/report/userStatistics | date |
Result<UserReportVO> |
订单统计 | /admin/report/ordersStatistics | date |
Result<OrderReportVO> |
销量排名TOP10 | /admin/report/top10 | date |
Result<SalesTop10ReportVO> |
三、分层实现详解(核心章节)
一、营业额统计接口
1.Controller
@DateTimeFormat主要作用是将前端传递的字符串类型的日期 / 时间数据,按照指定格式转换为 Java 中的日期 / 时间对象
2.ServerImpl
营业额统计接口实现概要
核心功能
计算指定日期范围内的每日营业额数据
过滤统计条件:仅包含"已完成"状态的订单
实现流程
日期范围处理
生成从
begin
到end
的连续日期序列使用循环逐日增加直到覆盖整个查询区间
每日营业额计算
将日期转换为当天的起止时间点(00:00至23:59)
构建查询参数:
时间范围(当日00:00 - 23:59)
订单状态(已完成)
执行SQL聚合查询获取当日营业额总和
空数据处理
对无订单的日期返回0.0值
避免前端展示断层
结果封装
日期列表转换为逗号分隔字符串
营业额列表转换为逗号分隔字符串
构建VO对象返回给Controller层
3.Mapper/.xml
二、用户统计接口
1.Controller
2.ServerImpl
用户统计接口实现概要
核心功能
统计指定日期范围内的用户增长数据
同步计算每日新增用户数和累计用户总数
覆盖完整日期区间,无数据断层
实现流程
日期范围处理
生成从起始日到结束日的连续日期序列
使用循环逐日推进确保日期连续性
双指标并行计算
每日累计用户:统计截至当日23:59:59的用户总量
仅需传入当日结束时间参数
每日新增用户:统计当日00:00:00-23:59:59的注册量
同时传入当日开始和结束时间参数
精确时间控制
将日期转换为当日精确时间范围
最小时间:00:00:00
最大时间:23:59:59.999999999
结果封装优化
日期序列转换为逗号分隔字符串
用户数据序列转换为逗号分隔数值字符串
构建三列数据返回结构
3.Mapper/.xml
三、订单统计接口
1.Controller
2.ServerImpl
日期序列生成
创建从
begin
到end
的连续日期列表确保日期范围完整性(包含起止日)
双指标同步统计
总订单统计:
查询条件:当日时间范围
无状态过滤
有效订单统计:
查询条件:当日时间范围 + 已完成状态
使用相同Mapper方法通过参数区分
实时聚合计算
循环内累计:
allDateOrders
(总订单量)
allValidOrders
(有效订单量)循环外计算:
orderCompletionRate = allValidOrders / allDateOrders
空值安全机制
无订单日期默认返回0
除零保护:当总订单为0时完成率设为0.0
3.Mapper/.xml
四、销量统计接口
1.Controller
2.ServerImpl
时间范围精确化
起始日转换为当日零点(
00:00:00
)结束日转换为当日最后一刻(
23:59:59.999999
)确保完整覆盖自然日边界
聚合查询执行
调用Mapper执行核心SQL:
数据流转换
名称提取:
List<GoodsSalesDTO> → List<String>
映射函数:
GoodsSalesDTO::getName
销量提取:
List<GoodsSalesDTO> → List<Integer>
映射函数:
GoodsSalesDTO::getNumber
字符串优化封装
名称列表拼接:
List<String> → "商品A,商品B,..."
销量列表拼接:
List<Integer> → "156,142,..."
构建最终VO对象
3.Mapper/.xml
<select id="getTop10" resultType="com.sky.dto.GoodsSalesDTO">
select
od.name, <!-- 商品名称 -->
sum(od.number) number <!-- 总销量(别名number) -->
from
order_detail od, <!-- 订单明细表别名od -->
orders o <!-- 订单主表别名o -->
where
od.order_id = o.id <!-- 两表关联条件 -->
and o.status = 5 <!-- 只统计已完成的订单 -->
<if test="beginTime!=null"> <!-- 动态时间范围 -->
and order_time > #{beginTime} <!-- 开始时间过滤 -->
</if>
<if test="endTime!=null">
and order_time < #{endTime} <!-- 结束时间过滤 -->
</if>
group by
od.name <!-- 按商品名称分组 -->
order by
number desc <!-- 按销量降序排序 -->
limit 0,10 <!-- 取前10条记录 -->
</select>
1.查找两个表分别是order_detail(订单详情表)和orders(订单表)
2.查找订单名,和订单number的数量 并命名为number
3.查找条件是order_detaiol(订单详情表)和order(订单表)的id相同,并且状态码为5(已完成状态)
4.时间必须在条件范围内。
5.根据名字和数量降序排序,
6.只查询前10个。
四、数据展示图
五、总结
本文详细实现了苍穹外卖系统的四个核心数据统计接口:
营业额统计:日期维度营收分析
用户统计:新增用户与总量趋势
订单统计:订单量与完成率分析(含关键实现细节)
销量排名:TOP10商品排行
六、附录
营业额统计接口返回VO
用户数量统计接口返回VO
订单数据统计接口返回VO
销量统计接口返回VO