Skip to content

架构总览 ​

服务端(server/)是整个系统的业务中枢:管理端与小程序端都通过 /api/v1 前缀的 REST 接口访问它。

技术栈 ​

组件选型版本
语言 / 运行时Java21
应用框架Spring Boot4.1.x
数据访问Spring Data JPA(Hibernate)随 Boot
数据库MySQL8.0
缓存Caffeine(本地缓存)3.3.x
认证Spring Security + JWT(jjwt)0.13.x
接口文档Knife4j(OpenAPI 3,中文)4.5.0
构建Maven Wrapper-

分层结构 ​

源码层 ​

按职责归纳的源码层地图、模块/状态清单、调用面和拆分理由见源码分层分析;术语定义汇总在术语表。

层实现配置 schema专属协议文件文案挂点
接入编排server/src/main/java/com/sinomed/config/SecurityConfig.javaserver/src/main/resources/application.yml无;OpenAPI 生成不适用
资源控制器server/src/main/java/com/sinomed/controller/PrescriptionController.javaSpringdoc 扫描 com.sinomed.controller无管理端 locale/页面
应用服务server/src/main/java/com/sinomed/service/impl/SettlementServiceImpl.javaJPA/注解与部分服务 @Value无管理端 locale/页面
持久化server/src/main/java/com/sinomed/config/PersistenceConfig.javaserver/src/main/resources/application.ymlserver/init/init.sql 是引导而非运行 schema不适用
业务字典server/src/main/java/com/sinomed/service/FormulaService.javaJPA 实体 schema无管理端 locale/页面
临床运营server/src/main/java/com/sinomed/service/AppointmentService.javaJPA 实体 schema无管理端 locale/页面
财务结算server/src/main/java/com/sinomed/service/CardService.javaJPA 实体 schema无管理端 locale/页面
渠道集成server/src/main/java/com/sinomed/service/WxMpServiceProvider.javaserver/src/main/resources/application.yml回调 XML 行为由代码持有服务内渠道文案
内容与外设desktop/src-tauri/src/main.rsdesktop/src-tauri/src/config.rsdesktop/src-tauri/templates/*.htmldesktop/ui/index.html
交互运行时web/src/app.tsx、app/src/app.ts、kiosk/src/App.tsx、tablet/src/App.tsxweb/config/config.ts、app/config/index.ts、Vite 配置REST 客户端模块locale/页面/token CSS
平台生命周期server/src/main/java/com/sinomed/seed/DemoSeedRunner.javacompose.yml、CI workflow、demo.seed无不适用

代码在 com.sinomed 包下按经典分层组织:

包职责
controllerREST 接口层:参数接收、校验、权限入口,不含业务规则
service / service.impl业务层:业务规则、数据组装、缓存注解
repository数据访问层:Spring Data JPA 接口
entity数据模型:与数据库表一一对应(ddl-auto 自动建表)
vo出参视图对象(View)
params入参对象
config配置类:安全、缓存、JPA、接口文档、加密
securityJWT 过滤器、签发 / 校验、角色与权限定义
exception全局异常到 HTTP 状态码的映射
util工具类:日期区间、考勤计算、手机号校验

模块与业务链路 ​

下文的源码层词汇在术语表定义;详细职责地图见源码分层分析。

从接口与页面出发,系统当前的主链路是:

text
顾客建档 → 创建诊疗单(四诊/脉象/取穴/诊断与调理方案) → 复诊调阅历史
卡项维护 → 订单(自助机下单 / 前台建单 → 待接待 → 接单 / 完成 / 取消)
每日报表 ← 每日总结 / 员工复盘 / 顾客回访(到期提醒)
收费结算 ← 订单收款(储值 / 微信 / 支付宝 / 现金 / 次卡抵扣) → 小票套打 / 月度收费报表
员工签到 → 打卡记录 → 今日/按月考勤统计(运营辅助)
模块Controller现状
顾客(建档 / 查询 / 更新 / 删除 / 病史)CustomerController可用
诊疗单(中医四诊记录)TreatController可用
穴位字典(穴名/拼音检索选穴)AcupointController可用
预约(建约 / 排班网格 / 到店接待)AppointmentController可用
反馈(每日总结 / 员工复盘 / 顾客回访)ReviewController可用
卡项ItemController可用
用户认证(登录 / 注册 / 当前用户)UserController可用
员工与考勤(诊所运营)StaffController、StaffLeaveController可用(请假已实装)
员工周期班表(员工×星期班次参考)StaffShiftController可用
订单(自助机下单 / 前台建单 / 状态流转)OrderController可用
中药处方(开方 / 代煎与膏方流转 / 实时计价 / 配伍与过敏审方)PrescriptionController可用
病症处方模板PrescriptionTemplateController可用
外治处方模板(耳穴/贴敷/艾灸/拔罐常用组合)TherapyTemplateController可用
方剂库(方名/拼音检索带出全方)FormulaController可用
药材字典(开方比价取数)HerbController可用
饮片出入库(流水登记 / 余额与效期预警)HerbStockController可用
收费结算与储值(收款 / 充值流水)SettlementController、RechargeController可用
收款码出图(微信/支付宝商户码图片)PayQrCodeController可用(读 data/payqrcodes/ 出图,不接支付网关)
次卡(发卡 / 停用 / 核销流水)CardController可用
结算小票套打(80mm HTML,模板可覆盖)ReceiptPrintController、PrintTemplateController可用
自助机(免登录下单 / 自助约期)KioskController可用
广告屏与叫号AdsController、CallController可用
微信公众号(回调路由、自动回复规则、自定义菜单+推送、素材台账本地/远端、粉丝绑定与网页授权、账号配置)WxOfficialAccountController、WxMpServiceProvider(WxJava SDK 薄封装)可用(真实出网压公众号凭据;设计稿 design/wechat-official-account.md)
前端错误上报TraceController简单日志记录

阅读接口文档时注意

员工请假已实装(/api/v1/staff/leave/,记录口径:不改登录状态、无审批流)。库存出入库、在线支付为规划功能。以本页「现状」列为准,避免按接口名推断可用功能。

认证与权限 ​

  • 登录走 POST /api/v1/user/login,成功后响应体与响应头同时返回 access token(1 天)与 refresh token(7 天),均为 Bearer JWT。
  • 除登录与接口文档路径外,所有接口都要求携带 Authorization: Bearer <token>。
  • 角色按员工表的 role 字段划分:role == 0 返回 admin 权限集,1-9 为管理层(MANAGER 权限集),≥10 为普通员工(USER);员工 status <= 0(离职)无法登录。
  • 权限字符串(admin:* / management:*)已在代码中定义;方法级鉴权已部分启用——员工管理写接口(POST/PUT/DELETE /api/v1/staff)加 @PreAuthorize("hasRole('ADMIN')"),越权返回 403;其余接口登录即可用。
  • admin / 123 管理员账号在首次以 admin 登录时自动创建(内置 bcrypt 密码);演示种子只建 gu/shen/su 三个员工账号。

横切机制 ​

  • 审计字段:所有实体带 create_time / update_time(card_adjusts 仅 create_time),由 JPA Auditing 自动维护。
  • 缓存:按 id 的查询走 Caffeine 缓存(默认约 50 分钟过期),卡项与诊疗单的更新 / 删除已加 @CacheEvict 主动失效;缓存失效仍按单 key 粒度,存在短窗口脏读,属已知待优化点。
  • 分页:current 从 1 起始,统一返回 { data, total, pages, success } 结构。
  • 异常:全局 advice 把参数错误映射 400、认证失败 401、账号锁定 403、其余 500。
  • 接口文档:Knife4j 中文界面,扫描 com.sinomed.controller,入口 /doc.html。

Last updated: