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反向代理

1
2
3
4
5
6
7
8
server {
listen 8082;
server_name localhost;

location /api/ {
proxy_pass http://localhost:8080/admin/; # 反向代理
}
}
  • 负载均衡配置nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
upstream webservers {
server 192.168.100.128:8080; # 后端服务器1
server 192.168.100.129:8080; # 后端服务器2
}
server {
listen 8082;
server_name localhost;

location /api/ {
proxy_pass http://webservers/admin/; # 负载均衡
}
}
  • 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
    @Service
    public class EmployeeServiceImpl implements EmployeeService {

    @Autowired
    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