青海网站制作多少钱,广告设计主要学什么内容,html5简单网页大作业,百度热搜 百度指数一、项目介绍以及环境搭建 1.苍穹外卖项目介绍 1.1项目介绍
本项目#xff08;苍穹外卖#xff09;是专门为餐饮企业#xff08;餐厅、饭店#xff09;定制的一款软件产品#xff0c;包括 系统管理后台 和 小程序端应用 两部分。其中系统管理后台主要提供给餐饮企业内部员…
一、项目介绍以及环境搭建 1.苍穹外卖项目介绍 1.1项目介绍
本项目苍穹外卖是专门为餐饮企业餐厅、饭店定制的一款软件产品包括 系统管理后台 和 小程序端应用 两部分。其中系统管理后台主要提供给餐饮企业内部员工使用可以对餐厅的分类、菜品、套餐、订单、员工等进行管理维护对餐厅的各类数据进行统计同时也可进行来单语音播报功能。小程序端主要提供给消费者使用可以在线浏览菜品、添加购物车、下单、支付、催单等。接下来通过功能架构图来展示管理端和用户端的具体业务功能模块。1). 管理端功能员工登录/退出 , 员工信息管理 , 分类管理 , 菜品管理 , 套餐管理 , 菜品口味管理 , 订单管理 数据统计来单提醒。2). 用户端功能微信登录 , 收件人地址管理 , 用户历史订单查询 , 菜品规格查询 , 购物车功能 , 下单 , 支付、分类及菜品浏览。
1.2产品原型
产品原型用于展示项目的业务功能一般由产品经理进行设计。注意事项 产品原型主要用于展示项目的功能并不是最终的页面效果。在课程资料的产品原型文件夹下,提供了两份产品原型。管理端原型图用户端原型图1). 管理端餐饮企业内部员工使用。 主要功能有:
模块描述登录/退出内部员工必须登录后,才可以访问系统管理后台员工管理管理员可以在系统后台对员工信息进行管理包含查询、新增、编辑、禁用等功能分类管理主要对当前餐厅经营的 菜品分类 或 套餐分类 进行管理维护 包含查询、新增、修改、删除等功能菜品管理主要维护各个分类下的菜品信息包含查询、新增、修改、删除、启售、停售等功能套餐管理主要维护当前餐厅中的套餐信息包含查询、新增、修改、删除、启售、停售等功能订单管理主要维护用户在移动端下的订单信息包含查询、取消、派送、完成以及订单报表下载等功能数据统计主要完成对餐厅的各类数据统计如营业额、用户数量、订单等
2). 用户端移动端应用主要提供给消费者使用。主要功能有:
模块描述登录/退出用户需要通过微信授权后登录使用小程序进行点餐点餐-菜单在点餐界面需要展示出菜品分类/套餐分类, 并根据当前选择的分类加载其中的菜品信息, 供用户查询选择点餐-购物车用户选中的菜品就会加入用户的购物车, 主要包含 查询购物车、加入购物车、删除购物车、清空购物车等功能订单支付用户选完菜品/套餐后, 可以对购物车菜品进行结算支付, 这时就需要进行订单的支付个人信息在个人中心页面中会展示当前用户的基本信息, 用户可以管理收货地址, 也可以查询历史订单数据 1.3 技术选型
关于本项目的技术选型, 我们将会从 用户层、网关层、应用层、数据层 这几个方面进行介绍主要用于展示项目中使用到的技术框架和中间件等。1). 用户层本项目中在构建系统管理后台的前端页面我们会用到H5、Vue.js、ElementUI、apache echarts(展示图表)等技术。而在构建移动端应用时我们会使用到微信小程序。2). 网关层Nginx是一个服务器主要用来作为Http服务器部署静态资源访问性能高。在Nginx中还有两个比较重要的作用 反向代理和负载均衡 在进行项目部署时要实现Tomcat的负载均衡就可以通过Nginx来实现。3). 应用层SpringBoot 快速构建Spring项目, 采用 “约定优于配置” 的思想, 简化Spring项目的配置开发。SpringMVCSpringMVC是spring框架的一个模块springmvc和spring无需通过中间整合层进行整合可以无缝集成。Spring Task: 由Spring提供的定时任务框架。httpclient: 主要实现了对http请求的发送。Spring Cache: 由Spring提供的数据缓存框架JWT: 用于对应用程序上的用户进行身份验证的标记。阿里云OSS: 对象存储服务在项目中主要存储文件如图片等。Swagger 可以自动的帮助开发人员生成接口文档并对接口进行测试。POI: 封装了对Excel表格的常用操作。WebSocket: 一种通信网络协议使客户端和服务器之间的数据交换更加简单用于项目的来单、催单功能实现。4). 数据层MySQL 关系型数据库, 本项目的核心业务数据都会采用MySQL进行存储。Redis 基于key-value格式存储的内存数据库, 访问速度快, 经常使用它做缓存。Mybatis 本项目持久层将会使用Mybatis开发。pagehelper: 分页插件。spring data redis: 简化java代码操作Redis的API。5). 工具git: 版本控制工具, 在团队协作中, 使用该工具对项目中的代码进行管理。maven: 项目构建工具。junit单元测试工具开发人员功能实现完毕后需要通过junit对功能进行单元测试。postman: 接口测工具模拟用户发起的各类HTTP请求获取对应的响应结果。
2.开发环境搭建
开发环境搭建主要包含前端环境和后端环境两部分。作为服务端开发工程师 我们课程学习的重心应该放在后端的业务代码上 前端的页面我们只需要导入资料中的nginx 前端页面的代码我们只需要能看懂即可。
2.1 前端环境搭建
1). 前端工程基于 nginx从资料中找到前端运行环境的nginx移动到非中文目录下。sky目录中存放了管理端的前端资源具体如下
2). 启动nginx访问测试双击 nginx.exe 即可启动 nginx 服务访问端口号为 80http://localhost:80但是为了比较端口冲突我们可以把端口进行修改
2.2后端环境搭建 2.2.1 熟悉项目结构
后端工程基于 maven 进行项目构建并且进行分模块开发。1). 从资料中找到后端初始工程2). 用 IDEA 打开初始工程了解项目的整体结构对工程的每个模块作用说明
序号名称说明1sky-take-outmaven父工程统一管理依赖版本聚合其他子模块2sky-common子模块存放公共类例如工具类、常量类、异常类等3sky-pojo子模块存放实体类、VO、DTO等4sky-server子模块后端服务存放配置文件、Controller、Service、Mapper等
对项目整体结构了解后接下来我们详细分析上述的每个子模块
sky-common: 模块中存放的是一些公共类可以供其他模块使用分析sky-common模块的每个包的作用
名称说明constant存放相关常量类context存放上下文类enumeration项目的枚举类存储exception存放自定义异常类json处理json转换的类properties存放SpringBoot相关的配置属性类result返回结果类的封装utils常用工具类
sky-pojo: 模块中存放的是一些 entity、DTO、VO
名称说明Entity实体通常和数据库中的表对应DTO数据传输对象通常用于程序中各层之间传递数据VO视图对象为前端展示数据提供的对象POJO普通Java对象只有属性和对应的getter和setter
sky-server: 模块中存放的是 配置文件、配置类、拦截器、controller、service、mapper、启动类等分析sky-server模块的每个包的作用
名称说明config存放配置类controller存放controller类interceptor存放拦截器类mapper存放mapper接口service存放service类SkyApplication启动类 2.2.2Git版本控制
使用Git进行项目代码的版本控制具体操作1). 创建Git本地仓库当Idea中出现说明本地仓库创建成功。2). 创建Git远程仓库访问https://gitee.com/新建仓库3). 将本地文件推送到Git远程仓库
提交文件至本地仓库忽略以下类型文件
开始提交点击commit2.添加Git远程仓库地址复制远程地址 选中工程右键3.推送成功推送至远程仓库
2.2.3导入数据库
导入sky.sql文件
CREATE DATABASE IF NOT EXISTS sky_take_out /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTIONN */;
USE sky_take_out;
-- MySQL dump 10.13 Distrib 8.0.28, for Win64 (x86_64)
--
-- Host: localhost Database: sky_take_out
-- ------------------------------------------------------
-- Server version 8.0.28/*!40101 SET OLD_CHARACTER_SET_CLIENTCHARACTER_SET_CLIENT */;
/*!40101 SET OLD_CHARACTER_SET_RESULTSCHARACTER_SET_RESULTS */;
/*!40101 SET OLD_COLLATION_CONNECTIONCOLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET OLD_TIME_ZONETIME_ZONE */;
/*!40103 SET TIME_ZONE00:00 */;
/*!40014 SET OLD_UNIQUE_CHECKSUNIQUE_CHECKS, UNIQUE_CHECKS0 */;
/*!40014 SET OLD_FOREIGN_KEY_CHECKSFOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS0 */;
/*!40101 SET OLD_SQL_MODESQL_MODE, SQL_MODENO_AUTO_VALUE_ON_ZERO */;
/*!40111 SET OLD_SQL_NOTESSQL_NOTES, SQL_NOTES0 */;--
-- Table structure for table address_book
--DROP TABLE IF EXISTS address_book;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 省级区划编号,province_name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 省级名称,city_code varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 市级区划编号,city_name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 市级名称,district_code varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 区级区划编号,district_name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 区级名称,detail varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 详细地址,label varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 标签,is_default tinyint(1) NOT NULL DEFAULT 0 COMMENT 默认 0 否 1是,PRIMARY KEY (id)
) ENGINEInnoDB AUTO_INCREMENT2 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT地址簿;
/*!40101 SET character_set_client saved_cs_client */;--
-- Table structure for table category
--DROP TABLE IF EXISTS category;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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)
) ENGINEInnoDB AUTO_INCREMENT23 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT菜品及套餐分类;
/*!40101 SET character_set_client saved_cs_client */;--
-- Dumping data for table category
--/*!40000 ALTER TABLE category DISABLE KEYS */;
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);
/*!40000 ALTER TABLE category ENABLE KEYS */;--
-- Table structure for table dish
--DROP TABLE IF EXISTS dish;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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)
) ENGINEInnoDB AUTO_INCREMENT70 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT菜品;
/*!40101 SET character_set_client saved_cs_client */;--
-- Dumping data for table dish
--/*!40000 ALTER TABLE dish DISABLE KEYS */;
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-bf7bd9eb2ad2.png,配料豆腐平菇,1,2022-06-10 10:55:02,2022-06-10 10:55:02,1,1);
/*!40000 ALTER TABLE dish ENABLE KEYS */;--
-- Table structure for table dish_flavor
--DROP TABLE IF EXISTS dish_flavor;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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)
) ENGINEInnoDB AUTO_INCREMENT104 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT菜品口味关系表;
/*!40101 SET character_set_client saved_cs_client */;--
-- Dumping data for table dish_flavor
--/*!40000 ALTER TABLE dish_flavor DISABLE KEYS */;
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,辣度,[\不辣\,\微辣\,\中辣\,\重辣\]);
/*!40000 ALTER TABLE dish_flavor ENABLE KEYS */;--
-- Table structure for table employee
--DROP TABLE IF EXISTS employee;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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)
) ENGINEInnoDB AUTO_INCREMENT2 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT员工信息;
/*!40101 SET character_set_client saved_cs_client */;--
-- Dumping data for table employee
--/*!40000 ALTER TABLE employee DISABLE KEYS */;
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);
/*!40000 ALTER TABLE employee ENABLE KEYS */;--
-- Table structure for table order_detail
--DROP TABLE IF EXISTS order_detail;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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)
) ENGINEInnoDB AUTO_INCREMENT5 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT订单明细表;
/*!40101 SET character_set_client saved_cs_client */;--
-- Table structure for table orders
--DROP TABLE IF EXISTS orders;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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)
) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT订单表;
/*!40101 SET character_set_client saved_cs_client */;--
-- Table structure for table setmeal
--DROP TABLE IF EXISTS setmeal;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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)
) ENGINEInnoDB AUTO_INCREMENT32 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT套餐;
/*!40101 SET character_set_client saved_cs_client */;--
-- Table structure for table setmeal_dish
--DROP TABLE IF EXISTS setmeal_dish;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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)
) ENGINEInnoDB AUTO_INCREMENT47 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT套餐菜品关系;
/*!40101 SET character_set_client saved_cs_client */;--
-- Table structure for table shopping_cart
--DROP TABLE IF EXISTS shopping_cart;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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)
) ENGINEInnoDB AUTO_INCREMENT9 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT购物车;
/*!40101 SET character_set_client saved_cs_client */;--
-- Table structure for table user
--DROP TABLE IF EXISTS user;
/*!40101 SET saved_cs_client character_set_client */;
/*!50503 SET character_set_client utf8mb4 */;
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)
) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb3 COLLATEutf8_bin COMMENT用户信息;
/*!40101 SET character_set_client saved_cs_client */;/*!40103 SET TIME_ZONEOLD_TIME_ZONE */;/*!40101 SET SQL_MODEOLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKSOLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKSOLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENTOLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTSOLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTIONOLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTESOLD_SQL_NOTES */;-- Dump completed on 2022-09-06 15:07:08 2.2.4数据库设计文档
序号数据表名中文名称1employee员工表2category分类表3dish菜品表4dish_flavor菜品口味表5setmeal套餐表6setmeal_dish套餐菜品关系表7user用户表8address_book地址表9shopping_cart购物车表10orders订单表11order_detail订单明细表 1. employee
employee表为员工表用于存储商家内部的员工信息。具体表结构如下
字段名数据类型说明备注idbigint主键自增namevarchar(32)姓名usernamevarchar(32)用户名唯一passwordvarchar(64)密码phonevarchar(11)手机号sexvarchar(2)性别id_numbervarchar(18)身份证号statusint账号状态1正常 0锁定create_timedatetime创建时间update_timedatetime最后修改时间create_userbigint创建人idupdate_userbigint最后修改人id 2. category
category表为分类表用于存储商品的分类信息。具体表结构如下
字段名数据类型说明备注idbigint主键自增namevarchar(32)分类名称唯一typeint分类类型1菜品分类 2套餐分类sortint排序字段用于分类数据的排序statusint状态1启用 0禁用create_timedatetime创建时间update_timedatetime最后修改时间create_userbigint创建人idupdate_userbigint最后修改人id 3. dish
dish表为菜品表用于存储菜品的信息。具体表结构如下
字段名数据类型说明备注idbigint主键自增namevarchar(32)菜品名称唯一category_idbigint分类id逻辑外键pricedecimal(10,2)菜品价格imagevarchar(255)图片路径descriptionvarchar(255)菜品描述statusint售卖状态1起售 0停售create_timedatetime创建时间update_timedatetime最后修改时间create_userbigint创建人idupdate_userbigint最后修改人id 4. dish_flavor
dish_flavor表为菜品口味表用于存储菜品的口味信息。具体表结构如下
字段名数据类型说明备注idbigint主键自增dish_idbigint菜品id逻辑外键namevarchar(32)口味名称valuevarchar(255)口味值 5. setmeal
setmeal表为套餐表用于存储套餐的信息。具体表结构如下
字段名数据类型说明备注idbigint主键自增namevarchar(32)套餐名称唯一category_idbigint分类id逻辑外键pricedecimal(10,2)套餐价格imagevarchar(255)图片路径descriptionvarchar(255)套餐描述statusint售卖状态1起售 0停售create_timedatetime创建时间update_timedatetime最后修改时间create_userbigint创建人idupdate_userbigint最后修改人id 6. setmeal_dish
setmeal_dish表为套餐菜品关系表用于存储套餐和菜品的关联关系。具体表结构如下
字段名数据类型说明备注idbigint主键自增setmeal_idbigint套餐id逻辑外键dish_idbigint菜品id逻辑外键namevarchar(32)菜品名称冗余字段pricedecimal(10,2)菜品单价冗余字段copiesint菜品份数 7. user
user表为用户表用于存储C端用户的信息。具体表结构如下
字段名数据类型说明备注idbigint主键自增openidvarchar(45)微信用户的唯一标识namevarchar(32)用户姓名phonevarchar(11)手机号sexvarchar(2)性别id_numbervarchar(18)身份证号avatarvarchar(500)微信用户头像路径create_timedatetime注册时间 8. address_book
address_book表为地址表用于存储C端用户的收货地址信息。具体表结构如下
字段名数据类型说明备注idbigint主键自增user_idbigint用户id逻辑外键consigneevarchar(50)收货人sexvarchar(2)性别phonevarchar(11)手机号province_codevarchar(12)省份编码province_namevarchar(32)省份名称city_codevarchar(12)城市编码city_namevarchar(32)城市名称district_codevarchar(12)区县编码district_namevarchar(32)区县名称detailvarchar(200)详细地址信息具体到门牌号labelvarchar(100)标签公司、家、学校is_defaulttinyint(1)是否默认地址1是 0否 9. shopping_cart
shopping_cart表为购物车表用于存储C端用户的购物车信息。具体表结构如下
字段名数据类型说明备注idbigint主键自增namevarchar(32)商品名称imagevarchar(255)商品图片路径user_idbigint用户id逻辑外键dish_idbigint菜品id逻辑外键setmeal_idbigint套餐id逻辑外键dish_flavorvarchar(50)菜品口味numberint商品数量amountdecimal(10,2)商品单价create_timedatetime创建时间 10. orders
orders表为订单表用于存储C端用户的订单数据。具体表结构如下
字段名数据类型说明备注idbigint主键自增numbervarchar(50)订单号statusint订单状态1待付款 2待接单 3已接单 4派送中 5已完成 6已取消user_idbigint用户id逻辑外键address_book_idbigint地址id逻辑外键order_timedatetime下单时间checkout_timedatetime付款时间pay_methodint支付方式1微信支付 2支付宝支付pay_statustinyint支付状态0未支付 1已支付 2退款amountdecimal(10,2)订单金额remarkvarchar(100)备注信息phonevarchar(11)手机号addressvarchar(255)详细地址信息user_namevarchar(32)用户姓名consigneevarchar(32)收货人cancel_reasonvarchar(255)订单取消原因rejection_reasonvarchar(255)拒单原因cancel_timedatetime订单取消时间estimated_delivery_timedatetime预计送达时间delivery_statustinyint配送状态1立即送出 0选择具体时间delivery_timedatetime送达时间pack_amountint打包费tableware_numberint餐具数量tableware_statustinyint餐具数量状态1按餐量提供 0选择具体数量 11. order_detail
order_detail表为订单明细表用于存储C端用户的订单明细数据。具体表结构如下
字段名数据类型说明备注idbigint主键自增namevarchar(32)商品名称imagevarchar(255)商品图片路径order_idbigint订单id逻辑外键dish_idbigint菜品id逻辑外键setmeal_idbigint套餐id逻辑外键dish_flavorvarchar(50)菜品口味numberint商品数量amountdecimal(10,2)商品单价 2.3前后端联调
进行项目启动的时候出现以下错误
ERROR org.springframework.boot.SpringApplication - Application run failed后面发现是因为文件编码的原因需要把文件编码都改成UTF-81.Controller层在sky-server模块中com.sky.controller.admin.EmployeeController
/*** 登录** param employeeLoginDTO* return*/
PostMapping(/login)
public ResultEmployeeLoginVO login(RequestBody EmployeeLoginDTO employeeLoginDTO) {log.info(员工登录{}, employeeLoginDTO);//调用service方法查询数据库Employee employee employeeService.login(employeeLoginDTO);//登录成功后生成jwt令牌MapString, Object claims new HashMap();claims.put(JwtClaimsConstant.EMP_ID, employee.getId());String token JwtUtil.createJWT(jwtProperties.getAdminSecretKey(),jwtProperties.getAdminTtl(),claims);EmployeeLoginVO employeeLoginVO EmployeeLoginVO.builder().id(employee.getId()).userName(employee.getUsername()).name(employee.getName()).token(token).build();return Result.success(employeeLoginVO);
}2.Service层在sky-server模块中com.sky.service.impl.EmployeeServiceImpl
/*** 员工登录** param employeeLoginDTO* return*/
public Employee login(EmployeeLoginDTO employeeLoginDTO) {
String username employeeLoginDTO.getUsername();
String password employeeLoginDTO.getPassword();//1、根据用户名查询数据库中的数据
Employee employee employeeMapper.getByUsername(username);//2、处理各种异常情况用户名不存在、密码不对、账号被锁定
if (employee null) {//账号不存在throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
}//密码比对
if (!password.equals(employee.getPassword())) {//密码错误throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}if (employee.getStatus() StatusConstant.DISABLE) {//账号被锁定throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
}//3、返回实体对象
return employee;
}3.Mapper层在sky-server模块中com.sky.mapper.EmployeeMapper
package com.sky.mapper;import com.sky.entity.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;Mapper
public interface EmployeeMapper {/*** 根据用户名查询员工* param username* return*/Select(select * from employee where username #{username})Employee getByUsername(String username);}注可以通过断点调试跟踪后端程序的执行过程
2.4NGINX 2.4.1正向代理 2.4.2反向代理和负载均衡
对登录功能测试完毕后接下来我们思考一个问题前端发送的请求是如何请求到后端服务的前端请求地址http://localhost/api/employee/login后端接口地址http://localhost:8080/admin/employee/login很明显两个地址不一致那是如何请求到后端服务的呢1). nginx反向代理nginx 反向代理就是将前端发送的动态请求由 nginx 转发到后端服务器那为什么不直接通过浏览器直接请求后台服务端需要通过nginx反向代理呢nginx 反向代理的好处
提高访问速度因为nginx本身可以进行缓存如果访问的同一接口并且做了数据缓存nginx就直接可把数据返回不需要真正地访问服务端从而提高访问速度。进行负载均衡所谓负载均衡,就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器。保证后端服务安全因为一般后台服务地址不会暴露所以使用浏览器不能直接访问可以把nginx作为请求访问的入口请求到达nginx后转发到具体的服务中从而保证后端服务的安全。
nginx 反向代理的配置方式
server{listen 80;server_name localhost;location /api/{proxy_pass http://localhost:8080/admin/; #反向代理}}**proxy_pass**该指令是用来设置代理服务器的地址可以是主机名称IP地址加端口号等形式。如上代码的含义是监听80端口号 然后当我们访问 http://localhost:80/api/…/…这样的接口的时候它会通过 location /api/ {} 这样的反向代理到 http://localhost:8080/admin/上来。接下来进到nginx-1.20.2\conf打开nginx配置
# 反向代理,处理管理端发送的请求location /api/ {proxy_pass http://localhost:8080/admin/;#proxy_pass http://webservers/admin/;}当在访问http://localhost/api/employee/loginnginx接收到请求后转到http://localhost:8080/admin/故最终的请求地址为http://localhost:8080/admin/employee/login和后台服务的访问地址一致。2). nginx 负载均衡当如果服务以集群的方式进行部署时那nginx在转发请求到服务器时就需要做相应的负载均衡。其实负载均衡从本质上来说也是基于反向代理来实现的最终都是转发请求。(nginx按照一定的规则去代理服务器就叫负载均衡)nginx 负载均衡的配置方式
upstream webservers{server 192.168.100.128:8080;server 192.168.100.129:8080;}server{listen 80;server_name localhost;location /api/{proxy_pass http://webservers/admin;#负载均衡}}**upstream**如果代理服务器是一组服务器的话我们可以使用upstream指令配置后端服务器组。如上代码的含义是监听80端口号 然后当我们访问 http://localhost:80/api/…/…这样的接口的时候它会通过 location /api/ {} 这样的反向代理到 http://webservers/admin根据webservers名称找到一组服务器根据设置的负载均衡策略(默认是轮询)转发到具体的服务器。**注**upstream后面的名称可自定义但要上下保持一致。nginx 负载均衡策略
名称说明轮询默认方式weight权重方式默认为1权重越高被分配的客户端请求就越多ip_hash依据ip分配方式这样每个访客可以固定访问一个后端服务least_conn依据最少连接方式把请求优先分配给连接数少的后端服务url_hash依据url分配方式这样相同的url会被分配到同一个后端服务fair依据响应时间方式响应时间短的服务将会被优先分配
具体配置方式轮询
upstream webservers{server 192.168.100.128:8080;server 192.168.100.129:8080;}weight:
upstream webservers{server 192.168.100.128:8080 weight90;server 192.168.100.129:8080 weight10;}ip_hash: :::info IP Hash分配的原理
IP哈希IP Hash的分配原理是将客户端的IP地址作为输入通过哈希函数计算一个值然后使用这个值来决定将请求分配给哪台后端服务器。以下是IP哈希的基本分配原理
客户端IP地址提取当一个请求到达负载均衡器如Nginx它会提取请求的客户端IP地址。哈希计算使用哈希函数将客户端IP地址转化为一个固定范围的哈希值。这个哈希值通常是一个整数。哈希值映射到后端服务器将哈希值映射到可用的后端服务器。通常哈希值与后端服务器的数量相除并取余数以确定将请求路由到哪台服务器。例如如果有3台后端服务器哈希值为12则计算12 % 3 0那么请求将路由到第一台后端服务器。请求路由根据计算的结果请求被路由到特定的后端服务器然后由该服务器来处理请求。会话保持对于会话保持相同客户端IP地址的后续请求将继续被路由到同一台后端服务器以保持用户的会话状态。 :::
upstream webservers{ip_hash;server 192.168.100.128:8080;server 192.168.100.129:8080;}least_conn:
upstream webservers{least_conn;server 192.168.100.128:8080;server 192.168.100.129:8080;}url_hash:URL哈希的分配原理是将请求的URL作为输入通过哈希函数计算一个值然后使用这个值来决定将请求分配给哪台后端服务器。
upstream webservers{hash request_uri;server 192.168.100.128:8080;server 192.168.100.129:8080;}fair:
upstream webservers{server 192.168.100.128:8080;server 192.168.100.129:8080;fair;}2.5完善登录功能(对密码进行加密)
**问题**员工表中的密码是明文存储安全性太低。解决思路
将密码加密后存储提高安全性登录的用户输入账号密码的时候后端使用MD5加密方式对明文密码加密然后和数据库的密文进行比对
实现步骤
修改数据库中明文密码改为MD5加密后的密文打开employee表修改密码修改Java代码前端提交的密码进行MD5加密后再跟数据库中密码比对
打开EmployeeServiceImpl.java修改比对密码
package com.sky.service.impl;import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.entity.Employee;
import com.sky.exception.AccountLockedException;
import com.sky.exception.AccountNotFoundException;
import com.sky.exception.PasswordErrorException;
import com.sky.mapper.EmployeeMapper;
import com.sky.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;Service
public class EmployeeServiceImpl implements EmployeeService {Autowiredprivate EmployeeMapper employeeMapper;/*** 员工登录** param employeeLoginDTO* return*/public Employee login(EmployeeLoginDTO employeeLoginDTO) {String username employeeLoginDTO.getUsername();String password employeeLoginDTO.getPassword();//1、根据用户名查询数据库中的数据Employee employee employeeMapper.getByUsername(username);//2、处理各种异常情况用户名不存在、密码不对、账号被锁定if (employee null) {//账号不存在throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);}//密码比对// TODO 后期需要进行md5加密然后再进行比对passwordDigestUtils.md5DigestAsHex(password.getBytes());if (!password.equals(employee.getPassword())) {//密码错误throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);}if (employee.getStatus() StatusConstant.DISABLE) {//账号被锁定throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);}//3、返回实体对象return employee;}} 3.导入接口文档
接下来就要进入到项目的业务开发了而我们的开发方式就是基本当前企业主流的前后端分离开发方式那么这种方式就要求我们之前需要先将接口定义好这样前后端人员才能并行开发所以这个章节就需要将接口文档导入到管理平台为我们后面业务开发做好准备。其实在真实的企业开发中接口设计过程其实是一个非常漫长的过程可能需要多次开会讨论调整甚至在开发的过程中才会发现某些接口定义还需要再调整这种情况其实是非常常见的但是由于项目时间原因所以选择一次性导入所有的接口在开发业务功能过程当中也会带着大家一起来分析一下对应的接口是怎么确定下来的为什么要这样定义从而培养同学们的接口设计能力。
3.1 前后端分离开发流程
第一步定义接口确定接口的路径、请求方式、传入参数、返回参数。第二步前端开发人员和后端开发人员并行开发同时也可自测。第三步前后端人员进行连调测试。第四步提交给测试人员进行最终测试。
3.2 操作步骤
将课程资料中提供的项目接口导入YApi。访问地址http://yapi.smart-xwork.cn/1). 从资料中找到项目接口文件2). 导入到YApi平台在YApi平台创建出两个项目选择苍穹外卖-管理端接口.json导入导入成功另一个用户端json文件也执行相同操作。
4.Swagger 4.1 介绍
Swagger 是一个规范和完整的框架用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是
使得前后端分离开发更加方便有利于团队协作接口的文档在线自动生成降低后端开发人员编写接口文档的负担功能测试 Spring已经将Swagger纳入自身的标准建立了Spring-swagger项目现在叫Springfox。通过在项目中引入Springfox 即可非常简单快捷的使用Swagger。
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!目前一般都使用knife4j框架。
5.2 使用步骤
导入 knife4j 的maven坐标在pom.xml中添加依赖
dependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-spring-boot-starter/artifactId
/dependency在配置类中加入 knife4j 相关配置WebMvcConfiguration.java
/*** 通过knife4j生成接口文档* return*/
Bean
public Docket docket() {ApiInfo apiInfo new ApiInfoBuilder().title(苍穹外卖项目接口文档).version(2.0).description(苍穹外卖项目接口文档).build();Docket docket new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo).select().apis(RequestHandlerSelectors.basePackage(com.sky.controller)).paths(PathSelectors.any()).build();return docket;
}设置静态资源映射否则接口文档页面无法访问WebMvcConfiguration.java
/*** 设置静态资源映射* param registry*/
protected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(/doc.html).addResourceLocations(classpath:/META-INF/resources/);registry.addResourceHandler(/webjars/**).addResourceLocations(classpath:/META-INF/resources/webjars/);
}访问测试接口文档访问路径为 http://ip:port/doc.html — http://localhost:8080/doc.html接口测试:测试登录功能
**思考**通过 Swagger 就可以生成接口文档那么我们就不需要 Yapi 了1、Yapi 是设计阶段使用的工具管理和维护接口2、Swagger 在开发阶段使用的框架帮助后端开发人员做后端的接口测试
5.3 常用注解
通过注解可以控制生成的接口文档使接口文档拥有更好的可读性常用注解如下
注解说明Api用在类上例如Controller表示对类的说明ApiModel用在类上例如entity、DTO、VOApiModelProperty用在属性上描述属性信息ApiOperation用在方法上例如Controller的方法说明方法的用途、作用
接下来使用上述注解生成可读性更好的接口文档在sky-pojo模块中EmployeeLoginDTO.java
package com.sky.dto;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;Data
ApiModel(description 员工登录时传递的数据模型)
public class EmployeeLoginDTO implements Serializable {ApiModelProperty(用户名)private String username;ApiModelProperty(密码)private String password;}EmployeeLoginVo.java
package com.sky.vo;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;Data
Builder
NoArgsConstructor
AllArgsConstructor
ApiModel(description 员工登录返回的数据格式)
public class EmployeeLoginVO implements Serializable {ApiModelProperty(主键值)private Long id;ApiModelProperty(用户名)private String userName;ApiModelProperty(姓名)private String name;ApiModelProperty(jwt令牌)private String token;}在sky-server模块中EmployeeController.java
package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.entity.Employee;
import com.sky.properties.JwtProperties;
import com.sky.result.Result;
import com.sky.service.EmployeeService;
import com.sky.utils.JwtUtil;
import com.sky.vo.EmployeeLoginVO;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;/*** 员工管理*/
RestController
RequestMapping(/admin/employee)
Slf4j
Api(tags 员工相关接口)
public class EmployeeController {Autowiredprivate EmployeeService employeeService;Autowiredprivate JwtProperties jwtProperties;/*** 登录** param employeeLoginDTO* return*/PostMapping(/login)ApiOperation(value 员工登录)public ResultEmployeeLoginVO login(RequestBody EmployeeLoginDTO employeeLoginDTO) {//..............}/*** 退出** return*/PostMapping(/logout)ApiOperation(员工退出)public ResultString logout() {return Result.success();}}启动服务访问http://localhost:8080/doc.html