用户使用流程图 — 健康知识库与邀请
端口说明: 📱 小程序 | 🖥 管理后台 | 📋 规划师端 | ⚙️ 系统自动
分层说明: 🏠 页面 → 🔗 API → ⚙️ Service → 📦 数据实体
flowchart TD
%% ============ 颜色定义 ============
classDef page fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
classDef api fill:#fff3e0,stroke:#f57c00,stroke-width:1px
classDef service fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
classDef data fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px
classDef external fill:#fce4ec,stroke:#d32f2f,stroke-width:1px,stroke-dasharray:3 2
classDef actor fill:#e1f5fe,stroke:#0288d1,stroke-width:2px,stroke-dasharray:5 3
%% ============ 角色 ============
ROLE_ADMIN(("🔧 管理员")):::actor
ROLE_PARENT(("👤 家长")):::actor
ROLE_SYSTEM(("⚙️ 微信API")):::actor
%% ================================================================
%% 阶段一:健康知识库管理
%% ================================================================
subgraph 阶段一[阶段一:健康知识库管理]
direction TB
P1["🖥 管理后台:健康知识库页"]:::page
P1 -->|"选择操作"| P1_choice{"查询 / 新增 / 编辑 / 删除 / 导入"}:::page
P1_choice -->|"查询单条"| A1["🔗 POST /api/health/knowledge/query"]:::api
A1 -->|"itemType, itemName"| S1["⚙️ HealthKnowledgeBaseService.query()"]:::service
S1 -->|"类型+名称精确匹配"| D1["📦 health_knowledge_base 表"]:::data
P1_choice -->|"批量查询"| A2["🔗 POST /api/health/knowledge/batch-query"]:::api
A2 -->|"queries: [{itemType, itemName}]"| S2["⚙️ HealthKnowledgeBaseService.batchQuery()"]:::service
S2 -->|"批量匹配返回Map"| D1
P1_choice -->|"列表查询"| A3["🔗 POST /api/health/knowledge/list"]:::api
A3 -->|"无参数"| S3["⚙️ HealthKnowledgeBaseService.listAll()"]:::service
S3 -->|"返回全量知识库"| D1
P1_choice -->|"新增条目"| P1a["🖥 知识库录入表单"]:::page
P1a -->|"itemType, itemName, category, description, ..."| A4["🔗 POST /api/health/knowledge/add"]:::api
A4 -->|"知识条目完整信息"| S4["⚙️ HealthKnowledgeBaseService.save()"]:::service
S4 -->|"写入一条知识记录"| D1
P1_choice -->|"编辑条目"| P1b["🖥 知识库编辑表单"]:::page
P1b -->|"id及更新字段"| A5["🔗 POST /api/health/knowledge/update"]:::api
A5 -->|"实体ID, 更新字段"| S5["⚙️ HealthKnowledgeBaseService.updateById()"]:::service
S5 -->|"更新对应知识记录"| D1
P1_choice -->|"删除条目"| P1c["🖥 确认删除"]:::page
P1c -->|"id"| A6["🔗 POST /api/health/knowledge/delete"]:::api
A6 -->|"知识条目ID"| S6["⚙️ HealthKnowledgeBaseService.removeById()"]:::service
S6 -->|"物理删除"| D1
P1_choice -->|"从JSON导入"| A7["🔗 POST /api/health/knowledge/import"]:::api
A7 -->|"无参数(读取本地JSON)"| S7["⚙️ KnowledgeBaseDataImporter.importAll()"]:::service
S7 -->|"批量导入菌属/指标/营养素等"| D1
end
%% ================================================================
%% 阶段二:KB v3 查询
%% ================================================================
subgraph 阶段二[阶段二:KB v3 查询]
direction TB
D1 -->|"v3数据"| P2["🖥 管理后台:KB v3查询页"]:::page
P2 -->|"选择查询类型"| P2_choice{"菌属 / 指标 / 食物 / 章节"}:::page
P2_choice -->|"查询菌属功能"| A8["🔗 POST /api/health/knowledge/v3/bacteria/query"]:::api
A8 -->|"name(菌名,支持属级回退)"| S8["⚙️ KnowledgeBaseV3Service.lookupBacteria()"]:::service
S8 -->|"菌属功能说明"| D2["📦 v3索引(内存)"]:::data
P2_choice -->|"批量查询菌属"| A9["🔗 POST /api/health/knowledge/v3/bacteria/batch-query"]:::api
A9 -->|"names: [...]"| S9["⚙️ KnowledgeBaseV3Service.batchLookupBacteria()"]:::service
S9 -->|"批量菌属功能说明"| D2
P2_choice -->|"查询指标调整"| A10["🔗 POST /api/health/knowledge/v3/indicator/query"]:::api
A10 -->|"name(指标名称)"| S10["⚙️ KnowledgeBaseV3Service.lookupIndicator()"]:::service
S10 -->|"指标调整建议"| D2
P2_choice -->|"查询食物营养"| A11["🔗 POST /api/health/knowledge/v3/food/query"]:::api
A11 -->|"name(食物名称)"| S11["⚙️ KnowledgeBaseV3Service.lookupFood()"]:::service
S11 -->|"食物营养数据"| D2
P2_choice -->|"获取章节数据"| A12["🔗 POST /api/health/knowledge/v3/section"]:::api
A12 -->|"section(章节名,空则返回目录)"| S12["⚙️ KnowledgeBaseV3Service.getSection()"]:::service
S12 -->|"章节完整原始数据或目录结构"| D2
end
%% ================================================================
%% 阶段三:Dify知识库
%% ================================================================
subgraph 阶段三[阶段三:Dify知识库管理]
direction TB
P3["🖥 管理后台:Dify知识库页"]:::page
P3 -->|"选择操作"| P3_choice{"列表 / 查看 / 新增 / 删除"}:::page
P3_choice -->|"列表查询"| A13["🔗 POST /api/admin/knowledge-base/list"]:::api
A13 -->|"keyword, status, page, size"| S13["⚙️ DanKnowledgeBaseService.list()"]:::service
S13 -->|"分页查询知识库"| D3["📦 dan_knowledge_base 表"]:::data
P3_choice -->|"查看详情"| A14["🔗 POST /api/admin/knowledge-base/get"]:::api
A14 -->|"id"| S14["⚙️ DanKnowledgeBaseService.getWithAssociations()"]:::service
S14 -->|"知识完整信息+维度/标签关联"| D3
P3_choice -->|"新增/编辑"| P3a["🖥 知识库编辑表单"]:::page
P3a -->|"title, content, dimensionIds, tagIds, ..."| A15["🔗 POST /api/admin/knowledge-base/save"]:::api
A15 -->|"知识条目+维度/标签绑定"| S15["⚙️ DanKnowledgeBaseService.saveWithAssociations()"]:::service
S15 -->|"写入知识记录+关联, 同步Dify"| S15a["⚙️ DifySyncService.syncToDify()"]:::service
S15a -->|"同步到Dify AI知识库"| D3a["📦 Dify外部API"]:::external
P3_choice -->|"删除"| A16["🔗 POST /api/admin/knowledge-base/delete"]:::api
A16 -->|"id"| S16["⚙️ DanKnowledgeBaseService.deleteKnowledge()"]:::service
S16 -->|"逻辑删除知识记录"| D3
P3_choice -->|"绑定维度"| A17["🔗 POST /api/admin/knowledge-base/bind-dimensions"]:::api
A17 -->|"knowledgeId, dimensionIds"| S17["⚙️ DanKnowledgeBaseService.bindDimensions()"]:::service
S17 -->|"写入维度关联表"| D3b["📦 知识-维度关联表"]:::data
P3_choice -->|"绑定标签"| A18["🔗 POST /api/admin/knowledge-base/bind-tags"]:::api
A18 -->|"knowledgeId, tagIds"| S18["⚙️ DanKnowledgeBaseService.bindTags()"]:::service
S18 -->|"写入标签关联表"| D3c["📦 知识-标签关联表"]:::data
P3_choice -->|"上传文件"| P3b["🖥 选择文件上传"]:::page
P3b -->|"file (multipart)"| A19["🔗 POST /api/admin/knowledge-base/upload-file"]:::api
A19 -->|"文件"| S19["⚙️ 文件存储到本地"]:::service
S19 -->|"保存到 uploads/knowledge/ 目录"| D3d["📦 本地文件系统"]:::data
P3_choice -->|"抓取网页"| P3c["🖥 输入网页URL"]:::page
P3c -->|"url"| A20["🔗 POST /api/admin/knowledge-base/fetch-url"]:::api
A20 -->|"网页URL"| S20["⚙️ RestTemplate抓取并解析"]:::service
S20 -->|"提取标题+正文内容"| D3e["📦 抓取结果(内存)"]:::data
end
%% ================================================================
%% 阶段四:邀请推广
%% ================================================================
subgraph 阶段四[阶段四:邀请推广]
direction TB
P4["📱 小程序:邀请推广页"]:::page
P4 -->|"选择操作"| P4_choice{"生成邀请码 / 绑定 / 查看 / 二维码"}:::page
P4_choice -->|"生成邀请码"| A21["🔗 POST /api/invite/code"]:::api
A21 -->|"userId(从token提取)"| S21["⚙️ CommissionService.getOrCreateReferralCode()"]:::service
S21 -->|"查询或生成推广码"| D4["📦 推广码(内存/用户关联)"]:::data
P4_choice -->|"绑定邀请"| P4a["📱 输入/扫描邀请码"]:::page
P4a -->|"referralCode"| A22["🔗 POST /api/invite/bind"]:::api
A22 -->|"推广码"| S22["⚙️ CommissionService.bindReferral()"]:::service
S22 -->|"建立邀请关系"| D4a["📦 邀请关系记录"]:::data
P4_choice -->|"查看邀请列表"| A23["🔗 POST /api/invite/list"]:::api
A23 -->|"page, size"| S23["⚙️ CommissionService.getMyReferrals()"]:::service
S23 -->|"分页查询被我邀请的用户"| D4b["📦 users 表(通过推广码关联)"]:::data
P4_choice -->|"邀请汇总"| A24["🔗 POST /api/invite/summary"]:::api
A24 -->|"userId"| S24["⚙️ CommissionService.getReferralSummary()"]:::service
S24 -->|"总邀请数, 奖励统计"| D4c["📦 ReferralSummaryDTO(内存)"]:::data
P4_choice -->|"生成二维码"| A25["🔗 POST /api/invite/qrcode"]:::api
A25 -->|"userId"| S25["⚙️ CommissionService.getOrCreateReferralCode()"]:::service
S25 -->|"获取推广码"| S25a["⚙️ WechatService.generateWxacode()"]:::service
S25a -->|"小程序码参数"| A25a["🔗 调用微信小程序码API"]:::external
A25a -->|"小程序码图片base64"| D4d["📦 小程序码(返回前端)"]:::data
end
%% ================================================================
%% 阶段五:邀请卡片
%% ================================================================
subgraph 阶段五[阶段五:邀请卡片]
direction TB
P5["📱 小程序:邀请卡片页"]:::page
P5 -->|"选择操作"| P5_choice{"生成 / 验证 / 接受"}:::page
P5_choice -->|"生成邀请卡片"| P5a["📱 选择邀请类型"]:::page
P5a -->|"type(child/family/guide), refId"| A26["🔗 POST /api/invite-card/generate"]:::api
A26 -->|"邀请类型, 关联ID, 创建人"| S26["⚙️ InviteCardService.generate()"]:::service
S26 -->|"生成邀请码, 设定过期时间"| D5["📦 invite_card 表"]:::data
P5_choice -->|"验证邀请码"| P5b["📱 输入/扫描邀请码"]:::page
P5b -->|"code"| A27["🔗 POST /api/invite-card/verify"]:::api
A27 -->|"邀请码字符串"| S27["⚙️ InviteCardService.verify()"]:::service
S27 -->|"校验有效性, 返回邀请信息"| D5
P5_choice -->|"接受邀请"| P5c["📱 填写手机号"]:::page
P5c -->|"code, phone"| A28["🔗 POST /api/invite-card/accept"]:::api
A28 -->|"邀请码, 手机号"| S28["⚙️ InviteCardService.accept()"]:::service
S28 -->|"标记已使用, 完成邀请逻辑"| D5
end
%% ================================================================
%% 阶段六:邀请里程碑与新手引导
%% ================================================================
subgraph 阶段六[阶段六:里程碑与引导]
direction TB
P6["📱 小程序:邀请奖励页"]:::page
P6 -->|"里程碑列表"| A29["🔗 POST /api/invite/milestone/list"]:::api
A29 -->|"userId"| S29["⚙️ 查询里程碑进度"]:::service
S29 -->|"所有里程碑及当前达成状态"| D6["📦 invite_milestone 表"]:::data
P6 -->|"领取里程碑奖励"| P6a["📱 点击领取按钮"]:::page
P6a -->|"milestone"| A30["🔗 POST /api/invite/milestone/claim"]:::api
A30 -->|"里程碑标识"| S30["⚙️ 发放积分/能量奖励"]:::service
S30 -->|"更新状态为claimed"| D6
P7["📱 小程序:新手引导页"]:::page
P7 -->|"查看引导进度"| A31["🔗 POST /api/onboarding/progress"]:::api
A31 -->|"userId"| S31["⚙️ OnboardingService.getProgress()"]:::service
S31 -->|"引导任务列表及完成状态"| D7["📦 onboarding_task 表"]:::data
P7 -->|"领取引导奖励"| P7a["📱 完成引导任务后领取"]:::page
P7a -->|"taskType"| A32["🔗 POST /api/onboarding/claim"]:::api
A32 -->|"任务类型"| S32["⚙️ OnboardingService.claimReward()"]:::service
S32 -->|"发放积分/能量, 标记已领取"| D7
end
%% ================================================================
%% 角色关联
%% ================================================================
ROLE_ADMIN -.- P1
ROLE_ADMIN -.- P2
ROLE_ADMIN -.- P3
ROLE_PARENT -.- P4
ROLE_PARENT -.- P5
ROLE_PARENT -.- P6
ROLE_PARENT -.- P7
ROLE_SYSTEM -.- A25a
端点明细
健康知识库
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/health/knowledge/query |
查询知识库单条 |
🖥管理后台 |
{itemType, itemName} |
HealthKnowledgeBase对象 |
POST /api/health/knowledge/batch-query |
批量查询知识库 |
🖥管理后台 |
{queries: [{itemType, itemName}]} |
{key: HealthKnowledgeBase} |
POST /api/health/knowledge/list |
知识库全量列表 |
🖥管理后台 |
— |
[HealthKnowledgeBase对象] |
POST /api/health/knowledge/add |
新增知识条目 |
🖥管理后台 |
HealthKnowledgeBase实体JSON |
{success} |
POST /api/health/knowledge/update |
更新知识条目 |
🖥管理后台 |
HealthKnowledgeBase实体JSON(含id) |
{success} |
POST /api/health/knowledge/delete |
删除知识条目 |
🖥管理后台 |
{id} |
{success} |
POST /api/health/knowledge/import |
从JSON全量导入 |
🖥管理后台 |
— |
导入结果消息 |
KB v3 查询
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/health/knowledge/v3/bacteria/query |
查询菌属功能 |
🖥管理后台 |
{name} |
{菌属功能说明} |
POST /api/health/knowledge/v3/bacteria/batch-query |
批量查询菌属 |
🖥管理后台 |
{names: [...]} |
{name: {...}} |
POST /api/health/knowledge/v3/indicator/query |
查询指标调整建议 |
🖥管理后台 |
{name} |
{指标调整建议} |
POST /api/health/knowledge/v3/food/query |
查询食物营养数据 |
🖥管理后台 |
{name} |
{食物营养数据} |
POST /api/health/knowledge/v3/section |
获取章节原始数据 |
🖥管理后台 |
{section}(空则返回目录) |
章节数据或目录结构 |
Dify知识库
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/admin/knowledge-base/list |
分页查询知识库 |
🖥管理后台 |
{keyword, status, page, size} |
分页结果 |
POST /api/admin/knowledge-base/get |
获取知识详情(含关联) |
🖥管理后台 |
id (RequestParam) |
知识+维度+标签信息 |
POST /api/admin/knowledge-base/save |
新增/编辑知识 |
🖥管理后台 |
{id?, title, content, dimensionIds, tagIds, ...} |
DanKnowledgeBase对象 |
POST /api/admin/knowledge-base/delete |
删除知识 |
🖥管理后台 |
id (RequestParam) |
{success} |
POST /api/admin/knowledge-base/bind-dimensions |
绑定维度 |
🖥管理后台 |
{knowledgeId, dimensionIds} |
{success} |
POST /api/admin/knowledge-base/bind-tags |
绑定标签 |
🖥管理后台 |
{knowledgeId, tagIds} |
{success} |
POST /api/admin/knowledge-base/upload-file |
上传文件 |
🖥管理后台 |
file (multipart) |
{fileUrl, fileName} |
POST /api/admin/knowledge-base/fetch-url |
抓取网页内容 |
🖥管理后台 |
{url} |
{title, content, sourceUrl} |
知识标签
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/admin/knowledge-tag/list |
标签列表 |
🖥管理后台 |
— |
[DanKnowledgeTag对象] |
POST /api/admin/knowledge-tag/save |
新增/编辑标签 |
🖥管理后台 |
DanKnowledgeTag实体JSON |
DanKnowledgeTag对象 |
POST /api/admin/knowledge-tag/delete |
删除标签 |
🖥管理后台 |
id (RequestParam) |
{success} |
邀请推广
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/invite/code |
获取或生成推广码 |
📱小程序 |
Header: Authorization |
推广码字符串 |
POST /api/invite/bind |
绑定邀请关系 |
📱小程序 |
{referralCode} |
"绑定成功" |
POST /api/invite/list |
我的邀请列表 |
📱小程序 |
{page, size} |
Page<User>(被邀请用户) |
POST /api/invite/summary |
邀请汇总统计 |
📱小程序 |
Header: Authorization |
ReferralSummaryDTO(总数/奖励等) |
POST /api/invite/qrcode |
生成推广小程序码 |
📱小程序 |
Header: Authorization |
{qrCodeBase64, referralCode} |
邀请卡片
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/invite-card/generate |
生成邀请卡片(含码) |
📱小程序 |
{type, refId} |
{code, expiresAt} |
POST /api/invite-card/verify |
验证邀请码有效性 |
📱小程序 |
{code} |
{type, refId, expiresAt, valid} |
POST /api/invite-card/accept |
接受邀请 |
📱小程序 |
{code, phone} |
{成员信息} |
邀请里程碑
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/invite/milestone/list |
里程碑列表及状态 |
📱小程序 |
Header: Authorization |
[InviteMilestone对象] |
POST /api/invite/milestone/claim |
领取里程碑奖励 |
📱小程序 |
{milestone} |
{success} |
新手引导
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/onboarding/progress |
获取引导任务进度 |
📱小程序 |
Header: Authorization |
[OnboardingTask对象] |
POST /api/onboarding/claim |
领取引导任务奖励 |
📱小程序 |
{taskType} |
奖励结果消息 |
数据实体关系
erDiagram
User ||--o{ InviteMilestone : "一个用户多个里程碑"
User ||--o{ OnboardingTask : "一个用户多个引导任务"
User ||--o{ InviteCard : "一个用户生成多个邀请卡片"
User ||--o{ ReferralRelation : "一个用户推广多个用户"
DanKnowledgeBase ||--o{ DanKnowledgeTag : "多对多标签关联"
DanKnowledgeBase ||--o{ Dimension : "多对多维度关联"
HealthKnowledgeBase {
Long id PK
string itemType "bacteria/nutrient/indicator/vitamin/amino_acid/disease"
string itemName
string category
string normalRange
string description
string suggestion
string source
}
DanKnowledgeBase {
Long id PK
string title
string content
int sort
int status
string fileUrl
string fileName
string sourceUrl
string sourceType
}
InviteCard {
Long id PK
string type "child/family/guide"
string code "唯一邀请码"
Long refId "关联ID"
Long creatorId
datetime expiresAt
int used "0/1"
}
InviteMilestone {
Long id PK
Long userId FK
string milestone
int rewardPoints
int rewardEnergy
string status "PENDING/CLAIMED"
}
OnboardingTask {
Long id PK
Long userId FK
string taskType
int rewardPoints
int rewardEnergy
string status "PENDING/COMPLETED/CLAIMED"
}
完整性分析
| # |
维度 |
评估 |
说明 |
| 1 |
流程完整性 |
✅ 完整 |
覆盖健康知识库(v1+v3)、Dify知识库管理、邀请推广、邀请卡片、里程碑/引导6个阶段,路径完整 |
| 2 |
异常路径 |
⚠️ 部分覆盖 |
知识库查询时参数校验返回错误;邀请码绑定失败(重复/无效)catch异常返回错误信息;邀请卡生成时权限校验(非家庭成员拒绝生成) |
| 3 |
端点覆盖 |
✅ 完整 |
32个端点全部映射到流程图中,与HealthKnowledgeBaseController、KnowledgeBaseController、KnowledgeTagController、InviteController、InviteCardController、OnboardingController的@PostMapping一致 |
| 4 |
角色覆盖 |
✅ 完整 |
管理员(admin)管理知识库;家长(parent)使用邀请推广、邀请卡片、里程碑和引导功能;微信系统API参与小程序码生成 |
| 5 |
数据实体 |
✅ 完整 |
health_knowledge_base、dan_knowledge_base、invite_card、invite_milestone、onboarding_task共5张核心表均在图中映射 |
| 6 |
一致性 |
✅ 与代码一致 |
所有端点路径与实际Controller中的@PostMapping匹配,Service方法名与代码逻辑一致 |