外卖综合项目

简介:这是一个完整外卖项目,包括前端页面设计、后端逻辑代码和数据库。小编在这里详细展示了编码步骤、注意事项、相关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开发技术栈
  • 扩展方向:分布式事务、消息队列、服务熔断等高级特性
相关推荐
降临-max2 小时前
JavaWeb企业级开发---Ajax、
java·ajax·maven
小白阿龙2 小时前
样式不生效/被覆盖(CSS优先级陷阱)
前端·css
Beginner x_u2 小时前
Vue 事件机制全面解析:原生事件、自定义事件与 DOM 冒泡完全讲透
前端·javascript·vue.js·dom
Emma_Maria2 小时前
关于vant-ui-vue 的datepicker 时间选择错乱问题的处理
前端·vue.js·ui
小徐Chao努力2 小时前
Spring AI Alibaba A2A 使用指南
java·人工智能·spring boot·spring·spring cloud·agent·a2a
Dabei2 小时前
Android 语音助手简单实现与语音助手“执行任务”交流
android·前端
dongczlu2 小时前
iOS 循环引用篇 菜鸟都能看懂
前端
Alsn862 小时前
26.IDEA 专业版中创建简单的 Web 项目并打包部署到本地Tomcat 9
前端·tomcat·intellij-idea
rannn_1112 小时前
【Git教程】概述、常用命令、Git-IDEA集成
java·git·后端·intellij-idea