整理记录下学习整个瑞吉外卖项目,详细代码可在我的Gitee仓库瑞吉外卖实战克隆下载学习使用!
7. 分类管理
7.1 公共字段填充
7.1.1问题
在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工信息时也要设置修改时间和修改人。这些字段属于公共字段,同时很多表也存在,如图
7.1.2 解决办法
使用MyBatisPlus的公共字段填充功能,在填充字段或更新的时候为指定字段进行赋予指定值,另外对于存在session中的用户id,可以用ThreadLocal(Thread局部变量)来解决,每次Http请求发送后后台会创建唯一的线程来执行对应操作,且ThreadLocal会给线程提供单一的存储空间,线程内才能访问,获取到值,可通过set()和get()来设置和获取当前线程对应的局部变量值。
7.1.3 代码开发
- 编写BaseContext工具类,使用ThreadLocal保存和获取用户id
public class BaseContext {
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
/**
* 设置值
* @param id
*/
public static void setCurrentId(Long id){
threadLocal.set(id);
}
/**
* 获取值
* @return
*/
public static Long getCurrentId(){
return threadLocal.get();
}
}
- 实体类属性加上@TableField注解,指定自动填充策略,如图
- 按框架要求编写元数据对象处理器,在此类中进行统一赋值,需实现MetaObjectHandler接口
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
/**
* 插入操作,自动填充
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充[insert]...");
log.info(metaObject.toString());
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("createUser",BaseContext.getCurrentId());
metaObject.setValue("updateUser",BaseContext.getCurrentId());
}
/**
* 更新操作,自动填充
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自动填充[update]...");
log.info(metaObject.toString());
long id = Thread.currentThread().getId();
log.info("线程id为:{}",id);
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("updateUser",BaseContext.getCurrentId());
}
}
- 在登录过滤器代码中使用BaseContext设置id,如图
- 将之前controller中写的设置createTime等公共字段值注释掉,如图
7.1.4 测试
新添加用户,如图
测试成功,数据正确,如图
7.2 新增分类
7.2.1 需求分析
可以在后台系统的分类管理页面分别添加菜品和套餐分类,如图
7.2.2 数据模型
将窗口新增的数据插入到category表中,表结构如图
7.2.3 代码开发
- 实体类编写,也可进行导入,如下:
@Data
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//类型 1 菜品分类 2 套餐分类
private Integer type;
//分类名称
private String name;
//顺序
private Integer sort;
//创建时间
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
//更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
//创建人
@TableField(fill = FieldFill.INSERT)
private Long createUser;
//修改人
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
}
- 和之前员工功能一样,新增controller、mapper层和业务层接口及实现类,如图
- controller层添加代码,完成添加菜品功能,如下:
@RestController
@RequestMapping("/category")
@Slf4j
@RequiredArgsConstructor
public class CategoryController {
private final CategoryService categoryService;
/**
* 新增分类
* @param category
* @return
*/
@PostMapping
public Result<String> save(@RequestBody Category category){
log.info("category:{}",category);
categoryService.save(category);
return Result.success("新增分类成功");
}
}
7.2.4 测试
添加川菜信息, 如图
点击确定后显示已存在,说明功能完成
7.3 分类信息分页查询
7.3.1代码开发
和之前员工分页查询类似,代码如下:
/**
* 分页查询
* @param page
* @param pageSize
* @return
*/
@