云禾外卖补充—项目整体初始架构解析

发布时间:2026/10/15 21:25:10

云禾外卖补充—项目整体初始架构解析 sky-server 只完成了一个业务模块员工管理其它业务订单/菜品/套餐/购物车/用户/地址/报表只到 entity/dto/vo 这层没有业务实现一、三个子工程的整体职责模块职责可被谁依赖sky-common通用工具箱常量、异常、响应包装、配置类、JWT/OSS/微信工具、JSON 映射sky-pojo、sky-serversky-pojo数据模型层entity数据库表映射、dto前端→后端入参、vo后端→前端出参sky-serversky-server业务实现层启动类、配置、Controller、Service、Mapper、拦截器、异常处理不被任何模块依赖部署入口依赖方向server → pojo → commonserver → common直接用工具类。典型的三层依赖倒置结构。二、sky-common28 个类6 个包包类职责constantAutoFillConstantAOP 自动填充注解里用的常量SET_CREATE_USER/SET_UPDATE_USER等JwtClaimsConstantJWT claims 的 key 名如EMP_ID empIdMessageConstant业务异常文案如账号不存在密码错误PasswordConstant默认密码常量123456StatusConstant员工/菜品状态常量ENABLE1/DISABLE0contextBaseContext基于 ThreadLocal 存当前登录用户 id拦截器写入业务层取出enumerationOperationTypeAOP 枚举UPDATE/INSERT配合AutoFill用exceptionBaseException所有业务异常的父类AccountNotFoundException账号不存在AccountLockedException账号被锁定PasswordErrorException密码错误PasswordEditFailedException修改密码失败LoginFailedException登录失败UserNotLoginException用户未登录AddressBookBusinessException地址簿业务异常OrderBusinessException订单业务异常ShoppingCartBusinessException购物车业务异常SetmealEnableFailedException套餐起售失败含未停售菜品DeletionNotAllowedException删除受限外键关联jsonJacksonObjectMapper自定义 Jackson 序列化器LocalDateTime/Long→String 等propertiesJwtProperties绑定sky.jwt.*配置密钥、TTL、token 名称AliOssProperties绑定sky.alioss.*配置endpoint、accessKey、bucketWeChatProperties绑定sky.wechat.*配置appid、secret、商户号resultResultT统一响应体{code, msg, data}PageResult分页结果{total, records}utilsJwtUtilcreateJWT / parseJWT基于 jjwt 0.9.1AliOssUtilupload / getFileUrl基于阿里云 OSS SDKWeChatPayUtil微信支付下单/退款/查询封装HttpClientUtil基于 HttpClient 的 HTTP 工具三、sky-pojo51 个类3 个包纯 POJO包数量职责entity11 个数据库表映射Employee/Category分类/Dish菜品/DishFlavor菜品口味/Setmeal套餐/SetmealDish套餐-菜品关系/Orders订单/OrderDetail订单明细/ShoppingCart购物车/UserC 端用户/AddressBook地址簿dto19 个Controller 入参EmployeeDTO新增员工、EmployeeLoginDTO登录、EmployeePageQueryDTO分页、CategoryDTO/CategoryPageQueryDTO、DishDTO/DishPageQueryDTO、SetmealDTO/SetmealPageQueryDTO、OrdersDTO下单/OrdersPageQueryDTO分页/OrdersSubmitDTO提交/OrdersPaymentDTO支付/OrdersConfirmDTO接单/OrdersRejectionDTO拒单/OrdersCancelDTO取消、ShoppingCartDTO、UserLoginDTOC 端微信登录、PasswordEditDTO、GoodsSalesDTO销量 Top10、DataOverViewQueryDTO数据看板vo21 个Controller 出参EmployeeLoginVO带 token、UserLoginVOC 端带 openid、DishVO含口味列表、SetmealVO含菜品列表、OrderVO含明细、OrderSubmitVO、OrderPaymentVO支付参数、OrderStatisticsVO各状态订单数量、OrderOverViewVO管理端今日订单概览、SetmealOverViewVO/DishOverViewVO起售停售概览、TurnoverReportVO/UserReportVO/OrderReportVO/SalesTop10ReportVO数据报表、DishItemVO按分类查菜品、BusinessDataVO工作台数据注意pojo 的类全部是数据载体没有任何业务逻辑没有注解、没有方法跟表结构/接口一一对应。四、sky-server全模块只 8 个文件sky-server/src/main/java/com/sky/ ├── SkyApplication.java # 启动类 ├── config/ │ └── WebMvcConfiguration.java # Web 配置拦截器、Knife4j、静态资源 ├── handler/ │ └── GlobalExceptionHandler.java # 全局异常处理 ├── interceptor/ │ └── JwtTokenAdminInterceptor.java # JWT 拦截器 ├── controller/admin/ │ └── EmployeeController.java # 员工 Controller仅 1 个 ├── service/ │ ├── EmployeeService.java # 员工 Service 接口 │ └── impl/ │ └── EmployeeServiceImpl.java # 员工 Service 实现仅 1 个 └── mapper/ └── EmployeeMapper.java # 员工 Mapper仅 1 个每个类真实职责类关键注解 / 配置实际做的事SkyApplicationSpringBootApplicationEnableTransactionManagement启动入口开启注解事务WebMvcConfigurationConfiguration继承WebMvcConfigurationSupport① 注册 JWT 拦截器拦截/admin/**放行/admin/employee/login② 配置 Knife4j 文档扫描com.sky.controller包访问/doc.html③ 映射 Swagger 静态资源JwtTokenAdminInterceptorComponent实现HandlerInterceptor从请求头拿token→JwtUtil.parseJWT解析 → 把员工 id 存到BaseContext的 ThreadLocal里失败返 401GlobalExceptionHandlerRestControllerAdviceExceptionHandler捕获所有BaseException子类 → 打日志 → 返回Result.error(msg)保证任何业务异常都包成统一响应体EmployeeControllerRestControllerRequestMapping(/admin/employee)3 个接口/login登录返 JWT token、/logout登出、POST /新增员工saveEmployeeService接口2 个方法签名login(EmployeeLoginDTO)、save(EmployeeDTO)EmployeeServiceImplService只有login写完了58 行查用户 → MD5 比对密码 → 校验账号状态。save方法是空的接口里声明了实现没写EmployeeMapperMapperXML 在resources/mapper/EmployeeMapper.xml当前只有 1 个方法Select注解方式按用户名查询五、目前项目情况业务entitydtovoControllerServiceMapper员工 Employee✅✅✅✅ 1 个✅ 1 个只完成 login✅ 1 个分类 Category✅✅—❌❌❌菜品 Dish / DishFlavor✅✅✅❌❌❌套餐 Setmeal / SetmealDish✅✅✅❌❌❌订单 Orders / OrderDetail✅✅✅❌❌❌购物车 ShoppingCart✅✅—❌❌❌C 端用户 User✅✅✅❌❌❌地址簿 AddressBook✅——❌❌❌报表营业额/用户/订单/SalesTop10—✅✅❌❌❌目前能跑通的接口只有/admin/employee/login、/admin/employee/logout需要编写分类/菜品/套餐的 CRUD、购物车、订单下单→支付→接单→拒单→催单、WebSocket 实时通知、阿里云 OSS 上传、Excel 报表、微信登录/支付、AOP 自动填充、切面日志、AOP Redis 缓存等目前entity/dto/vo 都已建好表只需写 Controller → Service → Mapper 即可
延伸阅读

更多相关文章

2026/10/15 21:25:10

数据仓库数据模型设计:从ETL分层到公共层下沉的实战方法论

简介:这是一份面向数据仓库工程师与大数据开发者的数据模型设计方法论文档,聚焦数仓建设中分层混乱、模型不规范、命名不统一、主题域划分不完整等典型痛点。文档以实战视角系统梳理了ODS操作型数据存储层、CDM通用数据模型层(含DWD明细层、D…

2026/10/15 21:25:10

T+转换U8+工具实战:账套迁移与数据校验全流程

简介:这是一份面向用友软件实施与运维人员的T数据向U8迁移转换工具,主要解决两套系统间账务、往来、库存等基础数据难以直接对接的问题,适合具备一定用友产品操作经验的技术人员使用。压缩包共13个文件,约426KB,包含8个…

2026/10/15 21:20:10

Gradle 8.6 all.zip 快速下载与离线构建配置避坑指南

简介:Gradle 8.6 是面向 Java、Android 及 JVM 语言开发者的开源构建自动化工具,这份 all 版压缩包适合需要快速获取完整发行版、搭建本地构建环境或研究 Gradle 内部实现的开发者。包内共 2000 个文件,以 1962 个 java 源码文件为主&#xf…

2026/10/15 22:40:58

Java工程师构建AI Agent的实战路径与架构设计

1. 这不是“转行”,是Java工程师的自然演进路径“13年Java老兵转型AI Agent”——这个标题里最需要被立刻纠正的认知偏差,就是“转型”这个词。我带过不下二十个从传统后端、中间件、金融核心系统走出来的Java开发者,他们做AI Agent项目时&am…

2026/10/15 22:40:58

AI漫剧生产全流程:从剧本到成片的降本增效实操指南

坦白说,我第一次在“生产短剧”这件事上认真考虑AI,是被成本逼的。真人短剧一集的拍摄成本摆在那,场景、演员、服化道、灯光、后期……任何一个环节想省,画面质感立刻露馅。后来看到几个团队用生成式AI做漫剧,单集成本…

2026/10/15 22:40:58

H5原生调用摄像头全攻略:从getUserMedia到移动端适配

先说一个我自己的真实经历。之前做移动端H5项目,页面需要直接用浏览器能力打开摄像头做人像采集。第一版Demo在电脑Chrome上跑,结果白屏,控制台日志打出一个NotAllowedError。我第一反应是权限被浏览器拦了,排查一圈下来才发现&am…

2026/10/15 22:40:58

AI速递实战:资讯筛选五层漏斗与20分钟高效清单法

如果你每天醒来第一件事就是刷各种AI消息,你多半会有一种感觉:消息太多,能用的太少。我做《衍辉AI速递》这段时间,最大的体会不是“信息不够”,而是“筛选信息比阅读信息更花精力”。10.8这期一共收录了11条资讯&#…

2026/10/15 22:35:58

帧、流与协议:音视频传输的三层结构深度解析

1. 这不是“播放卡顿”的问题,而是你根本没看懂视频在你设备里到底经历了什么很多人一听到“帧”“流”“流媒体协议”,第一反应是:“哦,就是视频卡不卡的事吧?”——这就像说“心脏跳动”只是“人有没有晕倒”的问题。…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/15 0:02:22

防关联浏览器哪个好?三款产品实测差异解析

新手做多店铺,最纠结的就是防关联浏览器选哪个。飞跨、网易、站斧这三款被问得最多,先给结论:要一体化省心、长期便宜,选站斧;要网易招牌和稳,选网易;预算紧做东南亚 Lazada,选飞跨。…

2026/10/15 0:02:22

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 一、技术背景 大模型(LLM)在通用场景下表现强大,但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时,准确率通常只有 40%-60%。原因…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑