Initial commit: MSH System\n\n- msh_single_uniapp: Vue 2 + UniApp 前端(微信小程序/H5/App/支付宝小程序)\n- msh_crmeb_22: Spring Boot 2.2 后端(C端API/管理端/业务逻辑)\n- models-integration: AI服务集成(Coze/KieAI/腾讯ASR)\n- docs: 产品文档与设计稿

This commit is contained in:
2026-02-28 05:40:21 +08:00
commit 14d29d51c0
2182 changed files with 482509 additions and 0 deletions

BIN
docs/.DS_Store vendored Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,542 @@
# Coze API 测试文档
> **版本**v1.0
> **创建日期**2026-02-08
> **基础路径**`/api/front/coze`
> **服务端口**20822
> **认证方式**:免登录(已加入白名单)
---
## 一、配置信息
### 1.1 当前环境配置
| 配置项 | 值 | 说明 |
|--------|-----|------|
| Base URL | `https://api.coze.cn` | Coze 平台 API 地址 |
| Auth Type | `pat` | Personal Access Token 模式 |
| Default Bot ID | `7591133240535449654` | 食谱计算器 Bot |
| Default User ID | `3243981400446844` | 测试用户 ID |
---
## 二、接口清单
| 序号 | 接口名称 | HTTP方法 | 路径 | 说明 |
|------|----------|----------|------|------|
| 1 | 发起对话 | `POST` | `/chat` | 与 Coze Bot 对话(支持流式/非流式) |
| 2 | 流式对话 | `POST` | `/chat/stream` | SSE 流式对话 |
| 3 | 执行工作流 | `POST` | `/workflow/run` | 触发预定义工作流 |
| 4 | 流式执行工作流 | `POST` | `/workflow/stream` | SSE 流式执行工作流 |
| 5 | 查看对话详情 | `POST` | `/chat/retrieve` | 查询对话状态 |
| 6 | 查看对话消息列表 | `POST` | `/chat/messages/list` | 获取对话消息 |
| 7 | 上传文件 | `POST` | `/file/upload` | 上传文件获取 file_id |
---
## 三、接口详细说明
### 3.1 发起对话
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/coze/chat` |
| Content-Type | `application/json` |
| 是否鉴权 | **否**(白名单) |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `botId` | String | 是 | Coze Bot ID |
| `userId` | String | 是 | 业务系统用户 ID |
| `stream` | Boolean | 否 | 是否流式返回,默认 false |
| `chatHistory` | Array | 否 | 历史对话上下文 |
| `additionalMessages` | Array | 否 | 当前发送的消息 |
**chatHistory 结构**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| `role` | String | 角色:`user` / `assistant` |
| `content` | String | 消息内容 |
| `contentType` | String | 内容类型:`text` / `object_string` / `card` |
#### 测试用例
##### TC-COZE-01: 基础对话测试
```bash
curl -X POST 'http://localhost:20822/api/front/coze/chat' \
-H "Content-Type: application/json" \
-d '{
"botId": "7591133240535449654",
"userId": "test_user_001",
"stream": false,
"additionalMessages": [
{
"role": "user",
"content": "你好,请介绍一下自己"
}
]
}'
```
**预期响应**
```json
{
"code": 200,
"message": "success",
"data": {
"id": "xxxxx",
"conversationId": "xxxxx",
"botId": "7591133240535449654",
"status": "completed",
"createdAt": 1707350400,
"completedAt": 1707350405
}
}
```
##### TC-COZE-02: 食谱计算器测试(男性透析患者)
```bash
curl -X POST 'http://localhost:20822/api/front/coze/chat' \
-H "Content-Type: application/json" \
-d '{
"botId": "7591133240535449654",
"userId": "3243981400446844",
"stream": false,
"additionalMessages": [
{
"role": "user",
"content": "请帮我计算营养方案我的信息如下性别男年龄55岁身高170cm正在进行血液透析干体重65.5kg血肌酐850μmol/L"
}
]
}'
```
##### TC-COZE-03: 食谱计算器测试(女性非透析患者)
```bash
curl -X POST 'http://localhost:20822/api/front/coze/chat' \
-H "Content-Type: application/json" \
-d '{
"botId": "7591133240535449654",
"userId": "3243981400446844",
"stream": false,
"additionalMessages": [
{
"role": "user",
"content": "请帮我计算营养方案我的信息如下性别女年龄48岁身高160cm未透析体重52kg血肌酐180μmol/L"
}
]
}'
```
##### TC-COZE-04: 带历史上下文的对话
```bash
curl -X POST 'http://localhost:20822/api/front/coze/chat' \
-H "Content-Type: application/json" \
-d '{
"botId": "7591133240535449654",
"userId": "test_user_001",
"stream": false,
"chatHistory": [
{
"role": "user",
"content": "我是一名55岁的男性透析患者",
"contentType": "text"
},
{
"role": "assistant",
"content": "好的,我了解了您的基本情况。请问您还有其他健康数据需要提供吗?",
"contentType": "text"
}
],
"additionalMessages": [
{
"role": "user",
"content": "我的身高是170cm体重65.5kg血肌酐850"
}
]
}'
```
---
### 3.2 流式对话
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/coze/chat/stream` |
| Content-Type | `application/json` |
| Response Type | `text/event-stream` |
#### 测试用例
##### TC-COZE-05: 流式对话测试
```bash
curl -X POST 'http://localhost:20822/api/front/coze/chat/stream' \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{
"botId": "7591133240535449654",
"userId": "test_user_001",
"additionalMessages": [
{
"role": "user",
"content": "请详细介绍一下肾病患者的饮食注意事项"
}
]
}'
```
**预期响应SSE 格式)**
```
event: message
data: {"event":"conversation.chat.created","chat":{"id":"xxx","conversation_id":"xxx"}}
event: message
data: {"event":"conversation.message.delta","message":{"content":"肾病患者..."}}
event: message
data: {"event":"conversation.message.delta","message":{"content":"需要注意..."}}
event: message
data: {"event":"conversation.chat.completed","chat":{"status":"completed"}}
```
---
### 3.3 执行工作流
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/coze/workflow/run` |
| Content-Type | `application/json` |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `workflowId` | String | 是 | 工作流 ID |
| `parameters` | Object | 否 | 工作流输入参数 |
| `isAsync` | Boolean | 否 | 是否异步执行,默认 false |
#### 测试用例
##### TC-COZE-06: 同步执行工作流
```bash
curl -X POST 'http://localhost:20822/api/front/coze/workflow/run' \
-H "Content-Type: application/json" \
-d '{
"workflowId": "1180790412263",
"isAsync": false,
"parameters": {
"gender": "male",
"age": 55,
"height": 170,
"dialysis": true,
"dialysisType": "hemodialysis",
"dryWeight": 65.5,
"creatinine": 850
}
}'
```
##### TC-COZE-07: 异步执行工作流
```bash
curl -X POST 'http://localhost:20822/api/front/coze/workflow/run' \
-H "Content-Type: application/json" \
-d '{
"workflowId": "1180790412263",
"isAsync": true,
"parameters": {
"userId": "test_user_001",
"recordId": 12345
}
}'
```
---
### 3.4 流式执行工作流
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/coze/workflow/stream` |
| Content-Type | `application/json` |
| Response Type | `text/event-stream` |
#### 测试用例
##### TC-COZE-08: 流式工作流测试
```bash
curl -X POST 'http://localhost:20822/api/front/coze/workflow/stream' \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{
"workflowId": "1180790412263",
"parameters": {
"input": "分析用户的饮食记录"
}
}'
```
---
### 3.5 查看对话详情
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/coze/chat/retrieve` |
| Content-Type | `application/json` |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `conversationId` | String | 是 | 对话 ID |
| `chatId` | String | 是 | Chat ID |
#### 测试用例
##### TC-COZE-09: 查询对话详情
```bash
curl -X POST 'http://localhost:20822/api/front/coze/chat/retrieve' \
-H "Content-Type: application/json" \
-d '{
"conversationId": "7460461142355574825",
"chatId": "7460461142355590000"
}'
```
**预期响应**
```json
{
"code": 200,
"message": "success",
"data": {
"id": "7460461142355590000",
"conversationId": "7460461142355574825",
"botId": "7591133240535449654",
"status": "completed",
"createdAt": 1707350400,
"completedAt": 1707350410,
"usage": {
"tokenCount": 1500,
"outputCount": 800,
"inputCount": 700
}
}
}
```
---
### 3.6 查看对话消息列表
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/coze/chat/messages/list` |
| Content-Type | `application/json` |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `conversationId` | String | 是 | 对话 ID |
| `chatId` | String | 是 | Chat ID |
#### 测试用例
##### TC-COZE-10: 获取对话消息列表
```bash
curl -X POST 'http://localhost:20822/api/front/coze/chat/messages/list' \
-H "Content-Type: application/json" \
-d '{
"conversationId": "7460461142355574825",
"chatId": "7460461142355590000"
}'
```
**预期响应**
```json
{
"code": 200,
"message": "success",
"data": [
{
"id": "msg_001",
"role": "user",
"type": "question",
"content": "请帮我计算营养方案",
"contentType": "text",
"createdAt": 1707350400
},
{
"id": "msg_002",
"role": "assistant",
"type": "answer",
"content": "根据您提供的信息,我为您计算了以下营养方案...",
"contentType": "text",
"createdAt": 1707350410
}
]
}
```
---
### 3.7 上传文件
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/coze/file/upload` |
| Content-Type | `multipart/form-data` |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `file` | File | 是 | 待上传的文件 |
#### 测试用例
##### TC-COZE-11: 上传图片文件
```bash
curl -X POST 'http://localhost:20822/api/front/coze/file/upload' \
-F "file=@/path/to/your/image.jpg"
```
##### TC-COZE-12: 上传文档文件
```bash
curl -X POST 'http://localhost:20822/api/front/coze/file/upload' \
-F "file=@/path/to/your/document.pdf"
```
**预期响应**
```json
{
"code": 200,
"message": "success",
"data": {
"id": "file_xxxxx",
"bytes": 102400,
"createdAt": 1707350400,
"fileName": "image.jpg"
}
}
```
---
## 四、错误码说明
| code | message | 说明 |
|------|---------|------|
| 200 | success | 请求成功 |
| 400 | Bad Request | 请求参数错误 |
| 401 | Unauthorized | 认证失败Token 无效或过期) |
| 404 | Not Found | 资源不存在 |
| 429 | Too Many Requests | 请求频率超限 |
| 500 | Internal Server Error | 服务端内部错误 |
---
## 五、常见问题
### 5.1 Token 过期
当前使用 PAT 模式Token 有效期 30 天。如遇 401 错误,请检查配置文件中的 `coze.api.token` 是否过期。
### 5.2 Bot ID 无效
确保使用正确的 Bot ID。默认 Bot ID `7591133240535449654` 为食谱计算器专用。
### 5.3 流式接口超时
流式接口默认超时时间为 60 秒。对于长时间运行的对话,请确保客户端保持连接。
---
## 六、Postman 测试集合
可导入以下 JSON 到 Postman 进行测试:
```json
{
"info": {
"name": "Coze API Tests",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "基础对话",
"request": {
"method": "POST",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {
"mode": "raw",
"raw": "{\"botId\": \"7591133240535449654\", \"userId\": \"test_user_001\", \"stream\": false, \"additionalMessages\": [{\"role\": \"user\", \"content\": \"你好\"}]}"
},
"url": {"raw": "http://localhost:20822/api/front/coze/chat"}
}
},
{
"name": "食谱计算-男性透析",
"request": {
"method": "POST",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {
"mode": "raw",
"raw": "{\"botId\": \"7591133240535449654\", \"userId\": \"3243981400446844\", \"stream\": false, \"additionalMessages\": [{\"role\": \"user\", \"content\": \"请帮我计算营养方案我的信息如下性别男年龄55岁身高170cm正在进行血液透析干体重65.5kg血肌酐850μmol/L\"}]}"
},
"url": {"raw": "http://localhost:20822/api/front/coze/chat"}
}
}
]
}
```
---
## 七、变更记录
| 版本 | 日期 | 作者 | 变更内容 |
|------|------|------|----------|
| v1.0 | 2026-02-08 | System | 初稿 |
---
*文档结束*

View File

@@ -0,0 +1,808 @@
# Tool 模块 API 测试文档
> **版本**v1.0
> **创建日期**2026-02-08
> **基础路径**`/api/front/tool`
> **服务端口**20822
> **认证方式**需登录Header: `Authori-zation`
---
## 一、接口总览
### 1.1 模块分类
| 模块 | 接口数量 | 说明 |
|------|----------|------|
| 食谱计算器 | 3 | 营养方案计算与采纳 |
| AI营养师 | 4 | AI 对话问答 |
| 饮食打卡 | 8 | 打卡记录管理 |
| 食物百科 | 4 | 食物查询 |
| 营养知识 | 3 | 知识库查询 |
| 打卡社区 | 9 | 社区互动 |
| 积分系统 | 5 | 积分管理 |
| 首页数据 | 4 | 首页聚合数据 |
| 食谱管理 | 3 | 食谱收藏 |
| 文件上传 | 2 | 图片/语音上传 |
---
## 二、认证说明
所有接口(除特殊标注外)均需要登录认证:
```bash
# Header 示例
-H "Authori-zation: eyJhbGciOiJIUzI1NiJ9.xxxxx"
```
---
## 三、食谱计算器
### 3.1 计算营养方案
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/tool/calculator/calculate` |
| Content-Type | `application/json` |
| 是否鉴权 | **是** |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 | 校验规则 |
|--------|------|------|------|----------|
| `gender` | String | 是 | 性别 | `male` / `female` |
| `age` | Integer | 是 | 年龄(岁) | 1 ≤ age ≤ 150 |
| `height` | Integer | 是 | 身高cm | 50 ≤ height ≤ 250 |
| `dialysis` | Boolean | 是 | 是否透析 | true / false |
| `dialysisType` | String | 否 | 透析类型 | `hemodialysis` / `peritoneal` |
| `dryWeight` | Number | 是 | 干体重kg | 20 ≤ dryWeight ≤ 300 |
| `creatinine` | Number | 是 | 血肌酐μmol/L | 0 < creatinine ≤ 2000 |
#### 测试用例
##### TC-CALC-01: 男性透析患者计算
```bash
curl -X POST 'http://localhost:20822/api/front/tool/calculator/calculate' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"gender": "male",
"age": 55,
"height": 170,
"dialysis": true,
"dialysisType": "hemodialysis",
"dryWeight": 65.5,
"creatinine": 850
}'
```
**预期响应**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 100234,
"healthData": {
"eGFR": "7.9",
"standardWeight": "63.0",
"bmi": "22.7",
"bmiStatus": "正常",
"ckdStage": "透析期"
},
"nutritionGoals": {
"protein": "75.6",
"energy": "2205"
},
"foodList": [
{ "number": 1, "name": "谷薯50g", "portion": "5.7" },
{ "number": 2, "name": "淀粉100g", "portion": "0.77" },
{ "number": 3, "name": "绿叶蔬菜200g", "portion": "1" },
{ "number": 4, "name": "瓜果蔬菜200g", "portion": "2" },
{ "number": 5, "name": "奶类230g", "portion": "1" },
{ "number": 6, "name": "肉蛋类50/60g", "portion": "7" },
{ "number": 7, "name": "油脂类10g", "portion": "5.7" }
],
"mealPlan": {
"breakfast": [...],
"lunch": [...],
"dinner": [...]
},
"importantTips": [
"以上配餐由 AI 生成,仅适用于无其他并发症的单纯尿毒症人群",
"透析患者需严格控制水分摄入"
],
"createdAt": "2026-02-08T10:30:00+08:00"
}
}
```
##### TC-CALC-02: 女性非透析患者计算
```bash
curl -X POST 'http://localhost:20822/api/front/tool/calculator/calculate' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"gender": "female",
"age": 48,
"height": 160,
"dialysis": false,
"dryWeight": 52,
"creatinine": 180
}'
```
##### TC-CALC-03: 参数校验-年龄超出范围
```bash
curl -X POST 'http://localhost:20822/api/front/tool/calculator/calculate' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"gender": "male",
"age": 200,
"height": 170,
"dialysis": false,
"dryWeight": 65,
"creatinine": 100
}'
```
**预期响应**`code=400, message 包含"年龄"`
---
### 3.2 获取计算结果详情
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `GET /api/front/tool/calculator/result/{id}` |
| 是否鉴权 | **是** |
#### 测试用例
##### TC-CALC-04: 获取计算结果
```bash
curl -X GET 'http://localhost:20822/api/front/tool/calculator/result/100234' \
-H "Authori-zation: YOUR_TOKEN"
```
##### TC-CALC-05: 查询不存在的结果
```bash
curl -X GET 'http://localhost:20822/api/front/tool/calculator/result/999999' \
-H "Authori-zation: YOUR_TOKEN"
```
**预期响应**`code=404`
---
### 3.3 采纳营养计划
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/tool/calculator/adopt` |
| Content-Type | `application/json` |
| 是否鉴权 | **是** |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `resultId` | Long | 是 | 计算结果 ID |
#### 测试用例
##### TC-CALC-06: 采纳营养计划
```bash
curl -X POST 'http://localhost:20822/api/front/tool/calculator/adopt' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"resultId": 100234
}'
```
**预期响应**
```json
{
"code": 200,
"message": "success",
"data": {
"planId": 56789,
"startDate": "2026-02-08",
"endDate": "2026-02-14"
}
}
```
##### TC-CALC-07: 重复采纳(幂等测试)
```bash
# 同一 resultId 调用两次
curl -X POST 'http://localhost:20822/api/front/tool/calculator/adopt' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{"resultId": 100234}'
```
**预期响应**:返回已存在的 planId
---
## 四、AI 营养师
### 4.1 发送消息给 AI 营养师
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/tool/ai-nutritionist/message` |
| Content-Type | `application/json` |
#### 测试用例
##### TC-AI-01: 发送消息
```bash
curl -X POST 'http://localhost:20822/api/front/tool/ai-nutritionist/message' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"conversationId": "conv_001",
"content": "肾病患者可以吃香蕉吗?"
}'
```
---
### 4.2 获取 AI 回复
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `GET /api/front/tool/ai-nutritionist/response/{messageId}` |
#### 测试用例
##### TC-AI-02: 获取回复
```bash
curl -X GET 'http://localhost:20822/api/front/tool/ai-nutritionist/response/12345' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 4.3 获取对话历史
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `GET /api/front/tool/ai-nutritionist/history` |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `page` | Integer | 否 | 页码,默认 1 |
| `limit` | Integer | 否 | 每页数量,默认 20 |
| `conversationId` | Long | 否 | 对话 ID |
#### 测试用例
##### TC-AI-03: 获取对话历史
```bash
curl -X GET 'http://localhost:20822/api/front/tool/ai-nutritionist/history?page=1&limit=20' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 4.4 清空对话历史
#### 测试用例
##### TC-AI-04: 清空对话
```bash
curl -X POST 'http://localhost:20822/api/front/tool/ai-nutritionist/clear' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"conversationId": "conv_001"
}'
```
---
## 五、饮食打卡
### 5.1 提交打卡记录
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/tool/checkin/submit` |
| Content-Type | `application/json` |
#### 测试用例
##### TC-CHECKIN-01: 提交打卡
```bash
curl -X POST 'http://localhost:20822/api/front/tool/checkin/submit' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"mealType": "breakfast",
"date": "2026-02-08",
"foods": [
{"name": "牛奶", "amount": "250ml"},
{"name": "全麦面包", "amount": "2片"}
],
"images": ["https://cdn.xxx.com/img1.jpg"],
"remark": "早餐清淡"
}'
```
---
### 5.2 获取打卡记录列表
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `page` | Integer | 否 | 页码 |
| `limit` | Integer | 否 | 每页数量 |
| `date` | String | 否 | 日期筛选 YYYY-MM-DD |
| `mealType` | String | 否 | 餐次breakfast/lunch/dinner |
#### 测试用例
##### TC-CHECKIN-02: 获取打卡列表
```bash
curl -X GET 'http://localhost:20822/api/front/tool/checkin/list?page=1&limit=10&date=2026-02-08' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 5.3 获取打卡记录详情
```bash
curl -X GET 'http://localhost:20822/api/front/tool/checkin/detail/123' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 5.4 获取连续打卡统计
```bash
curl -X GET 'http://localhost:20822/api/front/tool/checkin/streak' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 5.5 获取打卡日历数据
```bash
curl -X GET 'http://localhost:20822/api/front/tool/checkin/calendar?yearMonth=2026-02' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 5.6 获取打卡任务列表
```bash
curl -X GET 'http://localhost:20822/api/front/tool/checkin/tasks' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 5.7 一键复制打卡
```bash
curl -X POST 'http://localhost:20822/api/front/tool/checkin/copy' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"sourceRecordId": 12345,
"targetDate": "2026-02-08",
"mealType": "lunch"
}'
```
---
### 5.8 一键借鉴打卡
```bash
curl -X POST 'http://localhost:20822/api/front/tool/checkin/learn' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"sourcePostId": 67890,
"targetDate": "2026-02-08",
"mealType": "dinner"
}'
```
---
## 六、食物百科
### 6.1 搜索食物
```bash
curl -X GET 'http://localhost:20822/api/front/tool/food/search?keyword=鸡蛋&category=蛋类&page=1&limit=20' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 6.2 获取食物列表
```bash
curl -X GET 'http://localhost:20822/api/front/tool/food/list?category=肉类&page=1&limit=20' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 6.3 获取食物详情
```bash
curl -X GET 'http://localhost:20822/api/front/tool/food/detail/100' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 6.4 获取相似食物推荐
```bash
curl -X GET 'http://localhost:20822/api/front/tool/food/similar/100' \
-H "Authori-zation: YOUR_TOKEN"
```
---
## 七、营养知识
### 7.1 获取营养知识列表
```bash
curl -X GET 'http://localhost:20822/api/front/tool/knowledge/list?type=article&category=肾病饮食&page=1&limit=10' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 7.2 获取营养知识详情
```bash
curl -X GET 'http://localhost:20822/api/front/tool/knowledge/detail/50' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 7.3 获取营养素详情
```bash
curl -X GET 'http://localhost:20822/api/front/tool/knowledge/nutrient/蛋白质' \
-H "Authori-zation: YOUR_TOKEN"
```
---
## 八、打卡社区
### 8.1 获取社区内容列表
```bash
curl -X GET 'http://localhost:20822/api/front/tool/community/list?tab=recommend&page=1&limit=10' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 8.2 获取社区内容详情
```bash
curl -X GET 'http://localhost:20822/api/front/tool/community/detail/200' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 8.3 发布社区内容
```bash
curl -X POST 'http://localhost:20822/api/front/tool/community/publish' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"content": "今天的早餐很健康!",
"images": ["https://cdn.xxx.com/img1.jpg"],
"checkinId": 12345
}'
```
---
### 8.4 点赞/取消点赞
```bash
curl -X POST 'http://localhost:20822/api/front/tool/community/like' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"postId": 200,
"isLike": true
}'
```
---
### 8.5 收藏/取消收藏
```bash
curl -X POST 'http://localhost:20822/api/front/tool/community/collect' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"postId": 200,
"isCollect": true
}'
```
---
### 8.6 发表评论
```bash
curl -X POST 'http://localhost:20822/api/front/tool/community/comment' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"postId": 200,
"content": "看起来很不错!",
"parentId": null
}'
```
---
### 8.7 获取评论列表
```bash
curl -X GET 'http://localhost:20822/api/front/tool/community/comment/list/200?page=1&limit=20' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 8.8 关注/取消关注用户
```bash
curl -X POST 'http://localhost:20822/api/front/tool/community/follow' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"userId": 1001,
"isFollow": true
}'
```
---
### 8.9 分享内容
```bash
curl -X POST 'http://localhost:20822/api/front/tool/community/share' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"postId": 200
}'
```
---
## 九、积分系统
### 9.1 获取用户积分信息
```bash
curl -X GET 'http://localhost:20822/api/front/tool/points/info' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 9.2 获取积分规则
```bash
curl -X GET 'http://localhost:20822/api/front/tool/points/rules' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 9.3 获取积分流水
```bash
curl -X GET 'http://localhost:20822/api/front/tool/points/history?type=earn&page=1&limit=20' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 9.4 获取积分兑换列表
```bash
curl -X GET 'http://localhost:20822/api/front/tool/points/exchange/list' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 9.5 积分兑换
```bash
curl -X POST 'http://localhost:20822/api/front/tool/points/exchange' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"exchangeId": 10
}'
```
---
## 十、首页数据
### 10.1 获取首页数据
```bash
curl -X GET 'http://localhost:20822/api/front/tool/home/data' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 10.2 获取推荐食谱列表
```bash
curl -X GET 'http://localhost:20822/api/front/tool/home/recipes?limit=6' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 10.3 获取推荐营养知识
```bash
curl -X GET 'http://localhost:20822/api/front/tool/home/knowledge?limit=4' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 10.4 获取用户健康档案状态
```bash
curl -X GET 'http://localhost:20822/api/front/tool/home/health-status' \
-H "Authori-zation: YOUR_TOKEN"
```
---
## 十一、食谱管理
### 11.1 获取食谱列表
```bash
curl -X GET 'http://localhost:20822/api/front/tool/recipe/list?mealType=breakfast&page=1&limit=10' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 11.2 获取食谱详情
```bash
curl -X GET 'http://localhost:20822/api/front/tool/recipe/detail/50' \
-H "Authori-zation: YOUR_TOKEN"
```
---
### 11.3 收藏/取消收藏食谱
```bash
curl -X POST 'http://localhost:20822/api/front/tool/recipe/favorite' \
-H "Content-Type: application/json" \
-H "Authori-zation: YOUR_TOKEN" \
-d '{
"recipeId": 50,
"isFavorite": true
}'
```
---
## 十二、文件上传
### 12.1 上传图片
```bash
curl -X POST 'http://localhost:20822/api/front/tool/upload/image?type=checkin' \
-H "Authori-zation: YOUR_TOKEN" \
-F "file=@/path/to/image.jpg"
```
---
### 12.2 上传语音
```bash
curl -X POST 'http://localhost:20822/api/front/tool/upload/voice' \
-H "Authori-zation: YOUR_TOKEN" \
-F "file=@/path/to/voice.mp3"
```
---
## 十三、错误码说明
| code | message | 说明 |
|------|---------|------|
| 200 | success | 请求成功 |
| 400 | 参数校验失败 | 请求参数不符合校验规则 |
| 401 / 410000 | 未登录 | Token 缺失 |
| 410001 | Token 无效 | Token 格式错误 |
| 410002 | 登录过期 | Token 已过期 |
| 403 | 无权限 | 访问他人数据 |
| 404 | 资源不存在 | 数据不存在 |
| 500 | 系统异常 | 服务端内部错误 |
---
## 十四、变更记录
| 版本 | 日期 | 作者 | 变更内容 |
|------|------|------|----------|
| v1.0 | 2026-02-08 | System | 初稿 |
---
*文档结束*

25
docs/db/db_design.md Normal file
View File

@@ -0,0 +1,25 @@
## 数据库字典
### tool模块相关表
- 用户表: eb_user
- 用户积分记录表eb_user_integral_record
- 用户签到表eb_user_sign
- 文章内容表eb_article
- 用户积分表: v2_user_points
- 一键打卡记录表: v2_quick_checkin_records
- AI营养师对话表 v2_ai_conversations
- AI营养师消息表 v2_ai_messages
- 营养师咨询记录表: v2_nutritionist_consultations
- 食物百科表: v2_foods
- 营养知识表: v2_knowledge
- 食谱表: v2_recipes
- 打卡社区表: v2_community_posts
- 打卡社区互动表: v2_community_interactions
- 打卡社区评论表: v2_community_comments
- 打卡社区关注表: v2_community_follows
- 营养计划表: v2_nutrition_plans
- 食谱计算器结果表: v2_calculator_results

2594
docs/db/shop-msh.sql Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,104 @@
-- =========================================================
-- 食谱计算器表结构变更 SQL
-- 版本v1.0
-- 日期2026-02-01
-- 说明:根据开发文档优化后,需要新增以下字段
-- =========================================================
-- 检查并添加 bmi_status 字段
ALTER TABLE `v2_calculator_results`
ADD COLUMN IF NOT EXISTS `bmi_status` VARCHAR(20) DEFAULT NULL COMMENT 'BMI状态描述体型过轻/正常/超重/肥胖'
AFTER `bmi`;
-- 检查并添加 food_list_json 字段
ALTER TABLE `v2_calculator_results`
ADD COLUMN IF NOT EXISTS `food_list_json` TEXT DEFAULT NULL COMMENT '食物份数建议 JSON'
AFTER `energy_intake`;
-- 检查并添加 tips_json 字段
ALTER TABLE `v2_calculator_results`
ADD COLUMN IF NOT EXISTS `tips_json` TEXT DEFAULT NULL COMMENT '重要提示 JSON'
AFTER `meal_plan_json`;
-- 如果表不存在,创建完整表结构
CREATE TABLE IF NOT EXISTS `v2_calculator_results` (
`result_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '计算结果ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
-- 输入参数
`gender` VARCHAR(10) NOT NULL COMMENT '性别male/female',
`age` INT NOT NULL COMMENT '年龄(岁)',
`height` INT NOT NULL COMMENT '身高cm',
`weight` DECIMAL(5,2) DEFAULT NULL COMMENT '体重kg',
`has_dialysis` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否透析0-否 1-是',
`dialysis_type` VARCHAR(20) DEFAULT NULL COMMENT '透析类型hemodialysis/peritoneal',
`dry_weight` DECIMAL(5,2) NOT NULL COMMENT '干体重kg',
`creatinine` DECIMAL(8,2) NOT NULL COMMENT '血肌酐μmol/L',
-- 计算结果
`egfr` DECIMAL(6,2) NOT NULL COMMENT 'eGFRml/min/1.73m²)',
`standard_weight` DECIMAL(5,2) NOT NULL COMMENT '标准体重kg',
`bmi` DECIMAL(4,1) NOT NULL COMMENT 'BMI',
`bmi_status` VARCHAR(20) DEFAULT NULL COMMENT 'BMI状态描述',
`ckd_stage` VARCHAR(50) NOT NULL COMMENT 'CKD分期',
`protein_intake` DECIMAL(5,1) NOT NULL COMMENT '每日蛋白质目标g',
`energy_intake` INT NOT NULL COMMENT '每日能量目标kcal',
-- JSON 数据
`food_list_json` TEXT DEFAULT NULL COMMENT '食物份数建议 JSON',
`meal_plan_json` TEXT DEFAULT NULL COMMENT '配餐方案 JSON',
`tips_json` TEXT DEFAULT NULL COMMENT '重要提示 JSON',
-- 状态字段
`is_adopted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已采纳0-未采纳 1-已采纳',
`adopted_at` DATETIME DEFAULT NULL COMMENT '采纳时间',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`result_id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_created_at` (`created_at`),
INDEX `idx_is_adopted` (`is_adopted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='营养计算结果表';
-- 营养计划表(如果不存在则创建)
CREATE TABLE IF NOT EXISTS `v2_nutrition_plans` (
`plan_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '营养计划ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`result_id` BIGINT DEFAULT NULL COMMENT '关联的计算结果ID',
-- 健康数据(冗余存储,便于查询)
`gender` VARCHAR(10) DEFAULT NULL COMMENT '性别',
`age` INT DEFAULT NULL COMMENT '年龄',
`height` INT DEFAULT NULL COMMENT '身高cm',
`weight` DECIMAL(5,2) DEFAULT NULL COMMENT '体重kg',
`has_dialysis` TINYINT(1) DEFAULT 0 COMMENT '是否透析',
`dialysis_type` VARCHAR(20) DEFAULT NULL COMMENT '透析类型',
`creatinine` DECIMAL(8,2) DEFAULT NULL COMMENT '血肌酐',
-- 计算结果
`egfr` DECIMAL(6,2) DEFAULT NULL COMMENT 'eGFR',
`standard_weight` DECIMAL(5,2) DEFAULT NULL COMMENT '标准体重',
`bmi` DECIMAL(4,1) DEFAULT NULL COMMENT 'BMI',
`ckd_stage` VARCHAR(50) DEFAULT NULL COMMENT 'CKD分期',
`protein_intake` DECIMAL(5,1) DEFAULT NULL COMMENT '蛋白质目标',
`energy_intake` INT DEFAULT NULL COMMENT '能量目标',
-- 配餐方案
`meal_plan_json` TEXT DEFAULT NULL COMMENT '配餐方案 JSON',
-- 计划状态
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态active/completed/abandoned',
`start_date` DATE NOT NULL COMMENT '开始日期',
`end_date` DATE NOT NULL COMMENT '结束日期',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`plan_id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_result_id` (`result_id`),
INDEX `idx_status` (`status`),
INDEX `idx_start_date` (`start_date`),
UNIQUE INDEX `uk_user_result` (`user_id`, `result_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='营养计划表';

View File

@@ -0,0 +1,15 @@
-- =============================================
-- v2_recipes 表新增 source 相关字段
-- 用于追踪食谱来源(手动/计算器/AI生成等
-- Author: ScottPan
-- Date: 2026-02-14
-- =============================================
ALTER TABLE v2_recipes
ADD COLUMN `source` VARCHAR(20) DEFAULT 'manual' COMMENT '来源manual(手动)/calculator(计算器)/ai(AI生成)' AFTER `sort_order`,
ADD COLUMN `source_id` BIGINT DEFAULT NULL COMMENT '来源ID如计算器结果ID' AFTER `source`;
-- 新增索引,便于按来源查询
ALTER TABLE v2_recipes
ADD KEY `idx_source` (`source`),
ADD KEY `idx_source_id` (`source_id`);

View File

@@ -0,0 +1,602 @@
# 打卡社区功能设计方案
## 慢生活智能营养专家 - 类似小红书的UGC社区
---
## 📋 功能概述
**产品定位**将个人打卡记录转化为可分享的UGC内容打造肾病患者的饮食分享社区。
**对标产品**:小红书(内容社区)+ Keep运动社区打卡分享
**核心价值**
1. 📸 **降低UGC门槛** - 打卡记录一键转分享,无需重新创作
2. 👥 **社交连接** - 患者之间互相学习、点赞、评论、关注
3. 🎯 **激励增强** - 社交认同感大幅增强打卡动力
4. 💰 **商业价值** - 优质内容吸引新用户为KOL孵化和广告变现打基础
---
## 🎨 核心页面展示
### 1. 社区广场(瀑布流)
```
┌────────────────────────────────┐
│ 🏠 社区广场 [发布+] │
└────────────────────────────────┘
【筛选Tab】 [推荐] [最新] [关注] [热门]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【瀑布流布局】左右2列
┌──────────┐ ┌──────────┐
│ 图片 │ │ 图片 │
│ │ │ │
├──────────┤ ├──────────┤
│ 🥗 早餐打 │ │ 🍱 午餐低 │
│ 卡第7天│ │ 钾配餐 │
│ │ │ │
│ 👤 张小慢 │ │ 👤 李大康 │
│ ❤️ 128 │ │ ❤️ 256 │
└──────────┘ └──────────┘
```
**关键特性**
- 瀑布流布局,视觉效果好
- 封面图自动取打卡照片第一张
- 显示点赞数,体现内容质量
- 4个Tab满足不同浏览需求
### 2. 内容详情页
```
┌────────────────────────────────┐
│ 【用户信息】 │
│ 👤 张小慢透析3年
│ 📅 2025-11-20 12:30 │
│ [+ 关注] │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 【图片轮播】1/3 │
│ [滑动查看更多照片] │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 🥗 早餐打卡第7天终于坚持下来了 │
│ #早餐 #低钾饮食 #透析期 │
│ │
│ 今天的早餐:牛奶+鸡蛋拌面+黄瓜 │
│ 照片不是很好看但营养达标啦~ │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 【营养数据】 │
│ 蛋白质18.8g (达标94%) │
│ 能量452kcal (达标90%) │
│ 🎯 整体营养达标率92% │
└────────────────────────────────┘
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌────────────────────────────────┐
│ ❤️ 128 💬 23 ⭐ 45 ➤ 分享 │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 💬 评论区 │
│ 太棒了!我也要学习这样吃 │
│ 坚持得很好,营养搭配合理👍 │
└────────────────────────────────┘
```
**关键特性**
- 完整的营养数据展示(来自打卡记录)
- 图片轮播支持1-3张
- 互动栏:点赞/评论/收藏/分享
- 评论区支持点赞和回复
### 3. 发布页面
```
┌────────────────────────────────┐
│ < 分享打卡记录 [发布] │
└────────────────────────────────┘
【选择封面图】从打卡照片中选择
【标题】
🥗 早餐打卡第7天
[AI帮你写标题 ✨]
【正文】
分享一下你的打卡心得吧~
[AI帮你写描述 ✨]
【添加话题】
#早餐 #低钾饮食 #透析期
[+ 添加话题]
【营养数据】(自动带入)
蛋白质18.8g 能量452kcal
【隐私设置】
○ 公开 ○ 仅关注可见 ○ 私密
💡 提示分享到社区可获得20积分
```
**关键特性**
- 从打卡记录一键分享(降低门槛)
- AI辅助生成标题和描述降低创作难度
- 营养数据自动带入(突出专业性)
- 隐私设置(保护用户隐私)
- 积分激励(促进分享)
### 4. 用户主页
```
┌────────────────────────────────┐
│ 【用户资料卡】 │
│ 👤 张小慢 │
│ 透析3年 | CKD 5期 │
│ 简介:坚持健康饮食,享受慢生活 │
│ [+ 关注] │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 128 作品 | 256 获赞 | 89 粉丝 │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 🏆 成就勋章 │
│ 连续打卡7天 获赞100+ 营养达标王 │
└────────────────────────────────┘
【作品网格】3列
┌────┐ ┌────┐ ┌────┐
│图片 │ │图片 │ │图片 │
└────┘ └────┘ └────┘
```
**关键特性**
- 显示个人标签(疾病状态)
- 数据统计(作品/获赞/粉丝)
- 成就勋章系统
- 作品网格展示
---
## 🔄 用户使用流程
### 完整的内容生产和消费闭环
```
【内容生产】
打卡上传饮食记录
打卡成功页点击"分享到社区"
AI辅助编辑标题和描述
添加话题标签
发布成功 + 获得20积分
内容进入推荐池
【内容消费】
访问社区广场
浏览瀑布流内容(推荐算法)
点击感兴趣的卡片
查看详情(图片/文字/营养数据)
互动(点赞/评论/收藏)
关注优质创作者
形成社交关系
【社交连接】
关注其他用户
"关注"Tab看到关注用户的内容
评论互动
收到回复通知
再次访问社区
【激励闭环】
看到他人优质打卡内容
受到激励,自己也想分享
更认真地打卡(拍照、摆盘)
分享到社区
获得点赞和评论
社交认同感增强
继续坚持打卡和分享
```
---
## 💡 核心功能设计
### 1. 推荐算法
**推荐分数计算**
```javascript
推荐分数 = 内容质量分 × 0.4
+ 用户兴趣分 × 0.3
+ 时效性分 × 0.2
+ 多样性分 × 0.1
```
**内容质量分**
- 有配图:+20分
- 3张图+10分
- 有营养数据:+15分
- 字数>50字+10分
- 点赞数×0.5分
- 评论数×2分
- 收藏数×3分
**用户兴趣分**
- 同疾病状态(透析/非透析):+30分
- 同CKD分期+20分
- 同餐次(早中晚):+15分
- 关注的用户:+50分
- 历史互动过的标签:+10分
### 2. 互动系统
**点赞**
- 点击动画效果(心形放大+红色填充)
- 实时更新点赞数
- 发布者获得通知
**评论**
- 支持二级评论(回复评论)
- 支持@用户
- 支持Emoji
- 评论可点赞
- 按点赞数排序
**收藏**
- 一键收藏
- 个人中心查看收藏列表
- 取消收藏
**分享**
- 微信好友/朋友圈
- 复制链接
- 生成海报(带小程序码)
### 3. 积分奖励
| 行为 | 积分 | 说明 |
|-----|------|------|
| 发布内容到社区 | +20分 | 鼓励分享 |
| 内容获得第1个赞 | +5分 | 正向反馈 |
| 内容获得第10个赞 | +10分 | 里程碑奖励 |
| 内容获得第100个赞 | +50分 | 优质内容奖励 |
| 发布评论 | +2分 | 每日上限10条 |
| 收到评论 | +3分 | 提升互动积极性 |
| 评论被点赞 | +1分 | - |
| 分享到朋友圈 | +5分 | 每日上限1次 |
### 4. 创作者等级
```
Lv1 新手发布1-10篇
Lv2 达人发布11-50篇
Lv3 专家发布51-100篇
Lv4 大咖发布100+篇 + 平均获赞50+
```
**等级权益**
- Lv2解锁话题创建权限
- Lv3内容优先推荐
- Lv4认证标识 + 优先审核 + 流量扶持
---
## 📊 数据库设计
### 社区内容表community_posts
```sql
CREATE TABLE community_posts (
post_id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
check_in_record_id BIGINT, -- 关联的打卡记录
title VARCHAR(100) NOT NULL,
content TEXT,
cover_image VARCHAR(255),
images_json TEXT,
nutrition_data_json TEXT,
tags_json TEXT,
like_count INT DEFAULT 0,
comment_count INT DEFAULT 0,
collect_count INT DEFAULT 0,
share_count INT DEFAULT 0,
view_count INT DEFAULT 0,
recommend_score DECIMAL(10,2),
hot_score DECIMAL(10,2),
status VARCHAR(20) DEFAULT 'published',
privacy VARCHAR(20) DEFAULT 'public',
created_at TIMESTAMP
);
```
### 互动记录表community_interactions
```sql
CREATE TABLE community_interactions (
interaction_id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
post_id BIGINT NOT NULL,
interaction_type VARCHAR(20), -- like, comment, collect, share, view
created_at TIMESTAMP,
UNIQUE KEY (user_id, post_id, interaction_type)
);
```
### 评论表community_comments
```sql
CREATE TABLE community_comments (
comment_id BIGINT PRIMARY KEY,
post_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
content TEXT NOT NULL,
parent_comment_id BIGINT, -- NULL为一级评论
reply_to_user_id BIGINT,
like_count INT DEFAULT 0,
status VARCHAR(20) DEFAULT 'published',
created_at TIMESTAMP
);
```
### 关注关系表community_follows
```sql
CREATE TABLE community_follows (
follow_id BIGINT PRIMARY KEY,
follower_id BIGINT NOT NULL, -- 关注者
followee_id BIGINT NOT NULL, -- 被关注者
created_at TIMESTAMP,
UNIQUE KEY (follower_id, followee_id)
);
```
---
## 🎯 核心KPI指标
### 内容生产指标
| 指标 | v2.0目标 | 说明 |
|-----|---------|------|
| 社区内容总量 | 500篇 | 3个月累计 |
| 日均发布量 | 10篇 | 每日新增内容 |
| 发布率 | 10% | 打卡用户中分享到社区的比例 |
### 内容消费指标
| 指标 | v2.0目标 | 说明 |
|-----|---------|------|
| 日均访问用户 | 200人 | 每日访问社区的用户数 |
| 人均浏览数 | 5篇 | 每个用户平均浏览的内容数 |
| 互动率 | 30% | 浏览用户中产生互动的比例 |
### 互动指标
| 指标 | v2.0目标 | 说明 |
|-----|---------|------|
| 日均点赞数 | 500 | 每日产生的点赞总数 |
| 日均评论数 | 100 | 每日产生的评论总数 |
| 日均收藏数 | 50 | 每日产生的收藏总数 |
### 社交指标
| 指标 | v2.0目标 | 说明 |
|-----|---------|------|
| 关注关系数 | 200对 | 用户之间的关注关系总数 |
| 创作者数量 | 50人 | 发布过至少3篇内容的用户 |
### 留存指标
| 指标 | v2.0目标 | 说明 |
|-----|---------|------|
| 社区用户7日留存率 | 60% | 比普通用户高30% |
**北极星指标**
```
社区健康度 = (日均发布量 × 10)
+ (人均浏览数 × 5)
+ (互动率 × 100)
v2.0目标≥500分
```
---
## 🚀 开发计划
### 阶段1MVP版本2周
**核心功能**
- [ ] 社区广场(瀑布流展示)
- [ ] 内容详情页(图片/文字/营养数据)
- [ ] 发布功能(从打卡记录分享)
- [ ] 基础互动(点赞/评论)
**目标**:验证用户是否愿意分享和浏览内容
### 阶段2完善版本2周
**新增功能**
- [ ] 推荐算法
- [ ] 关注/粉丝系统
- [ ] 用户主页
- [ ] 话题标签
- [ ] 收藏和分享
- [ ] 评论二级回复
**目标**:完善社交体验,提升用户粘性
### 阶段3运营版本1周
**新增功能**
- [ ] 内容审核机制
- [ ] 创作者等级
- [ ] 成就勋章
- [ ] 举报功能
- [ ] 运营后台
**目标**:确保内容质量,支持运营活动
---
## 💰 商业价值
### 短期价值3-6个月
1. **用户增长**
- 优质内容吸引新用户注册
- 预计带来20-30%的新用户增长
2. **用户留存**
- 社区用户7日留存率60%比普通用户高30%
- 社交连接增强用户粘性
3. **用户活跃**
- 社区用户DAU/MAU是普通用户的3-4倍
- 日均打开频次提升50%
### 中期价值6-12个月
4. **内容资产**
- 积累10000+篇优质UGC内容
- 降低运营成本不需要大量PGC内容
5. **KOL孵化**
- 培养100+活跃创作者
- 部分创作者成为KOL认证营养师、资深患者
6. **品牌影响力**
- 打造"肾病患者专属社区"品牌认知
- 建立行业壁垒
### 长期价值12-24个月
7. **商业变现**
- **广告变现**:信息流广告、品牌合作内容
- **电商导流**:低钾食品、营养补剂推荐
- **会员体系**:优质内容专属查看
- **KOL分成**:创作者激励计划
8. **数据价值**
- 真实饮食数据+用户偏好数据
- 优化AI推荐算法
- 为医疗研究提供数据支持
---
## ⚠️ 风险和应对
### 风险1冷启动问题
**风险**:初期内容少,用户不愿意访问社区
**应对**
- 官方账号提前准备100+优质内容
- 种子用户激励前100名发布用户额外200积分
- 首页推荐位展示优质社区内容
### 风险2内容质量低
**风险**:用户分享的内容质量参差不齐
**应对**
- AI辅助生成标题和描述降低创作难度
- 推荐算法优先展示高质量内容
- 创作者等级制度,优质创作者流量扶持
### 风险3违规内容
**风险**:医疗广告、政治敏感内容
**应对**
- 敏感词过滤(实时拦截)
- 图片审核腾讯云内容安全API
- 人工审核(新用户首次发布、被举报内容)
- 处罚机制(警告、封禁)
### 风险4用户隐私
**风险**:患者不愿意公开疾病信息
**应对**
- 隐私设置(公开/仅关注可见/私密)
- 匿名发布选项
- 脱敏处理(可选择不显示个人标签)
---
## 📞 总结
### 为什么要做打卡社区?
1. **解决核心痛点**
- 患者孤独感强,需要同伴支持
- 打卡容易坚持不下来,需要社交激励
- 不知道怎么吃得好看,需要优质内容参考
2. **提升产品价值**
- 从工具型产品→社区型产品
- 从单向服务→双向互动
- 从个人使用→社交分享
3. **商业化基础**
- UGC内容吸引新用户降低获客成本
- 社交连接增强用户粘性提升LTV
- 为广告、电商、会员变现打基础
### 成功关键
**降低分享门槛** - 打卡记录一键转分享AI辅助创作
**优质内容优先** - 推荐算法保证用户看到好内容
**社交激励充分** - 点赞/评论/关注形成正向反馈
**内容审核严格** - 确保社区氛围健康
---
**完整PRD章节**第4.8章 - 打卡社区系统
**文档位置**`/Users/a123/Documents/Works25/慢生活/爱肾/msh-tools/docs/PRD_慢生活智能营养专家_v2.0.md`
**开发排期**3-4周MVP→完善→运营分三个阶段
---
**下一步**:需要我生成小程序页面代码吗? 📱✨

View File

@@ -0,0 +1,439 @@
# 打卡详情页 - 一键打卡入口设计
> **更新日期**2025-11-20
> **版本**v2.2.1
> **核心优化**:在打卡详情页增加"一键打卡"入口
---
## 🎯 优化目标
用户在查看打卡详情时,希望能快速复制该打卡内容,无需返回到列表页操作。
---
## 📱 三个主要入口
### 入口1打卡历史页 → 直接复制 ⭐推荐快速打卡
```
我的饮食记录
┌──────────────────────────┐
│ 11月19日 早餐 │
│ ✅ 达标率92% ⭐高分 │
│ [📊 查看详情] │
│ [⚡一键复制打卡] ←入口1 │
└──────────────────────────┘
```
**特点**
- ✅ 最快捷的方式
- ✅ 无需进入详情页
- ✅ 适合确定要复制的情况
- ✅ 30秒完成打卡
**流程**
```
点击"⚡一键复制打卡"
复制确认页(预览内容)
打卡页(内容已填充)
修改内容(可选)
发布完成(+5积分
```
---
### 入口2打卡详情页 → 详细查看后复制 ⭐⭐⭐本次新增
```
我的饮食记录
[📊 查看详情] ←先点这里
打卡详情页
┌──────────────────────────┐
│ 📸 完整照片查看 │
│ 📊 营养数据详情 │
│ 📋 菜品清单 │
│ ┌──────────────────────┐ │
│ │ ⚡一键复制打卡 ←入口2 │ │
│ └──────────────────────┘ │
└──────────────────────────┘
```
**特点**
- ✅ 查看完整信息后决定
- ✅ 可以看到所有照片和数据
- ✅ 更了解打卡内容
- ✅ 适合需要详细查看的情况
**流程**
```
点击"📊 查看详情"
进入打卡详情页
查看照片、营养数据、菜品清单
点击"⚡一键复制打卡"
复制确认页
打卡页(内容已填充)
发布完成(+5积分
```
---
### 入口3社区打卡详情页 → 借鉴他人 ⭐学习优质内容
```
社区广场 → 他人的打卡
[点击帖子查看详情]
打卡详情页(他人的)
┌──────────────────────────┐
│ 查看他人饮食方案 │
│ 营养数据参考 │
│ ┌──────────────────────┐ │
│ │ 🎬一键借鉴打卡 ←入口3 │ │
│ └──────────────────────┘ │
└──────────────────────────┘
```
**特点**
- ✅ 学习他人优质饮食方案
- ✅ AI自动调整用量根据你的情况
- ✅ 必须上传自己的照片
- ✅ 原作者也会获得积分
**流程**
```
浏览社区打卡内容
点击感兴趣的帖子
进入打卡详情页(他人的)
点击"🎬一键借鉴打卡"
借鉴确认页AI调整用量
打卡页(需上传自己的照片)
发布完成
自己+5积分原作者+2积分
```
---
## 🎨 UI设计对比
### 场景A查看【自己的】打卡详情页
```
┌────────────────────────────────┐
│ 【快速操作】 │
│ ┌──────────────────────────┐ │
│ │ ⚡ 一键复制打卡 │ │
│ │ 快速复用这份饮食方案 │ │
│ └──────────────────────────┘ │
│ │
│ 点击后可以: │
│ ✅ 复制照片和备注到新打卡 │
│ ✅ 修改内容后重新发布 │
│ ✅ 可选生成AI视频 │
│ ✅ 获得5积分奖励 │
│ │
│ 💡 适用场景: │
│ • 今天吃的和之前某天一样 │
│ • 想复用高分打卡记录 │
│ • 快速打卡不想重新拍照 │
└────────────────────────────────┘
```
**按钮样式**
- 颜色:绿色渐变(#4CAF50#45B649
- 大小宽度100%高度56px
- 字体18px加粗
- 图标:⚡(闪电,表示快速)
- 圆角12px
- 阴影0 4px 12px rgba(76, 175, 80, 0.3)
---
### 场景B查看【他人的】打卡详情页
```
┌────────────────────────────────┐
│ 【一键借鉴】 │
│ ┌──────────────────────────┐ │
│ │ 🎬 一键借鉴打卡 │ │
│ │ 学习这份营养方案 │ │
│ └──────────────────────────┘ │
│ │
│ 点击后可以: │
│ ✅ 复制菜品清单到我的打卡 │
│ ✅ 根据我的情况调整用量 │
│ ✅ AI生成适合我的食谱 │
│ ✅ 获得5积分奖励 │
│ │
│ 💡 适用场景: │
│ • 看到他人的优质打卡想学习 │
│ • 发现适合自己的饮食方案 │
│ • 需要新的饮食灵感 │
└────────────────────────────────┘
```
**按钮样式**
- 颜色:蓝色渐变(#2196F3#1E88E5
- 大小宽度100%高度56px
- 字体18px加粗
- 图标:🎬(摄像机,表示学习和记录)
- 圆角12px
- 阴影0 4px 12px rgba(33, 150, 243, 0.3)
---
## 💻 技术实现
### 1. 判断打卡详情页的场景
```javascript
/**
* 判断打卡详情页的场景
*/
function getCheckInDetailScene(recordId, currentUserId) {
const record = getCheckInRecordById(recordId);
if (record.user_id === currentUserId) {
// 场景A查看自己的打卡
return {
scene: 'self',
buttonText: '⚡ 一键复制打卡',
buttonColor: 'green',
buttonClass: 'copy-btn-self',
action: 'copyOwnCheckIn'
};
} else {
// 场景B查看他人的打卡
return {
scene: 'others',
buttonText: '🎬 一键借鉴打卡',
buttonColor: 'blue',
buttonClass: 'copy-btn-others',
action: 'learnFromOthers'
};
}
}
```
### 2. 一键复制自己的打卡
```javascript
/**
* 一键复制自己的打卡
*/
function copyOwnCheckIn(recordId) {
const record = getCheckInRecordById(recordId);
// 复制数据
const copiedData = {
photos_json: record.photos_json, // 照片URL数组
notes: record.notes, // 备注说明
voice_url: record.voice_url, // 语音备注(如果有)
copied_from_record_id: recordId, // 记录复制来源
is_copied: 1 // 标记为复制的打卡
};
// 保存到临时存储
wx.setStorageSync('tempCheckInData', copiedData);
// 跳转到打卡页
wx.navigateTo({
url: '/pages/check-in/check-in?from=copy&recordId=' + recordId
});
// 埋点统计
trackEvent('copy_own_check_in', {
record_id: recordId,
source: 'detail_page'
});
}
```
### 3. 一键借鉴他人的打卡
```javascript
/**
* 一键借鉴他人的打卡
*/
function learnFromOthers(recordId, currentUserId) {
const record = getCheckInRecordById(recordId);
// 获取用户自己的营养计划
const myPlan = getNutritionPlan(currentUserId);
// AI自动调整菜品用量
const adjustedDishes = adjustDishesForUser(
record.actual_dishes_json,
myPlan
);
// 准备借鉴数据
const learnedData = {
dishes_json: adjustedDishes, // AI调整后的菜品清单
reference_record_id: recordId, // 参考来源
reference_user_id: record.user_id, // 原作者ID
is_learned_from_others: 1 // 标记为借鉴的打卡
};
// 保存到临时存储
wx.setStorageSync('tempCheckInData', learnedData);
// 跳转到打卡页
wx.navigateTo({
url: '/pages/check-in/check-in?from=learn&recordId=' + recordId
});
// 给原作者增加积分(+2分
addPointsToUser(record.user_id, 2, 'content_learned', recordId);
// 埋点统计
trackEvent('learn_from_others', {
record_id: recordId,
original_user_id: record.user_id,
source: 'detail_page'
});
}
```
### 4. AI调整菜品用量
```javascript
/**
* AI调整菜品用量根据用户的营养计划
*/
function adjustDishesForUser(originalDishes, userPlan) {
// 计算原始菜品的总营养
const originalNutrition = calculateTotalNutrition(originalDishes);
// 计算调整比例
const proteinRatio = userPlan.target_protein / originalNutrition.protein;
const energyRatio = userPlan.target_energy / originalNutrition.energy;
// 取平均比例
const avgRatio = (proteinRatio + energyRatio) / 2;
// 调整每个菜品的用量
return originalDishes.map(dish => {
const newAmount = Math.round(dish.amount * avgRatio);
return {
...dish,
amount: newAmount, // 调整后的用量
adjusted: true, // 标记为AI调整过的
original_amount: dish.amount, // 保留原始用量供参考
adjustment_ratio: avgRatio.toFixed(2) // 调整比例
};
});
}
```
---
## 📊 页面路径说明
| 页面 | 路径 | 参数 | 说明 |
|-----|------|------|------|
| 打卡历史页 | `/pages/check-in-history/history` | - | 显示用户的打卡记录列表 |
| 打卡详情页(自己的) | `/pages/check-in-detail/detail` | `?id={recordId}&type=self` | 查看自己的打卡详情 |
| 打卡详情页(他人的) | `/pages/check-in-detail/detail` | `?id={recordId}&type=others` | 查看他人的打卡详情 |
| 复制确认页 | `/pages/copy-confirm/confirm` | `?from={recordId}` | 复制自己的打卡确认页 |
| 借鉴确认页 | `/pages/learn-confirm/confirm` | `?from={recordId}` | 借鉴他人的打卡确认页 |
| 打卡页 | `/pages/check-in/check-in` | `?from=copy&recordId={id}``?from=learn&recordId={id}` | 填写打卡内容 |
---
## 🎁 积分规则
| 行为 | 积分 | 说明 |
|-----|------|------|
| 一键复制打卡(自己的) | +5分 | 从历史记录快速复制 |
| 一键借鉴打卡(他人的) | +5分 | 学习他人的饮食方案 |
| 内容被借鉴(原作者) | +2分 | 自己的打卡被他人借鉴 |
---
## 📈 预期效果
| 指标 | 优化前 | 优化后 | 提升 |
|-----|-------|-------|------|
| **详情页停留时长** | 15秒 | 30秒 | +100% |
| **从详情页发起的打卡** | 5% | 20% | +300% |
| **一键复制打卡使用率** | 25% | 40% | +60% |
| **打卡转化率** | 30% | 45% | +50% |
**数据支持**
- 用户在详情页查看完整信息后,打卡意愿更强
- 详情页提供更多上下文,用户更愿意复制高质量打卡
- 减少操作步骤,提升转化率
---
## 💡 设计亮点
### 1. **场景区分** ⭐⭐⭐
- 智能判断是"自己的打卡"还是"他人的打卡"
- 不同场景显示不同的按钮文案和颜色
- 提供差异化的体验
### 2. **三重入口** ⭐⭐⭐
- 历史列表页:快速直接复制
- 详情页:查看后再复制
- 社区详情页:学习他人
### 3. **AI智能调整** ⭐⭐⭐
- 借鉴他人打卡时AI自动调整菜品用量
- 根据用户的营养计划个性化调整
- 降低借鉴门槛,提升使用率
### 4. **积分激励** ⭐⭐⭐
- 借鉴者获得+5分
- 原作者获得+2分
- 形成"创作-分享-学习"的正向循环
---
## 🚀 下一步优化
1. **智能推荐复制**
- 在详情页根据历史数据推荐"您可能也想复制这几条"
- 提供相似打卡记录推荐
2. **批量复制**
- 支持一次性复制一天的三餐
- 生成"一日食谱计划"
3. **收藏夹功能**
- 收藏优质打卡记录
- 从收藏夹快速复制
4. **打卡模板**
- 将高分打卡保存为模板
- 模板库供用户选择
---
**文档版本**v2.2.1
**更新日期**2025-11-20
**产品名称**:慢生活智能营养专家小程序
---
**让每个打卡详情页都成为下一次打卡的起点!** ⚡🎬

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,197 @@
# 慢生活MSH系统 — 项目技术栈与架构分析
## 一、项目概述
**慢生活**MSH System是一套面向 C 端的**商城 + 营养/工具**一体化系统包含移动端多端应用UniApp与基于 CRMEB 的 Java 后端服务。项目在 CRMEB Java 版 v2.2 基础上做了业务定制,并接入了 AICoze、KieAI、腾讯云 ASR 等)与文章/工具类能力,形成「慢生活营养专家」产品形态。
---
## 二、整体架构
系统采用**前后端分离 + 多端一体**架构:
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 客户端(多端) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 微信小程序 │ │ H5 商城 │ │ App(iOS/ │ │ 支付宝/ │ │
│ │ (mp-weixin) │ │ │ │ Android) │ │ 头条等小程序│ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │ │
│ └────────────────┴────────────────┴────────────────┘ │
│ │ │
│ msh_single_uniapp (Vue 2 + UniApp) │
└────────────────────────────────────┬────────────────────────────────────┘
│ HTTPS / REST API
┌─────────────────────────────────────────────────────────────────────────┐
│ 后端服务Spring Boot
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ crmeb-front (C 端 API) │ │ crmeb-admin (管理端 API) │ │
│ │ 端口: 20822 (sophia) │ │ 后台管理、定时任务(Quartz) │ │
│ │ /api/front/*, /api/public/* │ │ │ │
│ └──────────────┬──────────────┘ └──────────────┬──────────────┘ │
│ │ │ │
│ └────────────┬───────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ crmeb-service (业务逻辑) │ crmeb-common (工具/实体/配置) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────┬────────────────────────────────────┘
┌───────────────────────────┼───────────────────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ MySQL 8.x │ │ Redis │ │ 对象存储/ │
│ (Druid 连接池) │ │ (缓存/会话/ │ │ 支付/地图等 │
│ │ │ Token/验证码) │ │ OSS/COS/七牛 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
```
- **前端**:一套 UniApp 源码通过条件编译发布到微信小程序、H5、App、支付宝/头条等小程序。
- **后端**:多模块 Maven 工程C 端入口为 `crmeb-front`,管理端为 `crmeb-admin`,共用 `crmeb-service``crmeb-common`
- **外部**MySQL 主库、Redis、阿里云 OSS/腾讯云 COS/七牛、微信/支付宝支付、高德地图、Coze/KieAI 等。
---
## 三、前端技术栈msh_single_uniapp
### 3.1 核心框架与语言
| 类别 | 技术选型 | 说明 |
|------------|-----------------|------|
| 跨端框架 | **UniApp** | 基于 Vue 2一套代码多端运行微信/支付宝/头条小程序、H5、App |
| 前端框架 | **Vue 2.x** | 选项式 API`main.js` 中挂载全局工具与 Store |
| 状态管理 | **Vuex** | `store/index.js` + `store/modules`(如 `app.js` |
| 构建/工程 | **Vue CLI** | `vue.config.js`:生产环境关闭 sourceMap、压缩时去掉 console |
| 富文本 | **mp-html** | 用于商品/文章等富文本展示(`package.json` 中声明) |
### 3.2 工程结构要点
- **入口与全局**`main.js``App.vue`;全局通过 `Vue.prototype` 挂载 `$util``$config``$Cache``$eventHub``$Order``$LoginAuth` 等。
- **配置**`config/app.js` 统一配置 `domain`API 基地址)、`HTTP_REQUEST_URL``HEADER``TOKENNAME`(如 `Authori-zation`H5 下可选 VConsole。
- **请求层**
- 通用业务请求:`utils/request.js`,基于 `uni.request`,前缀 `/api/front/``/api/public/`,统一处理 401/403/410xxx 跳转登录。
- AI/文章等:`api/models-api.js` 使用同一 `domain`,封装 Coze、KieAI、腾讯 ASR、文章等接口。
- **API 模块化**`api/api.js``api/user.js``api/order.js``api/store.js``api/tool.js``api/public.js``api/models-api.js` 等按业务拆分。
- **路由与页面**`pages.json` 配置首页、分包subPackages、tabBar、导航栏样式等首屏为 `pages/tool_main/index`(慢生活营养专家)。
### 3.3 多端与发布
- **manifest.json**:应用名「慢生活」、版本 2.2.1、App 模块(支付、分享、地图、定位、直播等)、微信/支付宝/头条小程序 appid、高德 key、支付与 OAuth 等。
- **发行**H5 使用 history 路由;微信小程序开启 `lazyCodeLoading: requiredComponents` 控制包体;生产构建通过 `vue.config.js` 做压缩与去 console。
### 3.4 前端技术栈小结
- **语言**JavaScriptES6+
- **UI**UniApp 内置组件 + 自定义组件(如 `skeleton``homeIndex``payment``jyf-parser` 等)
- **特色**多端统一、Token 鉴权、登录态校验、分包与懒加载、与 CRMEB 后端约定 `/api/front/``/api/public/` 前缀
---
## 四、后端技术栈msh_crmeb_22
### 4.1 核心框架与运行时
| 类别 | 技术选型 | 版本/说明 |
|--------------|-----------------------------|-----------|
| 基础框架 | **Spring Boot** | 2.2.6.RELEASE |
| Java | **JDK 1.8** | 编译与运行 |
| 构建 | **Maven** | 多模块 parent POM 管理依赖 |
### 4.2 模块划分
| 模块 | 职责 |
|----------------|------|
| **crmeb-common** | 公共实体、工具类、配置(如 CozeConfig、通用组件Druid、MyBatis-Plus、Redis、JWT、验证码等 |
| **crmeb-service** | 业务逻辑层商城、用户、订单、营销、工具、AI 对接Coze、KieAI、腾讯 ASR等 |
| **crmeb-admin** | 管理端 Web API、Quartz 定时任务,打包为 `jxz-admin-2.2.jar` |
| **crmeb-front** | C 端 Web API打包为 `sophia-front-2.2.jar`,当前 sophia 配置端口 20822 |
### 4.3 数据访问与存储
| 类别 | 技术选型 | 说明 |
|----------|-------------------------|------|
| 关系库 | **MySQL 8.x** | 驱动 `mysql-connector-java` 8.0.33Druid 连接池 |
| ORM | **MyBatis-Plus** | 3.3.1,含 generatormapper 扫描 `com.zbkj.**.dao` |
| 分页 | **PageHelper** | 1.2.5,与 MyBatis-Plus 共存时排除 mybatis 避免冲突 |
| 缓存 | **Redis + Jedis** | Spring Boot 2.2 Data Redis独立 DB 存 accessToken 等 |
| 文档 | **MongoDB** | 仅 driver-core 依赖,用于部分扩展能力 |
### 4.4 安全与认证
- **JWT**`jjwt-api/impl/jackson` 0.11.5Token 名称与前端约定(如 `Authori-zation`)。
- **行为验证码**`spring-boot-starter-captcha`AJ支持滑动/点选,缓存可走 Redis。
- **白名单**`application.yml``crmeb.ignored` 配置 Swagger、上传、Coze、KieAI 等路径免鉴权。
### 4.5 接口与文档
- **REST**Spring MVCC 端前缀 `/api/front/``/api/public/`
- **文档**Springfox Swagger 2.9.2 + swagger-bootstrap-ui 1.9.3,配置在 `application*.yml``swagger.basic`
### 4.6 第三方与中间件(根 POM 管理)
- **工具**Hutool、Commons Lang3、Fastjson、HttpClient、Dom4j、XStream、Pinyin4j、ZXing二维码等。
- **文件与图片**Commons FileUpload/IO、Thumbnailator、阿里云 OSS、腾讯云 COS、七牛 SDK。
- **支付**:支付宝 SDK、微信通过 common 或 service 内封装)。
- **AI/开放接口**Coze APIcoze-api 0.2.3、OkHttp、RxJava流式KieAI、腾讯云 ASR 等通过 HTTP 在 service 层封装。
### 4.7 配置与运行
- **配置**`application.yml` + `application-{profile}.yml`(如 `sophia``dev``prod``beta`)。
- **数据源/Redis**:在 profile 中覆盖 URL、库名、端口、密码等。
- **日志**Logback`logback-spring.xml`),按环境输出到 `./crmeb_log``./logs`
---
## 五、models-integration 子项目
- **定位**:独立 Maven 工程(`com.integration:models-integration`Java 8Spring Boot 2.7.5。
- **用途**:与「模型/AI」集成相关的独立服务或能力如统一网关、模型路由等通过 SpringDoc OpenAPI、Redis、MySQL、AOP 等搭建。
- **与主系统关系**:与 msh_crmeb_22 无直接模块依赖,可单独部署,通过 HTTP 或消息与 front 协作。
---
## 六、部署与运行约定
### 6.1 前端
- **开发**:使用 HBuilderX 或 Vue CLI 运行/发行到各端API 基地址在 `config/app.js``domain` 修改(如 `https://sophia-shop.uj345.cc`)。
- **生产**H5 可部署到任意静态服务器;小程序/App 需在对应平台上传与配置域名白名单。
### 6.2 后端
- **C 端**:以 `sophia` profile 启动 `CrmebFrontApplication`,默认端口 20822需可访问的 MySQL、Redis。
- **管理端**:启动 `CrmebAdminApplication`,按需配置端口与数据源。
- **包名**`com.zbkj`front 的 `@ComponentScan` 包含 `com.zbkj``com.zbkj.front`Mapper 扫描 `com.zbkj.**.dao`
---
## 七、技术栈汇总表
| 层次 | 技术项 | 选型说明 |
|----------|------------------|----------|
| 前端框架 | Vue 2 + UniApp | 多端统一(小程序/H5/App |
| 状态管理 | Vuex | 登录态、购物车、全局配置等 |
| 请求 | uni.request 封装 | 统一 domain、Token、错误与登录跳转 |
| 后端框架 | Spring Boot 2.2 | 多模块common/service/admin/front |
| 数据访问 | MyBatis-Plus + MySQL | Druid 连接池、PageHelper 分页 |
| 缓存 | Redis (Jedis) | 会话、Token、验证码、配置缓存 |
| 认证 | JWT + 行为验证码 | 前端 Header 传 Token |
| 文档 | Swagger 2 + Bootstrap UI | 后端 API 文档 |
| 构建 | Maven / npm | 后端 Maven前端 Vue CLI / HBuilderX |
| 对象存储 | 阿里云 OSS / 腾讯云 COS / 七牛 | 图片与文件 |
| 支付 | 微信支付、支付宝 | 通过后端封装 |
| AI/能力 | Coze、KieAI、腾讯云 ASR 等 | 在 crmeb-service 中封装front 暴露 REST |
---
## 八、文档与资源
- **产品与设计**`docs/` 下 PRD、打卡社区设计、食谱计算器接口文档、用户界面交互设计等。
- **数据库**`docs/sql``msh_crmeb_22/sql` 等目录可存放建表/迁移脚本。
- **接口**`documents/api` 可补充 C 端/管理端接口说明,与 Swagger 互补。
---
*文档基于当前仓库目录与配置文件整理,用于技术评审、新人上手与架构演进参考。具体版本号以各模块 `pom.xml`、`package.json` 及运行环境为准。*

View File

@@ -0,0 +1,569 @@
# 食谱计算器后端接口开发文档
> **版本**v1.0
> **创建日期**2026-02-01
> **所属模块**Tool工具模块
> **配套前端**`msh_single_uniapp/pages/tool/calculator.vue` / `calculator-result.vue`
---
## 一、功能概述
食谱计算器是**慢生活智能营养专家**的核心功能之一面向肾病CKD及透析患者根据用户输入的健康数据自动计算
1. **健康指标**eGFR、标准体重、BMI、CKD分期
2. **每日营养目标**蛋白质摄入量g/d、能量摄入量kcal/d
3. **食物份数建议**7 类食物的每日推荐份数
4. **一日三餐配餐方案**:早餐、午餐、晚餐的菜品清单(含图片、食材用量)
5. **重要提示**:根据患者情况给出饮食注意事项
用户可进一步**采纳营养计划**,进入打卡流程(另单独接口)。
---
## 二、接口清单
| 序号 | 接口名称 | HTTP方法 | 路径 | 说明 |
|------|----------|----------|------|------|
| 1 | 计算营养方案 | `POST` | `/api/front/tool/calculator/calculate` | 核心接口,输入健康数据,返回计算结果 |
| 2 | 获取计算结果详情 | `GET` | `/api/front/tool/calculator/result/{id}` | 通过结果ID获取完整结果含配餐 |
| 3 | 采纳营养计划 | `POST` | `/api/front/tool/calculator/adopt` | 用户采纳后创建营养计划,进入打卡流程 |
---
## 三、接口详细设计
### 3.1 计算营养方案
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/tool/calculator/calculate` |
| 是否鉴权 | **是**(需登录) |
| Content-Type | `application/json` |
#### 请求参数Request Body
| 参数名 | 类型 | 必填 | 说明 | 校验规则 |
|--------|------|------|------|----------|
| `gender` | String | 是 | 性别 | 可选值:`male` / `female` |
| `age` | Integer | 是 | 年龄(岁) | 1 ≤ age ≤ 150 |
| `height` | Integer | 是 | 身高cm | 50 ≤ height ≤ 250 |
| `dialysis` | Boolean | 是 | 是否透析 | `true` / `false` |
| `dialysisType` | String | 否 | 透析类型 | 当 `dialysis=true` 时有效;可选值:`hemodialysis`(血透)/ `peritoneal`(腹透) |
| `dryWeight` | Number | 是 | 干体重kg | 20 ≤ dryWeight ≤ 300支持1位小数 |
| `creatinine` | Number | 是 | 血肌酐μmol/L | 0 < creatinine ≤ 2000支持2位小数 |
**请求示例**
```json
{
"gender": "male",
"age": 55,
"height": 170,
"dialysis": true,
"dialysisType": "hemodialysis",
"dryWeight": 65.5,
"creatinine": 850
}
```
#### 响应参数Response Body
| 参数名 | 类型 | 说明 |
|--------|------|------|
| `code` | Integer | 状态码,`200` 表示成功 |
| `message` | String | 提示信息 |
| `data` | Object | 计算结果对象 |
**`data` 结构**
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `id` / `resultId` | Long | 计算结果唯一ID用于后续查询/采纳 |
| `healthData` | Object | 健康数据计算结果 |
| `nutritionGoals` | Object | 每日营养目标 |
| `foodList` | Array | 食物份数建议列表 |
| `mealPlan` | Object | 一日三餐配餐方案 |
| `importantTips` | Array\<String\> | 重要提示文案列表 |
| `createdAt` | String | 创建时间 ISO8601 |
**`healthData` 结构**
| 字段名 | 类型 | 说明 | 计算公式 |
|--------|------|------|----------|
| `eGFR` | String | 肾小球滤过率ml/min/1.73m²) | CKD-EPI 公式(见附录 A |
| `standardWeight` | String | 标准体重kg | 男:`(height - 80) × 0.7`;女:`(height - 70) × 0.6` |
| `bmi` | String | 体重指数 | `dryWeight / (height/100)²` |
| `bmiStatus` | String | BMI 状态描述 | 见附录 B |
| `ckdStage` | String | CKD 分期 | 见附录 C |
**`nutritionGoals` 结构**
| 字段名 | 类型 | 说明 | 计算公式 |
|--------|------|------|----------|
| `protein` | String | 每日蛋白质目标(克) | 透析期:`standardWeight × 1.2`;非透析期:`standardWeight × 0.8` |
| `energy` | String | 每日能量目标(千卡) | `standardWeight × 35` |
**`foodList` 结构**数组7 项)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `number` | Integer | 序号 1-7 |
| `name` | String | 食物类别名称(如"谷薯50g" |
| `portion` | String | 推荐份数 |
**`mealPlan` 结构**
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `breakfast` | Array | 早餐菜品列表 |
| `lunch` | Array | 午餐菜品列表 |
| `dinner` | Array | 晚餐菜品列表 |
**菜品对象结构**
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `name` | String | 菜品名称 |
| `image` | String | 菜品图片 URL |
| `ingredients` | Array\<String\> | 食材列表(如 `["牛奶 120g", "面条 90g"]` |
**响应示例**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 100234,
"healthData": {
"eGFR": "7.9",
"standardWeight": "63.0",
"bmi": "22.7",
"bmiStatus": "正常",
"ckdStage": "CKD 5期"
},
"nutritionGoals": {
"protein": "75.6",
"energy": "2205"
},
"foodList": [
{ "number": 1, "name": "谷薯50g", "portion": "5.7" },
{ "number": 2, "name": "淀粉100g", "portion": "0.77" },
{ "number": 3, "name": "绿叶蔬菜200g", "portion": "1" },
{ "number": 4, "name": "瓜果蔬菜200g", "portion": "2" },
{ "number": 5, "name": "奶类230g", "portion": "1" },
{ "number": 6, "name": "肉蛋类50/60g", "portion": "7" },
{ "number": 7, "name": "油脂类10g", "portion": "5.7" }
],
"mealPlan": {
"breakfast": [
{
"name": "牛奶",
"image": "https://cdn.xxx.com/images/milk.jpg",
"ingredients": ["牛奶 120g"]
},
{
"name": "鸡蛋拌面",
"image": "https://cdn.xxx.com/images/egg-noodle.jpg",
"ingredients": ["面条 90g", "鸡蛋 120g", "葱花 5g"]
},
{
"name": "凉拌黄瓜",
"image": "https://cdn.xxx.com/images/cucumber.jpg",
"ingredients": ["黄瓜 100g"]
}
],
"lunch": [
{
"name": "米饭",
"image": "https://cdn.xxx.com/images/rice.jpg",
"ingredients": ["大米 100g"]
},
{
"name": "清蒸鲈鱼",
"image": "https://cdn.xxx.com/images/bass.jpg",
"ingredients": ["鲈鱼 120g", "生姜 5g", "葱 5g"]
},
{
"name": "蒜蓉西兰花",
"image": "https://cdn.xxx.com/images/broccoli.jpg",
"ingredients": ["西兰花 150g", "大蒜 5g", "植物油 8g"]
},
{
"name": "冬瓜汤",
"image": "https://cdn.xxx.com/images/wax-gourd-soup.jpg",
"ingredients": ["冬瓜 150g"]
}
],
"dinner": [
{
"name": "杂粮饭",
"image": "https://cdn.xxx.com/images/mixed-rice.jpg",
"ingredients": ["大米 70g", "小米 30g"]
},
{
"name": "香菇炒鸡丁",
"image": "https://cdn.xxx.com/images/chicken-mushroom.jpg",
"ingredients": ["鸡胸肉 100g", "香菇 50g", "植物油 8g"]
},
{
"name": "清炒油菜",
"image": "https://cdn.xxx.com/images/bok-choy.jpg",
"ingredients": ["油菜 150g", "植物油 5g"]
},
{
"name": "番茄蛋花汤",
"image": "https://cdn.xxx.com/images/tomato-egg-soup.jpg",
"ingredients": ["番茄 100g", "鸡蛋 60g"]
}
]
},
"importantTips": [
"以上配餐由 AI 生成,仅适用于无其他并发症的单纯尿毒症人群",
"透析患者需严格控制水分摄入",
"建议低盐饮食(每日少于 5g",
"注意限制高钾食物(香蕉、橙子、土豆等)",
"限制高磷食物(坚果、动物内脏等)",
"特别提醒:尿毒症合并其他并发症人群不适用此配餐,请务必咨询专业营养师调整方案"
],
"createdAt": "2026-02-01T10:30:00+08:00"
}
}
```
#### 错误码
| code | message | 说明 |
|------|---------|------|
| 400 | 参数校验失败 | 请求参数不符合校验规则 |
| 401 / 410000-410002 | 未登录/登录过期 | 需重新登录 |
| 500 | 系统异常 | 服务端内部错误 |
---
### 3.2 获取计算结果详情
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `GET /api/front/tool/calculator/result/{id}` |
| 是否鉴权 | **是** |
| 路径参数 | `id`计算结果IDLong |
#### 响应
与 3.1 的 `data` 结构相同,用于结果页刷新或分享后重新加载。
---
### 3.3 采纳营养计划
#### 基础信息
| 项目 | 值 |
|------|------|
| 请求路径 | `POST /api/front/tool/calculator/adopt` |
| 是否鉴权 | **是** |
| Content-Type | `application/json` |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `resultId` | Long | 是 | 计算结果ID |
**请求示例**
```json
{
"resultId": 100234
}
```
#### 响应
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `code` | Integer | 200 成功 |
| `message` | String | 提示信息 |
| `data.planId` | Long | 新创建的营养计划ID |
| `data.startDate` | String | 计划开始日期 |
| `data.endDate` | String | 计划结束日期(默认 +7 天) |
**响应示例**
```json
{
"code": 200,
"message": "采纳成功",
"data": {
"planId": 56789,
"startDate": "2026-02-01",
"endDate": "2026-02-07"
}
}
```
#### 业务规则
1. 同一用户同一时间只能有 **1 个激活状态(`status=active`** 的营养计划;若已存在则自动将旧计划标记为 `abandoned`
2. 采纳成功后赠送 **+20 积分**(积分任务:采纳营养方案)。
---
## 四、数据库表设计
### 4.1 计算结果表calculator_results
> 存储每次计算的输入与输出,方便查询历史、分析
```sql
CREATE TABLE calculator_results (
result_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
user_id BIGINT NOT NULL COMMENT '用户ID',
-- 输入参数
gender VARCHAR(10) NOT NULL COMMENT '性别male/female',
age INT NOT NULL COMMENT '年龄(岁)',
height INT NOT NULL COMMENT '身高cm',
has_dialysis TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否透析0-否 1-是',
dialysis_type VARCHAR(20) COMMENT '透析类型hemodialysis/peritoneal',
dry_weight DECIMAL(5,2) NOT NULL COMMENT '干体重kg',
creatinine DECIMAL(8,2) NOT NULL COMMENT '血肌酐μmol/L',
-- 计算结果
egfr DECIMAL(6,2) NOT NULL COMMENT 'eGFRml/min/1.73m²)',
standard_weight DECIMAL(5,2) NOT NULL COMMENT '标准体重kg',
bmi DECIMAL(4,1) NOT NULL COMMENT 'BMI',
bmi_status VARCHAR(20) NOT NULL COMMENT 'BMI状态描述',
ckd_stage VARCHAR(50) NOT NULL COMMENT 'CKD分期',
protein_intake DECIMAL(5,1) NOT NULL COMMENT '每日蛋白质目标g',
energy_intake INT NOT NULL COMMENT '每日能量目标kcal',
-- 配餐方案JSON
food_list_json TEXT COMMENT '食物份数建议 JSON',
meal_plan_json TEXT COMMENT '配餐方案 JSON',
tips_json TEXT COMMENT '重要提示 JSON',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='营养计算结果表';
```
### 4.2 营养计划表nutrition_plans
> PRD 中已定义,补充关联
```sql
-- 见 PRD 4.6.5 节
-- 关键字段:
-- plan_id, user_id, gender, age, height, weight, has_dialysis, dialysis_type, creatinine,
-- egfr, standard_weight, bmi, ckd_stage, protein_intake, energy_intake,
-- meal_plan_json, status, start_date, end_date, created_at, updated_at
```
关联关系:`nutrition_plans.source_result_id → calculator_results.id`(可选字段,用于溯源)
---
## 五、核心算法
### 5.1 eGFR 计算CKD-EPI 2021 公式)
```java
/**
* CKD-EPI 2021 公式(无种族系数)
* @param creatinine 血肌酐 (μmol/L)
* @param age 年龄 (岁)
* @param isFemale 是否女性
* @return eGFR (ml/min/1.73m²)
*/
public static double calculateEGFR(double creatinine, int age, boolean isFemale) {
// 将 μmol/L 转换为 mg/dL
double scr = creatinine / 88.4;
double kappa = isFemale ? 0.7 : 0.9;
double alpha = isFemale ? -0.241 : -0.302;
double multi = isFemale ? 1.012 : 1.0;
double minRatio = Math.min(scr / kappa, 1.0);
double maxRatio = Math.max(scr / kappa, 1.0);
double eGFR = 142 * Math.pow(minRatio, alpha) * Math.pow(maxRatio, -1.200)
* Math.pow(0.9938, age) * multi;
return Math.round(eGFR * 100.0) / 100.0; // 保留2位小数
}
```
### 5.2 标准体重
```java
public static double calculateStandardWeight(int height, boolean isFemale) {
return isFemale
? (height - 70) * 0.6
: (height - 80) * 0.7;
}
```
### 5.3 BMI
```java
public static double calculateBMI(double weight, int height) {
double heightM = height / 100.0;
return Math.round(weight / (heightM * heightM) * 10.0) / 10.0;
}
```
### 5.4 BMI 状态
| BMI 范围 | 状态描述 |
|----------|----------|
| < 18.5 | 体型过轻 |
| 18.5 - 23.9 | 正常 |
| 24.0 - 27.9 | 超重 |
| ≥ 28.0 | 肥胖 |
### 5.5 CKD 分期
| eGFR 范围 | 分期 |
|-----------|------|
| ≥ 90 | CKD 1期 |
| 60 - 89 | CKD 2期 |
| 45 - 59 | CKD 3a期 |
| 30 - 44 | CKD 3b期 |
| 15 - 29 | CKD 4期 |
| < 15非透析 | CKD 5期 |
| 透析患者 | 透析期 |
### 5.6 营养目标
```java
public static double calculateProtein(double standardWeight, boolean hasDialysis) {
return hasDialysis
? standardWeight * 1.2 // 透析期
: standardWeight * 0.8; // 非透析期
}
public static int calculateEnergy(double standardWeight) {
return (int) Math.round(standardWeight * 35);
}
```
### 5.7 食物份数
基于能量和蛋白质目标按照《慢性肾脏病患者膳食指导2017》推荐比例分配具体算法可参考专业营养软件或配置表。
### 5.8 配餐方案生成
1. **规则匹配**:基于 CKD 分期、透析类型、营养目标,从预置的 **配餐模板库recipes** 中匹配合适方案。
2. **AI 生成(可选)**:调用 AI 模型根据营养目标动态生成菜品及食材用量。
3. **输出**:早/午/晚三餐各 2-4 道菜,包含图片 URL 和食材列表。
---
## 六、性能与安全
### 6.1 缓存策略
| 数据 | 缓存方式 | 过期时间 | 说明 |
|------|----------|----------|------|
| 计算结果 | Redis Hash | 24 小时 | key = `calc_result:{id}` |
| 配餐模板库 | 本地缓存 / Redis | 1 小时 | 减少 DB 查询 |
### 6.2 限流
| 接口 | QPS 限制 | 说明 |
|------|----------|------|
| calculate | 10/用户/分钟 | 防止恶意刷算 |
| result/{id} | 60/用户/分钟 | 允许刷新 |
| adopt | 5/用户/分钟 | 防重复提交 |
### 6.3 幂等性
- **calculate**:每次计算生成新记录,允许重复调用。
- **adopt**:采纳接口需幂等设计,同一 `resultId` 多次调用只创建一个计划;可用 `user_id + result_id` 唯一索引或分布式锁。
### 6.4 数据安全
- 所有接口均需登录鉴权Header: `Authori-zation`)。
- 用户只能查询/采纳自己的计算结果(`user_id` 校验)。
- 敏感健康数据传输全程 HTTPS。
---
## 七、测试用例
### 7.1 正常场景
| 用例编号 | 描述 | 输入 | 预期输出 |
|----------|------|------|----------|
| TC01 | 男性透析患者计算 | gender=male, age=55, height=170, dialysis=true, dryWeight=65.5, creatinine=850 | 返回 code=200healthData/nutritionGoals/mealPlan 完整 |
| TC02 | 女性非透析患者 | gender=female, age=48, height=160, dialysis=false, dryWeight=52, creatinine=180 | 返回 code=200ckdStage 按 eGFR 判断 |
| TC03 | 查询结果详情 | GET /result/100234 | 返回与 calculate 相同结构 |
| TC04 | 采纳营养计划 | resultId=100234 | 返回 planId计划 status=active |
### 7.2 异常场景
| 用例编号 | 描述 | 输入 | 预期输出 |
|----------|------|------|----------|
| TC11 | 年龄超出范围 | age=200 | code=400, message 包含"年龄" |
| TC12 | 未登录调用 | 无 Token | code=401/410000 |
| TC13 | 查询他人结果 | id 属于其他用户 | code=403 |
| TC14 | 重复采纳 | 同一 resultId 调用两次 | 第二次返回已存在的 planId幂等 |
---
## 八、附录
### 附录 ACKD-EPI 2021 公式
> 无种族系数版本,适用于中国人群
```
eGFR = 142 × min(Scr/κ, 1)^α × max(Scr/κ, 1)^(-1.200) × 0.9938^Age × (1.012 if female)
其中:
- Scr = 血肌酐 (mg/dL) = μmol/L ÷ 88.4
- κ = 0.7 (女) / 0.9 (男)
- α = -0.241 (女) / -0.302 (男)
```
### 附录 BBMI 分类标准(中国)
| BMI | 分类 |
|-----|------|
| < 18.5 | 体型过轻 |
| 18.5 - 23.9 | 正常 |
| 24.0 - 27.9 | 超重 |
| ≥ 28.0 | 肥胖 |
### 附录 CCKD 分期标准
| 分期 | eGFR (ml/min/1.73m²) | 描述 |
|------|----------------------|------|
| 1期 | ≥ 90 | 肾功能正常或升高 |
| 2期 | 60-89 | 轻度下降 |
| 3a期 | 45-59 | 轻-中度下降 |
| 3b期 | 30-44 | 中-重度下降 |
| 4期 | 15-29 | 重度下降 |
| 5期 | < 15 | 肾衰竭 |
| 透析期 | — | 已接受透析治疗 |
---
## 九、变更记录
| 版本 | 日期 | 作者 | 变更内容 |
|------|------|------|----------|
| v1.0 | 2026-02-01 | — | 初稿 |
---
*文档结束*