苍穹外卖开发日记-员工管理与AOP自动填充
苍穹外卖开发日记员工管理、分类管理与AOP自动填充实战今天完成了苍穹外卖项目的员工管理模块、分类管理模块并通过自定义注解AOP的方式实现了公共字段的自动填充让我们来回顾一下这些核心功能的实现。一、今日工作概览时间完成内容14:44新增员工业务代码17:38启用禁用员工账号功能18:10员工信息查询与修改18:20分类管理模块完整开发22:31公共字段自动填充AOP二、员工管理模块2.1 新增员工新增员工功能涉及Controller、Service、Mapper三层架构的协作Controller层PostMappingApiOperation(新增员工)publicResultsave(RequestBodyEmployeeDTOemployeeDTO){log.info(新增员工{},employeeDTO);employeeService.save(employeeDTO);returnResult.success();}Service层publicvoidsave(EmployeeDTOemployeeDTO){EmployeeemployeenewEmployee();// 对象属性拷贝BeanUtils.copyProperties(employeeDTO,employee);// 设置状态默认启用employee.setStatus(StatusConstant.ENABLE);// 设置默认密码MD5加密employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));employeeMapper.insert(employee);}技术要点使用BeanUtils.copyProperties()快速复制属性密码采用 MD5 加密存储默认密码通过常量类管理2.2 员工分页查询使用 PageHelper 插件简化分页逻辑publicPageResultpageQuery(EmployeePageQueryDTOemployeePageQueryDTO){PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());PageEmployeepageemployeeMapper.pageQuery(employeePageQueryDTO);returnnewPageResult(page.getTotal(),page.getResult());}技术要点PageHelper 自动生成分页 SQL返回封装的 PageResult 对象2.3 启用/禁用员工账号publicvoidstartOrStop(Integerstatus,Longid){EmployeeemployeenewEmployee();employee.setStatus(status);employee.setId(id);employeeMapper.update(employee);}2.4 根据ID查询与修改员工// 查询密码脱敏publicEmployeegetById(Longid){EmployeeemployeeemployeeMapper.getById(id);employee.setPassword(****);returnemployee;}// 修改publicvoidupdate(EmployeeDTOemployeeDTO){EmployeeemployeenewEmployee();BeanUtils.copyProperties(employeeDTO,employee);employeeMapper.update(employee);}三、分类管理模块分类管理实现了完整的CRUD功能包括3.1 核心功能功能说明新增分类支持菜品分类和套餐分类分页查询按类型、名称条件查询删除分类带关联检查关联菜品/套餐时禁止删除修改分类更新分类信息启用禁用控制分类状态类型查询根据分类类型查询列表3.2 删除分类的业务约束publicvoiddeleteById(Longid){// 检查是否关联菜品IntegercountdishMapper.countByCategoryId(id);if(count0){thrownewDeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH);}// 检查是否关联套餐countsetmealMapper.countByCategoryId(id);if(count0){thrownewDeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL);}categoryMapper.deleteById(id);}设计思考删除前检查关联关系保证数据完整性。四、公共字段自动填充AOP4.1 问题背景在新增员工、修改员工、新增分类等操作中都需要设置以下公共字段createTime- 创建时间updateTime- 更新时间createUser- 创建人updateUser- 更新人原有代码employee.setCreateTime(LocalDateTime.now());employee.setUpdateTime(LocalDateTime.now());employee.setCreateUser(BaseContext.getCurrentId());employee.setUpdateUser(BaseContext.getCurrentId());这些重复代码散落在各个Service方法中不易维护。4.2 解决方案自定义注解 AOP第一步定义操作类型枚举publicenumOperationType{UPDATE,// 更新操作INSERT// 插入操作}第二步定义自定义注解Target(ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)publicinterfaceAutoFill{OperationTypevalue();// 数据库操作类型}第三步定义常量类publicclassAutoFillConstant{publicstaticfinalStringSET_CREATE_TIMEsetCreateTime;publicstaticfinalStringSET_UPDATE_TIMEsetUpdateTime;publicstaticfinalStringSET_CREATE_USERsetCreateUser;publicstaticfinalStringSET_UPDATE_USERsetUpdateUser;}第四步实现切面类AspectComponentSlf4jpublicclassAutoFillAspect{// 切入点拦截Mapper层带有AutoFill注解的方法Pointcut(execution(* com.sky.mapper.*.*(..)) annotation(com.sky.annotation.AutoFill))publicvoidautoFillPointCut(){}// 前置通知Before(autoFillPointCut())publicvoidautoFill(JoinPointjoinPoint){log.info(开始进行公共字段自动填充);// 1. 获取数据库操作类型MethodSignaturesignature(MethodSignature)joinPoint.getSignature();AutoFillautoFillsignature.getMethod().getAnnotation(AutoFill.class);OperationTypeoperationTypeautoFill.value();// 2. 获取方法参数实体对象Object[]argsjoinPoint.getArgs();if(argsnull||args.length0)return;Objectentityargs[0];// 3. 准备填充数据LocalDateTimenowLocalDateTime.now();LongcurrentIdBaseContext.getCurrentId();// 4. 根据操作类型通过反射赋值if(operationTypeOperationType.INSERT){// INSERT操作填充四个字段try{MethodsetCreateTimeentity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME,LocalDateTime.class);MethodsetUpdateTimeentity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);MethodsetCreateUserentity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER,Long.class);MethodsetUpdateUserentity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);setCreateTime.invoke(entity,now);setUpdateTime.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdateUser.invoke(entity,currentId);}catch(Exceptione){thrownewRuntimeException(e);}}else{// UPDATE操作只填充两个字段try{MethodsetUpdateTimeentity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);MethodsetUpdateUserentity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);}catch(Exceptione){thrownewRuntimeException(e);}}}}4.3 使用方式在Mapper接口的方法上添加注解Insert(INSERT INTO employee (...) VALUES (...))AutoFill(OperationType.INSERT)voidinsert(Employeeemployee);Update(UPDATE employee SET ...)AutoFill(OperationType.UPDATE)voidupdate(Employeeemployee);Service层代码简化为publicvoidsave(EmployeeDTOemployeeDTO){EmployeeemployeenewEmployee();BeanUtils.copyProperties(employeeDTO,employee);employee.setStatus(StatusConstant.ENABLE);employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));// 公共字段自动填充无需手动设置employeeMapper.insert(employee);}4.4 技术亮点技术点说明自定义注解标记需要自动填充的方法AOP切面统一处理公共字段填充逻辑反射机制动态调用实体类的setter方法枚举类型区分INSERT和UPDATE操作五、项目结构sky-take-out/ ├── sky-common/ # 公共模块 │ └── src/main/java/com/sky/ │ ├── constant/ # 常量类 │ │ ├── AutoFillConstant.java │ │ ├── MessageConstant.java │ │ └── StatusConstant.java │ └── enumeration/ # 枚举类 │ └── OperationType.java │ └── sky-server/ # 服务模块 └── src/main/java/com/sky/ ├── annotation/ # 自定义注解 │ └── AutoFill.java ├── aspect/ # 切面类 │ └── AutoFillAspect.java ├── controller/ # 控制器 │ └── admin/ │ ├── EmployeeController.java │ └── CategoryController.java ├── service/ # 业务层 │ └── impl/ │ ├── EmployeeServiceImpl.java │ └── CategoryServiceImpl.java └── mapper/ # 数据访问层 ├── EmployeeMapper.java └── CategoryMapper.java六、总结今天的工作主要围绕三个核心模块展开员工管理完成了员工的增删改查及状态管理熟悉了三层架构的开发流程分类管理实现了完整的CRUD功能加入了业务约束删除前检查关联AOP自动填充通过自定义注解切面编程优雅地解决了公共字段重复赋值的问题AOP自动填充的优势减少重复代码提高开发效率统一管理公共字段便于维护符合开闭原则对扩展开放对修改关闭下一步计划菜品管理模块开发套餐管理模块开发Redis缓存优化本文是苍穹外卖项目开发的学习记录希望对你有所帮助
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2607175.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!