# 保健品商城 - 总体设计方案 > 关联项目:健康AI问询助手 > 开发顺序:在健康AI问询助手项目完成后开发 > **实现状态**: 后端API已完成,前端待开发 --- ## 实现进度 ### 后端开发状态 ✅ 已完成 | 模块 | 状态 | 说明 | |------|------|------| | 会员系统 | ✅ 完成 | 会员等级(普通/银卡/金卡/钻石)、积分、折扣 | | 商品模块 | ✅ 完成 | 分类、商品列表、详情、SKU、搜索 | | 购物车 | ✅ 完成 | 增删改查、批量操作、库存检查 | | 收货地址 | ✅ 完成 | 地址管理、默认地址 | | 订单系统 | ✅ 完成 | 订单创建、支付、取消、确认收货 | | 体质推荐 | ✅ 完成 | 基于用户体质的商品推荐 | | 用户共享 | ✅ 完成 | 与健康AI共用用户表和JWT认证 | ### 前端开发状态 | 平台 | 状态 | 说明 | |------|------|------| | Web (Vue3) | ✅ 完成 | 独立 `mall/` 项目(10个页面 + 布局 + API层 + 状态管理) | | React Native | 📋 待开发 | APP端商城界面 | ### 前端项目架构 ``` healthApps/ ├── web/ → 健康AI助手前端 (端口 5173) ├── mall/ → 健康商城前端 (端口 5174) ← 独立项目 └── backend/ → 共享后端 (端口 8080) ``` - `web/` 和 `mall/` 为独立 Vue 3 项目,各自有 `package.json` - 共享同一后端 API 和 JWT Token(通过 localStorage) - 通过环境变量配置双向跳转 URL --- ## 一、项目概述 ### 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 + go-zero + GORM | 与健康AI项目保持一致(已迁移) | | 数据库 | SQLite / PostgreSQL | 支持切换,与健康AI共享用户表 | | 支付对接 | 微信支付 / 支付宝 | 预留接口 | | 对象存储 | 阿里云OSS / 本地存储 | 产品图片存储 | > **框架说明**: 后端使用 go-zero 微服务框架,保持与健康AI后端一致。 > - API定义: 使用 .api 文件定义接口 > - ORM: 继续使用 GORM 进行数据库操作 > - 认证: 使用 go-zero 内置 JWT 中间件 ### 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问诊参考 | ### 2.4 会员系统设计 (已实现) #### 会员等级体系 | 等级 | 升级条件 | 折扣 | 积分倍率 | 包邮门槛 | |------|----------|------|----------|----------| | 普通用户 | 默认 | 无 | 1.0x | ¥99 | | 银卡会员 | 累计消费≥¥500 | 98折 | 1.2x | ¥69 | | 金卡会员 | 累计消费≥¥2000 | 95折 | 1.5x | ¥49 | | 钻石会员 | 累计消费≥¥5000 | 92折 | 2.0x | 全场包邮 | #### 积分规则 - **获取**: 订单支付后按实付金额 × 等级倍率获得积分 - **使用**: 100积分 = 1元,单笔订单最多抵扣20% - **有效期**: 获得后1年过期 #### 数据模型 (已实现) ```go // User 扩展字段 type User struct { // ... 基础字段 MemberLevel string // normal/silver/gold/diamond TotalSpent float64 // 累计消费 Points int // 当前积分 MemberSince *time.Time // 首次消费时间 } // 积分变动记录 type PointsRecord struct { UserID uint Type string // earn/spend/expire/adjust Points int // 变动积分(正负) Balance int // 变动后余额 Source string // order/activity/system ReferenceID uint // 关联订单ID } ``` --- ## 三、功能模块 ### 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接收参数后处理:** 1. 识别来源为商城(source=mall) 2. 根据product_id获取产品信息 3. 自动生成用户问题:"我想了解【产品名称】是否适合我的体质" 4. AI结合用户体质数据回答 #### 3.2.4 购买记录同步 用户在商城购买保健品后,订单信息同步到健康AI,用于: - AI问诊时参考用户已购买的保健品 - 避免重复推荐已购买产品 - 分析用户保健品使用效果 --- ## 四、数据模型设计 ### 4.1 ER图 ```mermaid 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 # 取消收藏 ``` ### 5.7 go-zero API 定义示例 ```api // mallapi.api - 商城API定义文件 syntax = "v1" info( title: "保健品商城API" desc: "健康AI配套商城服务" author: "healthApps" version: "1.0" ) // ==================== 类型定义 ==================== type ( // 产品 Product { ID uint `json:"id"` Name string `json:"name"` Category string `json:"category"` MainImage string `json:"main_image"` SalePrice float64 `json:"sale_price"` OriginalPrice float64 `json:"original_price,omitempty"` SalesCount int `json:"sales_count"` Stock int `json:"stock"` } ProductListReq { Category string `form:"category,optional"` Page int `form:"page,default=1"` PageSize int `form:"page_size,default=20"` Sort string `form:"sort,optional"` // price_asc, price_desc, sales } ProductListResp { List []Product `json:"list"` Total int64 `json:"total"` } // 购物车 CartItem { ID uint `json:"id"` ProductID uint `json:"product_id"` SkuID uint `json:"sku_id,omitempty"` Name string `json:"name"` Image string `json:"image"` Price float64 `json:"price"` Quantity int `json:"quantity"` Selected bool `json:"selected"` } AddCartReq { ProductID uint `json:"product_id"` SkuID uint `json:"sku_id,omitempty"` Quantity int `json:"quantity,default=1"` } // 订单 CreateOrderReq { AddressID uint `json:"address_id"` CartIDs []uint `json:"cart_ids"` Remark string `json:"remark,optional"` } OrderResp { OrderNo string `json:"order_no"` Status string `json:"status"` TotalAmount float64 `json:"total_amount"` PayAmount float64 `json:"pay_amount"` } ) // ==================== 公开接口(无需认证)==================== @server( prefix: /api/mall ) service mallapi-api { @doc "产品列表" @handler GetProductList get /products (ProductListReq) returns (ProductListResp) @doc "产品详情" @handler GetProduct get /products/:id returns (Product) @doc "产品搜索" @handler SearchProducts get /products/search returns (ProductListResp) @doc "分类列表" @handler GetCategories get /categories returns ([]Category) } // ==================== 需要认证的接口 ==================== @server( prefix: /api/mall jwt: Auth ) service mallapi-api { @doc "获取购物车" @handler GetCart get /cart returns ([]CartItem) @doc "添加到购物车" @handler AddToCart post /cart (AddCartReq) returns (CartItem) @doc "创建订单" @handler CreateOrder post /orders (CreateOrderReq) returns (OrderResp) @doc "订单列表" @handler GetOrders get /orders returns ([]OrderResp) @doc "体质推荐产品" @handler GetRecommendProducts get /recommend returns (ProductListResp) } ``` --- ## 六、项目目录结构 ``` 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 │ ├── backend/ # 后端服务 (go-zero) │ └── mallapi/ # 商城API服务 │ ├── mallapi.go # 主入口 │ ├── mallapi.api # API定义文件 │ ├── etc/ │ │ └── mallapi-api.yaml # 配置文件 │ ├── internal/ │ │ ├── config/ │ │ │ └── config.go # 配置结构 │ │ ├── handler/ # 请求处理器 (goctl生成) │ │ │ ├── product_handler.go │ │ │ ├── cart_handler.go │ │ │ ├── order_handler.go │ │ │ ├── payment_handler.go │ │ │ ├── address_handler.go │ │ │ └── routes.go │ │ ├── logic/ # 业务逻辑 │ │ │ ├── product_logic.go │ │ │ ├── cart_logic.go │ │ │ ├── order_logic.go │ │ │ ├── payment_logic.go │ │ │ └── address_logic.go │ │ ├── model/ # GORM模型 │ │ │ ├── product.go │ │ │ ├── cart.go │ │ │ ├── order.go │ │ │ ├── payment.go │ │ │ └── address.go │ │ ├── svc/ │ │ │ └── service_context.go # 服务上下文 │ │ ├── types/ │ │ │ └── types.go # 请求/响应类型 (goctl生成) │ │ └── database/ │ │ └── database.go # 数据库初始化 │ └── pkg/ │ ├── payment/ # 支付SDK封装 │ │ ├── wechat.go │ │ └── alipay.go │ └── logistics/ # 物流查询 │ ├── 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 开发任务清单 **后端开发(go-zero):** 1. 项目初始化 - 使用 goctl 生成项目骨架:`goctl api new mallapi` - 编写 mallapi.api 定义文件 - 配置与健康AI共享的数据库和JWT密钥 2. 产品模块(详情、SKU、库存) - GORM 模型定义 - 产品列表、详情、搜索接口 3. 购物车模块 - 添加、修改、删除购物车 4. 地址管理模块 - CRUD 地址接口 5. 订单模块(创建、状态流转) - 订单创建、列表、详情 - 订单状态机实现 6. 支付模块(微信/支付宝) - 支付SDK封装 - 回调处理 7. 健康AI对接 - JWT Token 共享认证 - 体质推荐产品接口 - 购买记录同步接口 **Web前端开发:** 1. 项目初始化 2. 首页(Banner、分类、推荐、AI咨询入口) 3. 产品列表和详情页(含AI咨询入口) 4. 购物车页面(含AI咨询入口) 5. 结算和订单页面 6. 地址管理页面 7. 我的页面(体质报告入口) 8. 健康AI跳转工具封装 **APP开发:** 1. 项目初始化 2. 导航和Tab配置 3. 各功能页面 4. Deep Link跳转健康AI配置 --- ## 九、与健康AI的集成方案 ### 9.1 用户认证集成 商城与健康AI共享同一套JWT认证,使用相同的 AccessSecret: ```yaml # mallapi-api.yaml 配置(与健康AI保持一致) Auth: AccessSecret: health-ai-secret-key-change-in-production AccessExpire: 86400 ``` ```go // go-zero 内置 JWT 中间件自动验证 // 在 .api 文件中使用 jwt:Auth 标记需要认证的路由 @server( prefix: /api/mall jwt: Auth ) service mallapi-api { @handler GetCart get /cart returns (CartResp) } ``` ### 9.2 体质推荐集成 ```go // internal/logic/recommend_logic.go func (l *RecommendLogic) GetConstitutionRecommend() (*types.RecommendResp, error) { userID, _ := logic.GetUserIDFromCtx(l.ctx) // 1. 从共享数据库获取用户体质 var assessment model.ConstitutionAssessment l.svcCtx.DB.Where("user_id = ?", userID).Order("assessed_at DESC").First(&assessment) // 2. 根据体质查询推荐产品 // SELECT * FROM products p // JOIN constitution_products cp ON p.id = cp.product_id // WHERE cp.constitution_type = ? } ``` ### 9.3 AI咨询跳转集成(商城 → 健康AI) **Web端跳转工具:** ```typescript // 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):** ```typescript // 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接收跳转参数处理:** ```typescript // 健康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问诊参考: ```go // 商城后端 - 订单完成后同步 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 } ``` ```go // 健康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 合规要求 - 保健品销售资质展示 - 产品不得宣传治疗功效 - 退换货政策明示 --- ## 附录:配置文件示例 ```yaml # 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: "" ``` --- ## 附录B:后端API汇总 (已实现) ### 商城公开接口 (/api/mall) | 方法 | 路径 | 说明 | |------|------|------| | GET | /categories | 获取商品分类 | | GET | /products | 商品列表 | | GET | /products/:id | 商品详情 | | GET | /products/search | 搜索商品 | | GET | /products/featured | 推荐商品 | ### 商城认证接口 (/api/mall,需JWT) | 方法 | 路径 | 说明 | |------|------|------| | GET | /member/info | 获取会员信息 | | GET | /member/points/records | 积分变动记录 | | GET | /cart | 获取购物车 | | POST | /cart | 添加到购物车 | | PUT | /cart/:id | 更新购物车项 | | DELETE | /cart/:id | 删除购物车项 | | POST | /cart/batch-select | 批量选中 | | DELETE | /cart/clear | 清空购物车 | | GET | /addresses | 地址列表 | | POST | /addresses | 创建地址 | | PUT | /addresses/:id | 更新地址 | | DELETE | /addresses/:id | 删除地址 | | PUT | /addresses/:id/default | 设为默认 | | GET | /orders | 订单列表 | | GET | /orders/:id | 订单详情 | | POST | /orders/preview | 订单预览 | | POST | /orders | 创建订单 | | POST | /orders/:id/pay | 支付订单 | | POST | /orders/:id/cancel | 取消订单 | | POST | /orders/:id/receive | 确认收货 | | GET | /products/constitution-recommend | 体质推荐商品 | --- ### v1.4 增量更新(2026-02-11) - 购物车页补全批量操作:新增“删除已选”“清空购物车”交互和确认流程。 - 我的页补全账号操作:新增“退出登录”入口并接入本地登录页。 - 我的页补全订单状态总览:新增待支付/待发货/待收货/已完成角标统计。 - 会员信息请求失败时提供重试入口,提升弱网可恢复性。 - 修复会员积分记录分页加载:第 2 页起采用追加模式,避免“加载更多”覆盖已加载数据。 --- > **文档版本**: v1.4 > **更新日期**: 2026-02-11 > **创建日期**: 2026-02-01 > **关联项目**: 健康AI问询助手