当前位置: 首页 > article >正文

苍穹外卖开发日记-员工管理与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缓存优化本文是苍穹外卖项目开发的学习记录希望对你有所帮助

相关文章:

苍穹外卖开发日记-员工管理与AOP自动填充

苍穹外卖开发日记:员工管理、分类管理与AOP自动填充实战今天完成了苍穹外卖项目的员工管理模块、分类管理模块,并通过自定义注解AOP的方式实现了公共字段的自动填充,让我们来回顾一下这些核心功能的实现。一、今日工作概览时间完成内容14:44新…...

Windows内核级虚拟串口驱动com0com:构建无限虚拟COM端口对的终极解决方案

Windows内核级虚拟串口驱动com0com:构建无限虚拟COM端口对的终极解决方案 【免费下载链接】com0com Null-modem emulator - The virtual serial port driver for Windows. Brought to you by: vfrolov [Vyacheslav Frolov](http://sourceforge.net/u/vfrolov/profil…...

基于React与Tailwind CSS的轻量级ChatGPT Web界面部署与定制指南

1. 项目概述与核心价值最近在折腾AI应用开发,发现很多朋友都想自己部署一个轻量级的ChatGPT对话服务,但面对动辄几个G的模型和复杂的部署流程就望而却步。直到我发现了blrchen/chatgpt-lite这个项目,它完美地解决了这个问题——一个真正轻量、…...

IC场景XR全息通信_CSDN

6G IC场景XR/全息通信技术深度分析 摘要: 6G时代的沉浸式通信(Immersive Communication, IC)是实现"存在感"传输的核心场景,其中XR与全息通信技术对网络提出了Tbps级速率和亚毫秒级延迟的极限需求。本文从技术需求量化、…...

终极大脑训练指南:5个简单步骤用BrainWorkshop提升你的认知能力

终极大脑训练指南:5个简单步骤用BrainWorkshop提升你的认知能力 【免费下载链接】brainworkshop Continued development of the popular brainworkshop game 项目地址: https://gitcode.com/gh_mirrors/br/brainworkshop BrainWorkshop是一款专业的免费开源大…...

电源设计和效率优化案例C01

本文重点讲清楚三个非常重要的问题: 手把手教会计算电源的效率计算,包括线性电源和开关电源等 1-电源的上下管的 Qg和Rdson为什么是一对矛盾量? 2-单相30A的电流输出电源要求,对上下管子应该如何取舍这两个参数,为什么? 电源设计是硬件设计的核心组成部分,尤其事目前…...

雨夜便利店的光,刚好够照亮你这一秒的疲惫

雨声比闹钟更懂你凌晨一点十七分,耳机里循环着一首没名字的 lo-fi beat,窗外的雨没停,也没下大,就那么轻轻敲着空调外机和生锈的铁皮棚。你站在楼道口犹豫要不要出门买泡面,其实不是饿,是心里空了一小块&am…...

限流不是加个计数器就行:用 Lua 脚本实现多维度原子限流

限流不是加个计数器就行:用 Lua 脚本实现多维度原子限流 项目地址:interview-agent 技术栈:Java 21 / Spring Boot 4.0 / Redis 7 (Redisson) / PostgreSQL 问题:单维度限流挡不住真实场景 简历上传接口,你加了一个&q…...

微信自动化终极指南:5个强大功能助你高效管理微信数据

微信自动化终极指南:5个强大功能助你高效管理微信数据 【免费下载链接】wechat-toolbox WeChat toolbox(微信工具箱) 项目地址: https://gitcode.com/gh_mirrors/we/wechat-toolbox 还在为繁琐的微信数据管理而烦恼吗?微信…...

工业控制系统安全实践:基于ISA-62443-3-3标准的OT/IT融合指南

1. 项目概述:当工业安全遇上新标准在工业自动化领域摸爬滚打了十几年,我见过太多因为安全标准“两张皮”而引发的头疼事。一边是负责生产线的工控工程师,他们的核心信条是“稳定压倒一切”,任何可能影响PLC运行周期、导致电机意外…...

冻|结D球 2026

通过网盘分享的文件:冻|结D球 2026 链接: https://pan.baidu.com/s/1-bhxibfD69ahEoufeQFRRQ?pwdhygv 提取码: hygv...

Guitar Pro 8.1.5作为吉他爱好者的练琴神器,其跨平台支持与强大功能值得重点关注。本评测聚焦其核心优势与操作要点,为吉他学习者与原创音乐人提供高效解决方案。跨系统兼容性Guit

Guitar Pro 8.1.5作为吉他爱好者的练琴神器,其跨平台支持与强大功能值得重点关注。本评测聚焦其核心优势与操作要点,为吉他学习者与原创音乐人提供高效解决方案。跨系统兼容性 Guitar Pro 8.1.5同时支持macOS与Windows系统,mac用户无需转战Wi…...

2026年搜索引擎大变革:生成式优化服务如何引领未来趋势

随着AI技术的不断进步,搜索引擎领域正在经历一场前所未有的变革。2026年,我们见证了从传统SEO到生成式引擎优化(GEO)的重大转变。这场变革不仅改变了用户获取信息的方式,也为企业带来了全新的营销机遇。本文将深入探讨…...

【限时解密】ElevenLabs未公开的“Voice Stability Index”(VSI)指标解析——专业级语音稳定性评估体系首度披露

更多请点击: https://intelliparadigm.com 第一章:【限时解密】ElevenLabs未公开的“Voice Stability Index”(VSI)指标解析——专业级语音稳定性评估体系首度披露 VSI 的本质与工程意义 Voice Stability Index(VSI&…...

开源项目remote2mac:用Windows远程桌面无缝控制macOS

1. 项目概述:远程桌面连接的另一条路如果你是一名需要在Windows电脑上远程控制macOS设备的开发者、设计师或者运维人员,那么“远程桌面”这个需求对你来说一定不陌生。传统的方案,比如微软的RDP(远程桌面协议)对Window…...

终极网盘直链下载助手完整指南:告别限速,快速获取八大平台真实下载地址

终极网盘直链下载助手完整指南:告别限速,快速获取八大平台真实下载地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里…...

别再只会点灯了!用51单片机和继电器模块,做个智能插座控制台灯(附完整代码)

从点灯到智能家居:51单片机与继电器模块的实战进阶指南 当你已经能够熟练地用51单片机点亮LED灯时,是否想过将这些基础技能转化为实际生活中的实用工具?本文将带你跨越实验板与真实世界的鸿沟,用最常见的51单片机和继电器模块&…...

Google 2026 AI全家桶升级:企业管理员必须在48小时内完成的3项策略校准与2项合规备案

更多请点击: https://intelliparadigm.com 第一章:Google 2026 AI全家桶升级全景图 2026年,Google正式发布新一代AI基础设施矩阵——“Project Aether”,标志着其AI全家桶从模块化协同迈向原生融合时代。核心升级聚焦于模型、工具…...

开源情报自动化工具OpenClaw:模块化设计与实战部署指南

1. 项目概述:从“Resolver-TNG/ogas-openclaw”看开源情报自动化最近在开源情报(OSINT)和自动化数据采集的圈子里,一个名为“ogas-openclaw”的项目引起了我的注意。这个项目托管在Resolver-TNG的组织下,名字本身就很有…...

SkillSync MCP:为AI技能市场构建自动化安全门禁系统

1. 项目概述:为AI技能市场装上“安全门” 如果你和我一样,是Claude Code、Cursor这类AI编程助手的深度用户,那你一定对“技能”(Skills)这个概念不陌生。简单来说,技能就是一些预定义的提示词模板或工具脚…...

SatGate-Proxy:开源反向代理与隧道工具部署与实战指南

1. 项目概述与核心价值最近在折腾一些需要跨地域、跨网络环境访问的应用时,遇到了一个老生常谈的痛点:如何稳定、高效地访问那些因为网络策略限制而无法直接触达的服务。这不仅仅是个人用户的需求,很多中小团队在部署混合云、进行远程办公或访…...

法律AI助手weclaw:基于RAG与领域大模型的智能法律应用实践

1. 项目概述:一个面向法律领域的智能助手 最近在关注一些开源项目,发现了一个挺有意思的,叫 shp-ai/weclaw 。光看这个名字,就能猜个八九不离十——“weclaw”,听起来像是“we”和“law”的结合,指向性非…...

AI技能包实战:用cc-skills打造专业级AI编程助手

1. 项目概述:为你的AI助手装上“专业工具箱”如果你和我一样,每天都在和Claude、Cursor、Copilot这类AI编程助手打交道,那你肯定遇到过这样的场景:想让AI帮你写一篇符合公司技术博客规范的PR稿,或者生成一段精准的Prom…...

使用curl命令直接调试Taotoken大模型聊天接口的详细步骤

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用curl命令直接调试Taotoken大模型聊天接口的详细步骤 对于需要在底层进行调试、验证或是在无特定SDK环境中工作的开发者而言&am…...

91160-cli:健康160平台终极挂号神器,5分钟上手解决抢号难题

91160-cli:健康160平台终极挂号神器,5分钟上手解决抢号难题 【免费下载链接】91160-cli 健康160全自动挂号脚本,捡漏神器 项目地址: https://gitcode.com/gh_mirrors/91/91160-cli 你是否还在为抢不到专家号而烦恼?面对健康…...

体验Taotoken多模型聚合在内容生成任务中的效果差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 体验Taotoken多模型聚合在内容生成任务中的效果差异 在实际的开发与创作工作中,我们常常面临一个选择:针对…...

Capital许可排队严重?不想买新许可,闲置回收立即可用

我去年在做项目时,客户说他们Capital许可证池天天爆队,新增用户连基本的算力都抢不到。当时我就琢磨,许可证回收这事儿到底有多重要?去年底我带着团队做了一个实验,直接把闲置许可证利用率干到45%,127个许可…...

Meta发布最大视觉模型:DSG架构如何重构视觉理解范式

1. 项目概述:这不是一次普通更新,而是一次视觉理解边界的重写“Meta Just Updated the Largest Computer Vision Model in History”——这个标题乍看像科技媒体的快讯标题,但如果你在CV领域摸爬滚打过几年,第一反应不是点开链接&…...

FlareLine Flutter:开源跨平台管理后台模板开发与部署指南

1. 项目概述:一个为现代应用而生的Flutter仪表盘模板如果你正在寻找一个能快速启动你的下一个Web、Android或iOS项目后台管理界面的方案,并且希望这个方案足够现代、功能齐全,同时又能让你完全掌控代码,那么FlareLine Flutter这个…...

AMD Ryzen硬件调试终极指南:深入SMU Debug Tool的完整实战应用

AMD Ryzen硬件调试终极指南:深入SMU Debug Tool的完整实战应用 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...