简介:这是一个完整外卖项目,包括前端页面设计、后端逻辑代码和数据库。小编在这里详细展示了编码步骤、注意事项、相关BUG解决方案以及最最重要的就是源代码和部署过程。
(备注:项目来源于B站的黑马课程,如果时间允许还是建议同学们可以认真的从头到尾去学习,这样对于开发来说会有更好的掌握)
目录
-
软件开发整体介绍
- 软件开发流程
- 角色分工
- 软件环境
-
苍穹外卖项目介绍
- 项目介绍
- 产品原型
- 技术选型
-
开发环境搭建
- 前端环境搭建
- 后端环境搭建
- 后端环境搭建---使用Git进行版本控制
- 后端环境搭建---数据库环境搭建
- 后端环境搭建---前后端联调
- 完善登录功能
-
导入接口文档
- 前后端分离开发流程
- 操作步骤
-
Swagger
- Swagger介绍
- 使用方式
- 常用注解
-
员工管理
- 新增员工
- 需求分析和设计
- 代码开发
- 功能测试
- 完善代码
- 员工分页查询
- 需求分析和设计
- 代码开发
- 启用禁用员工账号
- 需求分析和设计
- 代码开发
- 编辑员工
- 分类模块
- 新增员工
-
公共字段自动填充
- 问题分析
- 实现思路
- 代码开发
-
新增菜品
- 需求分析和设计
- 代码开发
-
菜品分页查询
- 需求分析和设计
- 代码开发
-
删除菜品
- 需求分析和设计
- 代码开发
-
修改菜品
- 需求分析和设计
- 代码开发
-
清空购物车
- 需求分析和设计
- 代码开发
-
导入地址簿
- 需求分析和设计
- 代码开发
- 查询当前登录用户的所有地址信息
- 新增地址
- 设置默认地址
- 查询默认地址
-
用户下单
- 需求分析和设计
- 代码开发
-
订单支付
- 需求分析和设计
- 微信支付准备工作
- 如何保障支付过程安全性
- 微信后台如何调用商户系统
- 代码开发
- 代码导入
- 微信支付工具类
- 支付成功进行回调
-
订单状态定时更新
- 需求分析和设计
- 代码开发
-
来单提醒
- 需求分析和设计
- 代码开发
-
客户催单
- 需求分析和设计
- 代码开发
-
营业额统计
- 需求分析和设计
- 代码开发
-
用户统计
- 需求分析和设计
- 代码开发
-
订单统计
- 需求分析和设计
- 代码开发
-
销量排名
- 需求分析和设计
- 代码开发
-
工作台
- 需求分析和设计
- 代码开发
-
总结
1、软件开发整体介绍
1.1 软件开发流程
图 1.1-1 软件开发流程
1.2 角色分工
- 项目经理:对整个项目负责、任务分配、把控进度
- 产品经理:进行需求调研,输出需求调研文档、产品原型等
- UI设计师:根据产品原型输出界面效果图
- 架构师:项目整体架构设计、技术选型
- 开发工程师:代码实现(小编的身份)
- 测试工程师:编写测试用例、输出测试报告
- 运维工程师:软件环境搭建、项目上线
1.3 软件环境
图 1.3-1 软件环境
上图是开发人员、测试人员以及在最后上线提供服务的服务器的介绍。
2、苍穹外卖项目介绍
2.1 项目介绍
图 2.1-1 功能架构
上图是本外卖项目的功能架构在管理端、用户端各个业务功能模块。
2.2 产品原型
图 2.2-1 产品原型
上图中展示的是产品原型,展示了各个业务具体的功能模块具有那些功能和对应开发标准,开发者根据产品原型进行编码实现对应的功能。
2.3 技术选型
图 2.3-1 技术选型
上图中重要说明了,开发当前外卖系统需要使用的技术框架、中间件等。其中用户层、网关层、应用层、数据层各自用到哪些技术都已标注。
3、开发环境搭建
3.1 前端环境搭建
图 3.1-1 前端环境搭建
在这里我是将前端项目运行在 nginx 中,这里读者可以去官网下载,也可以在直接通过百度网盘直接下载:
网盘地址:nginx下载 提取码:6666
注意:nginx不能运行在中文目录中,所以在安装时不能出现中文目录
启动 nginx ,点击nginx.exe启动,运行端口号为80
3.2 后端环境搭建
3.2.1 后端环境搭建---使用Git进行版本控制
使用Git进行项目代码的版本控制,具体操作:
- 创建Git本地仓库
- 创建Git远程仓库
- 将本地文件推送到远程Git仓库
3.2.2 后端环境搭建---数据库环境搭建
sql
CREATE DATABASE IF NOT EXISTS `sky_take_out` ;
USE `sky_take_out`;
DROP TABLE IF EXISTS `address_book`;
CREATE TABLE `address_book` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` bigint NOT NULL COMMENT '用户id',
`consignee` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人',
`sex` varchar(2) COLLATE utf8_bin DEFAULT NULL COMMENT '性别',
`phone` varchar(11) COLLATE utf8_bin NOT NULL COMMENT '手机号',
`province_code` varchar(12) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '省级区划编号',
`province_name` varchar(32) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '省级名称',
`city_code` varchar(12) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '市级区划编号',
`city_name` varchar(32) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '市级名称',
`district_code` varchar(12) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '区级区划编号',
`district_name` varchar(32) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '区级名称',
`detail` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '详细地址',
`label` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '标签',
`is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '默认 0 否 1是',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='地址簿';
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`type` int DEFAULT NULL COMMENT '类型 1 菜品分类 2 套餐分类',
`name` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '分类名称',
`sort` int NOT NULL DEFAULT '0' COMMENT '顺序',
`status` int DEFAULT NULL COMMENT '分类状态 0:禁用,1:启用',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_user` bigint DEFAULT NULL COMMENT '创建人',
`update_user` bigint DEFAULT NULL COMMENT '修改人',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_category_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='菜品及套餐分类';
INSERT INTO `category` VALUES (11,1,'酒水饮料',10,1,'2022-06-09 22:09:18','2022-06-09 22:09:18',1,1);
INSERT INTO `category` VALUES (12,1,'传统主食',9,1,'2022-06-09 22:09:32','2022-06-09 22:18:53',1,1);
INSERT INTO `category` VALUES (13,2,'人气套餐',12,1,'2022-06-09 22:11:38','2022-06-10 11:04:40',1,1);
INSERT INTO `category` VALUES (15,2,'商务套餐',13,1,'2022-06-09 22:14:10','2022-06-10 11:04:48',1,1);
INSERT INTO `category` VALUES (16,1,'蜀味烤鱼',4,1,'2022-06-09 22:15:37','2022-08-31 14:27:25',1,1);
INSERT INTO `category` VALUES (17,1,'蜀味牛蛙',5,1,'2022-06-09 22:16:14','2022-08-31 14:39:44',1,1);
INSERT INTO `category` VALUES (18,1,'特色蒸菜',6,1,'2022-06-09 22:17:42','2022-06-09 22:17:42',1,1);
INSERT INTO `category` VALUES (19,1,'新鲜时蔬',7,1,'2022-06-09 22:18:12','2022-06-09 22:18:28',1,1);
INSERT INTO `category` VALUES (20,1,'水煮鱼',8,1,'2022-06-09 22:22:29','2022-06-09 22:23:45',1,1);
INSERT INTO `category` VALUES (21,1,'汤类',11,1,'2022-06-10 10:51:47','2022-06-10 10:51:47',1,1);
DROP TABLE IF EXISTS `dish`;
CREATE TABLE `dish` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '菜品名称',
`category_id` bigint NOT NULL COMMENT '菜品分类id',
`price` decimal(10,2) DEFAULT NULL COMMENT '菜品价格',
`image` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '图片',
`description` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '描述信息',
`status` int DEFAULT '1' COMMENT '0 停售 1 起售',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_user` bigint DEFAULT NULL COMMENT '创建人',
`update_user` bigint DEFAULT NULL COMMENT '修改人',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_dish_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='菜品';
INSERT INTO `dish` VALUES (46,'王老吉',11,6.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/41bfcacf-7ad4-4927-8b26-df366553a94c.png','',1,'2022-06-09 22:40:47','2022-06-09 22:40:47',1,1);
INSERT INTO `dish` VALUES (47,'北冰洋',11,4.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/4451d4be-89a2-4939-9c69-3a87151cb979.png','还是小时候的味道',1,'2022-06-10 09:18:49','2022-06-10 09:18:49',1,1);
INSERT INTO `dish` VALUES (48,'雪花啤酒',11,4.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/bf8cbfc1-04d2-40e8-9826-061ee41ab87c.png','',1,'2022-06-10 09:22:54','2022-06-10 09:22:54',1,1);
INSERT INTO `dish` VALUES (49,'米饭',12,2.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/76752350-2121-44d2-b477-10791c23a8ec.png','精选五常大米',1,'2022-06-10 09:30:17','2022-06-10 09:30:17',1,1);
INSERT INTO `dish` VALUES (50,'馒头',12,1.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/475cc599-8661-4899-8f9e-121dd8ef7d02.png','优质面粉',1,'2022-06-10 09:34:28','2022-06-10 09:34:28',1,1);
INSERT INTO `dish` VALUES (51,'老坛酸菜鱼',20,56.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/4a9cefba-6a74-467e-9fde-6e687ea725d7.png','原料:汤,草鱼,酸菜',1,'2022-06-10 09:40:51','2022-06-10 09:40:51',1,1);
INSERT INTO `dish` VALUES (52,'经典酸菜鮰鱼',20,66.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/5260ff39-986c-4a97-8850-2ec8c7583efc.png','原料:酸菜,江团,鮰鱼',1,'2022-06-10 09:46:02','2022-06-10 09:46:02',1,1);
INSERT INTO `dish` VALUES (53,'蜀味水煮草鱼',20,38.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/a6953d5a-4c18-4b30-9319-4926ee77261f.png','原料:草鱼,汤',1,'2022-06-10 09:48:37','2022-06-10 09:48:37',1,1);
INSERT INTO `dish` VALUES (54,'清炒小油菜',19,18.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/3613d38e-5614-41c2-90ed-ff175bf50716.png','原料:小油菜',1,'2022-06-10 09:51:46','2022-06-10 09:51:46',1,1);
INSERT INTO `dish` VALUES (55,'蒜蓉娃娃菜',19,18.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/4879ed66-3860-4b28-ba14-306ac025fdec.png','原料:蒜,娃娃菜',1,'2022-06-10 09:53:37','2022-06-10 09:53:37',1,1);
INSERT INTO `dish` VALUES (56,'清炒西兰花',19,18.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/e9ec4ba4-4b22-4fc8-9be0-4946e6aeb937.png','原料:西兰花',1,'2022-06-10 09:55:44','2022-06-10 09:55:44',1,1);
INSERT INTO `dish` VALUES (57,'炝炒圆白菜',19,18.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/22f59feb-0d44-430e-a6cd-6a49f27453ca.png','原料:圆白菜',1,'2022-06-10 09:58:35','2022-06-10 09:58:35',1,1);
INSERT INTO `dish` VALUES (58,'清蒸鲈鱼',18,98.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/c18b5c67-3b71-466c-a75a-e63c6449f21c.png','原料:鲈鱼',1,'2022-06-10 10:12:28','2022-06-10 10:12:28',1,1);
INSERT INTO `dish` VALUES (59,'东坡肘子',18,138.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/a80a4b8c-c93e-4f43-ac8a-856b0d5cc451.png','原料:猪肘棒',1,'2022-06-10 10:24:03','2022-06-10 10:24:03',1,1);
INSERT INTO `dish` VALUES (60,'梅菜扣肉',18,58.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/6080b118-e30a-4577-aab4-45042e3f88be.png','原料:猪肉,梅菜',1,'2022-06-10 10:26:03','2022-06-10 10:26:03',1,1);
INSERT INTO `dish` VALUES (61,'剁椒鱼头',18,66.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/13da832f-ef2c-484d-8370-5934a1045a06.png','原料:鲢鱼,剁椒',1,'2022-06-10 10:28:54','2022-06-10 10:28:54',1,1);
INSERT INTO `dish` VALUES (62,'金汤酸菜牛蛙',17,88.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/7694a5d8-7938-4e9d-8b9e-2075983a2e38.png','原料:鲜活牛蛙,酸菜',1,'2022-06-10 10:33:05','2022-06-10 10:33:05',1,1);
INSERT INTO `dish` VALUES (63,'香锅牛蛙',17,88.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/f5ac8455-4793-450c-97ba-173795c34626.png','配料:鲜活牛蛙,莲藕,青笋',1,'2022-06-10 10:35:40','2022-06-10 10:35:40',1,1);
INSERT INTO `dish` VALUES (64,'馋嘴牛蛙',17,88.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/7a55b845-1f2b-41fa-9486-76d187ee9ee1.png','配料:鲜活牛蛙,丝瓜,黄豆芽',1,'2022-06-10 10:37:52','2022-06-10 10:37:52',1,1);
INSERT INTO `dish` VALUES (65,'草鱼2斤',16,68.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/b544d3ba-a1ae-4d20-a860-81cb5dec9e03.png','原料:草鱼,黄豆芽,莲藕',1,'2022-06-10 10:41:08','2022-06-10 10:41:08',1,1);
INSERT INTO `dish` VALUES (66,'江团鱼2斤',16,119.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/a101a1e9-8f8b-47b2-afa4-1abd47ea0a87.png','配料:江团鱼,黄豆芽,莲藕',1,'2022-06-10 10:42:42','2022-06-10 10:42:42',1,1);
INSERT INTO `dish` VALUES (67,'鮰鱼2斤',16,72.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/8cfcc576-4b66-4a09-ac68-ad5b273c2590.png','原料:鮰鱼,黄豆芽,莲藕',1,'2022-06-10 10:43:56','2022-06-10 10:43:56',1,1);
INSERT INTO `dish` VALUES (68,'鸡蛋汤',21,4.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/c09a0ee8-9d19-428d-81b9-746221824113.png','配料:鸡蛋,紫菜',1,'2022-06-10 10:54:25','2022-06-10 10:54:25',1,1);
INSERT INTO `dish` VALUES (69,'平菇豆腐汤',21,6.00,'https://sky-itcast.oss-cn-beijing.aliyuncs.com/16d0a3d6-2253-4cfc-9b49-bf5b273c25ad2.png','配料:豆腐,平菇',1,'2022-06-10 10:55:02','2022-06-10 10:55:02',1,1);
DROP TABLE IF EXISTS `dish_flavor`;
CREATE TABLE `dish_flavor` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`dish_id` bigint NOT NULL COMMENT '菜品',
`name` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '口味名称',
`value` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '口味数据list',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=104 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='菜品口味关系表';
INSERT INTO `dish_flavor` VALUES (40,10,'甜味','[\"无糖\",\"少糖\",\"半糖\",\"多糖\",\"全糖\"]');
INSERT INTO `dish_flavor` VALUES (41,7,'忌口','[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]');
INSERT INTO `dish_flavor` VALUES (42,7,'温度','[\"热饮\",\"常温\",\"去冰\",\"少冰\",\"多冰\"]');
INSERT INTO `dish_flavor` VALUES (45,6,'忌口','[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]');
INSERT INTO `dish_flavor` VALUES (46,6,'辣度','[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]');
INSERT INTO `dish_flavor` VALUES (47,5,'辣度','[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]');
INSERT INTO `dish_flavor` VALUES (48,5,'甜味','[\"无糖\",\"少糖\",\"半糖\",\"多糖\",\"全糖\"]');
INSERT INTO `dish_flavor` VALUES (49,2,'甜味','[\"无糖\",\"少糖\",\"半糖\",\"多糖\",\"全糖\"]');
INSERT INTO `dish_flavor` VALUES (50,4,'甜味','[\"无糖\",\"少糖\",\"半糖\",\"多糖\",\"全糖\"]');
INSERT INTO `dish_flavor` VALUES (51,3,'甜味','[\"无糖\",\"少糖\",\"半糖\",\"多糖\",\"全糖\"]');
INSERT INTO `dish_flavor` VALUES (52,3,'忌口','[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]');
INSERT INTO `dish_flavor` VALUES (86,52,'忌口','[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]');
INSERT INTO `dish_flavor` VALUES (87,52,'辣度','[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]');
INSERT INTO `dish_flavor` VALUES (88,51,'忌口','[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]');
INSERT INTO `dish_flavor` VALUES (89,51,'辣度','[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]');
INSERT INTO `dish_flavor` VALUES (92,53,'忌口','[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]');
INSERT INTO `dish_flavor` VALUES (93,53,'辣度','[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]');
INSERT INTO `dish_flavor` VALUES (94,54,'忌口','[\"不要葱\",\"不要蒜\",\"不要香菜\"]');
INSERT INTO `dish_flavor` VALUES (95,56,'忌口','[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]');
INSERT INTO `dish_flavor` VALUES (96,57,'忌口','[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]');
INSERT INTO `dish_flavor` VALUES (97,60,'忌口','[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]');
INSERT INTO `dish_flavor` VALUES (101,66,'辣度','[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]');
INSERT INTO `dish_flavor` VALUES (102,67,'辣度','[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]');
INSERT INTO `dish_flavor` VALUES (103,65,'辣度','[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]');
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '姓名',
`username` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '用户名',
`password` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '密码',
`phone` varchar(11) COLLATE utf8_bin NOT NULL COMMENT '手机号',
`sex` varchar(2) COLLATE utf8_bin NOT NULL COMMENT '性别',
`id_number` varchar(18) COLLATE utf8_bin NOT NULL COMMENT '身份证号',
`status` int NOT NULL DEFAULT '1' COMMENT '状态 0:禁用,1:启用',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_user` bigint DEFAULT NULL COMMENT '创建人',
`update_user` bigint DEFAULT NULL COMMENT '修改人',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='员工信息';
INSERT INTO `employee` VALUES (1,'管理员','admin','123456','13812312312','1','110101199001010047',1,'2022-02-15 15:51:20','2022-02-17 09:16:20',10,1);
DROP TABLE IF EXISTS `order_detail`;
CREATE TABLE `order_detail` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '名字',
`image` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '图片',
`order_id` bigint NOT NULL COMMENT '订单id',
`dish_id` bigint DEFAULT NULL COMMENT '菜品id',
`setmeal_id` bigint DEFAULT NULL COMMENT '套餐id',
`dish_flavor` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '口味',
`number` int NOT NULL DEFAULT '1' COMMENT '数量',
`amount` decimal(10,2) NOT NULL COMMENT '金额',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='订单明细表';
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`number` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '订单号',
`status` int NOT NULL DEFAULT '1' COMMENT '订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 7退款',
`user_id` bigint NOT NULL COMMENT '下单用户',
`address_book_id` bigint NOT NULL COMMENT '地址id',
`order_time` datetime NOT NULL COMMENT '下单时间',
`checkout_time` datetime DEFAULT NULL COMMENT '付款时间',
`pay_method` int NOT NULL DEFAULT '1' COMMENT '支付方式 1微信,2支付宝',
`pay_status` tinyint NOT NULL DEFAULT '0' COMMENT '支付状态 0未支付 1已支付 2退款',
`amount` decimal(10,2) NOT NULL COMMENT '实收金额',
`remark` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '备注',
`phone` varchar(11) COLLATE utf8_bin DEFAULT NULL COMMENT '手机号',
`address` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '地址',
`user_name` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '用户名称',
`consignee` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人',
`cancel_reason` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '订单取消原因',
`rejection_reason` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '订单拒绝原因',
`cancel_time` datetime DEFAULT NULL COMMENT '订单取消时间',
`estimated_delivery_time` datetime DEFAULT NULL COMMENT '预计送达时间',
`delivery_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '配送状态 1立即送出 0选择具体时间',
`delivery_time` datetime DEFAULT NULL COMMENT '送达时间',
`pack_amount` int DEFAULT NULL COMMENT '打包费',
`tableware_number` int DEFAULT NULL COMMENT '餐具数量',
`tableware_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '餐具数量状态 1按餐量提供 0选择具体数量',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='订单表';
DROP TABLE IF EXISTS `setmeal`;
CREATE TABLE `setmeal` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`category_id` bigint NOT NULL COMMENT '菜品分类id',
`name` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '套餐名称',
`price` decimal(10,2) NOT NULL COMMENT '套餐价格',
`status` int DEFAULT '1' COMMENT '售卖状态 0:停售 1:起售',
`description` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '描述信息',
`image` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '图片',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_user` bigint DEFAULT NULL COMMENT '创建人',
`update_user` bigint DEFAULT NULL COMMENT '修改人',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_setmeal_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='套餐';
DROP TABLE IF EXISTS `setmeal_dish`;
CREATE TABLE `setmeal_dish` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`setmeal_id` bigint DEFAULT NULL COMMENT '套餐id',
`dish_id` bigint DEFAULT NULL COMMENT '菜品id',
`name` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '菜品名称 (冗余字段)',
`price` decimal(10,2) DEFAULT NULL COMMENT '菜品单价(冗余字段)',
`copies` int DEFAULT NULL COMMENT '菜品份数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='套餐菜品关系';
DROP TABLE IF EXISTS `shopping_cart`;
CREATE TABLE `shopping_cart` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '商品名称',
`image` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '图片',
`user_id` bigint NOT NULL COMMENT '主键',
`dish_id` bigint DEFAULT NULL COMMENT '菜品id',
`setmeal_id` bigint DEFAULT NULL COMMENT '套餐id',
`dish_flavor` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '口味',
`number` int NOT NULL DEFAULT '1' COMMENT '数量',
`amount` decimal(10,2) NOT NULL COMMENT '金额',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='购物车';
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`openid` varchar(45) COLLATE utf8_bin DEFAULT NULL COMMENT '微信用户唯一标识',
`name` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '姓名',
`phone` varchar(11) COLLATE utf8_bin DEFAULT NULL COMMENT '手机号',
`sex` varchar(2) COLLATE utf8_bin DEFAULT NULL COMMENT '性别',
`id_number` varchar(18) COLLATE utf8_bin DEFAULT NULL COMMENT '身份证号',
`avatar` varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT '头像',
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='用户信息';
数据库设计文档
- employee
employee表为员工表,用于存储商家内部的员工信息。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
name varchar(32) 姓名
username varchar(32) 用户名 唯一
password varchar(64) 密码
phone varchar(11) 手机号
sex varchar(2) 性别
id_number varchar(18) 身份证号
status int 账号状态 1正常 0锁定
create_time datetime 创建时间
update_time datetime 最后修改时间
create_user bigint 创建人id
update_user bigint 最后修改人id
- category
category表为分类表,用于存储商品的分类信息。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
name varchar(32) 分类名称 唯一
type int 分类类型 1菜品分类 2套餐分类
sort int 排序字段 用于分类数据的排序
status int 状态 1启用 0禁用
create_time datetime 创建时间
update_time datetime 最后修改时间
create_user bigint 创建人id
update_user bigint 最后修改人id
- dish
dish表为菜品表,用于存储菜品的信息。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
name varchar(32) 菜品名称 唯一
category_id bigint 分类id 逻辑外键
price decimal(10,2) 菜品价格
image varchar(255) 图片路径
description varchar(255) 菜品描述
status int 售卖状态 1起售 0停售
create_time datetime 创建时间
update_time datetime 最后修改时间
create_user bigint 创建人id
update_user bigint 最后修改人id
- dish_flavor
dish_flavor表为菜品口味表,用于存储菜品的口味信息。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
dish_id bigint 菜品id 逻辑外键
name varchar(32) 口味名称
value varchar(255) 口味值
- setmeal
setmeal表为套餐表,用于存储套餐的信息。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
name varchar(32) 套餐名称 唯一
category_id bigint 分类id 逻辑外键
price decimal(10,2) 套餐价格
image varchar(255) 图片路径
description varchar(255) 套餐描述
status int 售卖状态 1起售 0停售
create_time datetime 创建时间
update_time datetime 最后修改时间
create_user bigint 创建人id
update_user bigint 最后修改人id
- setmeal_dish
setmeal_dish表为套餐菜品关系表,用于存储套餐和菜品的关联关系。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
setmeal_id bigint 套餐id 逻辑外键
dish_id bigint 菜品id 逻辑外键
name varchar(32) 菜品名称 冗余字段
price decimal(10,2) 菜品单价 冗余字段
copies int 菜品份数
- user
user表为用户表,用于存储C端用户的信息。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
openid varchar(45) 微信用户的唯一标识
name varchar(32) 用户姓名
phone varchar(11) 手机号
sex varchar(2) 性别
id_number varchar(18) 身份证号
avatar varchar(500) 微信用户头像路径
create_time datetime 注册时间
- address_book
address_book表为地址表,用于存储C端用户的收货地址信息。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
user_id bigint 用户id 逻辑外键
consignee varchar(50) 收货人
sex varchar(2) 性别
phone varchar(11) 手机号
province_code varchar(12) 省份编码
province_name varchar(32) 省份名称
city_code varchar(12) 城市编码
city_name varchar(32) 城市名称
district_code varchar(12) 区县编码
district_name varchar(32) 区县名称
detail varchar(200) 详细地址信息 具体到门牌号
label varchar(100) 标签 公司、家、学校
is_default tinyint(1) 是否默认地址 1是 0否
- shopping_cart
shopping_cart表为购物车表,用于存储C端用户的购物车信息。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
name varchar(32) 商品名称
image varchar(255) 商品图片路径
user_id bigint 用户id 逻辑外键
dish_id bigint 菜品id 逻辑外键
setmeal_id bigint 套餐id 逻辑外键
dish_flavor varchar(50) 菜品口味
number int 商品数量
amount decimal(10,2) 商品单价
create_time datetime 创建时间
- orders
orders表为订单表,用于存储C端用户的订单数据。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
number varchar(50) 订单号
status int 订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
user_id bigint 用户id 逻辑外键
address_book_id bigint 地址id 逻辑外键
order_time datetime 下单时间
checkout_time datetime 付款时间
pay_method int 支付方式 1微信支付 2支付宝支付
pay_status tinyint 支付状态 0未支付 1已支付 2退款
amount decimal(10,2) 订单金额
remark varchar(100) 备注信息
phone varchar(11) 手机号
address varchar(255) 详细地址信息
user_name varchar(32) 用户姓名
consignee varchar(32) 收货人
cancel_reason varchar(255) 订单取消原因
rejection_reason varchar(255) 拒单原因
cancel_time datetime 订单取消时间
estimated_delivery_time datetime 预计送达时间
delivery_status tinyint 配送状态 1立即送出 0选择具体时间
delivery_time datetime 送达时间
pack_amount int 打包费
tableware_number int 餐具数量
tableware_status tinyint 餐具数量状态 1按餐量提供 0选择具体数量
- order_detail
order_detail表为订单明细表,用于存储C端用户的订单明细数据。具体表结构如下:
字段名 数据类型 说明 备注
id bigint 主键 自增
name varchar(32) 商品名称
image varchar(255) 商品图片路径
order_id bigint 订单id 逻辑外键
dish_id bigint 菜品id 逻辑外键
setmeal_id bigint 套餐id 逻辑外键
dish_flavor varchar(50) 菜品口味
number int 商品数量
amount decimal(10,2) 商品单价
3.2.3 后端环境搭建---前后端联调
图 3.2.3-1 联调过程图
当后端的初始工程已经实现了登录功能,直接进行前后端联调测试即可。
图 3.2.3-2 nginx反向代理
-
Nginx是一个高性能的HTTP和反向代理服务器,同时也提供了IMAP/POP3/SMTP服务。
-
我们知道,Web服务器是用来对外共享资源的 ,类似于我们以前学习的Tomcat一样,是Web项目的部署容器。
-
而IMAP/POP3/SMTP这三者,则是一种邮件协议,分别是邮件的发送和接收协议,所以Nginx还可以作为一个邮件服务器来使用。
-
综上所述,Nginx就是一个服务器,这个服务器既可以当成邮件服务器,也可以当成Web服务器来使用。 |
3.3 完善登录功能
图 3.3-1 完善登录功能
原数据中,账号密码是明文存储的,安全性比较低,这里就需要对其进行加密存储,所以要进行如下操作。
- 修改数据库中明文密码,改为MD5加密后的密文
- 修改Java代码,将前端提交的密码进行MD5加密后和数据库中的密码进行比对 |
4、导入接口文档
4.1 前后端分离开发流程
图 4.1-1 前后端开发流程
图中我们看到,在定制接口中定义规范,前后端开发人员就可以进行并行开发,之后走联调、提测等。
4.2 操作步骤
这边建议的是使用 YApi 作为开发项目接口管理器,使用起来简便、快捷。
YApi官网:http://yapi.mglicai.com/
5、Swagger
5.1 Swagger介绍
- 使用Swagger你只需要按照它的规范去定义接口以及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。
- Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,使用这个方案,只需要在项目的pom.xml文件中导入对应依赖就可以。
5.2 使用方式
下面是使用Swagger的步骤:
- 导入Knife4j的maven坐标
- 在配置类中添加Knife4j相关配置
- 设置静态资源映射,否则接口文档页面无法访问
以上三个步骤中都配有相对应的代码。
5.3 常用注解
图 5.3-1 Swagger常用注解
上图中是Swagger常用注解,通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性。
6、员工管理
6.1 新增员工
6.1.1 需求分析和设计
图 6.1.1-1 新增员工需求分析和设计
新增员工:
- 用户名
- 身份证号
- 手机号码
- 性别 |
| 以上就是新增员工需求分析和设计,即需要新增用户提供以上信息完成用户注册。 |
6.1.2 代码开发
图 6.1.2-1 Controller层代码
上图中,展示的是用户登录的控制层代码,用以接收客户端传来的登录信息。
6.1.3 功能测试
功能测试方式:
- 通过接口文档测试:启动项目后,在浏览器端输入 http://localhost:8080/doc.html 进入Swagger在线接口文档进行调试
- 通过前后端联调测试:需要开启前端项目,进行测试。
6.1.4 完善代码
当管理端注册新用户时,新用户登记信息中有一个当前操作用户ID属性,但是这个属性无法直接赋值,所以这就需要一个新的技术点 ThreadLocal
ThreadLocal 为每一个线程提供一份单独的存储空间,具有线程隔离的效果,只有在线程内才能获取到相对应的值,线程外不能访问。
图 6.1.4-1 新增员工
在上图中,我们看到新增管理端用户,在登记信息中需要提供当前操作员工的ID,通过 ThreadLoad 实现。
图 6.1.4-2 ThreadLocal常用方法
在上图中,我们看到了 ThreadLoad 实常见方法,通过这几个方法实现在登记信息中需要提供当前操作员工的ID这一需求。
6.2 员工分页查询
6.2.1 需求分析和设计
图 6.2.1-1 产品原型
上图中,我们看到数据展示规则;首先是根据页码展示员工信息,其次是每页展示10条数据,最后是分页查询时可以根据需要,输入员工姓名进行查询。
6.2.2 代码开发
图 6.2.2-1 代码开发
上图中,我们看到前端页面在地址栏传递了name、page、pageSize三个参数,后端使用了EmployeePageQueryDTO 这个属性类接收。
图 6.2.2-2 PageResult对象
上图中,说明了后面所有的分页查询,统一封装成PageResult对象。
6.3 启用禁用员工账号
6.3.1 需求分析和设计
图 6.3.1 员工账号数据库设计图
业务规则:
- 可以对状态为 "启用" 的员工账号进行 "禁用" 操作
- 可以对状态为 "禁用" 的员工账号进行 "启用" 操作
- 状态为 "禁用" 的员工账号不能登录系统。 |
6.3.2 代码开发
图 6.3.2-1 启用、禁用员工账号Controller层代码
图中展示的是启用、禁用员工账号 Controller 层代码,主要是通过接收前端传递的 (Integer status, Long id)参数,去调用 Service 层代码。
图 6.3.2-2 启用、禁用员工账号Service层代码
图中展示的是启用、禁用员工账号 Service 层代码,主要是通过接收Controller传递的 (Integer status, Long id)参数,去调用 Mapper 层代码,实现修改数据库表中的员工数据。
图 6.3.2-3 启用、禁用员工账号Mapper层代码
图中展示的是启用、禁用员工账号 Mapper层代码,主要是通过接收Service 传递的 (Employee employee)参数,去调用 Mapper 层代码,实现修改数据库表中的员工数据。
6.4 编辑员工
6.4.1 需求分析和设计
图 6.4.1 编辑员工需求分析和设计
编辑员工涉及到了两个接口:
- 根据id查询员工信息
- 修改员工信息。 |
6.4.2 代码开发
图 6.4.2-1 编辑员工Controller层代码
上图中展示的是编辑员工Controller层代码,接收前端传递的参数(Long id)从而调用Service层代码查询。
图 6.4.2-2 编辑员工Service层代码
上图中展示的是编辑员工Service层代码,接收Controller层传递的参数(Long id)从而调用Mapper层代码查询。
图 6.4.2-3 编辑员工Mapper层代码
上图中展示的是编辑员工Mapper层代码,接收Service层传递的参数(Long id)进而通过数据库进行查询。
6.5 分类模块
6.5.1 需求分析和设计
图 6.5.1 需求分析和设计
业务规则:
- 分类名称必须是唯一的
- 分类按照类型可以分为菜品分类和套餐分类
- 新添加的分类状态默认为"禁用"。 |
6.5.2 代码开发
java
package com.sky.controller.admin;
import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.CategoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 分类管理
*/
@RestController
@RequestMapping("/admin/category")
@Api(tags = "分类相关接口")
@Slf4j
public class CategoryController {
@Autowired
private CategoryService categoryService;
/**
* 新增分类
* @param categoryDTO
* @return
*/
@PostMapping
@ApiOperation("新增分类")
public Result<String> save(@RequestBody CategoryDTO categoryDTO){
log.info("新增分类:{}", categoryDTO);
categoryService.save(categoryDTO);
return Result.success();
}
}
7、公共字段自动填充
7.1 问题分析
- 重复代码:多个表的create_time、update_time等字段需要重复赋值。
7.2 实现思路
- AOP + 反射:自定义注解 + 切面编程实现自动填充。
7.3 代码开发
- 注解定义:
@AutoFill - 切面实现:拦截Mapper层的insert和update操作
- 填充逻辑:根据操作类型自动赋值
8、新增菜品
8.1 需求分析和设计
- 功能点:添加菜品基本信息 + 口味信息
- 图片上传:支持菜品图片上传至OSS
8.2 代码开发
- 事务控制:保证菜品和口味数据一致性
- DTO设计:
DishDTO包含菜品和口味列表
9、菜品分页查询
9.1 需求分析和设计
- 展示字段:菜品名称、分类、价格、图片、状态
- 查询条件:支持按分类和名称模糊查询
9.2 代码开发
- VO对象:
DishVO包含分类名称等关联数据 - 连表查询:关联category表获取分类名称
10、删除菜品
10.1 需求分析和设计
- 业务规则:
- 起售中的菜品不能删除
- 被套餐关联的菜品不能删除
10.2 代码开发
- 校验逻辑:删除前检查菜品状态和使用情况
- 事务控制:同时删除菜品和关联的口味数据
11、修改菜品
11.1 需求分析和设计
- 功能点:修改基本信息、修改图片、修改口味
- 版本控制:乐观锁防止并发修改
11.2 代码开发
- 回显功能:先查询菜品和口味信息
- 更新策略:先删除旧口味,再插入新口味
14、清空购物车
14.1 需求分析和设计
- 触发场景:用户下单成功后清空购物车
- 数据清理:删除当前用户的购物车数据
14.2 代码开发
- 批量删除:根据用户ID删除购物车记录
15、导入地址簿
15.1 需求分析和设计
- 功能点:增删改查地址、设置默认地址
- 数据隔离:用户只能操作自己的地址
15.2 代码开发
15.2.1 查询当前登录用户的所有地址信息
- 接口:GET
/user/addressBook/list - 实现:根据用户ID查询地址列表
15.2.2 新增地址
- 业务规则:单个用户最多保存10个地址
15.2.3 设置默认地址
- 逻辑:将其他地址设为非默认,当前地址设为默认
15.2.4 查询默认地址
- 用途:下单时自动选择默认地址
16、用户下单
16.1 需求分析和设计
- 业务流程:
- 校验购物车非空
- 校验地址有效性
- 生成订单号
- 计算金额
- 插入订单和明细
- 清空购物车
16.2 代码开发
- 事务控制:保证订单、明细、购物车操作的原子性
- 分布式ID:使用Snowflake算法生成订单号
17、订单支付
17.1 需求分析和设计
- 支付流程:调用微信支付接口,生成预支付订单
17.2 微信支付准备工作
17.2.1 如何保障支付过程安全性
- 安全机制:HTTPS、签名验证、证书
17.2.2 微信后台如何调用商户系统
- 回调机制:支付结果异步通知
17.3 代码开发
17.3.1 代码导入
- 依赖引入:微信支付SDK
17.3.2 微信支付工具类
- 核心方法:统一下单、查询订单、关闭订单
17.3.3 支付成功进行回调
- 验签逻辑:验证微信回调的签名
- 业务处理:更新订单支付状态
18、订单状态定时更新
18.1 需求分析和设计
- 超时处理:超过15分钟未支付自动取消订单
- 完成逻辑:派送超过2小时自动完成订单
18.2 代码开发
- Spring Task:定时任务每分钟扫描一次
- Redis队列:优化大规模订单处理性能
19、来单提醒
19.1 需求分析和设计
- 实时推送:新订单通过WebSocket推送给商家端
- 通知方式:语音播报 + 页面弹窗
19.2 代码开发
- WebSocket配置:建立长连接
- 消息推送:订单支付成功后触发推送
20、客户催单
20.1 需求分析和设计
- 催单限制:每个订单只能催单一次
- 推送对象:仅推送给商家端
20.2 代码开发
- 状态校验:仅允许待接单状态的订单催单
21、营业额统计
21.1 需求分析和设计
- 统计维度:按天、按周、按月
- 数据范围:包括已完成订单金额
21.2 代码开发
- SQL聚合:使用SUM函数计算营业额
- 时间分组:按DATE_FORMAT分组统计
22、用户统计
22.1 需求分析和设计
- 统计内容:新增用户数量、总用户数量
- 时间维度:日、周、月统计
22.2 代码开发
- 关联查询:左连接用户表和订单表
23、订单统计
23.1 需求分析和设计
- 多维度统计:待接单、已接单、派送中、已完成数量
23.2 代码开发
- 状态分组:GROUP BY status统计各状态订单数
24、销量排名
24.1 需求分析和设计
- 统计规则:按菜品销量或销售额TOP10
- 时间范围:日、周、月
24.2 代码开发
- 排序查询:ORDER BY数量或金额DESC
25、工作台
25.1 需求分析和设计
- 看板功能:展示今日数据概览(订单数、营业额、待处理订单)
25.2 代码开发
- 聚合查询:多个指标一次性查询
26、总结
- 项目亮点:完整业务闭环、前后端分离、微服务架构
- 学习价值:涵盖主流Java开发技术栈
- 扩展方向:分布式事务、消息队列、服务熔断等高级特性