You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
14 KiB
14 KiB
健康 AI 助手 - 后端服务文档
基于 go-zero 微服务框架重构
一、服务概述
1.1 原架构(Gin)
server/
├── cmd/server/main.go # 入口
├── internal/
│ ├── api/handler/ # HTTP 处理器
│ ├── api/middleware/ # 中间件
│ ├── api/router.go # 路由定义
│ ├── config/ # 配置
│ ├── database/ # 数据库初始化
│ ├── model/ # GORM 模型
│ ├── repository/ # 数据访问层
│ └── service/ # 业务逻辑层
└── pkg/ # 公共包
1.2 目标架构(go-zero)
backend/
├── health-api/ # REST API 服务
│ ├── etc/config.yaml # 配置
│ ├── health.api # API 定义
│ ├── internal/
│ │ ├── config/ # 配置结构
│ │ ├── handler/ # Handler 层
│ │ ├── logic/ # Logic 业务层
│ │ ├── svc/ # ServiceContext
│ │ └── types/ # 请求/响应类型
│ └── health.go # 入口
├── health-rpc/ # RPC 服务(可选)
└── model/ # 数据模型
二、功能模块
2.1 认证模块 (Auth)
| API | 方法 | 路径 | 描述 |
|---|---|---|---|
| 注册 | POST | /api/auth/register | 手机号/邮箱注册 |
| 登录 | POST | /api/auth/login | 登录获取 Token |
| 刷新 Token | POST | /api/auth/refresh | 刷新 JWT Token |
| 发送验证码 | POST | /api/auth/send-code | 发送短信/邮箱验证码 |
请求/响应示例:
// 注册请求
type RegisterReq struct {
Phone string `json:"phone,optional"`
Email string `json:"email,optional"`
Password string `json:"password"`
Code string `json:"code,optional"`
}
// 登录响应
type LoginResp struct {
Token string `json:"token"`
ExpiresAt int64 `json:"expires_at"`
User UserInfo `json:"user"`
}
2.2 用户模块 (User)
| API | 方法 | 路径 | 描述 | 认证 |
|---|---|---|---|---|
| 获取信息 | GET | /api/user/profile | 获取用户基本信息 | ✅ |
| 更新资料 | PUT | /api/user/profile | 更新昵称/头像 | ✅ |
2.3 健康档案模块 (Health)
| API | 方法 | 路径 | 描述 | 认证 |
|---|---|---|---|---|
| 获取完整档案 | GET | /api/user/health-profile | 获取所有健康信息 | ✅ |
| 更新档案 | PUT | /api/user/health-profile | 更新健康档案 | ✅ |
| 获取基础档案 | GET | /api/user/basic-profile | 获取基础信息 | ✅ |
| 获取生活习惯 | GET | /api/user/lifestyle | 获取生活习惯 | ✅ |
| 更新生活习惯 | PUT | /api/user/lifestyle | 更新生活习惯 | ✅ |
| 获取病史 | GET | /api/user/medical-history | 获取病史列表 | ✅ |
| 删除病史 | DELETE | /api/user/medical-history/:id | 删除单条病史 | ✅ |
| 获取家族史 | GET | /api/user/family-history | 获取家族病史 | ✅ |
| 删除家族史 | DELETE | /api/user/family-history/:id | 删除单条家族史 | ✅ |
| 获取过敏记录 | GET | /api/user/allergy-records | 获取过敏记录 | ✅ |
| 删除过敏记录 | DELETE | /api/user/allergy-records/:id | 删除单条过敏记录 | ✅ |
| 获取购买历史 | GET | /api/user/purchase-history | 获取保健品购买记录 | ✅ |
2.4 健康调查模块 (Survey)
| API | 方法 | 路径 | 描述 | 认证 |
|---|---|---|---|---|
| 获取状态 | GET | /api/survey/status | 获取调查完成状态 | ✅ |
| 提交基础信息 | POST | /api/survey/basic-info | 提交基础健康信息 | ✅ |
| 提交生活习惯 | POST | /api/survey/lifestyle | 提交生活习惯 | ✅ |
| 提交病史 | POST | /api/survey/medical-history | 提交单条病史 | ✅ |
| 批量提交病史 | POST | /api/survey/medical-history/batch | 批量提交病史 | ✅ |
| 提交家族史 | POST | /api/survey/family-history | 提交单条家族史 | ✅ |
| 批量提交家族史 | POST | /api/survey/family-history/batch | 批量提交家族史 | ✅ |
| 提交过敏信息 | POST | /api/survey/allergy | 提交单条过敏信息 | ✅ |
| 批量提交过敏 | POST | /api/survey/allergy/batch | 批量提交过敏信息 | ✅ |
| 完成调查 | POST | /api/survey/complete | 标记调查完成 | ✅ |
2.5 体质辨识模块 (Constitution)
| API | 方法 | 路径 | 描述 | 认证 |
|---|---|---|---|---|
| 获取问卷 | GET | /api/constitution/questions | 获取所有题目 | ✅ |
| 获取分组问卷 | GET | /api/constitution/questions/grouped | 按体质分组获取 | ✅ |
| 提交测评 | POST | /api/constitution/submit | 提交问卷答案 | ✅ |
| 获取结果 | GET | /api/constitution/result | 获取最新测评结果 | ✅ |
| 获取历史 | GET | /api/constitution/history | 获取测评历史 | ✅ |
| 获取建议 | GET | /api/constitution/recommendations | 获取调养建议 | ✅ |
体质类型:
- pinghe (平和质)
- qixu (气虚质)
- yangxu (阳虚质)
- yinxu (阴虚质)
- tanshi (痰湿质)
- shire (湿热质)
- xueyu (血瘀质)
- qiyu (气郁质)
- tebing (特禀质)
2.6 AI 对话模块 (Conversation)
| API | 方法 | 路径 | 描述 | 认证 |
|---|---|---|---|---|
| 获取列表 | GET | /api/conversations | 获取对话列表 | ✅ |
| 创建对话 | POST | /api/conversations | 创建新对话 | ✅ |
| 获取详情 | GET | /api/conversations/:id | 获取对话消息 | ✅ |
| 删除对话 | DELETE | /api/conversations/:id | 删除对话 | ✅ |
| 发送消息 | POST | /api/conversations/:id/messages | 发送消息(非流式) | ✅ |
| 发送消息(流式) | POST | /api/conversations/:id/messages/stream | 发送消息(SSE 流式) | ✅ |
AI 服务配置:
- 阿里云通义千问(主要)
- OpenAI 兼容接口(备选)
2.7 产品模块 (Product)
| API | 方法 | 路径 | 描述 | 认证 |
|---|---|---|---|---|
| 获取列表 | GET | /api/products | 分页获取产品 | ❌ |
| 获取详情 | GET | /api/products/:id | 获取产品详情 | ❌ |
| 按分类获取 | GET | /api/products/category | 按分类筛选 | ❌ |
| 搜索产品 | GET | /api/products/search | 关键词搜索 | ❌ |
| 获取推荐 | GET | /api/products/recommend | 基于体质推荐 | ✅ |
| 同步购买 | POST | /api/sync/purchase | 商城同步购买记录 | API Key |
三、数据模型
3.1 用户相关
-- 用户表
CREATE TABLE users (
id BIGINT PRIMARY KEY,
phone VARCHAR(20) UNIQUE,
email VARCHAR(100) UNIQUE,
password_hash VARCHAR(255) NOT NULL,
nickname VARCHAR(50),
avatar VARCHAR(255),
survey_completed BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP
);
-- 健康档案表
CREATE TABLE health_profiles (
id BIGINT PRIMARY KEY,
user_id BIGINT UNIQUE NOT NULL,
name VARCHAR(50),
birth_date DATE,
gender VARCHAR(10),
height DECIMAL(5,2),
weight DECIMAL(5,2),
bmi DECIMAL(4,2),
blood_type VARCHAR(10),
occupation VARCHAR(50),
marital_status VARCHAR(20),
region VARCHAR(100)
);
-- 生活习惯表
CREATE TABLE lifestyle_infos (
id BIGINT PRIMARY KEY,
user_id BIGINT UNIQUE NOT NULL,
sleep_time TIME,
wake_time TIME,
sleep_quality VARCHAR(20),
meal_regularity VARCHAR(20),
diet_preference VARCHAR(20),
daily_water_ml INT,
exercise_frequency VARCHAR(20),
exercise_type VARCHAR(50),
exercise_duration_min INT,
is_smoker BOOLEAN,
alcohol_frequency VARCHAR(20)
);
3.2 健康记录
-- 病史表
CREATE TABLE medical_histories (
id BIGINT PRIMARY KEY,
health_profile_id BIGINT NOT NULL,
disease_name VARCHAR(100) NOT NULL,
disease_type VARCHAR(50),
diagnosed_date DATE,
status VARCHAR(20),
notes TEXT
);
-- 家族病史表
CREATE TABLE family_histories (
id BIGINT PRIMARY KEY,
health_profile_id BIGINT NOT NULL,
relation VARCHAR(20) NOT NULL,
disease_name VARCHAR(100) NOT NULL,
notes TEXT
);
-- 过敏记录表
CREATE TABLE allergy_records (
id BIGINT PRIMARY KEY,
health_profile_id BIGINT NOT NULL,
allergy_type VARCHAR(50) NOT NULL,
allergen VARCHAR(100) NOT NULL,
severity VARCHAR(20),
reaction_desc TEXT
);
3.3 体质辨识
-- 体质测评表
CREATE TABLE constitution_assessments (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
assessed_at TIMESTAMP NOT NULL,
scores JSON, -- 各体质得分
primary_constitution VARCHAR(20),
secondary_constitutions JSON, -- 兼夹体质
recommendations JSON -- 调养建议
);
-- 测评答案表
CREATE TABLE assessment_answers (
id BIGINT PRIMARY KEY,
assessment_id BIGINT NOT NULL,
question_id INT NOT NULL,
score INT CHECK (score >= 1 AND score <= 5)
);
-- 问卷题库表
CREATE TABLE question_banks (
id INT PRIMARY KEY,
constitution_type VARCHAR(20) NOT NULL,
question_text TEXT NOT NULL,
options JSON,
order_num INT
);
3.4 对话
-- 对话表
CREATE TABLE conversations (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
title VARCHAR(200),
created_at TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP
);
-- 消息表
CREATE TABLE messages (
id BIGINT PRIMARY KEY,
conversation_id BIGINT NOT NULL,
role VARCHAR(20) NOT NULL, -- user/assistant/system
content TEXT NOT NULL,
created_at TIMESTAMP
);
3.5 产品
-- 产品表
CREATE TABLE products (
id BIGINT PRIMARY KEY,
name VARCHAR(200) NOT NULL,
category VARCHAR(50),
description TEXT,
efficacy TEXT,
suitable TEXT,
price DECIMAL(10,2),
image_url VARCHAR(500),
mall_url VARCHAR(500),
is_active BOOLEAN DEFAULT TRUE
);
-- 体质-产品关联表
CREATE TABLE constitution_products (
id BIGINT PRIMARY KEY,
constitution_type VARCHAR(20) NOT NULL,
product_id BIGINT NOT NULL,
priority INT DEFAULT 0,
reason TEXT
);
-- 购买历史表
CREATE TABLE purchase_histories (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
order_no VARCHAR(50),
product_id BIGINT,
product_name VARCHAR(200),
purchased_at TIMESTAMP,
source VARCHAR(50)
);
四、配置说明
4.1 服务配置
Name: health-api
Host: 0.0.0.0
Port: 8080
Mode: dev
# JWT 认证
Auth:
AccessSecret: health-ai-secret-key-change-in-production
AccessExpire: 86400 # 24小时
# 数据库
Database:
Driver: sqlite
DataSource: ./data/health.db
# PostgreSQL
# Driver: postgres
# DataSource: host=localhost port=5432 user=postgres password=xxx dbname=health_app sslmode=disable
# AI 服务
AI:
Provider: aliyun
MaxHistoryMessages: 10
MaxTokens: 2000
Aliyun:
ApiKey: sk-xxx
Model: qwen-plus
OpenAI:
ApiKey: sk-xxx
BaseUrl: https://api.openai.com/v1
Model: gpt-3.5-turbo
4.2 中间件
-
JWT 认证中间件
- 验证 Authorization Header
- 解析 Token 获取 userID
- 注入上下文
-
CORS 中间件
- 允许跨域请求
- 配置允许的方法和头部
-
日志中间件
- 请求日志记录
- 响应时间统计
五、API 统计
| 模块 | API 数量 | 需认证 | 说明 |
|---|---|---|---|
| 认证 | 4 | 0 | 注册/登录/刷新/验证码 |
| 用户 | 2 | 2 | 获取/更新资料 |
| 健康档案 | 12 | 12 | 完整健康信息 CRUD |
| 健康调查 | 10 | 10 | 分步提交流程 |
| 体质辨识 | 6 | 6 | 问卷/测评/结果 |
| AI 对话 | 6 | 6 | 对话管理/消息 |
| 产品 | 6 | 1 | 产品查询/推荐 |
| 总计 | 46 | 37 |
六、迁移计划
6.1 阶段一:基础框架 ✅ 已完成
- 创建 backend 目录
- 使用 mcp-zero 创建 API 服务结构
- 定义 .api 文件(46 个 API 端点)
- 生成基础代码(47 个 Handler + 47 个 Logic)
6.2 阶段二:核心功能
- 迁移认证模块
- 迁移用户模块
- 迁移健康档案模块
6.3 阶段三:业务功能
- 迁移体质辨识模块
- 迁移 AI 对话模块
- 迁移产品模块
6.4 阶段四:优化完善
- 添加弹性模式(熔断/限流)
- 优化数据库访问
- 添加监控和日志
七、技术栈对比
| 项目 | 原架构 (Gin) | 目标架构 (go-zero) |
|---|---|---|
| Web 框架 | Gin | go-zero rest |
| ORM | GORM | sqlx / goctl model |
| 配置 | Viper | go-zero conf |
| 路由 | Gin Router | .api 文件生成 |
| 中间件 | Gin Middleware | go-zero Middleware |
| 依赖注入 | 手动 | ServiceContext |
| 代码生成 | 无 | goctl |
| 分层架构 | Handler/Service/Repository | Handler/Logic/Model |