外卖综合项目

简介:这是一个完整外卖项目,包括前端页面设计、后端逻辑代码和数据库。小编在这里详细展示了编码步骤、注意事项、相关BUG解决方案以及最最重要的就是源代码和部署过程。

(备注:项目来源于B站的黑马课程,如果时间允许还是建议同学们可以认真的从头到尾去学习,这样对于开发来说会有更好的掌握)

目录

  1. 软件开发整体介绍

    • 软件开发流程
    • 角色分工
    • 软件环境
  2. 苍穹外卖项目介绍

    • 项目介绍
    • 产品原型
    • 技术选型
  3. 开发环境搭建

    • 前端环境搭建
    • 后端环境搭建
      • 后端环境搭建---使用Git进行版本控制
      • 后端环境搭建---数据库环境搭建
      • 后端环境搭建---前后端联调
    • 完善登录功能
  4. 导入接口文档

    • 前后端分离开发流程
    • 操作步骤
  5. Swagger

    • Swagger介绍
    • 使用方式
    • 常用注解
  6. 员工管理

    • 新增员工
      • 需求分析和设计
      • 代码开发
      • 功能测试
      • 完善代码
    • 员工分页查询
      • 需求分析和设计
      • 代码开发
    • 启用禁用员工账号
      • 需求分析和设计
      • 代码开发
    • 编辑员工
    • 分类模块
  7. 公共字段自动填充

    • 问题分析
    • 实现思路
    • 代码开发
  8. 新增菜品

    • 需求分析和设计
    • 代码开发
  9. 菜品分页查询

    • 需求分析和设计
    • 代码开发
  10. 删除菜品

    • 需求分析和设计
    • 代码开发
  11. 修改菜品

    • 需求分析和设计
    • 代码开发
  12. 清空购物车

    • 需求分析和设计
    • 代码开发
  13. 导入地址簿

    • 需求分析和设计
    • 代码开发
      • 查询当前登录用户的所有地址信息
      • 新增地址
      • 设置默认地址
      • 查询默认地址
  14. 用户下单

    • 需求分析和设计
    • 代码开发
  15. 订单支付

    • 需求分析和设计
    • 微信支付准备工作
      • 如何保障支付过程安全性
      • 微信后台如何调用商户系统
    • 代码开发
      • 代码导入
      • 微信支付工具类
      • 支付成功进行回调
  16. 订单状态定时更新

    • 需求分析和设计
    • 代码开发
  17. 来单提醒

    • 需求分析和设计
    • 代码开发
  18. 客户催单

    • 需求分析和设计
    • 代码开发
  19. 营业额统计

    • 需求分析和设计
    • 代码开发
  20. 用户统计

    • 需求分析和设计
    • 代码开发
  21. 订单统计

    • 需求分析和设计
    • 代码开发
  22. 销量排名

    • 需求分析和设计
    • 代码开发
  23. 工作台

    • 需求分析和设计
    • 代码开发
  24. 总结


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='用户信息';

数据库设计文档

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

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

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

  1. dish_flavor

dish_flavor表为菜品口味表,用于存储菜品的口味信息。具体表结构如下:

字段名 数据类型 说明 备注

id bigint 主键 自增

dish_id bigint 菜品id 逻辑外键

name varchar(32) 口味名称

value varchar(255) 口味值

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

  1. setmeal_dish

setmeal_dish表为套餐菜品关系表,用于存储套餐和菜品的关联关系。具体表结构如下:

字段名 数据类型 说明 备注

id bigint 主键 自增

setmeal_id bigint 套餐id 逻辑外键

dish_id bigint 菜品id 逻辑外键

name varchar(32) 菜品名称 冗余字段

price decimal(10,2) 菜品单价 冗余字段

copies int 菜品份数

  1. 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 注册时间

  1. 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否

  1. 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 创建时间

  1. 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选择具体数量

  1. 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的步骤:

  1. 导入Knife4j的maven坐标
  2. 在配置类中添加Knife4j相关配置
  3. 设置静态资源映射,否则接口文档页面无法访问

以上三个步骤中都配有相对应的代码。

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 需求分析和设计

  • 业务流程:
    1. 校验购物车非空
    2. 校验地址有效性
    3. 生成订单号
    4. 计算金额
    5. 插入订单和明细
    6. 清空购物车

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开发技术栈
  • 扩展方向:分布式事务、消息队列、服务熔断等高级特性
相关推荐
全栈前端老曹几秒前
【前端路由】React Router 权限路由控制 - 登录验证、私有路由封装、高阶组件实现路由守卫
前端·javascript·react.js·前端框架·react-router·前端路由·权限路由
之歆2 分钟前
Spring AI入门到实战到原理源码-多模型协作智能客服系统
java·人工智能·spring
yyy(十一月限定版)16 分钟前
c++(3)类和对象(中)
java·开发语言·c++
zhuà!21 分钟前
uv-picker在页面初始化时,设置初始值无效
前端·javascript·uv
Amumu1213822 分钟前
React应用
前端·react.js·前端框架
摸鱼的春哥25 分钟前
实战:在 Docker (Windows) 中构建集成 yt-dlp 的“满血版” n8n 自动化工作流
前端·javascript·后端
IT 行者29 分钟前
Spring Security 7 OAuth2 Token 格式选择浅析
java·后端·spring
幽络源小助理30 分钟前
Springboot机场乘客服务系统源码 – SpringBoot+Vue项目免费下载 | 幽络源
vue.js·spring boot·后端
小酒星小杜31 分钟前
在AI时代,技术人应该每天都要花两小时来构建一个自身的构建系统
前端·vue.js·架构