苍穹外卖开发日志Day01——环境搭建
2025.06.03
苍穹外卖开发日志Day01——环境搭建
一、项目介绍
1.1 项目介绍
-
项目定位:专门为餐饮企业定制的一款软件产品

-
功能架构:体现项目中的业务功能模块

1.2 产品原型
- 产品原型:展示了苍穹外卖的产品原型,一般由产品经理设计


1.3 技术选型
- 技术选型:展示了苍穹外卖中使用的技术框架和中间件等

二、环境搭建
2.1 前段环境搭建
- 使用提供的前段环境
2.2 后端环境搭建
- 后端工程基于maven进行项目构建,并且进行分模块开发
项目结构:

- sky-take-out:maven父工程,统一管理依赖版本,聚合其他子模块
- sky-common:子模块,存放公共类,例如:工具类、常量类、异常类等
- sky-pojo:子模块,存放实体类、V0、DTO等
- sky-service:子模块,后端服务,存放配置文件、Controller、 Service、 Mapper等
- Git版本控制
- 数据库设计
| 序号 | 数据表名 | 中文名称 |
|---|---|---|
| 1 | employee | 员工表 |
| 2 | category | 分类表 |
| 3 | dish | 菜品表 |
| 4 | dish_flavor | 菜品口味表 |
| 5 | setmeal | 套餐表 |
| 6 | setmeal_dish | 套餐菜品关系表 |
| 7 | user | 用户表 |
| 8 | address_book | 地址表 |
| 9 | shopping_cart | 购物车表 |
| 10 | orders | 订单表 |
| 11 | order_detail | 订单明细表 |
2.3 nginx反向代理
- 前端请求地址:http://localhost:8082/api/employee/login
- 后端接口地址:http://localhost:8080/admin/employee/login
- 实现方式:nginx反向代理
- nginx反向代理
- 将前端发送的动态请求由nginx转发到后端服务器
- 好处
- 提高访问速度(nginx可以进行缓存)
- 进行负载均衡
- 保证后端服务安全性
- 反向代理配置nginx.conf
1 | server { |
- 负载均衡配置nginx.conf
1 | upstream webservers { |
- nginx负载均衡策略
| 名称 | 说明 |
|---|---|
| 轮询 | 默认的负载均衡策略,按顺序将请求分发到每个服务器 |
| weight | 根据服务器的权重分配请求,权重越高,分配的请求越多 |
| ip_hash | 根据客户端IP地址进行负载均衡,同一IP地址的请求总是转发到同一台服务器 |
| least_conn | 将请求分发给当前连接数最少的服务器 |
| url_hash | 根据请求的URL进行负载均衡,同一URL的请求总是转发到同一台服务器 |
| fair | 根据请求的响应时间进行负载均衡,响应时间越短的服务器分配的请求越多 |
三、登录功能完善
3.1 登录功能完善——密码加密
- 修改数据库中明文密码,改为MD5加密后的密文
- 修改登录功能,使用MD5加密密码进行比对
- EmployeeServiceImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class EmployeeServiceImpl implements EmployeeService {
private 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);
}
//密码比对
//进行md5加密,然后再进行比对
password = DigestUtils.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;
}
}
四、接口文档导入
4.1 导入接口文档
- 前后端分离开发流程
- 导入接口文档
- 使用Apifox导入接口文档
- 苍穹外卖-管理端接口.json

- 苍穹外卖-用户端接口.json

- 使用Apifox导入接口文档

