视频加载失败

苍穹外卖 Day01:员工模块与分类管理、AutoFill

499 字
2 分钟
苍穹外卖 Day01:员工模块与分类管理、AutoFill

苍穹外卖(sky-take-out)是多模块 Maven 工程,分为 sky-common、sky-pojo、sky-server 三个模块,基于 Spring Boot 2.7.3。第一天的主线是员工模块、分类管理,以及公共字段自动填充(AutoFill)的注解 + 切面方案。

员工模块#

  • 登录:用户名 + MD5 密码比对,通过后签发 JWT。
  • 退出:空实现,前端删除本地 token 即可。
  • 新增员工:DTO 转 Entity,默认密码 123456,状态默认启用,公共字段手工 set。
  • 分页查询:PageHelper。
  • 根据 id 查询:密码脱敏为 ****。
  • 编辑员工:BeanUtils 拷贝属性,补充 updateTime/updateUser。
  • 启停账号:更新 status 字段。

分类管理#

  • 新增分类:默认禁用状态。
  • 分页查询。
  • 删除分类:先查 dish/setmeal 关联,有关联抛 DeletionNotAllowedException。
  • 修改分类。
  • 启停。
  • 按类型查询 list。

公共字段自动填充:自定义注解 + AOP#

createTime/updateTime/createUser/updateUser 四处公共字段在多个业务里重复 set,代码复用和维护成本高。方案是三件套:注解标记 @AutoFill(OperationType) + 切面拦截 + 反射填充。

两种操作类型的填充范围不同:

  • INSERT 填 4 个字段(createUser/createTime/updateUser/updateTime)
  • UPDATE 只填 2 个字段(updateUser/updateTime)

三个关键实现点:

  • 切入点写法:execution(* com.sky.mapper.*.*(..)) && @annotation(...AutoFill)
  • 通过 MethodSignature 调 getAnnotation(AutoFill.class).value() 得到操作类型;setter 方法名统一放在 AutoFillConstant 常量类中,用 getDeclaredMethod().invoke() 反射调用
  • 填充人取 BaseContext.getCurrentId()(ThreadLocal 实现,值由 JWT 拦截器在校验时塞入)

当天的切面只搭好切入点与 @Before 日志骨架,填充逻辑次日补全。

基础设施#

  • JWT 拦截器:拦截 /admin/**,放行 login。
  • BaseContext:基于 ThreadLocal 存当前登录员工 id。
  • 统一返回结果 Result。
  • 全局异常处理:BaseException 兜底;SQLIntegrityConstraintViolationException 单独处理重复用户名。
  • WebMvc 配置:拦截器注册、docket 接口文档、静态资源、消息转换器。
  • mapper XML 开启驼峰映射。

环境排障:Lombok 与 JDK21 不兼容#

问题根因修复
mvn compile 失败:NoSuchFieldError: JCTree$JCImport ... qualidJDK21 移除了 JCImport.qualid 字段,Lombok 1.18.20 不兼容 JDK21root pom <lombok>1.18.20</lombok> 升级为 1.18.34,编译 BUILD SUCCESS

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
苍穹外卖 Day01:员工模块与分类管理、AutoFill
https://ryuki.icu/posts/sky-takeout-day01/
作者
RK
发布于
2026-08-19
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
RK
Long may the sunshine
公告
Long may the sunshine
分类
标签
最新动态
站点天气
天气加载中…
站点统计
文章
27
分类
6
标签
59
总字数
39,139
篝火已燃
0 天
最后活动
0 天前
每日一签