1. 新增员工
1.1 需求分析和设计
注意事项:
- 账号必须是唯一的
- 手机号为合法的11位手机号码
- 身份证号为合法的18位身份证号码
- 密码默认为123456
本项目约定:
- 管理端发出的请求,统一使用**/admin**作为前缀。
- 用户端发出的请求,统一使用**/user**作为前缀。
1.2 代码开发
注意:
- 当前端提交的数据和实体类中对应的属性差别比较大时,建议使用 DTO 来封装数据
@Data
public class EmployeeDTO implements Serializable {private Long id;private String username;private String name;private String phone;private String sex;private String idNumber;}
1.3 功能测试
功能测试实现方式:
- 通过接口文档测试
- 通前后端联调测试
1.3.1 接口文档测试
启动服务: 访问http://localhost:8080/doc.html,进入新增员工接口
响应码:401 报错
报错原因: 由于JWT令牌校验失败,导致EmployeeController的save方法没有被调用
解决方法: 调用员工登录接口获得一个合法的JWT令牌
使用admin用户登录获取令牌
添加令牌:
- 将合法的JWT令牌添加到全局参数中
- 文档管理–>全局参数设置–>添加参数
接口测试:
1.3.2 前后端联调测试
启动nginx,访问 http://localhost
注意: 由于开发阶段前端和后端是并行开发的,后端完成某个功能后,此时前端对应的功能可能还没有开发完成,导致无法进行前后端联调测试。所以在开发阶段,后端测试主要以接口文档测试为主。
1.4 代码完善
目前,程序存在的问题主要有两个:
- 录入的用户名已存,抛出的异常后没有处理
- 新增员工时,创建人id和修改人id设置为固定值
1.4.1 问题一
描述: 录入的用户名已存在,抛出的异常后没有处理
1.4.2 问题二
描述: 新增员工时,创建人 id 和修改人 id 设置为固定值
思考: 解析出登录员工 id 后,如何传递给 Service 的 save 方法?
- 通过 ThreadLocal 进行传递。
1.4.3 ThreadLocal
- ThreadLocal 并不是一个 Thread,而是 Thread 的局部变量。
- ThreadLocal 为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
注意:
- 客户端发送的每次请求,后端的 Tomcat 服务器都会分配一个单独的线程来处理请求
ThreadLocal 常用方法:
- public void set(T value) 设置当前线程的线程局部变量的值
- public T get() 返回当前线程所对应的线程局部变量的值
- public void remove() 移除当前线程的线程局部变量
2. 员工分页查询
2.1 需求分析和设计
业务规则:
- 根据页码展示员工信息
- 每页展示10条数据
- 分页查询时可以根据需要,输入员工姓名进行查询
2.2 代码开发
2.3 功能测试
可以通过接口文档进行测试,也可以进行前后端联调测试,最后操作时间字段展示有问题
2.4 代码完善
问题描述: 操作时间字段显示有问题。
解决方式:
- 方式一:在属性上加入注解,对日期进行格式化
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;
- 方式二:在 WebMvcConfiguration 中扩展Spring MVC的消息转换器,统一对日期类型进行格式化处理
3. 启用禁用员工账号
3.1 需求分析与设计
业务规则:
- 可以对状态为“启用” 的员工账号进行“禁用”操作
- 可以对状态为“禁用”的员工账号进行“启用”操作
- 状态为“禁用”的员工账号不能登录系统
3.2 代码开发
4. 编辑员工
4.1 需求分析与设计
根据上述原型图分析,编辑员工功能涉及到两个接口:
- 根据 id 查询员工信息
- 编辑员工信息
4.2 代码开发
4.2.1 回显员工信息功能
4.2.2 修改员工信息功能
5. 导入分类模块功能代码
5.1 需求分析与设计
业务规则:
- 分类名称必须是唯一的
- 分类按照类型可以分为菜品分类和套餐分类
- 新添加的分类状态默认为“禁用”
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 |