You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
graph TD
A["axzl-admin<br/>Web入口,Controller层"] --> B["axzl-framework<br/>Security, JWT, AOP"]
A --> D["axzl-biz<br/>AI业务,RAG,知识库"]
B --> C["axzl-system<br/>User/Role/Menu/Dict"]
B --> E["axzl-common<br/>工具,基础类,注解"]
C --> E
D --> E
style A fill:#409EFF,color:#fff
style B fill:#67C23A,color:#fff
style C fill:#E6A23C,color:#fff
style D fill:#F56C6C,color:#fff
style E fill:#909399,color:#fff
Loading
各模块职责:
模块
职责
关键包
axzl-admin
Web入口,Controller层,应用启动配置
com.axzl.web.controller
axzl-biz
AI业务逻辑,RAG流程,知识库,健康档案
com.axzl.biz.service
axzl-framework
Spring Security,JWT,AOP切面,核心服务
com.axzl.framework
axzl-system
系统管理领域(用户/角色/菜单/字典)
com.axzl.system
axzl-common
通用工具,基础类,注解,枚举,Redis
com.axzl.common
2.3 技术选型
层次
技术
版本
选型理由
后端框架
Spring Boot
4.0.3
Java生态最成熟的Web框架
AI框架
Spring AI
2.0.0-M3
Spring官方AI集成框架,统一API
ORM
MyBatis-Plus
3.5.16
兼容MyBatis原生,提供便捷CRUD
连接池
Druid
1.2.28
阿里巴巴开源,支持监控和SQL防火墙
缓存
Redis (Lettuce)
7.x
高性能内存缓存,支持集群
向量库
Milvus
2.x
开源向量数据库,支持多种索引
前端框架
Vue 3 + Vite 6
3.x / 6.x
响应式前端框架,快速构建工具
UI组件库
Element Plus
2.x
Vue 3生态最成熟的UI库
API文档
Knife4j (Swagger)
4.4.0
增强版Swagger UI
容器化
Docker Compose
-
一键部署所有依赖服务
3 系统功能结构与建模
3.1 系统功能结构图
graph TB
A["安心诊聊平台 AXZL"] --> B["智能问诊模块"]
A --> C["知识库管理模块"]
A --> E["健康档案管理模块"]
A --> F["AI模型配置模块"]
A --> M["用药提醒模块"]
A --> G["系统管理模块"]
A --> H["系统监控模块"]
A --> I["通用服务模块"]
B --> B1["SSE流式对话"]
B --> B2["同步AI问诊"]
B --> B3["问诊历史管理"]
B --> B4["会话管理"]
B --> B5["满意度评价"]
C --> C1["知识条目管理"]
C --> C2["文档上传处理"]
C --> C3["语义向量检索"]
C --> C4["异步向量化"]
C --> C5["文档重新处理"]
E --> E1["患者档案维护"]
E --> E2["档案Excel导入导出"]
E --> E3["我的健康档案"]
F --> F1["模型CRUD"]
F --> FM2["默认模型切换"]
F --> F3["多Provider支持"]
M --> M1["用药管理"]
M --> M2["用药打卡"]
M --> M3["今日提醒"]
M --> M4["管理端查询"]
G --> G1["用户管理"]
G --> G2["角色管理"]
G --> G3["菜单权限管理"]
G --> G4["字典管理"]
G --> G5["参数配置"]
G --> G6["个人中心"]
H --> H1["在线用户监控"]
H --> H2["操作日志"]
H --> H3["登录日志"]
H --> H4["缓存监控"]
H --> H5["服务器监控"]
H --> H6["SQL监控"]
I --> I1["验证码生成"]
I --> I2["文件上传下载"]
Loading
3.2 系统用例图
3.2.1 患者角色用例图
graph LR
subgraph 患者端
U(("患者"))
U --> UC1["用户登录/注册"]
U --> UC2["AI智能问诊"]
U --> UC3["查看问诊历史"]
U --> UC4["管理问诊会话"]
U --> UC5["评价问诊满意度"]
U --> UC6["查看健康档案"]
U --> UC7["编辑健康档案"]
U --> UC8["修改个人信息"]
U --> UC9["用药提醒管理"]
end
Loading
3.2.2 管理员角色用例图
graph LR
subgraph 管理端
A(("管理员"))
A --> AC1["用户管理"]
A --> AC2["角色权限管理"]
A --> AC3["菜单管理"]
A --> AC4["字典管理"]
A --> AC5["系统参数配置"]
A --> AC6["问诊会话管理"]
A --> AC7["知识库管理"]
A --> AC8["文档管理"]
A --> AC9["健康档案管理"]
A --> AC10["AI模型配置"]
A --> AC11["在线用户监控"]
A --> AC12["日志查看"]
A --> AC13["缓存管理"]
A --> AC14["服务器监控"]
end
Loading
3.2.3 系统交互用例总图
graph TB
P(("患者")) --> P1["AI智能问诊"]
P --> P2["健康档案管理"]
P --> P3["用药提醒管理"]
P --> P4["知识文档上传"]
M(("管理员")) --> M1["系统管理"]
M --> M2["业务管理"]
M --> M3["系统监控"]
M --> M4["AI模型配置"]
subgraph "核心业务"
P1 -->|"SSE流式对话"| RAG["RAG检索增强生成"]
RAG -->|"向量检索"| MV["Milvus向量库"]
RAG -->|"文本生成"| DS["DeepSeek API"]
P4 -->|"异步向量化"| MV
end
subgraph "系统基础设施"
M1 --> DB["MySQL数据库"]
M3 --> RD["Redis缓存"]
end
Loading
3.3 核心业务流程图
3.3.1 用户登录认证流程
flowchart TD
A([用户访问系统]) --> B{是否已登录?}
B -->|是| C[获取Token]
B -->|否| D[跳转登录页]
D --> E[输入用户名/密码/验证码]
E --> F[提交登录请求]
F --> G{验证码校验}
G -->|失败| H[提示验证码错误]
H --> D
G -->|通过| I{用户存在性检查}
I -->|不存在| J[提示用户不存在]
I -->|存在| K{密码校验-BCrypt}
K -->|失败| L{重试次数>=5?}
L -->|是| M[锁定账户10分钟]
L -->|否| N[密码错误计数+1]
K -->|通过| O{账户状态检查}
O -->|停用| P[提示账户已停用]
O -->|正常| Q[生成JWT Token]
Q --> R[存储Token到Redis]
R --> S[返回Bearer Token]
S --> T[前端存储Token到Cookie]
T --> U[加载动态路由]
U --> V([进入系统首页])
Loading
3.3.2 AI智能问诊流程(RAG)
flowchart TD
A([患者输入症状描述]) --> B[创建/获取问诊会话]
B --> C[保存用户消息到数据库]
C --> D[文本向量化-Embedding]
D --> E[Milvus相似度检索Top-5]
E --> F{相似度>=0.6?}
F -->|是| G[注入知识库检索结果]
F -->|否| H[跳过知识库注入]
G --> I[加载用户健康档案]
H --> I
I --> J[加载最近30条对话历史]
J --> K[组装结构化Prompt]
K --> L[调用DeepSeek API-SSE流式]
L --> M[逐字推送SSE事件到前端]
M --> N{流式输出完成?}
N -->|否| M
N -->|是| O[保存AI完整回复到数据库]
O --> P[更新会话元数据]
P --> Q([问诊完成])
Loading
3.3.3 文档上传与向量化流程
flowchart TD
A([管理员/患者上传文档]) --> B{文件格式校验}
B -->|不支持| C[提示格式错误]
B -->|支持| D[存储文件到本地]
D --> E[返回文档记录-状态:待处理]
E --> F["@Async 异步启动处理"]
F --> G[更新状态:处理中]
G --> H[提取文档文本内容]
H --> I{文本长度<3000字符?}
I -->|是| J[整体存储为单个知识块]
I -->|否| K[按800字符分块-50字重叠]
K --> L[批量向量化-每批20条]
J --> L
L --> M[EmbeddingModel.embed]
M --> N[写入Milvus向量库]
N --> O[写入MySQL知识元数据表]
O --> P{处理成功?}
P -->|是| Q[更新状态:已完成]
P -->|否| R[更新状态:处理失败]
Q --> S([文档可被RAG检索])
R --> T[支持手动重新处理]
Loading
3.3.4 权限控制流程
flowchart TD
A([HTTP请求到达]) --> B[JwtAuthenticationTokenFilter]
B --> C{是否匿名接口?}
C -->|是| D[直接放行]
C -->|否| E[提取Authorization Header]
E --> F{Token是否存在?}
F -->|否| G[返回401未认证]
F -->|是| H[JWT验签+Redis查询]
H --> I{Token有效?}
I -->|否| J[返回401 Token过期/无效]
I -->|是| K{剩余时间<20分钟?}
K -->|是| L[自动刷新Token]
K -->|否| M[设置SecurityContext]
L --> M
M --> N[进入Controller方法]
N --> O{是否有@PreAuthorize?}
O -->|是| P{权限校验通过?}
P -->|否| Q[返回403无权限]
P -->|是| R[执行业务逻辑]
O -->|否| R
sequenceDiagram
actor U as 患者
participant FE as 前端
participant BE as 后端服务
participant Milvus as 向量数据库
participant DB as MySQL
participant AI as DeepSeek大模型
U->>FE: 描述症状,点击发送
alt 新会话
FE->>BE: 创建新会话
BE->>DB: 保存会话记录
end
BE->>DB: 保存用户消息
alt 开启知识库
BE->>Milvus: 症状向量检索(返回Top5相关知识)
Milvus-->>BE: 返回医学参考知识
end
BE->>DB: 查询用户健康档案
BE->>DB: 查询历史对话(最近30条)
BE->>BE: 组装提示词(参考知识+健康档案+历史对话+当前症状)
BE->>AI: 发送提示词请求
AI-->>BE: 流式返回AI回答
BE-->>FE: 逐字推送回答(SSE流式)
FE-->>U: 逐字显示回答(打字机效果)
BE->>DB: 保存AI回答
BE->>DB: 更新会话信息
Loading
4.1.2 Prompt组装策略
flowchart TD
A([患者发起问诊]) --> B{是否有会话ID?}
B -- 否 --> C[创建新会话]
B -- 是 --> D[加载已有会话]
C --> E[保存用户消息到数据库]
D --> E
E --> F{是否开启知识库?}
F -- 是 --> G[向量检索医学知识库]
G --> H[获取相关参考知识Top5]
H --> I[查询用户健康档案]
F -- 否 --> I
I --> J[查询历史对话记录]
J --> K[组装完整提示词]
K --> L[调用大模型生成回答]
L --> M[流式返回AI回答]
M --> N[前端逐字展示]
N --> O[保存AI回答到数据库]
O --> P[更新会话]
P --> Q([问诊完成])
flowchart TD
A["MultipartFile 文件上传"] --> B["存储到本地文件系统"]
B --> C["@Async 异步启动处理"]
C --> D["CustomDocumentReader<br/>提取文本内容<br/>(txt/docx/pdf/md/jsonl)"]
D --> E{"文本长度 < 3000字符?"}
E -->|是| F["整体存储为单个知识块"]
E -->|否| G["按段落分块<br/>800字符/块,50字符重叠"]
F --> H["EmbeddingModel.embed()<br/>批量向量化(每批20条)"]
G --> H
H --> I["写入 Milvus 向量库"]
H --> J["写入 MySQL 元数据表"]
sequenceDiagram
actor U as 用户
participant FE as 前端
participant BE as 后端服务
participant Redis as Redis
participant DB as 数据库
U->>FE: 输入用户名、密码、验证码
FE->>BE: 提交登录请求
BE->>Redis: 校验验证码
alt 验证码错误或过期
BE-->>FE: 返回错误提示
FE-->>U: 显示错误信息
end
BE->>DB: 查询用户信息
DB-->>BE: 返回用户数据
alt 用户不存在或已停用
BE-->>FE: 返回错误提示
FE-->>U: 显示错误信息
end
BE->>BE: 校验密码(BCrypt)
alt 密码错误
BE->>Redis: 记录失败次数
alt 连续错误达上限
BE-->>FE: 返回"账号已锁定"
FE-->>U: 显示账号锁定
else 未达上限
BE-->>FE: 返回"密码错误"
FE-->>U: 显示密码错误
end
end
BE->>DB: 查询用户权限菜单
BE->>Redis: 生成并存储登录凭证(TTL=30min)
BE->>BE: 签发JWT令牌
BE-->>FE: 返回JWT令牌
FE->>FE: 保存令牌到Cookie
FE-->>U: 登录成功,跳转首页
Note over U,DB: === 后续业务请求 ===
U->>FE: 访问业务页面
FE->>BE: 请求携带JWT令牌
BE->>Redis: 验证令牌有效性
alt 令牌有效(剩余≤20min自动续期)
BE-->>FE: 返回业务数据
FE-->>U: 展示页面
else 令牌无效或过期
BE-->>FE: 返回401未授权
FE-->>U: 跳转登录页
end
Loading
flowchart TD
A["用户登录请求"] --> B["CaptchaController<br/>验证码校验(可配置关闭)"]
B --> C["SysLoginService.login()"]
C --> D["1. 验证码校验"]
D --> E["2. 用户存在性检查"]
E --> F["3. 密码校验 (BCrypt)"]
F --> F1["SysPasswordService"]
F1 --> F2["Redis计数器<br/>login_password_limit:{username}"]
F2 --> F3{"重试次数 >= 5?"}
F3 -->|是| F4["锁定账户10分钟"]
F3 -->|否| G["4. 账户状态检查"]
G --> H["5. TokenService.createToken()"]
H --> H1["生成UUID loginKey"]
H1 --> H2["构建loginUser对象<br/>(userId, userName, deptId,<br/>token, loginTime, expireTime)"]
H2 --> H3["JWT签名 (HS512)"]
H3 --> H4["Redis存储<br/>login_tokens:{loginKey}"]
H4 --> H5["返回 Bearer {token}"]
graph TD
U["用户 SysUser"] -->|"N:N"| UR["用户角色关联<br/>sys_user_role"]
UR -->|"N:N"| R["角色 SysRole"]
R -->|"N:N"| RM["角色菜单关联<br/>sys_role_menu"]
RM -->|"N:1"| M["菜单 SysMenu"]
M --> M1["目录 (menuType=M)<br/>一级导航"]
M --> M2["菜单 (menuType=C)<br/>页面路由"]
M --> M3["按钮 (menuType=F)<br/>权限标识 (perms)"]
style U fill:#409EFF,color:#fff
style R fill:#E6A23C,color:#fff
style M fill:#67C23A,color:#fff
services:
mysql: # MySQL 8.0, port 3306redis: # Redis 7, port 6379milvus: # Milvus standalone, port 19530etcd: # Milvus依赖minio: # Milvus对象存储依赖attu: # Milvus管理界面, port 8000bge-embedding: # BGE嵌入模型服务, port 8718