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.
27 KiB
27 KiB
保健品商城 - 总体设计方案
关联项目:健康AI问询助手 开发顺序:在健康AI问询助手项目完成后开发
一、项目概述
1.1 项目背景
本项目是"健康AI问询助手"的关联项目,为用户提供保健品购买服务。通过AI问诊系统的体质分析和健康建议,智能推荐适合用户的保健品,实现"健康咨询 → 产品推荐 → 购买转化"的完整闭环。
1.2 核心价值
- 精准推荐:基于用户体质和健康状况,提供个性化产品推荐
- 信任背书:AI健康助手的专业分析增强用户购买信心
- 便捷体验:从健康咨询到产品购买的无缝衔接
- 用户粘性:健康管理与产品消费的双向绑定
1.3 目标用户
| 用户群体 | 特点 | 需求 |
|---|---|---|
| 中老年人 | 50-70岁,注重养生 | 心脑血管、骨关节、助眠、血糖调节 |
| 亚健康白领 | 25-45岁,工作压力大 | 补气、抗疲劳、护眼、免疫力 |
| 养生爱好者 | 各年龄段,关注中医体质 | 体质调养、食疗产品 |
二、技术架构
2.1 技术栈
| 层次 | 技术选型 | 说明 |
|---|---|---|
| Web前端 | Vue 3 + TypeScript + Vite | 与健康AI项目保持一致 |
| APP端 | React Native + TypeScript | 与健康AI项目保持一致 |
| 后端服务 | Go + Gin + GORM | 与健康AI项目保持一致 |
| 数据库 | SQLite / PostgreSQL | 支持切换,与健康AI共享用户表 |
| 支付对接 | 微信支付 / 支付宝 | 预留接口 |
| 对象存储 | 阿里云OSS / 本地存储 | 产品图片存储 |
2.2 系统架构图
┌─────────────────────────────────────────────────────────────────┐
│ 用户端 │
├─────────────────────┬───────────────────────────────────────────┤
│ 健康AI Web/APP │ 商城 Web/APP │
│ (体质分析/AI问诊) │ (产品浏览/购物车/订单/支付) │
└─────────┬───────────┴────────────────┬──────────────────────────┘
│ │
│ API Gateway │
│ │
┌─────────▼────────────────────────────▼──────────────────────────┐
│ 后端服务层 │
├─────────────────────┬───────────────────────────────────────────┤
│ 健康AI服务 │ 商城服务 │
│ - 用户认证 │ - 产品管理 │
│ - 体质辨识 │ - 购物车 │
│ - AI对话 │ - 订单管理 │
│ - 健康档案 │ - 支付对接 │
│ - 产品推荐接口 │ - 物流查询 │
└─────────┬───────────┴────────────────┬──────────────────────────┘
│ │
┌─────────▼────────────────────────────▼──────────────────────────┐
│ 数据层 │
├─────────────────────┬───────────────────────────────────────────┤
│ 共享数据 │ 商城独立数据 │
│ - 用户表 │ - 产品详情表 │
│ - 产品基础表 │ - SKU表 │
│ - 体质-产品关联 │ - 购物车表 │
│ │ - 订单表 │
│ │ - 支付记录表 │
└─────────────────────┴───────────────────────────────────────────┘
2.3 与健康AI项目的双向对接
| 对接方式 | 方向 | 说明 |
|---|---|---|
| 用户体系共享 | 双向 | 使用同一套用户认证(JWT Token互认) |
| 产品数据同步 | 双向 | 健康AI存储基础产品信息,商城扩展详细信息 |
| 产品推荐跳转 | 健康AI → 商城 | AI推荐的产品链接直接跳转到商城产品页 |
| AI咨询跳转 | 商城 → 健康AI | 商城产品页/首页提供AI咨询入口,跳转到健康AI |
| 体质信息获取 | 商城 ← 健康AI | 商城调用健康AI接口获取用户体质,优化推荐排序 |
| 购买记录同步 | 商城 → 健康AI | 用户购买保健品后,同步到健康AI用于AI问诊参考 |
三、功能模块
3.1 功能架构
保健品商城
├── 首页模块
│ ├── Banner轮播
│ ├── AI健康咨询入口(悬浮按钮)
│ ├── 体质推荐卡片(对接健康AI)
│ ├── 分类导航
│ ├── 热销推荐
│ └── 新品上架
│
├── 产品模块
│ ├── 产品列表(分类筛选、排序)
│ ├── 产品详情
│ │ ├── 图文规格评价
│ │ ├── "咨询适合我吗"按钮 → 跳转AI问诊
│ │ └── 相关体质说明
│ ├── 产品搜索
│ └── 收藏功能
│
├── AI咨询模块(跳转健康AI)
│ ├── 智能健康咨询入口
│ ├── 体质测试入口
│ ├── 历史咨询记录
│ └── 携带产品信息跳转
│
├── 购物车模块
│ ├── 添加/删除商品
│ ├── 修改数量
│ ├── 选择结算
│ └── 失效商品处理
│
├── 订单模块
│ ├── 确认订单
│ ├── 地址管理
│ ├── 订单列表
│ ├── 订单详情
│ ├── 取消订单
│ └── 申请退款
│
├── 支付模块
│ ├── 微信支付
│ ├── 支付宝支付
│ └── 支付结果回调
│
├── 用户模块
│ ├── 登录/注册(共享健康AI)
│ ├── 我的体质报告(跳转健康AI)
│ ├── 收货地址管理
│ ├── 我的订单
│ ├── 我的收藏
│ └── 浏览历史
│
└── 其他模块
├── 物流查询
└── 优惠券(扩展)
3.2 核心功能说明
3.2.1 体质推荐功能
从健康AI获取用户体质信息,在商城首页和产品列表页优先展示适合用户体质的产品。
用户打开商城
│
▼
调用健康AI接口获取用户体质
│
▼
根据体质查询关联产品
│
▼
在"为您推荐"模块展示
3.2.2 智能搜索
支持按症状关键词搜索产品,如"失眠"、"关节痛"、"血压高"等。
3.2.3 AI健康咨询功能(核心)
商城内置多个AI咨询入口,用户点击后跳转到健康AI项目进行咨询。
入口位置:
| 位置 | 入口形式 | 跳转目标 | 携带参数 |
|---|---|---|---|
| 首页右下角 | 悬浮按钮"AI咨询" | 健康AI对话页 | 无 |
| 首页体质卡片 | "测测我的体质" | 健康AI体质测试页 | 无 |
| 产品详情页 | "这款适合我吗?" | 健康AI对话页 | 产品ID、产品名称 |
| 我的页面 | "查看体质报告" | 健康AI体质结果页 | 无 |
| 购物车页面 | "不知道选哪个?问问AI" | 健康AI对话页 | 购物车产品列表 |
跳转流程:
商城产品详情页
│
│ 用户点击"这款适合我吗?"
▼
检查用户登录状态
│
├─[未登录]─▶ 跳转登录页 → 登录后继续
│
└─[已登录]─▶ 构建跳转URL
│
▼
跳转健康AI对话页
URL: health-ai://chat?product_id=123&product_name=xxx
│
▼
健康AI自动发起对话
"我想咨询一下【产品名称】是否适合我"
│
▼
AI根据用户体质和产品信息回答
│
▼
用户可继续咨询或返回商城购买
跳转协议设计:
# Web端跳转(同域或配置跨域)
https://health-ai.example.com/chat?source=mall&product_id=123
# APP端跳转(Deep Link)
health-ai://chat?source=mall&product_id=123&product_name=xxx
# 小程序跳转(如扩展)
/pages/chat/index?source=mall&product_id=123
健康AI接收参数后处理:
- 识别来源为商城(source=mall)
- 根据product_id获取产品信息
- 自动生成用户问题:"我想了解【产品名称】是否适合我的体质"
- AI结合用户体质数据回答
3.2.4 购买记录同步
用户在商城购买保健品后,订单信息同步到健康AI,用于:
- AI问诊时参考用户已购买的保健品
- 避免重复推荐已购买产品
- 分析用户保健品使用效果
四、数据模型设计
4.1 ER图
erDiagram
User ||--o{ Order : places
User ||--o{ CartItem : has
User ||--o{ Address : has
User ||--o{ Favorite : has
Product ||--o{ ProductSku : has
Product ||--o{ CartItem : in
Product ||--o{ OrderItem : in
Product ||--o{ Favorite : contains
Order ||--|{ OrderItem : contains
Order ||--o| Payment : has
ProductSku ||--o{ CartItem : selected
ProductSku ||--o{ OrderItem : ordered
User {
int id PK
string phone
string nickname
string avatar
}
Product {
int id PK
string name
string category
string sub_category
text description
text detail_html
string main_image
json images
decimal original_price
decimal sale_price
int sales_count
int stock
boolean is_on_sale
int sort_order
}
ProductSku {
int id PK
int product_id FK
string sku_name
string sku_image
decimal price
int stock
json attributes
}
CartItem {
int id PK
int user_id FK
int product_id FK
int sku_id FK
int quantity
boolean selected
}
Address {
int id PK
int user_id FK
string receiver_name
string phone
string province
string city
string district
string detail
boolean is_default
}
Order {
int id PK
string order_no
int user_id FK
int address_id FK
decimal total_amount
decimal pay_amount
decimal freight_amount
string status
string pay_type
datetime pay_time
string logistics_no
text remark
datetime created_at
}
OrderItem {
int id PK
int order_id FK
int product_id FK
int sku_id FK
string product_name
string sku_name
string image
decimal price
int quantity
}
Payment {
int id PK
string payment_no
int order_id FK
string pay_type
decimal amount
string status
string trade_no
datetime paid_at
}
Favorite {
int id PK
int user_id FK
int product_id FK
datetime created_at
}
4.2 核心表说明
产品表(Product)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 产品ID(与健康AI同步) |
| name | string | 产品名称 |
| category | string | 一级分类 |
| sub_category | string | 二级分类 |
| description | text | 简短描述 |
| detail_html | text | 详情页富文本 |
| main_image | string | 主图URL |
| images | json | 图片列表 |
| original_price | decimal | 原价 |
| sale_price | decimal | 售价 |
| sales_count | int | 销量 |
| stock | int | 库存 |
| is_on_sale | boolean | 是否上架 |
订单表(Order)
| 字段 | 类型 | 说明 |
|---|---|---|
| order_no | string | 订单编号(唯一) |
| status | string | 状态:pending/paid/shipped/completed/cancelled/refunding |
| pay_type | string | 支付方式:wechat/alipay |
| logistics_no | string | 物流单号 |
4.3 订单状态机
待支付(pending)
│
├──[支付成功]──▶ 待发货(paid)
│ │
│ ├──[商家发货]──▶ 待收货(shipped)
│ │ │
│ │ └──[确认收货]──▶ 已完成(completed)
│ │
│ └──[申请退款]──▶ 退款中(refunding)
│
└──[取消/超时]──▶ 已取消(cancelled)
五、API 接口设计
5.1 产品接口
GET /api/products # 产品列表(支持分类、排序、分页)
GET /api/products/:id # 产品详情
GET /api/products/search?q=xxx # 搜索产品
GET /api/products/recommend # 体质推荐(调用健康AI)
GET /api/categories # 分类列表
5.2 购物车接口
GET /api/cart # 获取购物车
POST /api/cart # 添加到购物车
PUT /api/cart/:id # 更新数量
DELETE /api/cart/:id # 删除商品
PUT /api/cart/select-all # 全选/取消全选
5.3 订单接口
POST /api/orders # 创建订单
GET /api/orders # 订单列表
GET /api/orders/:id # 订单详情
PUT /api/orders/:id/cancel # 取消订单
PUT /api/orders/:id/confirm # 确认收货
POST /api/orders/:id/refund # 申请退款
5.4 支付接口
POST /api/pay/wechat # 微信支付
POST /api/pay/alipay # 支付宝支付
POST /api/pay/callback/wechat # 微信回调
POST /api/pay/callback/alipay # 支付宝回调
GET /api/pay/status/:order_no # 查询支付状态
5.5 地址接口
GET /api/addresses # 地址列表
POST /api/addresses # 添加地址
PUT /api/addresses/:id # 修改地址
DELETE /api/addresses/:id # 删除地址
PUT /api/addresses/:id/default # 设为默认
5.6 收藏接口
GET /api/favorites # 收藏列表
POST /api/favorites # 添加收藏
DELETE /api/favorites/:product_id # 取消收藏
六、项目目录结构
healthMall/
├── web/ # Web前端
│ ├── src/
│ │ ├── api/ # 接口定义
│ │ ├── assets/ # 静态资源
│ │ ├── components/ # 公共组件
│ │ │ ├── ProductCard.vue # 产品卡片
│ │ │ ├── CartItem.vue # 购物车项
│ │ │ └── AddressCard.vue # 地址卡片
│ │ ├── views/
│ │ │ ├── Home.vue # 首页
│ │ │ ├── Category.vue # 分类页
│ │ │ ├── ProductList.vue # 产品列表
│ │ │ ├── ProductDetail.vue # 产品详情
│ │ │ ├── Cart.vue # 购物车
│ │ │ ├── Checkout.vue # 结算页
│ │ │ ├── OrderList.vue # 订单列表
│ │ │ ├── OrderDetail.vue # 订单详情
│ │ │ └── Address.vue # 地址管理
│ │ ├── store/ # 状态管理
│ │ ├── router/ # 路由配置
│ │ └── utils/ # 工具函数
│ └── package.json
│
├── app/ # React Native APP
│ ├── src/
│ │ ├── api/
│ │ ├── components/
│ │ ├── screens/
│ │ ├── navigation/
│ │ ├── store/
│ │ └── utils/
│ └── package.json
│
├── server/ # 后端服务
│ ├── cmd/
│ │ └── main.go
│ ├── internal/
│ │ ├── api/
│ │ │ ├── handler/
│ │ │ │ ├── product.go
│ │ │ │ ├── cart.go
│ │ │ │ ├── order.go
│ │ │ │ ├── payment.go
│ │ │ │ └── address.go
│ │ │ ├── middleware/
│ │ │ └── router.go
│ │ ├── model/
│ │ │ ├── product.go
│ │ │ ├── cart.go
│ │ │ ├── order.go
│ │ │ ├── payment.go
│ │ │ └── address.go
│ │ ├── repository/
│ │ ├── service/
│ │ │ ├── product.go
│ │ │ ├── cart.go
│ │ │ ├── order.go
│ │ │ └── payment.go
│ │ ├── database/
│ │ └── config/
│ ├── pkg/
│ │ ├── payment/ # 支付SDK封装
│ │ │ ├── wechat.go
│ │ │ └── alipay.go
│ │ └── logistics/ # 物流查询
│ └── go.mod
│
├── config.yaml # 配置文件
└── README.md
七、UI 设计规范
7.1 设计原则
- 与健康AI项目保持视觉一致性
- 面向中老年用户,字体和按钮适当放大
- 购买流程清晰简洁,减少操作步骤
7.2 页面规划
| 页面 | 主要功能 | AI咨询入口 |
|---|---|---|
| 首页 | Banner、分类入口、体质推荐卡片、热销榜 | 右下角悬浮按钮、体质卡片"测测体质" |
| 分类页 | 左侧分类菜单、右侧产品列表 | 顶部"不知道选什么?问AI" |
| 产品详情 | 轮播图、价格、规格选择、加入购物车 | "这款适合我吗?咨询AI" |
| 购物车 | 商品列表、全选、价格汇总、去结算 | "不确定?咨询AI帮你选" |
| 结算页 | 收货地址、商品清单、支付方式、提交订单 | - |
| 订单列表 | Tab分类(全部/待付款/待发货/待收货/已完成) | - |
| 订单详情 | 物流信息、订单状态、商品信息、操作按钮 | "使用问题?咨询AI" |
| 我的 | 体质报告入口、订单、收藏、地址 | "查看我的体质报告" |
7.3 配色方案
| 用途 | 颜色 | 说明 |
|---|---|---|
| 主色调 | #52C41A | 绿色,与健康主题一致 |
| 价格色 | #FF4D4F | 红色,突出价格 |
| 辅助色 | #1890FF | 蓝色,链接和按钮 |
| 背景色 | #F5F5F5 | 浅灰,页面背景 |
| 文字色 | #333333 | 深灰,主要文字 |
八、开发计划
8.1 阶段划分
| 阶段 | 内容 | 预计周期 |
|---|---|---|
| 第一阶段 | 产品展示、购物车 | - |
| 第二阶段 | 订单流程、地址管理 | - |
| 第三阶段 | 支付对接 | - |
| 第四阶段 | APP开发 | - |
| 第五阶段 | 物流、优惠券等扩展 | - |
8.2 开发任务清单
后端开发:
- 项目初始化(共用健康AI的基础架构)
- 产品模块(详情、SKU、库存)
- 购物车模块
- 地址管理模块
- 订单模块(创建、状态流转)
- 支付模块(微信/支付宝)
- 健康AI对接(用户认证、体质推荐、订单同步)
Web前端开发:
- 项目初始化
- 首页(Banner、分类、推荐、AI咨询入口)
- 产品列表和详情页(含AI咨询入口)
- 购物车页面(含AI咨询入口)
- 结算和订单页面
- 地址管理页面
- 我的页面(体质报告入口)
- 健康AI跳转工具封装
APP开发:
- 项目初始化
- 导航和Tab配置
- 各功能页面
- Deep Link跳转健康AI配置
九、与健康AI的集成方案
9.1 用户认证集成
// 商城服务验证Token时,调用健康AI的JWT验证
func ValidateToken(token string) (*UserClaims, error) {
// 使用相同的JWT密钥验证
// 或调用健康AI的 /api/auth/validate 接口
}
9.2 体质推荐集成
// 商城首页获取用户体质推荐产品
func GetConstitutionRecommend(userID uint) ([]Product, error) {
// 1. 调用健康AI接口获取用户体质
// GET http://health-ai-server/api/constitution/result
// 2. 根据体质查询推荐产品
// SELECT * FROM products p
// JOIN constitution_products cp ON p.id = cp.product_id
// WHERE cp.constitution_type = ?
}
9.3 AI咨询跳转集成(商城 → 健康AI)
Web端跳转工具:
// utils/healthAI.ts
const HEALTH_AI_BASE_URL = import.meta.env.VITE_HEALTH_AI_URL || 'http://localhost:5173'
interface JumpParams {
page: 'chat' | 'constitution' | 'result' // 对话页/体质测试/体质结果
productId?: number
productName?: string
source?: string
}
// 跳转到健康AI
export function jumpToHealthAI(params: JumpParams) {
const query = new URLSearchParams()
query.set('source', 'mall')
if (params.productId) {
query.set('product_id', String(params.productId))
}
if (params.productName) {
query.set('product_name', params.productName)
}
const url = `${HEALTH_AI_BASE_URL}/${params.page}?${query.toString()}`
// 同域:直接跳转
// 跨域:新窗口打开
window.location.href = url
}
// 在产品详情页使用
// jumpToHealthAI({ page: 'chat', productId: 123, productName: '氨糖软骨素' })
APP端跳转(React Native):
// utils/healthAI.ts
import { Linking, Platform } from 'react-native'
const HEALTH_AI_SCHEME = 'healthai://'
const HEALTH_AI_WEB_URL = 'https://health-ai.example.com'
export async function jumpToHealthAI(params: {
page: 'chat' | 'constitution' | 'result'
productId?: number
productName?: string
}) {
const query = `source=mall&product_id=${params.productId || ''}&product_name=${encodeURIComponent(params.productName || '')}`
// 尝试Deep Link
const deepLink = `${HEALTH_AI_SCHEME}${params.page}?${query}`
const canOpen = await Linking.canOpenURL(deepLink)
if (canOpen) {
// 健康AI APP已安装,使用Deep Link
await Linking.openURL(deepLink)
} else {
// 健康AI APP未安装,跳转Web版
await Linking.openURL(`${HEALTH_AI_WEB_URL}/${params.page}?${query}`)
}
}
健康AI接收跳转参数处理:
// 健康AI项目 - chat页面
// views/Chat.vue 或 screens/Chat.tsx
import { useRoute } from 'vue-router' // Vue
// import { useRoute } from '@react-navigation/native' // RN
const route = useRoute()
onMounted(() => {
const { source, product_id, product_name } = route.query
if (source === 'mall' && product_id) {
// 从商城跳转而来,自动发起产品咨询
const autoMessage = `我想了解【${product_name}】这款产品是否适合我的体质?`
sendMessage(autoMessage)
}
})
9.4 双向跳转入口汇总
| 方向 | 场景 | 入口 | 跳转目标 |
|---|---|---|---|
| 商城→健康AI | 首页悬浮按钮 | "AI咨询" | 健康AI对话页 |
| 商城→健康AI | 首页体质卡片 | "测测我的体质" | 健康AI体质测试页 |
| 商城→健康AI | 产品详情页 | "这款适合我吗?" | 健康AI对话页(带产品参数) |
| 商城→健康AI | 购物车页 | "不确定选哪个?" | 健康AI对话页 |
| 商城→健康AI | 我的页面 | "查看体质报告" | 健康AI体质结果页 |
| 健康AI→商城 | AI回答推荐 | 产品链接 | 商城产品详情页 |
| 健康AI→商城 | 体质结果页 | "选购调养产品" | 商城体质推荐列表 |
9.5 订单数据同步
用户在商城购买后,同步订单到健康AI用于AI问诊参考:
// 商城后端 - 订单完成后同步
func SyncOrderToHealthAI(order *Order) error {
payload := map[string]interface{}{
"user_id": order.UserID,
"order_no": order.OrderNo,
"products": extractProductInfo(order.Items),
"created_at": order.CreatedAt,
}
// 调用健康AI接口同步
_, err := http.Post(
config.HealthAI.BaseURL + "/api/sync/purchase",
"application/json",
bytes.NewBuffer(jsonEncode(payload)),
)
return err
}
// 健康AI后端 - 接收购买记录
// POST /api/sync/purchase
func HandlePurchaseSync(c *gin.Context) {
var req struct {
UserID uint `json:"user_id"`
OrderNo string `json:"order_no"`
Products []struct {
ID uint `json:"id"`
Name string `json:"name"`
} `json:"products"`
}
c.BindJSON(&req)
// 存储到用户健康档案,AI问诊时可参考
// "用户最近购买了:氨糖软骨素、深海鱼油..."
}
十、安全与合规
10.1 支付安全
- 支付回调验签
- 订单金额校验
- 防止重复支付
10.2 数据安全
- 用户隐私数据加密存储
- HTTPS传输
- SQL注入防护
10.3 合规要求
- 保健品销售资质展示
- 产品不得宣传治疗功效
- 退换货政策明示
附录:配置文件示例
# config.yaml
server:
port: 8081
mode: debug
database:
driver: sqlite
dsn: "./data/mall.db"
# 健康AI服务配置
health_ai:
# 后端API地址(用于数据同步)
api_url: "http://localhost:8080"
# Web前端地址(用于页面跳转)
web_url: "http://localhost:5173"
# APP Deep Link Scheme
app_scheme: "healthai://"
# 同步API密钥
sync_api_key: "your-sync-key"
# 支付配置(正式环境从环境变量读取)
payment:
wechat:
app_id: ""
mch_id: ""
api_key: ""
notify_url: "https://yourdomain.com/api/pay/callback/wechat"
alipay:
app_id: ""
private_key: ""
public_key: ""
notify_url: "https://yourdomain.com/api/pay/callback/alipay"
# 文件存储
storage:
type: local # local / oss
local:
path: "./uploads"
oss:
endpoint: ""
access_key: ""
secret_key: ""
bucket: ""
文档版本: v1.0 创建日期: 2026-02-01 关联项目: 健康AI问询助手