半享项目总文档
半享项目总文档
说明:本文件为历史文档合并版,便于统一查阅。
来源:CODE-MAP.md
CODE MAP(Flutter 项目)
版本:v1.1.0+2 | 更新:2026-02-17
1) 目录树(文件级,聚焦 lib/)
banxiang_app/
├── lib/
│ ├── main.dart
│ ├── theme.dart
│ ├── models/
│ │ ├── activity.dart
│ │ ├── hospital.dart
│ │ ├── message.dart
│ │ └── user.dart
│ ├── screens/
│ │ ├── activity_detail_screen.dart
│ │ ├── activity_list_screen.dart
│ │ ├── ai_chat_screen.dart
│ │ ├── booking_screen.dart
│ │ ├── create_activity_screen.dart
│ │ ├── department_screen.dart
│ │ ├── doctor_list_screen.dart
│ │ ├── home_screen.dart
│ │ ├── hospital_list_screen.dart
│ │ ├── login_screen.dart
│ │ ├── main_screen.dart
│ │ ├── medical_screen.dart
│ │ ├── messages_screen.dart
│ │ ├── order_list_screen.dart
│ │ ├── payment_screen.dart
│ │ ├── profile_screen.dart
│ │ ├── profile_setup_screen.dart
│ │ ├── publish_screen.dart
│ │ └── services_screen.dart
│ ├── services/
│ │ ├── activity_service.dart
│ │ ├── ai_service.dart
│ │ ├── auth_service.dart
│ │ └── medical_service.dart
│ └── utils/
│ └── constants.dart2) 文件说明
| 文件 | 说明 |
|---|---|
| main.dart | 应用入口,读取本地token后决定进入登录页或活动广场页 |
| theme.dart | 定义全局浅色主题 AppTheme.lightTheme |
| models/activity.dart | 活动实体模型,承载标题、分类、时间、地点、人数等基础字段 |
| models/hospital.dart | 医疗相关实体,含 Hospital、Doctor、Appointment 三类模型 |
| models/message.dart | 聊天消息模型,含文本、发送方与时间 |
| models/user.dart | 用户资料模型,含手机号、昵称、性别、兴趣等 |
| screens/activity_list_screen.dart | 活动广场页,瀑布流展示活动卡片+底部导航+发布入口 |
| screens/activity_detail_screen.dart | 活动详情页,含图片轮播、评论区、点赞与报名底栏 |
| screens/login_screen.dart | 手机验证码模拟登录页,登录后按新老用户分流 |
| screens/profile_setup_screen.dart | 新用户三步资料完善流程 |
| screens/profile_screen.dart | 个人资料编辑页 |
| screens/publish_screen.dart | 发布页,支持图片/视频上传 |
| screens/ai_chat_screen.dart | AI聊天页,支持快捷提问和消息渲染 |
| screens/services_screen.dart | 生活服务总入口页 |
| screens/medical_screen.dart | 医疗健康服务聚合页 |
| screens/messages_screen.dart | 消息通知页(空壳) |
| screens/main_screen.dart | 底部Tab主容器(旧版,已不作入口) |
| services/auth_service.dart | 认证与用户资料服务,管理登录态与资料更新 |
| services/activity_service.dart | 活动 mock 数据服务 |
| services/ai_service.dart | AI回复 mock 服务,基于关键词规则 |
| services/medical_service.dart | 医疗 mock 数据服务 |
| utils/constants.dart | 应用常量(应用名、活动分类、兴趣标签等) |
3) 核心方法索引
| 文件 | 方法 | 说明 |
|---|---|---|
| main.dart | main | 读取token决定首屏 |
| login_screen.dart | _login | 校验验证码+写token+登录分流 |
| profile_setup_screen.dart | _finishSetup | 提交资料跳转活动页 |
| activity_list_screen.dart | _buildBody | 构建瀑布流活动列表 |
| activity_list_screen.dart | _buildFloatingActionButton | 构建中心悬浮发布按钮 |
| activity_detail_screen.dart | _toggleLike | 切换点赞状态 |
| activity_detail_screen.dart | _postComment | 发布评论 |
| publish_screen.dart | _publish | 校验并发布 |
| publish_screen.dart | _pickImages | 多选图片(最多9张) |
| auth_service.dart | checkLoginStatus | 读取token恢复登录态 |
| auth_service.dart | updateProfile | 更新用户资料 |
| activity_service.dart | getActivities | 按分类筛选活动 |
| ai_service.dart | mockChat | 基于关键词返回AI回复 |
4) 数据模型汇总
| 模型 | 主要字段 | 用途 |
|---|---|---|
| Activity | id, title, category, time, location, maxParticipants, currentParticipants | 社区活动核心实体 |
| User | id, phone, nickname, avatar, birthYear, gender, city, interests | 用户画像 |
| Hospital | id, name, address, departments | 医院实体 |
| Doctor | id, name, department, title, fee | 医生实体 |
| Appointment | id, hospitalName, doctorName, time, status, fee | 预约订单 |
| Message | text, isUser, time | AI聊天消息 |
来源:PRD-V1.0-MVP核心功能.md
slug: prd-v1-0-mvp
「伴享」PRD V1.0 — MVP核心功能
版本: V1.0 MVP
目标: 6周内上线,500人内测,验证"社交活动+AI管家+医疗服务"三大核心能力
发布时间: 2026年4月初
文档更新: 2026-02-16
目录
1. 版本概述
1.1 核心目标
| 维度 | 目标 | 衡量指标 |
|---|---|---|
| 产品验证 | 验证"社交+AI+服务"模式是否成立 | 用户留存率>40%(7日) |
| 用户获取 | 500名种子用户完成内测 | 注册用户≥500 |
| 活动验证 | 线下活动机制跑通 | 累计创建活动≥50个 |
| AI验证 | AI管家基础能力可用 | 语音识别准确率>90% |
| 服务验证 | 医疗服务闭环可用 | 挂号成功率>95% |
1.2 功能范围
| 模块 | 包含 | 不包含(后续版本) |
|---|---|---|
| 用户系统 | 注册/登录/实名/资料/子女关联 | 会员体系、积分 |
| 社交活动 | 发现/创建/报名/签到/评价 | 社区队长、活动保险 |
| AI管家 | 语音对话/3个快捷指令 | 完整Agent能力、方言识别 |
| 医疗服务 | 挂号/在线问诊/订单管理 | 体检预约、慢病管理 |
| 支付 | 微信支付/订单管理/退款 | 支付宝、会员订阅 |
| 通知 | 活动提醒/订单通知/系统消息 | 营销推送、个性化推荐 |
1.3 用户故事地图
用户角色:银发用户(55-70岁,退休,会用微信)
Day 1: 注册
→ 子女帮下载APP → 手机号注册 → 填写兴趣标签 → 绑定子女账号
Day 3: 首次参与活动
→ 首页浏览推荐活动 → 查看太极晨练详情 → 一键报名
→ 当天签到 → 认识新朋友 → 给活动好评
Day 7: 使用AI管家
→ 点击AI管家 → 语音说"帮我挂个华西医院的号"
→ AI引导选科室选医生 → 微信支付 → 收到预约确认
Day 14: 成为活跃用户
→ 每周参加2次活动 → 日常用AI管家查天气、提醒吃药
→ 推荐朋友加入2. 用户系统
2.1 注册登录
需求描述
银发用户通过手机号+短信验证码注册/登录,整个流程不超过3分钟,70岁用户可独立完成或在子女协助下完成。
用户故事
- US-2.1.1: 作为银发用户,我希望用手机号快速注册,不需要记密码
- US-2.1.2: 作为银发用户,我希望验证码发送后有足够时间输入(120秒)
- US-2.1.3: 作为子女,我希望能帮父母完成注册流程
交互流程
启动APP
↓
欢迎页(3张引导图,可跳过)
↓
登录页面
├── 输入手机号(11位,自动校验格式)
├── 点击「获取验证码」→ 倒计时120秒
├── 输入6位验证码(大输入框,自动聚焦下一位)
└── 点击「登录/注册」
↓
新用户 → 完善资料页(分3步)
├── Step 1: 昵称 + 头像(可跳过,默认随机头像)
├── Step 2: 出生年月 + 性别 + 城市
└── Step 3: 兴趣标签选择(最少1个,最多5个)
↓
首页(附新手引导浮层)UI要求
- 手机号输入框:高度56dp,字号20sp,数字键盘
- 验证码输入:6个独立方框,每框48x48dp,字号24sp
- 按钮:宽度100%,高度52dp,圆角12dp,主色调
- 引导图:大图+简短文字(每张≤10字),可左右滑动
数据结构
-- 用户表
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
phone VARCHAR(11) UNIQUE NOT NULL,
nickname VARCHAR(50),
avatar_url TEXT,
birth_year INTEGER,
birth_month INTEGER,
gender VARCHAR(10) CHECK (gender IN ('male', 'female', 'other')),
city VARCHAR(50) DEFAULT '成都',
district VARCHAR(50),
interests TEXT[] DEFAULT '{}',
real_name VARCHAR(50),
id_card_hash VARCHAR(64), -- SHA256哈希,不存明文
id_card_encrypted TEXT, -- AES-256加密存储
verified BOOLEAN DEFAULT FALSE,
emergency_contact_name VARCHAR(50),
emergency_contact_phone VARCHAR(11),
avatar_updated_at TIMESTAMP,
last_login_at TIMESTAMP,
login_count INTEGER DEFAULT 0,
status VARCHAR(20) DEFAULT 'active' CHECK (status IN ('active', 'disabled', 'deleted')),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 索引
CREATE INDEX idx_users_phone ON users(phone);
CREATE INDEX idx_users_city ON users(city);
CREATE INDEX idx_users_interests ON users USING GIN(interests);
-- 短信验证码表
CREATE TABLE sms_codes (
id BIGSERIAL PRIMARY KEY,
phone VARCHAR(11) NOT NULL,
code VARCHAR(6) NOT NULL,
purpose VARCHAR(20) DEFAULT 'login', -- login / bindChild
used BOOLEAN DEFAULT FALSE,
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_sms_phone_purpose ON sms_codes(phone, purpose, used);API接口
POST /api/v1/auth/send-code
// Request
{
"phone": "13800138000",
"purpose": "login"
}
// Response 200
{
"success": true,
"expiresIn": 120
}
// Error 429 (频率限制)
{
"error": "TOO_MANY_REQUESTS",
"message": "请60秒后重试",
"retryAfter": 60
}POST /api/v1/auth/login
// Request
{
"phone": "13800138000",
"code": "123456"
}
// Response 200
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": 1,
"phone": "138****8000",
"nickname": null,
"isNewUser": true,
"profileComplete": false
}
}PUT /api/v1/users/profile
// Request (分步更新)
{
"nickname": "张阿姨",
"birth_year": 1960,
"birth_month": 3,
"gender": "female",
"city": "成都",
"district": "武侯区",
"interests": ["太极", "书法", "摄影"]
}
// Response 200
{
"success": true,
"user": { ... }
}验收标准
- 注册流程端到端 < 3分钟
- 验证码120秒有效期,60秒限频
- 同一手机号5分钟内最多发3次验证码
- 新用户首次进入显示资料完善引导
- 资料可分步填写,不强制一次完成
- 70岁用户测试通过率 > 80%
2.2 实名认证
需求描述
调用第三方API进行身份证二要素认证(姓名+身份证号),认证后可发起活动和使用部分服务。
用户故事
- US-2.2.1: 作为用户,我希望实名认证简单快速
- US-2.2.2: 作为用户,我希望知道为什么需要实名认证
交互流程
我的页面 → 实名认证入口(显示认证状态)
↓
认证说明页(为什么需要认证:安全保障、活动参与)
↓
输入:真实姓名 + 身份证号码
↓
确认信息弹窗(二次确认)
↓
调用第三方API验证
├── 成功 → 显示"认证成功✓",更新状态
└── 失败 → 提示"信息不匹配,请检查",可重试API接口
POST /api/v1/users/verify
// Request
{
"realName": "张秀兰",
"idCard": "510107196003150024"
}
// Response 200
{
"success": true,
"verified": true
}
// Error 400
{
"error": "VERIFICATION_FAILED",
"message": "姓名与身份证号不匹配,请检查后重试"
}验收标准
- 认证接口响应 < 3秒
- 身份证号AES-256加密存储
- 认证失败可重试,每天最多5次
- 认证成功后不可修改
2.3 紧急联系人
需求描述
用户设置紧急联系人(姓名+手机号),用于活动签到异常时通知。
API接口
PUT /api/v1/users/emergency-contact
{
"name": "张明(儿子)",
"phone": "13900139000"
}验收标准
- 紧急联系人为活动报名必填项
- 支持修改,修改前需短信验证
2.4 子女账号关联
需求描述
用户生成6位邀请码,子女通过微信小程序扫码绑定,绑定后子女可查看用户的活动和健康状态(V1.2启用健康数据)。
交互流程
父母端:
我的 → 家人关联 → 生成邀请码(6位字母数字,24小时有效)
→ 展示邀请码 + 二维码 → 微信分享给子女
子女端(V1.0仅做关联,小程序V1.2上线):
扫码/输入邀请码 → 确认绑定 → 关联成功数据结构
-- 家庭关联表
CREATE TABLE family_links (
id BIGSERIAL PRIMARY KEY,
parent_user_id BIGINT REFERENCES users(id),
child_user_id BIGINT REFERENCES users(id),
invite_code VARCHAR(6),
status VARCHAR(20) DEFAULT 'active',
linked_at TIMESTAMP DEFAULT NOW(),
UNIQUE(parent_user_id, child_user_id)
);
-- 邀请码表
CREATE TABLE invite_codes (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
code VARCHAR(6) UNIQUE NOT NULL,
used BOOLEAN DEFAULT FALSE,
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);API接口
POST /api/v1/family/generate-code
// Response
{
"code": "A3B7K9",
"expiresAt": "2026-04-02T10:00:00Z",
"qrCodeUrl": "https://api.banxiang.com/qr/A3B7K9"
}POST /api/v1/family/link
// Request
{
"inviteCode": "A3B7K9"
}
// Response
{
"success": true,
"parentUser": {
"id": 1,
"nickname": "张阿姨",
"avatar": "..."
}
}验收标准
- 邀请码24小时有效,使用后失效
- 一个父母最多关联5个子女
- 关联后双方可解除
3. 社交活动模块
3.1 活动发现(首页)
需求描述
首页以Feed流形式展示附近活动,基于用户兴趣和地理位置智能推荐,用户可筛选分类和时间。
用户故事
- US-3.1.1: 作为用户,我打开APP就能看到附近感兴趣的活动
- US-3.1.2: 作为用户,我希望能按时间和类型筛选活动
- US-3.1.3: 作为用户,我希望看到活动还剩多少名额
交互流程
首页布局(从上到下):
┌─────────────────────────────────┐
│ 搜索栏 + 城市选择 + AI语音入口 │ ← 固定顶部
├─────────────────────────────────┤
│ 推荐活动(横向滚动,3张卡片) │ ← AI推荐
├─────────────────────────────────┤
│ 分类标签栏(横向滚动) │ ← 全部/太极/书法/...
├─────────────────────────────────┤
│ 时间筛选(今天/明天/本周/全部) │
├─────────────────────────────────┤
│ 活动列表(纵向滚动) │
│ ┌─────────────────────────────┐ │
│ │ 🏃 太极晨练·人民公园 │ │
│ │ 明天 7:00 距你1.2km │ │
│ │ 已报名 8/12人 [报名] │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ 🍵 周末茶话会·宽窄巷子 │ │
│ │ 周六 14:00 距你3.5km │ │
│ │ 已报名 5/10人 [报名] │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────┘
│ 首页 │ 服务 │ 🎙AI管家 │ 消息 │ 我的 │ ← 底部TabUI要求
- 活动卡片:圆角16dp,内边距16dp,卡片间距12dp
- 活动标题:18sp加粗,最多一行(超出截断)
- 时间/距离:16sp,灰色(#666666)
- 报名状态:16sp,绿色(#4CAF50)表示有余位,红色(#F44336)表示已满
- 报名按钮:主色调,圆角8dp,高度44dp
- 分类标签:可横向滚动的Chip组件,选中态高亮
推荐算法
推荐分数 = 兴趣匹配度 × 0.4 + 距离分 × 0.3 + 时间分 × 0.2 + 热度分 × 0.1
兴趣匹配度 = 用户兴趣标签与活动类型的交集数 / 用户兴趣标签总数
距离分 = 1 - min(距离km / 10, 1) -- 10km以内线性衰减
时间分 = 1 - min(时间差小时 / 168, 1) -- 一周以内线性衰减
热度分 = min(已报名人数 / 总人数, 1) -- 报名率越高越热数据结构
-- 活动表
CREATE TABLE activities (
id BIGSERIAL PRIMARY KEY,
creator_id BIGINT REFERENCES users(id) NOT NULL,
title VARCHAR(100) NOT NULL,
category VARCHAR(50) NOT NULL,
description TEXT,
cover_image_url TEXT,
location_lat DECIMAL(10, 7) NOT NULL,
location_lng DECIMAL(10, 7) NOT NULL,
location_address TEXT NOT NULL,
location_name VARCHAR(100), -- 地点名称(如"人民公园东门")
location_type VARCHAR(20) DEFAULT 'public', -- public/community
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP,
max_participants INTEGER DEFAULT 10 CHECK (max_participants BETWEEN 5 AND 15),
current_participants INTEGER DEFAULT 0,
status VARCHAR(20) DEFAULT 'upcoming'
CHECK (status IN ('upcoming', 'ongoing', 'finished', 'cancelled')),
is_public_place BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_activities_status_time ON activities(status, start_time);
CREATE INDEX idx_activities_category ON activities(category);
CREATE INDEX idx_activities_location ON activities USING GIST (
ll_to_earth(location_lat, location_lng)
);
-- 活动分类枚举
-- 晨练、太极、茶话会、书法、摄影、舞蹈、户外徒步、手工、唱歌、棋牌、读书、其他
-- 活动报名表
CREATE TABLE activity_participants (
id BIGSERIAL PRIMARY KEY,
activity_id BIGINT REFERENCES activities(id) NOT NULL,
user_id BIGINT REFERENCES users(id) NOT NULL,
status VARCHAR(20) DEFAULT 'registered'
CHECK (status IN ('registered', 'signed_in', 'absent', 'cancelled')),
signed_in_at TIMESTAMP,
signed_in_lat DECIMAL(10, 7),
signed_in_lng DECIMAL(10, 7),
rating INTEGER CHECK (rating BETWEEN 1 AND 5),
review TEXT,
joined_at TIMESTAMP DEFAULT NOW(),
cancelled_at TIMESTAMP,
UNIQUE(activity_id, user_id)
);
CREATE INDEX idx_participants_activity ON activity_participants(activity_id);
CREATE INDEX idx_participants_user ON activity_participants(user_id);API接口
GET /api/v1/activities
Query参数:
lat=30.572816&lng=104.066801 -- 用户位置
category=太极 -- 分类筛选(可选)
timeRange=today|tomorrow|week|all -- 时间筛选
page=1&pageSize=20 -- 分页
sort=recommended|time|distance -- 排序
Response 200:
{
"activities": [
{
"id": 1,
"title": "太极晨练·人民公园",
"category": "太极",
"coverImage": "https://...",
"startTime": "2026-04-03T07:00:00+08:00",
"endTime": "2026-04-03T08:30:00+08:00",
"location": {
"name": "人民公园东门",
"address": "成都市青羊区少城路12号",
"lat": 30.663,
"lng": 104.059,
"distance": 1.2
},
"maxParticipants": 12,
"currentParticipants": 8,
"creator": {
"id": 5,
"nickname": "李教练",
"avatar": "https://..."
},
"isJoined": false,
"recommendScore": 0.85
}
],
"total": 45,
"page": 1,
"pageSize": 20
}GET /api/v1/activities/:id
{
"id": 1,
"title": "太极晨练·人民公园",
"category": "太极",
"description": "每天早上在人民公园练太极,欢迎新手加入!有专业老师指导。",
"coverImage": "https://...",
"startTime": "2026-04-03T07:00:00+08:00",
"endTime": "2026-04-03T08:30:00+08:00",
"location": {
"name": "人民公园东门广场",
"address": "成都市青羊区少城路12号",
"lat": 30.663,
"lng": 104.059
},
"maxParticipants": 12,
"currentParticipants": 8,
"participants": [
{ "id": 2, "nickname": "王大爷", "avatar": "..." },
{ "id": 3, "nickname": "刘阿姨", "avatar": "..." }
],
"creator": {
"id": 5,
"nickname": "李教练",
"avatar": "...",
"activitiesCreated": 15,
"avgRating": 4.8
},
"isJoined": false,
"canCancel": true,
"status": "upcoming"
}验收标准
- 首页加载 < 2秒
- 推荐算法正确匹配用户兴趣
- 距离显示准确(误差<100m)
- 分类筛选和时间筛选正常工作
- 下拉刷新、上拉加载更多正常
- 活动已满时显示"已满员",不可报名
3.2 活动创建
需求描述
任何已认证用户可发起活动,限制为公共场所,人数5-15人。
用户故事
- US-3.2.1: 作为用户,我希望3分钟内创建一个活动
- US-3.2.2: 作为用户,我希望选择地点时能看到地图
- US-3.2.3: 作为用户,我希望创建后能修改活动信息
交互流程
首页右上角「+」按钮 或 底部浮动按钮
↓
创建活动页面(单页表单,滚动填写)
├── 活动名称(必填,1-20字,placeholder: "给活动起个名字吧")
├── 活动类型(必选,横向标签选择)
├── 活动时间
│ ├── 日期选择器(日历式,不能选过去)
│ └── 时间选择器(滚轮式,30分钟间隔)
├── 活动地点(必填)
│ ├── 点击打开地图选点页面
│ ├── 搜索地址 或 地图上点选
│ ├── 系统检测是否公共场所
│ │ ├── 是 → 确认地点
│ │ └── 否 → 提示"为了安全,请选择公共场所"
│ └── 返回显示选择的地址
├── 人数限制(滑块,5-15人,默认10)
├── 活动描述(选填,0-200字)
├── 上传封面图(选填,相机/相册)
└── 【发布活动】按钮
↓
自动审核(敏感词检测 + 地点类型检测)
├── 通过 → "活动发布成功!" → 跳转活动详情
└── 不通过 → 提示具体原因,修改后重新提交API接口
POST /api/v1/activities
// Request
{
"title": "太极晨练·人民公园",
"category": "太极",
"startTime": "2026-04-03T07:00:00+08:00",
"endTime": "2026-04-03T08:30:00+08:00",
"location": {
"name": "人民公园东门广场",
"address": "成都市青羊区少城路12号",
"lat": 30.663,
"lng": 104.059
},
"maxParticipants": 12,
"description": "每天早上练太极,欢迎新手!",
"coverImage": "base64..."
}
// Response 201
{
"id": 1,
"status": "upcoming",
"message": "活动发布成功"
}PUT /api/v1/activities/:id(修改活动,仅创建者,仅未开始的活动)
DELETE /api/v1/activities/:id(取消活动,通知所有报名者)
验收标准
- 未实名认证用户不能创建活动
- 地点选择只允许公共场所(POI类型校验)
- 人数范围5-15人
- 时间不能早于当前时间+1小时
- 敏感词自动过滤
- 60岁用户创建活动通过率 > 80%
3.3 活动报名与取消
API接口
POST /api/v1/activities/:id/join
// Response 200
{
"success": true,
"message": "报名成功!活动前15分钟会提醒您",
"participantCount": 9
}
// Error 400 (已满员)
{
"error": "ACTIVITY_FULL",
"message": "活动已满员,下次早点哦~"
}
// Error 400 (无紧急联系人)
{
"error": "NO_EMERGENCY_CONTACT",
"message": "请先设置紧急联系人"
}POST /api/v1/activities/:id/cancel
// 活动开始前2小时可取消
// Response 200
{
"success": true,
"message": "已取消报名"
}验收标准
- 报名需有紧急联系人
- 已满员不可报名
- 开始前2小时可取消,之后不可取消
- 不可重复报名
- 取消后名额释放
3.4 活动签到
需求描述
活动开始前15分钟推送提醒,参与者到场后通过GPS定位签到(距活动地点500米内)。
交互流程
活动开始前15分钟 → 推送通知"您报名的[活动名]即将开始"
↓
进入活动详情页 → 签到按钮亮起
↓
点击签到 → 获取GPS位置
├── 距离<500m → "签到成功✓" + 打卡动画
└── 距离>500m → "您距活动地点较远,请靠近后重试"API接口
POST /api/v1/activities/:id/sign-in
// Request
{
"lat": 30.663,
"lng": 104.059
}
// Response 200
{
"success": true,
"message": "签到成功!祝您活动愉快~"
}验收标准
- GPS定位精度500m内可签到
- 签到时间窗口:活动开始前15分钟至活动结束
- 每人只能签到一次
- 活动结束后未签到的标记为"未到场"
3.5 活动评价
需求描述
活动结束后,参与者可对活动评分(1-5星)和文字评价,评价用于后续推荐和队长评级。
API接口
POST /api/v1/activities/:id/review
{
"rating": 5,
"review": "李教练教得真好,明天还来!"
}验收标准
- 只有已签到的参与者可评价
- 评价在活动结束后24小时内可提交
- 评分1-5星必填,文字评价选填
3.6 我的活动
需求描述
用户可查看自己报名的活动和发起的活动,按状态分类。
API接口
GET /api/v1/users/me/activities
Query: type=joined|created&status=upcoming|finished|all&page=14. AI智能管家
4.1 对话界面
需求描述
AI管家是APP的核心卖点之一。提供类似微信聊天的对话界面,支持语音输入和文字输入,AI回复简洁易懂,支持语音播报。
用户故事
- US-4.1.1: 作为用户,我希望对着手机说话就能完成挂号
- US-4.1.2: 作为用户,我希望AI回复简短好懂,不要太专业
- US-4.1.3: 作为用户,我希望常用功能有快捷按钮
交互流程
底部Tab「AI管家」→ 对话页面
┌─────────────────────────────────┐
│ 🤖 小伴 · AI管家 │
├─────────────────────────────────┤
│ │
│ 小伴:您好张阿姨!我是小伴, │
│ 有什么可以帮您的吗? │
│ │
│ ┌──────────────────────┐ │
│ │ 快捷指令: │ │
│ │ [附近活动] [挂号] │ │
│ │ [买菜] [天气] [提醒] │ │
│ └──────────────────────┘ │
│ │
│ 用户🗣️:帮我挂个华西的号 │
│ │
│ 小伴:好的张阿姨,您想看 │
│ 哪个科室呢? │
│ [心内科] [骨科] [消化内科] │
│ [更多科室...] │
│ │
├─────────────────────────────────┤
│ [输入框... ] [🎤] │
└─────────────────────────────────┘UI要求
- 对话气泡:用户靠右蓝色,AI靠左白色,字号18sp
- AI回复每条≤100字,复杂内容分多条发送
- 语音按钮:底部右侧大圆按钮(直径56dp),按住说话
- 快捷指令:圆角标签式按钮,可点击触发
- 语音播报:AI回复自动语音播报,用户可关闭
- 播报速度:可调(慢速/正常/快速)
数据结构
-- AI对话记录表
CREATE TABLE ai_conversations (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id) NOT NULL,
session_id VARCHAR(36) NOT NULL, -- 会话ID(UUID)
role VARCHAR(20) NOT NULL CHECK (role IN ('user', 'assistant', 'system')),
content TEXT NOT NULL,
content_type VARCHAR(20) DEFAULT 'text', -- text / voice / action
voice_url TEXT, -- 语音文件URL
intent VARCHAR(50), -- 识别到的意图
metadata JSONB, -- 额外信息(如快捷指令结果)
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_ai_conv_user_session ON ai_conversations(user_id, session_id);
CREATE INDEX idx_ai_conv_user_time ON ai_conversations(user_id, created_at DESC);
-- AI用户偏好表(用于个性化)
CREATE TABLE ai_user_preferences (
user_id BIGINT PRIMARY KEY REFERENCES users(id),
preferred_hospital VARCHAR(100),
preferred_doctor VARCHAR(100),
home_address TEXT,
common_destinations JSONB, -- 常去地址
dietary_restrictions TEXT[], -- 饮食限制(低盐、低糖等)
speech_speed VARCHAR(10) DEFAULT 'normal', -- slow/normal/fast
auto_voice_reply BOOLEAN DEFAULT TRUE,
updated_at TIMESTAMP DEFAULT NOW()
);API接口
POST /api/v1/ai/chat
// Request
{
"sessionId": "uuid-xxx",
"content": "帮我挂个华西医院的号",
"contentType": "text" // text | voice
}
// Response 200 (流式SSE)
event: message
data: {"role":"assistant","content":"好的张阿姨,您想看哪个科室呢?","actions":[{"type":"quickReply","options":["心内科","骨科","消化内科","更多科室"]}]}
event: done
data: {"messageId": 123}POST /api/v1/ai/voice
// Request: multipart/form-data
// file: 语音文件(PCM/WAV/MP3)
// sessionId: uuid-xxx
// Response 200
{
"transcription": "帮我挂个华西医院的号",
"reply": {
"content": "好的张阿姨,您想看哪个科室呢?",
"voiceUrl": "https://...tts-output.mp3",
"actions": [...]
}
}验收标准
- 语音识别准确率 > 90%(普通话)
- AI响应时间 < 3秒(首字)
- 对话历史保存最近100条
- TTS语音播报自然流畅
- 快捷指令点击后正确触发对应流程
- 免费用户每天20次对话限制
4.2 快捷指令:附近活动
交互流程
用户:"帮我找附近的活动" / 点击[附近活动]
↓
AI:获取用户位置 → 调用活动推荐API
↓
AI回复:
"张阿姨,给您找到几个好活动:
1️⃣ 太极晨练·人民公园
明天7:00 距您1.2km 还剩4个名额
[查看详情] [直接报名]
2️⃣ 周末茶话会·宽窄巷子
周六14:00 距您3.5km 还剩5个名额
[查看详情] [直接报名]
3️⃣ 书法交流·社区中心
周日9:00 距您0.8km 还剩8个名额
[查看详情] [直接报名]
想参加哪个呢?"验收标准
- 返回3个最匹配的活动
- 点击"查看详情"跳转活动页
- 点击"直接报名"一键报名
4.3 快捷指令:挂号服务
交互流程
用户:"帮我挂个号" / "我想看心内科"
↓
AI意图识别 → 进入挂号流程
AI:"您要挂哪家医院?"
[华西医院] [省人民医院] [市一医院]
↓
用户选择华西医院
↓
AI:"好的,看哪个科室呢?"
[心内科] [骨科] [消化内科] [神经内科] [更多...]
↓
用户选择心内科
↓
AI:"心内科有这些医生:
👨⚕️ 王教授 主任医师 好评率98%
下周二9:00 / 下周四14:00
👩⚕️ 李医生 副主任医师 好评率95%
明天10:00 / 下周一9:00
选哪位医生和时间?"
↓
用户选择王教授下周二
↓
AI:"好的,帮您预约了:
📋 华西医院 · 心内科
👨⚕️ 王教授(主任医师)
🕐 下周二 4月8日 9:00-9:30
💰 挂号费 50元
确认预约并支付吗?
[确认支付] [取消]"
↓
用户确认 → 调起微信支付 → 支付成功
↓
AI:"预约成功!提前一天会提醒您。
需要帮您叫车去医院吗?
[好的,帮我叫车] [不用了,谢谢]"API接口
GET /api/v1/medical/hospitals
{
"hospitals": [
{ "id": 1, "name": "四川大学华西医院", "distance": 5.2, "departments": [...] }
]
}GET /api/v1/medical/doctors
Query: hospitalId=1&departmentId=3
Response:
{
"doctors": [
{
"id": 1,
"name": "王教授",
"title": "主任医师",
"rating": 4.9,
"availableSlots": [
{ "date": "2026-04-08", "time": "09:00", "fee": 50 }
]
}
]
}POST /api/v1/medical/appointments
{
"hospitalId": 1,
"departmentId": 3,
"doctorId": 1,
"slotDate": "2026-04-08",
"slotTime": "09:00",
"patientName": "张秀兰",
"patientPhone": "13800138000"
}
// Response
{
"orderId": "ORD20260408001",
"amount": 50,
"paymentUrl": "wxpay://..."
}验收标准
- 挂号全流程可通过语音完成
- 选择项清晰,有快捷按钮
- 支付前有二次确认
- 支付成功后生成订单记录
- 支持取消预约(提前24小时)
4.4 快捷指令:生鲜配送
交互流程
用户:"帮我买菜" / "今晚想吃鱼"
↓
AI:"今晚想吃什么菜呢?我帮您配好~"
[推荐今日特价] [我自己选]
↓
用户:"来条鲈鱼,再要点青菜和豆腐"
↓
AI:"好的,帮您找到了:
🐟 鲈鱼 1条(约500g) ¥25
🥬 小白菜 1份(250g) ¥4
🧊 嫩豆腐 1盒(350g) ¥3.5
━━━━━━━━━━━━━━
💰 合计:¥32.5(免配送费)
📍 送到:武侯区XX小区3栋2单元
⏰ 预计30分钟送达
[确认下单] [修改商品] [换个地址]"验收标准
- 支持自然语言描述购买需求
- 正确匹配商品并展示价格
- 地址默认用户常用地址
- 支付前有二次确认
5. 医疗健康服务
5.1 服务入口
交互流程
底部Tab「服务」→ 服务首页
┌─────────────────────────────────┐
│ 生活服务 │
├─────────────────────────────────┤
│ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │
│ │🏥 │ │🏠 │ │🛒 │ │🔒 │ │
│ │医疗 │ │家政 │ │消费 │ │更多 │ │
│ │健康 │ │服务 │ │日用 │ │即将 │ │
│ │ │ │ │ │ │ │开放 │ │
│ └────┘ └────┘ └────┘ └────┘ │
├─────────────────────────────────┤
│ V1.0仅医疗健康可用,其他显示 │
│ "即将开放"标记 │
└─────────────────────────────────┘5.2 在线挂号
数据结构
-- 医院表
CREATE TABLE hospitals (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
address TEXT,
lat DECIMAL(10, 7),
lng DECIMAL(10, 7),
phone VARCHAR(20),
logo_url TEXT,
level VARCHAR(20), -- 三甲、三乙、二甲...
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- 科室表
CREATE TABLE departments (
id BIGSERIAL PRIMARY KEY,
hospital_id BIGINT REFERENCES hospitals(id),
name VARCHAR(50) NOT NULL,
description TEXT,
sort_order INTEGER DEFAULT 0
);
-- 医生表
CREATE TABLE doctors (
id BIGSERIAL PRIMARY KEY,
hospital_id BIGINT REFERENCES hospitals(id),
department_id BIGINT REFERENCES departments(id),
name VARCHAR(50) NOT NULL,
title VARCHAR(50), -- 主任医师/副主任/主治...
avatar_url TEXT,
specialty TEXT, -- 擅长方向
rating DECIMAL(2,1) DEFAULT 5.0,
rating_count INTEGER DEFAULT 0,
status VARCHAR(20) DEFAULT 'active'
);
-- 排班表
CREATE TABLE doctor_schedules (
id BIGSERIAL PRIMARY KEY,
doctor_id BIGINT REFERENCES doctors(id),
schedule_date DATE NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
max_patients INTEGER DEFAULT 30,
current_patients INTEGER DEFAULT 0,
fee DECIMAL(10, 2),
status VARCHAR(20) DEFAULT 'available'
);
CREATE UNIQUE INDEX idx_schedule_doctor_date_time
ON doctor_schedules(doctor_id, schedule_date, start_time);
-- 预约记录表
CREATE TABLE appointments (
id BIGSERIAL PRIMARY KEY,
order_id VARCHAR(20) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
hospital_id BIGINT REFERENCES hospitals(id),
department_id BIGINT REFERENCES departments(id),
doctor_id BIGINT REFERENCES doctors(id),
schedule_id BIGINT REFERENCES doctor_schedules(id),
patient_name VARCHAR(50),
patient_phone VARCHAR(11),
appointment_date DATE,
appointment_time TIME,
fee DECIMAL(10, 2),
status VARCHAR(20) DEFAULT 'pending'
CHECK (status IN ('pending', 'paid', 'confirmed', 'completed', 'cancelled', 'refunded')),
paid_at TIMESTAMP,
cancelled_at TIMESTAMP,
cancel_reason TEXT,
created_at TIMESTAMP DEFAULT NOW()
);5.3 在线问诊
数据结构
-- 问诊记录表
CREATE TABLE consultations (
id BIGSERIAL PRIMARY KEY,
order_id VARCHAR(20) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
doctor_id BIGINT REFERENCES doctors(id),
symptom_description TEXT,
images TEXT[], -- 图片URL数组
doctor_reply TEXT,
fee DECIMAL(10, 2) DEFAULT 19.90,
status VARCHAR(20) DEFAULT 'pending'
CHECK (status IN ('pending', 'paid', 'replied', 'completed', 'cancelled')),
replied_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);API接口
POST /api/v1/medical/consultations
{
"doctorId": 1,
"symptomDescription": "最近经常头晕,血压偏高",
"images": ["https://...photo1.jpg"]
}验收标准
- 问诊费19.9元/次
- 医生2小时内回复
- 支持上传最多3张图片
- 医疗内容标注"仅供参考,不构成医疗建议"
6. 支付系统
6.1 微信支付集成
数据结构
-- 支付订单表
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(20) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
order_type VARCHAR(50) NOT NULL, -- appointment/consultation/grocery
amount DECIMAL(10, 2) NOT NULL,
status VARCHAR(20) DEFAULT 'pending'
CHECK (status IN ('pending', 'paid', 'completed', 'cancelled', 'refunded')),
detail JSONB,
wx_transaction_id VARCHAR(50),
paid_at TIMESTAMP,
completed_at TIMESTAMP,
cancelled_at TIMESTAMP,
refund_amount DECIMAL(10, 2),
refund_at TIMESTAMP,
refund_reason TEXT,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_orders_user ON orders(user_id, created_at DESC);
CREATE INDEX idx_orders_status ON orders(status);API接口
POST /api/v1/orders/create
{
"orderType": "appointment",
"referenceId": 1,
"amount": 50.00
}
// Response
{
"orderNo": "BX20260408001",
"wxPayParams": {
"appId": "wx...",
"timeStamp": "1712534400",
"nonceStr": "xxx",
"package": "prepay_id=xxx",
"signType": "RSA",
"paySign": "xxx"
}
}POST /api/v1/orders/:orderNo/refund
{
"reason": "取消预约"
}
// Response
{
"success": true,
"refundAmount": 50.00,
"message": "退款将在1-3个工作日到账"
}验收标准
- 支付前二次确认弹窗(防误操作)
- 支付成功率 > 99%
- 退款1-3个工作日到账
- 订单30分钟未支付自动取消
7. 消息与通知系统
7.1 通知类型
| 类型 | 触发场景 | 推送方式 |
|---|---|---|
| 活动提醒 | 报名活动开始前15分钟 | Push + App内消息 |
| 报名通知 | 有人报名我的活动 | App内消息 |
| 签到提醒 | 活动进行中未签到 | Push |
| 订单通知 | 支付成功/退款成功 | Push + 短信 |
| 问诊回复 | 医生回复问诊 | Push + 短信 |
| 系统通知 | 版本更新/运营活动 | App内消息 |
数据结构
CREATE TABLE notifications (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
type VARCHAR(50) NOT NULL,
title VARCHAR(100),
content TEXT,
data JSONB, -- 跳转数据
is_read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_notifications_user ON notifications(user_id, is_read, created_at DESC);8. 适老化设计规范
8.1 视觉规范
| 项目 | 标准值 | 说明 |
|---|---|---|
| 最小字号 | 18sp | 正文,可在设置中调至24sp |
| 标题字号 | 22sp | 页面标题 |
| 按钮字号 | 18sp | 所有可点击按钮 |
| 按钮最小高度 | 48dp | 确保可点击区域足够大 |
| 按钮间距 | ≥12dp | 防止误触 |
| 对比度 | ≥7:1 | WCAG AAA级别 |
| 主色调 | #1976D2(蓝色) | 稳重、可信赖 |
| 辅助色 | #4CAF50(绿色) | 用于成功状态 |
| 警示色 | #F44336(红色) | 用于错误、危险操作 |
8.2 交互规范
| 项目 | 标准 |
|---|---|
| 页面层级 | ≤3层 |
| 每页输入项 | ≤3个 |
| 核心操作步骤 | ≤3步 |
| 操作反馈 | 0.5秒内 |
| 错误提示 | 简单明了,无术语 |
| 返回按钮 | 每页左上角必有 |
| 底部导航 | 5个Tab:首页/服务/AI管家/消息/我的 |
| 手势操作 | 仅使用点击和滑动,不使用长按/双击 |
| 弹窗确认 | 危险操作(支付/取消)必有确认弹窗 |
| 字体设置 | 支持小/中/大三档(18/20/24sp) |
8.3 语音交互规范
| 项目 | 标准 |
|---|---|
| 唤醒方式 | 点击按钮(不用语音唤醒词) |
| 识别等待 | 显示波形动画+文字"正在听…" |
| 播报速度 | 慢速/正常/快速可调 |
| 播报打断 | 播报时点击任意位置可打断 |
| 超时处理 | 10秒无输入提示"还在吗?" |
9. 非功能性需求
9.1 性能要求
| 指标 | 标准 |
|---|---|
| 首页加载 | < 2秒(首次),< 1秒(缓存) |
| API响应 | P95 < 500ms |
| AI首字响应 | < 3秒 |
| 语音识别 | < 2秒 |
| 并发支持 | 500人同时在线 |
| APP安装包 | < 80MB |
9.2 安全要求
| 项目 | 措施 |
|---|---|
| 传输加密 | HTTPS + TLS 1.3 |
| 数据加密 | 敏感字段AES-256加密存储 |
| 身份认证 | JWT Token,有效期7天,支持续签 |
| 接口限流 | 全局100次/分钟,敏感接口10次/分钟 |
| 日志审计 | 所有操作记录审计日志 |
| 数据备份 | 每日自动备份,保留30天 |
9.3 兼容性要求
| 平台 | 最低版本 |
|---|---|
| iOS | 14.0+ |
| Android | 8.0+ (API 26) |
| 屏幕 | 4.7英寸-6.7英寸 |
10. 验收标准与测试计划
10.1 内测验收标准
| 指标 | 目标值 | 判定 |
|---|---|---|
| 注册成功率 | > 90% | 必达 |
| 日活用户 | > 100人 | 必达 |
| 活动创建数 | > 50个/2周 | 必达 |
| 活动报名成功率 | > 95% | 必达 |
| AI对话满意度 | > 80% | 必达 |
| 语音识别准确率 | > 90% | 必达 |
| 挂号成功率 | > 95% | 必达 |
| 支付成功率 | > 99% | 必达 |
| 严重Bug数 | < 5个 | 必达 |
| 7日留存率 | > 40% | 目标 |
| NPS | > 30 | 目标 |
10.2 测试计划
种子用户: 500人(从合伙人资源筛选)
测试周期: 2周
反馈渠道: 微信群 + APP内反馈按钮 + 线下面访(每周2次)
测试重点:
- 易用性测试 — 60-70岁用户独立完成核心流程
- 功能测试 — 所有功能流程跑通
- 性能测试 — 500人并发
- 安全测试 — 个人信息加密、支付安全
10.3 进入V1.1的Gate条件
- 所有"必达"指标达标
- 无P0级Bug
- 用户反馈汇总完成
- V1.1需求评审通过
文档结束
来源:PRD-V1.1-体验优化版.md
slug: prd-v1-1-experience
「伴享」PRD V1.1 — 体验优化版
版本: V1.1
目标: V1.0后3周上线,2000人公测,提升留存,引入社区队长和会员体系
发布时间: 2026年4月下旬
前置条件: V1.0内测Gate条件全部达标
1. 版本概述
1.1 核心目标
| 维度 | 目标 | 衡量指标 |
|---|---|---|
| 用户增长 | 2000人公测 | 注册用户≥2000 |
| 留存提升 | 7日留存50%+ | 较V1.0提升10% |
| 社区运营 | 社区队长体系运转 | 队长≥20人 |
| 商业验证 | 会员付费起步 | 付费率>5% |
| 服务扩展 | 新增家政+日用消费 | 服务板块从1→3 |
1.2 新增功能清单
| 模块 | 功能 | 优先级 | 开发周期 |
|---|---|---|---|
| 社区队长 | 申请/审核/等级/排行榜 | P0 | 2周 |
| 会员订阅 | 月卡/年卡/权益/子女代付 | P0 | 1周 |
| 家政服务 | 保洁/维修/陪护 | P1 | 1周 |
| 日常消费 | 生鲜配送/日化用品 | P1 | 1周 |
| 新手引导 | 首次使用动画引导 | P1 | 0.5周 |
| 分享功能 | 活动分享到微信 | P1 | 0.5周 |
| 消息推送 | 活动提醒/AI关怀 | P1 | 0.5周 |
2. 社区队长体系
2.1 需求描述
社区队长是「伴享」增长引擎的核心。借鉴Meet5 Community Captains模式,从广场舞队长、社区积极分子、退休干部、太极教练等人群中招募,赋予组织权限和激励,驱动线下活动供给和用户增长。
2.2 用户故事
- US-CQ.1: 作为活跃用户,我组织了3次以上活动,希望获得官方认可
- US-CQ.2: 作为社区队长,我希望看到自己的等级和排名
- US-CQ.3: 作为社区队长,我希望组织活动能获得补贴
- US-CQ.4: 作为普通用户,我希望优先参加队长组织的活动(更有保障)
2.3 队长等级体系
| 等级 | 条件 | 权益 | 标识 |
|---|---|---|---|
| 见习队长 | 累计组织3次活动,好评率>80% | 专属标识🏅、活动优先推荐、队长培训群 | 铜色徽章 |
| 银牌队长 | 累计20次、好评率>90%、活跃用户带新>20人 | 免费会员1年、活动补贴20元/次、月度队长聚会 | 银色徽章 |
| 金牌队长 | 累计50次、好评率>95%、带新>100人 | 月度奖金500元、平台分成5%、专属客服 | 金色徽章 |
| 荣誉队长 | 年度评选TOP10 | 品牌大使、媒体曝光、年度旅行奖励 | 钻石徽章 |
2.4 交互流程
队长申请
我的 → 社区队长 → 申请成为队长
↓
申请条件检查:
├── 已实名认证 ✓
├── 累计组织≥3次活动 ✓
└── 好评率≥80% ✓
↓
填写申请信息:
├── 自我介绍(100字以内)
├── 擅长活动类型(多选)
├── 活动区域(选择区域)
└── 联系方式确认
↓
提交申请 → 后台审核(1-3天)
├── 通过 → Push通知"恭喜成为见习队长!" + 解锁队长功能
└── 拒绝 → 通知原因 + 建议继续积累队长主页
┌──────────────────────────────────┐
│ 🏅 银牌队长 · 李教练 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ 累计活动:28次 好评率:96% │
│ 活跃粉丝:156人 排名:#5 │
├──────────────────────────────────┤
│ 📊 本月数据 │
│ 组织活动 8次 新增粉丝 23人 │
│ 获得好评 52个 补贴收入 ¥160 │
├──────────────────────────────────┤
│ 🎯 升级进度 │
│ 距金牌队长还需: │
│ ▓▓▓▓▓▓▓▓░░ 28/50次活动 │
│ ▓▓▓▓▓▓▓▓▓░ 96%/95%好评 │
│ ▓▓▓▓▓░░░░░ 56/100带新 │
├──────────────────────────────────┤
│ [创建活动] [我的粉丝] [收入明细] │
└──────────────────────────────────┘2.5 数据结构
-- 队长信息表
CREATE TABLE captains (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT UNIQUE REFERENCES users(id),
level VARCHAR(20) DEFAULT 'trainee'
CHECK (level IN ('trainee', 'silver', 'gold', 'honor')),
bio TEXT,
specialties TEXT[],
serving_area VARCHAR(50),
total_activities INTEGER DEFAULT 0,
total_participants INTEGER DEFAULT 0,
total_new_users INTEGER DEFAULT 0,
avg_rating DECIMAL(2,1) DEFAULT 0,
monthly_subsidy DECIMAL(10,2) DEFAULT 0,
status VARCHAR(20) DEFAULT 'pending'
CHECK (status IN ('pending', 'active', 'suspended', 'revoked')),
approved_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 队长申请表
CREATE TABLE captain_applications (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
bio TEXT,
specialties TEXT[],
serving_area VARCHAR(50),
contact_info JSONB,
status VARCHAR(20) DEFAULT 'pending'
CHECK (status IN ('pending', 'approved', 'rejected')),
reviewer_note TEXT,
reviewed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
-- 队长排行榜(月度物化视图)
CREATE MATERIALIZED VIEW captain_monthly_ranking AS
SELECT
c.user_id,
u.nickname,
u.avatar_url,
c.level,
COUNT(a.id) AS monthly_activities,
SUM(ap.cnt) AS monthly_participants,
AVG(ap.avg_rating) AS monthly_avg_rating
FROM captains c
JOIN users u ON c.user_id = u.id
LEFT JOIN activities a ON a.creator_id = c.user_id
AND a.start_time >= date_trunc('month', CURRENT_DATE)
LEFT JOIN (
SELECT activity_id, COUNT(*) cnt, AVG(rating) avg_rating
FROM activity_participants
WHERE status = 'signed_in'
GROUP BY activity_id
) ap ON ap.activity_id = a.id
WHERE c.status = 'active'
GROUP BY c.user_id, u.nickname, u.avatar_url, c.level
ORDER BY monthly_activities DESC;2.6 API接口
POST /api/v1/captains/apply
{
"bio": "退休体育老师,太极拳教练,组织活动经验丰富",
"specialties": ["太极", "晨练", "户外徒步"],
"servingArea": "武侯区"
}GET /api/v1/captains/ranking
{
"ranking": [
{
"rank": 1,
"userId": 5,
"nickname": "李教练",
"level": "silver",
"monthlyActivities": 12,
"monthlyParticipants": 98,
"avgRating": 4.9
}
]
}GET /api/v1/captains/me/dashboard
{
"level": "silver",
"stats": {
"totalActivities": 28,
"totalParticipants": 312,
"totalNewUsers": 56,
"avgRating": 4.8,
"monthlySubsidy": 160
},
"upgradeProgress": {
"nextLevel": "gold",
"activities": { "current": 28, "required": 50 },
"rating": { "current": 96, "required": 95 },
"newUsers": { "current": 56, "required": 100 }
}
}2.7 验收标准
- 满足条件的用户可申请队长
- 审核1-3天内完成
- 队长主页展示数据准确
- 排行榜每日更新
- 等级自动升降
- 活动补贴按月结算
3. 会员订阅系统
3.1 需求描述
会员体系是核心变现手段之一。提供基础会员和尊享会员两档,支持子女代付(重要转化场景)。
3.2 会员权益对比
| 功能 | 免费用户 | 基础会员(29元/月 或 299元/年) | 尊享会员(待V2.0) |
|---|---|---|---|
| 活动参与 | 每月3次 | 无限次 | 无限+优先 |
| AI管家 | 每天20条 | 无限对话 | 专属AI+家庭共享 |
| 服务预约 | 基础 | 优先预约+专属折扣5% | VIP折扣10% |
| 客服 | 无 | 专属客服(微信1v1) | 专属客服+电话 |
| 生日礼物 | 无 | 电子贺卡+优惠券 | 实物礼品 |
| 标识 | 无 | 会员标识✨ | VIP标识👑 |
3.3 交互流程
开通会员
我的 → 会员中心
↓
┌──────────────────────────────────┐
│ ✨ 伴享会员 │
│ │
│ 解锁全部功能,让生活更便捷 │
│ │
│ ┌────────────┐ ┌────────────┐ │
│ │ 月卡 │ │ 年卡 │ │
│ │ 29元/月 │ │ 299元/年 │ │
│ │ │ │ 省49元 🔥 │ │
│ │ [开通] │ │ [开通] │ │
│ └────────────┘ └────────────┘ │
│ │
│ 或者让子女帮您开通: │
│ [生成代付链接] │
│ │
│ 会员权益: │
│ ✅ 活动不限次 │
│ ✅ AI管家不限量 │
│ ✅ 服务优先预约+折扣 │
│ ✅ 专属客服 │
│ ✅ 生日礼物 │
└──────────────────────────────────┘子女代付
父母端:会员中心 → [生成代付链接] → 生成微信分享卡片
↓
子女微信:收到分享卡片 → 打开支付页面 → 微信支付
↓
父母端:收到Push通知 "您的子女为您开通了会员✨"3.4 数据结构
-- 会员表
CREATE TABLE memberships (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
plan VARCHAR(20) NOT NULL CHECK (plan IN ('monthly', 'yearly')),
price DECIMAL(10, 2) NOT NULL,
paid_by_user_id BIGINT REFERENCES users(id), -- 代付人(子女)
starts_at TIMESTAMP NOT NULL,
expires_at TIMESTAMP NOT NULL,
auto_renew BOOLEAN DEFAULT FALSE, -- 明确不设自动续费
status VARCHAR(20) DEFAULT 'active'
CHECK (status IN ('active', 'expired', 'cancelled')),
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_membership_user ON memberships(user_id, status);3.5 API接口
POST /api/v1/membership/subscribe
{
"plan": "yearly",
"payForUserId": null // 为自己开通
}
// Response
{
"orderNo": "MEM20260420001",
"amount": 299,
"wxPayParams": { ... }
}POST /api/v1/membership/generate-pay-link
// 生成子女代付链接
// Response
{
"payLink": "https://pay.banxiang.com/member/xxx",
"shareCard": {
"title": "张阿姨邀请您为TA开通伴享会员",
"description": "299元/年,让父母的生活更便捷",
"imageUrl": "https://..."
},
"expiresAt": "2026-04-21T10:00:00Z"
}3.6 验收标准
- 支付后立即生效
- 不设自动续费(合规要求)
- 到期前7天/3天/1天提醒续费
- 子女代付链接24小时有效
- 会员标识在头像/个人页显示
- 免费用户超出限额时引导开通会员
4. 家政服务
4.1 需求描述
接入成都本地2-3家家政公司,提供保洁、维修、陪护三项基础服务。
4.2 用户故事
- US-HP.1: 作为用户,我希望一键预约保洁阿姨上门
- US-HP.2: 作为用户,我希望看到服务人员的评价和资质
- US-HP.3: 作为用户,我希望服务完成后可以评价
4.3 服务列表
| 服务 | 价格区间 | 平台佣金 | 服务时长 |
|---|---|---|---|
| 钟点保洁 | 40-60元/时 | 15% | 2-4小时 |
| 深度保洁 | 200-400元/次 | 15% | 4-8小时 |
| 水电维修 | 50-200元/次 | 12% | 按需 |
| 家电维修 | 80-300元/次 | 12% | 按需 |
| 陪同就医 | 100-200元/次 | 10% | 半天/全天 |
| 陪聊服务 | 50-80元/时 | 10% | 1-3小时 |
4.4 交互流程
服务Tab → 家政服务
↓
┌──────────────────────────────────┐
│ 🏠 家政服务 │
├──────────────────────────────────┤
│ ┌────────┐ ┌────────┐ ┌────────┐│
│ │ 🧹 │ │ 🔧 │ │ 🤝 ││
│ │ 保洁 │ │ 维修 │ │ 陪护 ││
│ └────────┘ └────────┘ └────────┘│
├──────────────────────────────────┤
│ 推荐服务人员: │
│ ┌────────────────────────────┐ │
│ │ 👩 李阿姨 好评率98% │ │
│ │ 擅长:保洁 服务次数:320 │ │
│ │ ¥50/小时 [预约] │ │
│ └────────────────────────────┘ │
└──────────────────────────────────┘4.5 数据结构
-- 服务商表
CREATE TABLE service_providers (
id BIGSERIAL PRIMARY KEY,
company_name VARCHAR(100),
category VARCHAR(50), -- housekeeping/repair/companion
contact_phone VARCHAR(20),
license_no VARCHAR(50),
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- 服务人员表
CREATE TABLE service_workers (
id BIGSERIAL PRIMARY KEY,
provider_id BIGINT REFERENCES service_providers(id),
name VARCHAR(50),
avatar_url TEXT,
skills TEXT[],
rating DECIMAL(2,1) DEFAULT 5.0,
service_count INTEGER DEFAULT 0,
hourly_rate DECIMAL(10,2),
status VARCHAR(20) DEFAULT 'available',
created_at TIMESTAMP DEFAULT NOW()
);
-- 服务订单表
CREATE TABLE service_orders (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(20) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
worker_id BIGINT REFERENCES service_workers(id),
service_type VARCHAR(50),
scheduled_date DATE,
scheduled_time TIME,
duration_hours DECIMAL(3,1),
address TEXT,
requirements TEXT,
amount DECIMAL(10,2),
platform_fee DECIMAL(10,2),
status VARCHAR(20) DEFAULT 'pending'
CHECK (status IN ('pending', 'paid', 'confirmed', 'in_progress', 'completed', 'cancelled')),
rating INTEGER CHECK (rating BETWEEN 1 AND 5),
review TEXT,
created_at TIMESTAMP DEFAULT NOW()
);4.6 API接口
GET /api/v1/services/housekeeping/workers
Query: type=cleaning|repair|companion&lat=30.57&lng=104.07POST /api/v1/services/housekeeping/orders
{
"workerId": 1,
"serviceType": "cleaning",
"scheduledDate": "2026-04-22",
"scheduledTime": "09:00",
"durationHours": 3,
"address": "武侯区XX小区3栋2单元501",
"requirements": "重点打扫厨房和卫生间"
}4.7 验收标准
- 服务人员展示评价和资质
- 预约流程≤3步
- 支付前二次确认
- 服务完成后可评价
- 订单可取消(提前24小时免费,之内收取30%)
5. 日常消费服务
5.1 需求描述
整合2-3家本地生鲜/日化商家,用户可在线选购,30分钟-2小时配送到家。
5.2 交互流程
服务Tab → 日常消费 → 商家列表
↓
选择商家 → 浏览商品(分类:蔬菜/水果/肉蛋/日化)
↓
加入购物车 → 确认订单(地址+时间)→ 微信支付
↓
等待配送 → 收货确认 → 评价5.3 数据结构
-- 商品表
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
provider_id BIGINT REFERENCES service_providers(id),
name VARCHAR(100),
category VARCHAR(50),
description TEXT,
image_url TEXT,
price DECIMAL(10,2),
unit VARCHAR(20), -- 斤/个/盒/份
stock INTEGER DEFAULT 0,
status VARCHAR(20) DEFAULT 'available',
created_at TIMESTAMP DEFAULT NOW()
);
-- 购物车表
CREATE TABLE cart_items (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
product_id BIGINT REFERENCES products(id),
quantity INTEGER DEFAULT 1,
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(user_id, product_id)
);
-- 配送订单表
CREATE TABLE delivery_orders (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(20) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
provider_id BIGINT REFERENCES service_providers(id),
items JSONB, -- [{productId, name, qty, price}]
total_amount DECIMAL(10,2),
delivery_fee DECIMAL(10,2) DEFAULT 0,
delivery_address TEXT,
delivery_phone VARCHAR(11),
estimated_delivery TIMESTAMP,
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT NOW()
);5.4 验收标准
- 商品展示清晰(大图+价格+单位)
- 购物车增删改查正常
- 满30元免配送费,否则收5元
- 订单实时状态更新
6. 新手引导
6.1 交互流程
首次打开APP → 3张引导卡片(可跳过)
├── 卡片1: "发现身边的好活动" + 活动截图
├── 卡片2: "AI管家,一句话搞定" + AI管家截图
└── 卡片3: "便捷生活服务" + 服务截图
↓
首次进入首页 → 高亮引导浮层(逐步指引)
├── Step 1: "点这里搜索活动" → 高亮搜索栏
├── Step 2: "这是AI管家入口" → 高亮底部Tab
└── Step 3: "这是服务入口" → 高亮服务Tab7. 分享功能
7.1 活动分享到微信
活动详情页 → 右上角分享按钮
↓
选择:微信好友 / 朋友圈
↓
生成分享卡片:
┌────────────────────────┐
│ 🏃 太极晨练·人民公园 │
│ 4月3日 7:00 还剩4个名额│
│ 来「伴享」一起参加吧! │
│ [伴享APP logo] │
└────────────────────────┘
↓
接收者点击 → H5落地页(含下载引导)7.2 验收标准
- 微信分享卡片展示正确
- H5落地页可查看活动详情
- 引导下载APP
8. V1.1验收标准总表
| 指标 | 目标值 | 判定 |
|---|---|---|
| 注册用户 | ≥2000 | 必达 |
| 社区队长 | ≥20人 | 必达 |
| 会员付费率 | >5% | 必达 |
| 7日留存率 | >50% | 必达 |
| 家政服务订单 | >50单/月 | 目标 |
| 配送服务订单 | >100单/月 | 目标 |
| 分享率 | >10%用户 | 目标 |
| NPS | >40 | 目标 |
进入V1.2的Gate条件
- 所有"必达"指标达标
- 社区队长运营SOP建立
- 商家合作流程跑通
- V1.2需求评审通过
文档结束
来源:PRD-V1.2-功能丰富版.md
slug: prd-v1-2-feature-rich
「伴享」PRD V1.2 — 功能丰富版
版本: V1.2
目标: V1.1后4周上线,5000人规模,健康管理+子女端+3个新服务
发布时间: 2026年5月下旬
前置条件: V1.1 Gate条件达标
1. 版本概述
1.1 核心目标
| 维度 | 目标 | 衡量指标 |
|---|---|---|
| 用户规模 | 5000注册用户 | 注册≥5000 |
| 子女覆盖 | 子女端1000+用户 | 小程序用户≥1000 |
| 健康数据 | 手环接入用户>500 | 健康数据活跃 |
| 月活 | 1500+月活 | MAU≥1500 |
| 服务扩展 | 总计6个服务板块 | 新增候鸟/文教/设备 |
1.2 新增功能清单
| 模块 | 功能 | 优先级 | 开发周期 |
|---|---|---|---|
| 健康管理 | 手环接入/数据展示/异常报警/周报 | P0 | 2周 |
| 子女端小程序 | 活动查看/健康数据/代办/代付 | P0 | 2周 |
| 内容社区 | 朋友圈/话题广场 | P1 | 1周 |
| 候鸟养老 | 旅居产品/短期度假 | P1 | 1周 |
| 文化教育 | 老年大学/兴趣班 | P1 | 1周 |
| 智能设备 | 设备商城/配对绑定 | P2 | 1周 |
2. 健康管理模块
2.1 需求描述
接入华为/小米智能手环手表,自动采集步数、心率、血压、血糖、睡眠数据,建立电子健康档案,数据可视化展示,异常情况自动报警通知子女。
重要声明:本模块为健康记录工具,所有数据仅供参考,不构成医疗诊断。
2.2 用户故事
- US-HM.1: 作为用户,我希望手环数据自动同步到APP,不用手动录入
- US-HM.2: 作为用户,我希望看到清晰的健康趋势图(血压/心率/步数)
- US-HM.3: 作为子女,我希望父母血压异常时能收到通知
- US-HM.4: 作为用户,我希望每周收到健康总结报告
2.3 功能详情
2.3.1 设备绑定
支持设备(MVP阶段):
- 华为手环系列(Band 8/9)
- 华为手表系列(GT 4/5)
- 小米手环系列(Band 8/9)
- 小米手表系列
绑定流程:
健康管理 → 绑定设备 → 选择品牌
↓
华为:通过华为健康API OAuth授权
小米:通过小米运动API OAuth授权
↓
授权成功 → 自动同步历史7天数据
↓
设置同步频率:每30分钟/每小时/手动2.3.2 健康数据看板
┌──────────────────────────────────┐
│ ❤️ 我的健康 │
│ 2026年4月20日 周一 │
├──────────────────────────────────┤
│ 今日概览 │
│ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │
│ │🚶 │ │❤️ │ │💤 │ │🩸 │ │
│ │步数 │ │心率 │ │睡眠 │ │血压 │ │
│ │6,842│ │72 │ │7.2h│ │正常 │ │
│ └────┘ └────┘ └────┘ └────┘ │
├──────────────────────────────────┤
│ 血压趋势(近7天) │
│ ┌────────────────────────────┐ │
│ │ 140─╮ │ │
│ │ 130─│─╮ ╭─╮ │ │
│ │ 120─╰─╯─╮─╭╯ ╰─╮─● │ │
│ │ 80─────╰╯──────╰── │ │
│ │ 周一 二 三 四 五 六 日 │ │
│ └────────────────────────────┘ │
│ 收缩压: 125 mmHg 舒张压: 82 │
│ 状态: ✅ 正常范围 │
├──────────────────────────────────┤
│ 本周报告 → │
│ 异常预警设置 → │
│ 健康档案 → │
└──────────────────────────────────┘2.3.3 异常预警
| 指标 | 正常范围 | 预警阈值 | 动作 |
|---|---|---|---|
| 收缩压 | 90-140 mmHg | >150 或 <85 | Push通知+子女通知 |
| 舒张压 | 60-90 mmHg | >100 或 <55 | Push通知+子女通知 |
| 心率 | 60-100 bpm | >120 或 <50 | Push通知+子女通知+建议就医 |
| 血糖 | 3.9-6.1 mmol/L | >7.0 或 <3.5 | Push通知+子女通知 |
| 步数 | >3000步/天 | 连续3天<1000 | 关怀提醒 |
| 睡眠 | 6-9小时 | <4小时或>11小时 | 关怀提醒 |
预警流程:
数据同步 → 异常检测引擎
├── 达到预警阈值
│ ├── Push通知用户:"您的血压偏高(155/95),建议休息并测量"
│ ├── 通知子女端:"父/母血压异常(155/95),请关注"
│ └── 记录预警日志
└── 正常 → 不通知2.3.4 每周健康报告
每周一生成上周健康报告,Push通知用户和子女:
📊 张阿姨的健康周报(4.14-4.20)
✅ 步数:平均6,200步/天(目标6,000 ✓)
⚠️ 血压:平均128/83,周三偏高(142/92)
✅ 心率:平均72bpm,范围正常
✅ 睡眠:平均7.1小时,质量良好
💡 建议:
1. 血压偶有波动,建议减少盐分摄入
2. 步数达标,继续保持!
3. 周末可适当增加户外活动
⚠️ 以上仅供参考,不构成医疗建议2.4 数据结构
-- 设备绑定表
CREATE TABLE health_devices (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
brand VARCHAR(20) NOT NULL, -- huawei/xiaomi
device_model VARCHAR(50),
device_id VARCHAR(100),
auth_token TEXT, -- 加密存储
refresh_token TEXT,
sync_interval INTEGER DEFAULT 60, -- 分钟
last_sync_at TIMESTAMP,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- 健康数据表(时序数据)
CREATE TABLE health_records (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
record_type VARCHAR(20) NOT NULL, -- steps/heart_rate/blood_pressure/blood_sugar/sleep
value JSONB NOT NULL, -- 灵活存储不同类型数据
recorded_at TIMESTAMP NOT NULL,
source VARCHAR(20), -- device/manual
created_at TIMESTAMP DEFAULT NOW()
);
-- 分区索引(按用户和时间查询)
CREATE INDEX idx_health_user_type_time
ON health_records(user_id, record_type, recorded_at DESC);
-- value字段示例:
-- steps: {"count": 6842}
-- heart_rate: {"bpm": 72}
-- blood_pressure: {"systolic": 125, "diastolic": 82}
-- blood_sugar: {"mmol": 5.8, "timing": "fasting"}
-- sleep: {"duration_hours": 7.2, "deep_hours": 2.1, "light_hours": 4.5, "rem_hours": 0.6}
-- 预警记录表
CREATE TABLE health_alerts (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
alert_type VARCHAR(50),
record_id BIGINT REFERENCES health_records(id),
value JSONB,
threshold JSONB,
notified_user BOOLEAN DEFAULT FALSE,
notified_family BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
-- 健康报告表
CREATE TABLE health_reports (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
report_type VARCHAR(20) DEFAULT 'weekly',
period_start DATE,
period_end DATE,
content JSONB,
created_at TIMESTAMP DEFAULT NOW()
);2.5 API接口
POST /api/v1/health/devices/bind
{
"brand": "huawei",
"authCode": "xxx" // OAuth回调code
}GET /api/v1/health/dashboard
{
"today": {
"steps": 6842,
"heartRate": { "current": 72, "min": 58, "max": 98 },
"bloodPressure": { "systolic": 125, "diastolic": 82, "status": "normal" },
"sleep": { "duration": 7.2, "quality": "good" }
},
"trends": {
"bloodPressure": [
{ "date": "2026-04-14", "systolic": 128, "diastolic": 83 },
{ "date": "2026-04-15", "systolic": 132, "diastolic": 85 }
]
},
"alerts": []
}GET /api/v1/health/reports/weekly
Query: week=2026-W162.6 验收标准
- 华为/小米手环成功绑定和数据同步
- 健康看板数据展示正确
- 趋势图展示近7/30天数据
- 异常预警5分钟内通知用户和子女
- 每周一自动生成周报
- 所有健康数据单独加密存储
- 页面标注"仅供参考,不构成医疗建议"
3. 子女端小程序
3.1 需求描述
微信小程序,子女通过扫码绑定父母账号后,可查看父母活动、健康数据、代办服务、代付会员。
3.2 用户故事
- US-CW.1: 作为子女,我希望知道父母今天参加了什么活动
- US-CW.2: 作为子女,我希望看到父母的血压心率数据
- US-CW.3: 作为子女,我希望帮父母预约挂号
- US-CW.4: 作为子女,我希望帮父母续费会员
3.3 功能模块
子女端小程序
├── 首页(父母状态概览)
│ ├── 今日健康数据卡片
│ ├── 最近活动记录
│ └── 预警通知列表
├── 健康
│ ├── 实时数据
│ ├── 趋势图
│ └── 历史周报
├── 活动
│ ├── 参与的活动列表
│ └── 活动详情(地点/时间/参与者)
├── 代办
│ ├── 帮父母挂号
│ ├── 帮父母预约家政
│ └── 帮父母购物
├── 我的
│ ├── 绑定的父母列表
│ ├── 帮父母充值会员
│ └── 消息通知设置3.4 交互流程
绑定流程
子女打开小程序 → 微信一键登录
↓
输入父母分享的邀请码 / 扫描二维码
↓
确认绑定信息(显示父母昵称头像)
↓
绑定成功 → 进入首页首页
┌──────────────────────────────────┐
│ 👵 妈妈 · 张阿姨 │
│ 在线 · 今日步数 6,842 │
├──────────────────────────────────┤
│ ❤️ 健康状态 │
│ 血压 125/82 ✅ 心率 72 ✅ │
│ 睡眠 7.2h ✅ 步数 6842 ✅ │
│ [查看详情 →] │
├──────────────────────────────────┤
│ 📅 最近活动 │
│ 4/20 太极晨练·人民公园 ✓已签到 │
│ 4/22 茶话会·宽窄巷子 报名中 │
│ [查看全部 →] │
├──────────────────────────────────┤
│ 🔔 消息 │
│ 暂无预警,一切正常 ✅ │
├──────────────────────────────────┤
│ [帮妈妈挂号] [帮妈妈续会员] │
└──────────────────────────────────┘3.5 数据结构
-- 子女用户表(微信小程序)
CREATE TABLE child_users (
id BIGSERIAL PRIMARY KEY,
wx_openid VARCHAR(50) UNIQUE NOT NULL,
wx_unionid VARCHAR(50),
nickname VARCHAR(50),
avatar_url TEXT,
phone VARCHAR(11),
created_at TIMESTAMP DEFAULT NOW()
);
-- 子女-父母关联表
CREATE TABLE child_parent_links (
id BIGSERIAL PRIMARY KEY,
child_id BIGINT REFERENCES child_users(id),
parent_user_id BIGINT REFERENCES users(id),
relationship VARCHAR(20) DEFAULT 'child', -- child/daughter/son
notification_enabled BOOLEAN DEFAULT TRUE,
alert_phone VARCHAR(11),
linked_at TIMESTAMP DEFAULT NOW(),
UNIQUE(child_id, parent_user_id)
);3.6 API接口(子女端)
GET /api/v1/child/parents/:parentId/overview
{
"parent": {
"nickname": "张阿姨",
"avatar": "...",
"lastOnline": "2026-04-20T08:30:00Z"
},
"health": {
"steps": 6842,
"bloodPressure": { "systolic": 125, "diastolic": 82, "status": "normal" },
"heartRate": 72,
"sleep": 7.2
},
"recentActivities": [
{ "id": 1, "title": "太极晨练", "date": "2026-04-20", "status": "signed_in" }
],
"alerts": [],
"membershipExpires": "2027-04-20"
}POST /api/v1/child/parents/:parentId/proxy-order
{
"orderType": "appointment",
"data": {
"hospitalId": 1,
"departmentId": 3,
"doctorId": 1,
"slotDate": "2026-04-25",
"slotTime": "09:00"
}
}3.7 验收标准
- 微信扫码5秒内完成绑定
- 健康数据实时同步(延迟<5分钟)
- 预警通知30秒内到达子女端
- 代办功能正确创建订单
- 支持绑定多位父母
- 小程序加载 < 2秒
4. 内容社区
4.1 朋友圈
功能:
- 发布图文动态(最多9张图+500字文字)
- 点赞、评论
- 仅展示好友和同城动态
- 内容审核(敏感词+图片鉴黄)
4.2 话题广场
功能:
- 预设话题:#今日晨练 #养生食谱 #退休生活 #带孙记
- 用户可创建话题
- 话题热度排行
4.3 数据结构
-- 动态表
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
content TEXT,
images TEXT[],
topic_id BIGINT,
location VARCHAR(100),
like_count INTEGER DEFAULT 0,
comment_count INTEGER DEFAULT 0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- 点赞表
CREATE TABLE post_likes (
id BIGSERIAL PRIMARY KEY,
post_id BIGINT REFERENCES posts(id),
user_id BIGINT REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(post_id, user_id)
);
-- 评论表
CREATE TABLE post_comments (
id BIGSERIAL PRIMARY KEY,
post_id BIGINT REFERENCES posts(id),
user_id BIGINT REFERENCES users(id),
content TEXT,
reply_to_id BIGINT REFERENCES post_comments(id),
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- 话题表
CREATE TABLE topics (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE,
description TEXT,
post_count INTEGER DEFAULT 0,
is_official BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);4.4 验收标准
- 发布动态流程 < 1分钟
- 图片上传支持压缩(<2MB/张)
- 内容审核延迟 < 5秒
- 点赞/评论实时更新
5. 新增3个服务板块
5.1 候鸟养老
| 产品类型 | 价格区间 | 合作方 | 佣金 |
|---|---|---|---|
| 旅居短租(攀枝花/三亚/大理) | 2000-5000元/月 | 养老社区/民宿 | 8% |
| 短期度假(5-7天) | 1000-3000元/次 | 旅行社 | 10% |
| 候鸟团(含交通+住宿+活动) | 3000-8000元/人 | 旅行社 | 10% |
5.2 文化教育
| 服务 | 价格 | 合作方 |
|---|---|---|
| 老年大学课程(书法/摄影/绘画) | 200-500元/期 | 老年大学/培训机构 |
| 兴趣班(太极/舞蹈/合唱) | 100-300元/月 | 文化馆/私人教练 |
| 线上讲座(健康/防诈/数码) | 免费/9.9元 | 专家/志愿者 |
5.3 智能设备商城
| 设备 | 价格区间 | 佣金 |
|---|---|---|
| 健康手环(华为/小米) | 200-500元 | 5-8% |
| 智能血压计 | 200-400元 | 8% |
| 智能药盒 | 100-300元 | 10% |
| 紧急呼叫器 | 100-200元 | 10% |
5.4 数据结构
-- 通用服务产品表(候鸟养老/文化教育/智能设备共用)
CREATE TABLE service_products (
id BIGSERIAL PRIMARY KEY,
provider_id BIGINT REFERENCES service_providers(id),
category VARCHAR(50), -- travel/education/device
subcategory VARCHAR(50),
title VARCHAR(200),
description TEXT,
images TEXT[],
price DECIMAL(10,2),
price_unit VARCHAR(20), -- 元/月、元/期、元/个
commission_rate DECIMAL(4,2),
location VARCHAR(100),
available_from DATE,
available_to DATE,
stock INTEGER,
sales_count INTEGER DEFAULT 0,
rating DECIMAL(2,1) DEFAULT 5.0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);6. V1.2验收标准总表
| 指标 | 目标值 | 判定 |
|---|---|---|
| 注册用户 | ≥5000 | 必达 |
| 月活用户 | ≥1500 | 必达 |
| 子女端用户 | ≥1000 | 必达 |
| 手环绑定用户 | ≥500 | 目标 |
| 健康预警准确率 | >95% | 必达 |
| 子女端NPS | >40 | 目标 |
| 内容社区日发帖 | >50条 | 目标 |
| 新增服务板块上线 | 3个 | 必达 |
进入V2.0的Gate条件
- 核心指标达标
- 健康数据安全审计通过
- 子女端体验满意度>80%
- 商家合作模式验证成功
文档结束
来源:PRD-V2.0-完整产品.md
slug: prd-v2-0-full-product
「伴享」PRD V2.0 — 完整产品版
版本: V2.0
目标: V1.2后6周上线,10000用户,100+商家入驻,月收入10万+,完整商业化
发布时间: 2026年7月
前置条件: V1.2 Gate条件达标
1. 版本概述
1.1 核心目标
| 维度 | 目标 | 衡量指标 |
|---|---|---|
| 用户规模 | 10000注册 | 注册≥10000 |
| 商家生态 | 100+商家入驻 | 入驻≥100家 |
| 月收入 | 10万+ | GMV≥100万 |
| 服务完整 | 全部9个板块 | 上线9/9 |
| 覆盖范围 | 成都5个区 | 武侯/青羊/锦江/成华/金牛 |
1.2 新增功能清单
| 模块 | 功能 | 优先级 | 开发周期 |
|---|---|---|---|
| 商家后台(Web) | 注册/认证/服务管理/订单/数据/结算 | P0 | 3周 |
| 康养护理 | 居家护理/康复/心理咨询 | P0 | 1周 |
| 金融理财 | 适老理财信息/保险咨询(合规展示) | P1 | 1周 |
| 法律服务 | 遗嘱咨询/权益保护 | P1 | 1周 |
| 积分系统 | 签到积分/消费积分/积分兑换 | P1 | 1周 |
| 优惠券 | 平台券/商家券/新人券 | P1 | 0.5周 |
| 拼团活动 | 活动拼团/服务拼团 | P2 | 1周 |
| 线上课程 | 老年大学直播/录播课 | P2 | 1周 |
2. 商家后台(Web端)
2.1 需求描述
为入驻商家提供独立的Web管理后台,支持商家自助注册、资质认证、服务发布与管理、订单处理、财务结算、数据分析。
2.2 用户故事
- US-BZ.1: 作为商家,我希望在线完成入驻申请
- US-BZ.2: 作为商家,我希望自助发布和管理服务/商品
- US-BZ.3: 作为商家,我希望实时看到订单并及时处理
- US-BZ.4: 作为商家,我希望了解我的客户画像和销售数据
- US-BZ.5: 作为商家,我希望收入按时结算到账
2.3 功能模块
商家后台(Web端)
├── 注册与认证
│ ├── 商家注册(企业信息+联系人)
│ ├── 资质上传(营业执照+行业许可证)
│ └── 平台审核(1-3个工作日)
├── 服务管理
│ ├── 服务/商品发布(标题/描述/价格/图片)
│ ├── 服务列表管理(上下架/编辑/删除)
│ ├── 库存管理(实物商品)
│ └── 排班管理(服务类商家)
├── 订单管理
│ ├── 订单列表(待处理/进行中/已完成/已取消)
│ ├── 订单详情(用户信息脱敏/服务内容/金额)
│ ├── 确认/拒绝订单
│ └── 退款处理
├── 财务结算
│ ├── 收入明细(佣金扣除后)
│ ├── 月度结算单
│ ├── 提现到银行卡(T+7结算)
│ └── 发票管理
├── 数据看板
│ ├── 核心指标(订单量/收入/评价/复购率)
│ ├── 用户画像(年龄/性别/区域分布)
│ ├── 热销服务TOP10
│ └── 趋势图(日/周/月)
├── 店铺设置
│ ├── 店铺信息编辑
│ ├── 营业时间设置
│ └── 服务区域设置
└── 消息通知
├── 新订单提醒
├── 用户评价通知
└── 平台公告2.4 商家入驻流程
商家后台首页 → [立即入驻]
↓
Step 1: 基本信息
├── 公司名称
├── 统一社会信用代码
├── 服务类目(医疗/康养/家政/候鸟/消费/文教/金融/法律/设备)
├── 联系人姓名+手机
└── 店铺名称+简介
↓
Step 2: 资质上传
├── 营业执照(必传)
├── 行业许可证(如医疗机构执业许可证)
└── 其他资质(选传)
↓
Step 3: 确认并提交
↓
平台审核(1-3工作日)
├── 通过 → 短信+邮件通知 → 开通后台权限
└── 拒绝 → 说明原因 → 可修改后重新提交2.5 数据结构
-- 商家表
CREATE TABLE merchants (
id BIGSERIAL PRIMARY KEY,
company_name VARCHAR(200) NOT NULL,
credit_code VARCHAR(18) UNIQUE, -- 统一社会信用代码
category VARCHAR(50) NOT NULL,
store_name VARCHAR(100),
store_description TEXT,
store_logo_url TEXT,
contact_name VARCHAR(50),
contact_phone VARCHAR(11),
contact_email VARCHAR(100),
business_license_url TEXT,
industry_license_url TEXT,
other_licenses TEXT[],
address TEXT,
lat DECIMAL(10,7),
lng DECIMAL(10,7),
service_area TEXT[], -- 服务区域列表
business_hours JSONB, -- {"mon":{"open":"09:00","close":"18:00"}, ...}
annual_fee DECIMAL(10,2) DEFAULT 0,
commission_rate DECIMAL(4,2),
level VARCHAR(20) DEFAULT 'normal'
CHECK (level IN ('normal', 'certified', 'strategic')),
rating DECIMAL(2,1) DEFAULT 5.0,
rating_count INTEGER DEFAULT 0,
total_orders INTEGER DEFAULT 0,
total_revenue DECIMAL(12,2) DEFAULT 0,
status VARCHAR(20) DEFAULT 'pending'
CHECK (status IN ('pending', 'active', 'suspended', 'closed')),
approved_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 商家账户表(登录)
CREATE TABLE merchant_accounts (
id BIGSERIAL PRIMARY KEY,
merchant_id BIGINT REFERENCES merchants(id),
phone VARCHAR(11) UNIQUE NOT NULL,
password_hash VARCHAR(100),
role VARCHAR(20) DEFAULT 'owner',
last_login_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
-- 商家服务/商品表
CREATE TABLE merchant_services (
id BIGSERIAL PRIMARY KEY,
merchant_id BIGINT REFERENCES merchants(id),
title VARCHAR(200) NOT NULL,
category VARCHAR(50),
subcategory VARCHAR(50),
description TEXT,
images TEXT[],
price DECIMAL(10,2),
original_price DECIMAL(10,2),
price_unit VARCHAR(20),
stock INTEGER,
service_duration VARCHAR(50), -- 服务时长
is_online BOOLEAN DEFAULT TRUE,
sort_order INTEGER DEFAULT 0,
sales_count INTEGER DEFAULT 0,
rating DECIMAL(2,1) DEFAULT 5.0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 商家结算表
CREATE TABLE merchant_settlements (
id BIGSERIAL PRIMARY KEY,
merchant_id BIGINT REFERENCES merchants(id),
period_start DATE,
period_end DATE,
total_orders INTEGER,
gross_amount DECIMAL(12,2),
commission_amount DECIMAL(12,2),
net_amount DECIMAL(12,2),
bank_account JSONB, -- 银行账户信息(加密)
status VARCHAR(20) DEFAULT 'pending'
CHECK (status IN ('pending', 'confirmed', 'paid')),
paid_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
-- 商家数据日报表
CREATE TABLE merchant_daily_stats (
id BIGSERIAL PRIMARY KEY,
merchant_id BIGINT REFERENCES merchants(id),
stat_date DATE,
page_views INTEGER DEFAULT 0,
unique_visitors INTEGER DEFAULT 0,
order_count INTEGER DEFAULT 0,
revenue DECIMAL(10,2) DEFAULT 0,
avg_rating DECIMAL(2,1),
new_reviews INTEGER DEFAULT 0,
UNIQUE(merchant_id, stat_date)
);2.6 API接口(商家端)
POST /api/v1/merchant/register
{
"companyName": "成都XX家政服务有限公司",
"creditCode": "91510100XXXXXXXX",
"category": "housekeeping",
"storeName": "XX家政",
"contactName": "王经理",
"contactPhone": "13800138001",
"businessLicense": "base64..."
}GET /api/v1/merchant/dashboard
{
"overview": {
"todayOrders": 12,
"todayRevenue": 2400,
"monthOrders": 156,
"monthRevenue": 31200,
"avgRating": 4.8,
"pendingOrders": 3
},
"trends": {
"daily": [
{ "date": "2026-07-01", "orders": 8, "revenue": 1600 }
]
},
"topServices": [
{ "id": 1, "title": "钟点保洁", "orders": 45, "revenue": 9000 }
]
}POST /api/v1/merchant/services
{
"title": "钟点保洁",
"category": "housekeeping",
"subcategory": "cleaning",
"description": "专业保洁阿姨上门服务",
"price": 50,
"priceUnit": "元/小时",
"images": ["base64..."],
"serviceDuration": "2-4小时"
}GET /api/v1/merchant/orders
Query: status=pending|confirmed|completed|cancelled&page=1&pageSize=20POST /api/v1/merchant/orders/:id/confirm POST /api/v1/merchant/orders/:id/reject
GET /api/v1/merchant/settlements
Query: month=2026-072.7 验收标准
- 商家自助注册到审核通过全流程跑通
- 服务发布后C端可见
- 订单实时推送(WebSocket)
- 数据看板数据准确,延迟<1小时
- 结算T+7到账
- Web端兼容Chrome/Safari/Edge
3. 补全剩余服务板块
3.1 康养护理
| 服务 | 价格 | 佣金 | 合作方 |
|---|---|---|---|
| 居家护理(专业护工) | 200-400元/天 | 10% | 护理机构 |
| 康复训练(上门) | 150-300元/次 | 12% | 康复中心 |
| 心理咨询(线上/线下) | 200-500元/次 | 8% | 心理咨询师 |
3.2 金融理财(合规展示)
重要:平台仅提供信息展示,不销售金融产品,不提供投资建议。
| 内容 | 形式 | 合规要求 |
|---|---|---|
| 适老理财产品信息 | 信息列表+跳转银行官网 | 持牌机构+风险提示 |
| 保险产品咨询 | 预约咨询+信息展示 | 持牌保险公司+免责声明 |
| 金融防诈知识 | 文章/视频 | 权威来源 |
3.3 法律服务
| 服务 | 价格 | 佣金 |
|---|---|---|
| 遗嘱咨询 | 500-2000元/次 | 10% |
| 权益保护咨询 | 200-500元/次 | 10% |
| 法律文书代写 | 1000-5000元/份 | 8% |
4. 积分系统
4.1 积分获取
| 行为 | 积分 | 每日上限 |
|---|---|---|
| 每日签到 | 5分 | 5分 |
| 连续签到7天 | 额外20分 | - |
| 参加活动 | 10分/次 | 30分 |
| 发布动态 | 5分/条 | 15分 |
| 消费(每1元) | 1分 | 无上限 |
| 邀请新用户 | 50分/人 | 200分 |
| 评价服务 | 3分/次 | 15分 |
4.2 积分兑换
| 商品 | 所需积分 |
|---|---|
| 会员月卡优惠券(5元) | 200分 |
| 服务折扣券(9折) | 500分 |
| 实物礼品(水杯/毛巾等) | 1000-3000分 |
| 活动优先权 | 300分 |
4.3 数据结构
-- 积分账户表
CREATE TABLE point_accounts (
user_id BIGINT PRIMARY KEY REFERENCES users(id),
total_points INTEGER DEFAULT 0,
available_points INTEGER DEFAULT 0,
used_points INTEGER DEFAULT 0,
expired_points INTEGER DEFAULT 0,
updated_at TIMESTAMP DEFAULT NOW()
);
-- 积分流水表
CREATE TABLE point_transactions (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
type VARCHAR(20), -- earn/use/expire
action VARCHAR(50), -- sign_in/activity/spend/invite/redeem
points INTEGER,
balance INTEGER,
reference_id VARCHAR(50), -- 关联订单号等
description TEXT,
expires_at TIMESTAMP, -- 积分过期时间(获取后1年)
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_points_user_time ON point_transactions(user_id, created_at DESC);
-- 积分商品表
CREATE TABLE point_products (
id BIGSERIAL PRIMARY KEY,
title VARCHAR(100),
description TEXT,
image_url TEXT,
points_required INTEGER,
stock INTEGER,
category VARCHAR(20), -- coupon/gift/privilege
coupon_detail JSONB, -- 如果是优惠券,券面详情
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);5. 优惠券系统
5.1 券类型
| 类型 | 说明 | 发放场景 |
|---|---|---|
| 新人券 | 新注册用户获10元无门槛券 | 注册完成 |
| 满减券 | 满50减5 / 满100减10 | 活动发放/积分兑换 |
| 服务折扣券 | 指定服务9折 | 会员权益/活动 |
| 商家券 | 商家自行发放 | 商家后台配置 |
5.2 数据结构
-- 优惠券模板
CREATE TABLE coupon_templates (
id BIGSERIAL PRIMARY KEY,
title VARCHAR(100),
type VARCHAR(20), -- amount/discount/service
value DECIMAL(10,2), -- 金额或折扣率
min_amount DECIMAL(10,2), -- 最低消费
applicable_categories TEXT[], -- 适用类目
merchant_id BIGINT, -- 商家券关联商家
total_count INTEGER,
issued_count INTEGER DEFAULT 0,
valid_days INTEGER, -- 领取后有效天数
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- 用户优惠券
CREATE TABLE user_coupons (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
template_id BIGINT REFERENCES coupon_templates(id),
status VARCHAR(20) DEFAULT 'available',
used_order_no VARCHAR(20),
expires_at TIMESTAMP,
used_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);6. 拼团活动
6.1 需求描述
用户发起拼团,邀请好友一起参加活动或购买服务,达到成团人数后享受优惠价。
场景示例:
- 3人成团参加书法班,每人优惠30元
- 5人成团预约候鸟养老旅居,每人优惠200元
6.2 数据结构
CREATE TABLE group_buy_campaigns (
id BIGSERIAL PRIMARY KEY,
service_id BIGINT REFERENCES merchant_services(id),
original_price DECIMAL(10,2),
group_price DECIMAL(10,2),
min_members INTEGER DEFAULT 3,
max_members INTEGER DEFAULT 10,
valid_hours INTEGER DEFAULT 24,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE group_buy_orders (
id BIGSERIAL PRIMARY KEY,
campaign_id BIGINT REFERENCES group_buy_campaigns(id),
initiator_id BIGINT REFERENCES users(id),
current_members INTEGER DEFAULT 1,
status VARCHAR(20) DEFAULT 'pending', -- pending/success/failed/expired
expires_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE group_buy_members (
id BIGSERIAL PRIMARY KEY,
group_order_id BIGINT REFERENCES group_buy_orders(id),
user_id BIGINT REFERENCES users(id),
order_no VARCHAR(20),
joined_at TIMESTAMP DEFAULT NOW(),
UNIQUE(group_order_id, user_id)
);7. 线上课程
7.1 功能
- 直播课:老年大学教师在线授课(接入腾讯云直播SDK)
- 录播课:历史课程回放
- 课程分类:健康养生/书法绘画/数码技能/防诈知识
- 课程评价和收藏
7.2 数据结构
CREATE TABLE courses (
id BIGSERIAL PRIMARY KEY,
title VARCHAR(200),
category VARCHAR(50),
instructor_name VARCHAR(50),
instructor_avatar TEXT,
description TEXT,
cover_image TEXT,
type VARCHAR(20), -- live/recorded
video_url TEXT, -- 录播URL
live_room_id VARCHAR(50), -- 直播间ID
scheduled_at TIMESTAMP, -- 直播时间
duration_minutes INTEGER,
price DECIMAL(10,2) DEFAULT 0, -- 0=免费
enrollment_count INTEGER DEFAULT 0,
rating DECIMAL(2,1) DEFAULT 5.0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE course_enrollments (
id BIGSERIAL PRIMARY KEY,
course_id BIGINT REFERENCES courses(id),
user_id BIGINT REFERENCES users(id),
progress DECIMAL(5,2) DEFAULT 0, -- 观看进度百分比
completed BOOLEAN DEFAULT FALSE,
enrolled_at TIMESTAMP DEFAULT NOW(),
UNIQUE(course_id, user_id)
);8. V2.0验收标准总表
| 指标 | 目标值 | 判定 |
|---|---|---|
| 注册用户 | ≥10000 | 必达 |
| 月活用户 | ≥3000 | 必达 |
| 入驻商家 | ≥100家 | 必达 |
| 月收入 | ≥10万元 | 必达 |
| 服务板块 | 9个全部上线 | 必达 |
| 会员付费率 | >8% | 必达 |
| 覆盖区域 | 成都5个区 | 必达 |
| 商家满意度 | >80% | 目标 |
| 用户NPS | >50 | 目标 |
9. 后续规划
V2.0完成后,产品进入成熟运营阶段,后续重点:
- V2.1: AI管家2.0(更多Agent能力:自动缴费、叫车)
- V2.2: 商家SaaS工具升级(CRM、营销工具)
- V3.0: 多城市版本(重庆、昆明),区域代理系统
- V3.1: 尊享会员上线(299元/年,家庭共享)
- V4.0: 开放平台API,第三方服务接入
文档结束
来源:PRD-产品需求文档.md
slug: banxiang-prd
「伴享」银发社交平台 - 产品需求文档(PRD)
文档版本: V1.0
创建日期: 2026-02-16
负责人: 范子琪
技术团队: Codex + Claude Code
📋 文档目的
本文档定义「伴享」APP 从 MVP 到完整产品的迭代路径,每个版本明确功能范围、开发周期、验收标准,确保团队聚焦、小步快跑、快速验证。
🎯 产品定位
一句话定位: 让银发群体"不孤独、不麻烦、不掉队"的智慧生活社交平台
核心能力:
- 社交活动 - 线下小组活动,对抗孤独
- 生活服务 - 本地商家一站式服务
- AI 管家 - 语音交互,降低数字门槛
🚀 版本迭代规划总览
| 版本 | 核心目标 | 关键功能 | 周期 | 里程碑 |
|---|---|---|---|---|
| V1.0 MVP | 跑通闭环,验证模式 | 社交活动 + AI 管家 + 1个服务 | 6周 | 500人内测 |
| V1.1 | 提升体验,增加留存 | 优化交互 + 社区队长 + 2个服务 | 3周 | 2000人公测 |
| V1.2 | 丰富功能,扩大规模 | 健康管理 + 5个服务 + 子女端 | 4周 | 5000人 |
| V2.0 | 完整产品,商业化 | 全部 9 个服务 + 商家后台 | 6周 | 10000人 |
版本 V1.0 MVP(最小可行产品)
目标: 6周内上线,500人内测,验证"社交+服务+AI"模式是否成立
发布时间: 2026年4月初(开发6周)
V1.0 功能清单
✅ 必做功能(P0)
1. 用户系统(2周)
功能点:
- 手机号注册/登录(短信验证码)
- 个人资料设置
- 昵称、头像
- 出生年月(自动计算年龄)
- 性别、居住城市
- 兴趣标签(多选,最多5个)
- 预设标签:太极、晨练、书法、摄影、舞蹈、旅游、茶艺、手工、唱歌、棋牌
- 实名认证(调用第三方 API,姓名+身份证号)
- 紧急联系人(姓名+手机号,用于活动安全)
- 子女账号关联(生成6位邀请码,子女扫码绑定)
适老化设计要求:
- 字体最小 18sp,可调至 24sp
- 表单输入框大(最小高度 56dp)
- 每页最多 3 个输入项,避免信息过载
- 支持语音输入(调用系统语音识别)
验收标准:
- 注册流程 < 3 分钟
- 70岁老人能独立完成(或在子女协助下完成)
2. 社交活动模块(4周)— 核心差异化
功能点:
2.1 活动发现(首页)
- 活动列表
- 显示:活动名称、时间、地点、人数(已报名/总人数)、距离
- 排序:默认按时间排序,可切换"离我最近"
- 筛选:全部/今天/明天/本周
- 活动分类标签
- 晨练、太极、茶话会、书法、摄影、舞蹈、户外徒步、手工、唱歌、棋牌
- 智能推荐(基于兴趣标签 + 地理位置)
- 算法:标签匹配度 60% + 距离权重 40%
- 首页顶部展示 3 个推荐活动(卡片样式)
2.2 活动详情页
- 活动信息展示
- 标题、封面图(可选)
- 时间、地点(显示地图)
- 人数限制、已报名人数
- 活动描述(支持图文)
- 发起人信息(昵称、头像、年龄)
- 操作按钮
- "立即报名"(未报名)
- "取消报名"(已报名,活动开始前 2 小时可取消)
- "查看路线"(调起地图导航)
- 参与者列表(只显示昵称、头像,保护隐私)
2.3 活动创建(任何用户都可发起)
- 填写活动信息
- 活动名称(必填,20字内)
- 活动类型(单选)
- 时间选择(日期+时间,不能早于当前时间)
- 地点选择(地图选点 或 搜索地址)
- 限制:只能选公共场所(公园、茶馆、社区中心、广场等)
- 系统检测非公共场所时弹出提示:"为了您的安全,请选择公共场所"
- 人数限制(5-15人,默认 10 人)
- 活动描述(选填,200字内)
- 上传封面图(选填)
- 发布审核
- 自动审核:检测敏感词、地点类型
- 通过后立即上线
2.4 我的活动
- 我报名的活动(按时间排序)
- 我发起的活动
- 活动状态
- 待开始、进行中、已结束
2.5 活动签到(安全机制)
- 活动开始前 15 分钟,参与者收到提醒通知
- 活动开始后,参与者需签到
- 签到方式:GPS 位置验证(距离活动地点 < 500米)
- 未签到用户显示为"未到场"
- 紧急联系按钮
- 长按 3 秒自动拨打紧急联系人
适老化设计要求:
- 地图界面简化(只保留必要功能)
- 活动卡片大、间距宽(最小点击区域 48x48dp)
- 用大图标 + 文字标签(不只用图标)
验收标准:
- 从发现活动到报名成功 < 1 分钟
- 60岁用户能独立创建活动(通过率 > 80%)
3. AI 智能管家(3周)— 核心卖点
功能点:
3.1 语音交互入口
- 首页底部导航栏有"AI 管家"入口(中间位置,突出)
- 点击进入对话界面
- 支持文字输入 + 语音输入
- 语音按钮:大圆形按钮,按住说话,松手识别
- 语音识别:调用讯飞/百度 ASR API
- 语音播报:调用 TTS API
3.2 基础对话能力
- 接入大模型(通义千问 / 文心一言)
- 对话历史记录(保存最近 30 条)
- 支持打断(语音播报时可随时打断)
3.3 快捷指令(MVP 阶段只做 3 个)
- 附近活动
- 指令:"帮我找附近的活动" / "今天有什么活动"
- 返回:推荐 3 个活动,点击跳转详情页
- 挂号服务(调用合作医院 API)
- 指令:"我要挂号" / "帮我挂个号"
- 流程:选择医院 → 选择科室 → 选择医生 → 选择时间 → 确认支付
- 结果:发送短信提醒,生成订单
- 生鲜配送(对接合作商家)
- 指令:"我要买菜" / "帮我订菜"
- 流程:展示商家清单 → 选择商品 → 填写地址 → 确认支付
- 结果:订单生成,配送上门
适老化设计要求:
- 对话气泡字体大(16-18sp)
- AI 回复简洁(每条 < 100 字)
- 语音播报速度可调(慢速模式)
验收标准:
- 语音识别准确率 > 90%(普通话)
- 快捷指令成功率 > 85%
- 从语音提问到得到结果 < 30 秒
4. 生活服务(只做 1 个板块,3周)
MVP 阶段只做医疗健康板块(最刚需)
4.1 医疗健康服务
- 在线挂号
- 接入 2-3 家成都本地医院(利用合伙人资源)
- 流程:选医院 → 选科室 → 选医生 → 选时间 → 支付
- 订单管理:查看订单、取消挂号(提前 1 天可退)
- 在线问诊(文字咨询,非视频)
- 对接 1-2 个医生
- 流程:描述病情 → 上传照片(可选) → 医生回复
- 收费:19.9 元/次
- 订单记录
- 查看历史订单
- 订单状态:待支付、已预约、已完成、已取消
适老化设计要求:
- 医生头像、科室图标大
- 流程简化(最多 3 步)
- 支付前二次确认(防误操作)
验收标准:
- 挂号成功率 > 95%
- 问诊响应时间 < 2 小时
5. 支付系统(2周)
功能点:
- 接入微信支付
- 接入支付宝(可选,优先微信)
- 订单管理
- 查看订单列表(按时间倒序)
- 订单详情:商品/服务、金额、状态、时间
- 订单状态:待支付、已支付、已完成、已取消、已退款
- 退款功能
- 符合条件的订单可申请退款
- 退款审核(人工审核,1-3 个工作日)
MVP 阶段不做:
- ❌ 会员订阅(V1.1 再做)
- ❌ 积分系统
- ❌ 优惠券
验收标准:
- 支付成功率 > 99%
- 支付流程 < 1 分钟
🔶 不做的功能(留到后续版本)
V1.0 明确不做:
- ❌ 社区队长体系(V1.1)
- ❌ 健康管理(手环接入)(V1.2)
- ❌ 内容社区(朋友圈)(V1.2)
- ❌ 子女端小程序(V1.2)
- ❌ 商家后台(V2.0)
- ❌ 会员订阅(V1.1)
- ❌ 其他 8 个服务板块(V1.1-V2.0 逐步加)
V1.0 技术方案
架构设计
┌─────────────────────────────────────────┐
│ Flutter APP(iOS + Android) │
├─────────────────────────────────────────┤
│ 用户系统 │ 活动模块 │ AI管家 │ 医疗服务 │
└────────────────┬────────────────────────┘
│ HTTPS API
┌────────────────▼────────────────────────┐
│ Node.js + Express 后端 │
├─────────────────────────────────────────┤
│ 用户服务 │ 活动服务 │ AI服务 │ 支付服务 │
└────────────────┬────────────────────────┘
│
┌────────────────▼────────────────────────┐
│ PostgreSQL(用户/活动/订单数据) │
│ Redis(会话/缓存) │
│ OSS(图片/文件存储) │
└─────────────────────────────────────────┘技术栈确认
| 层级 | 技术选型 | 理由 |
|---|---|---|
| 移动端 | Flutter 3.x | 跨平台、性能好、适老化组件丰富 |
| 后端 | Node.js 22 + Express 4.x | 我们擅长、生态成熟、AI 集成方便 |
| 数据库 | PostgreSQL 15 | 关系型数据、稳定可靠 |
| 缓存 | Redis 7.x | 高性能、会话管理 |
| 存储 | 阿里云 OSS | 图片/文件存储 |
| AI | 通义千问 API | 国产、价格低、支持语音 |
| 地图 | 高德地图 API | 国内覆盖好 |
| 支付 | 微信支付 V3 | 银发群体使用率高 |
| 短信 | 阿里云短信 | 稳定可靠 |
| 语音 | 讯飞 ASR + TTS | 识别准确率高 |
数据库设计(核心表)
用户表(users)
CREATE TABLE users (
id SERIAL PRIMARY KEY,
phone VARCHAR(11) UNIQUE NOT NULL, -- 手机号
nickname VARCHAR(50), -- 昵称
avatar_url TEXT, -- 头像
birth_year INTEGER, -- 出生年份
gender VARCHAR(10), -- 性别:male/female/other
city VARCHAR(50), -- 城市
interests TEXT[], -- 兴趣标签(数组)
real_name VARCHAR(50), -- 真实姓名(实名认证)
id_card VARCHAR(18), -- 身份证号(加密存储)
verified BOOLEAN DEFAULT FALSE, -- 是否实名认证
emergency_contact_name VARCHAR(50), -- 紧急联系人姓名
emergency_contact_phone VARCHAR(11), -- 紧急联系人电话
created_at TIMESTAMP DEFAULT NOW()
);活动表(activities)
CREATE TABLE activities (
id SERIAL PRIMARY KEY,
creator_id INTEGER REFERENCES users(id), -- 发起人
title VARCHAR(100) NOT NULL, -- 活动名称
category VARCHAR(50), -- 分类
description TEXT, -- 描述
cover_image_url TEXT, -- 封面图
location_lat DECIMAL(10, 7), -- 纬度
location_lng DECIMAL(10, 7), -- 经度
location_address TEXT, -- 详细地址
start_time TIMESTAMP NOT NULL, -- 开始时间
max_participants INTEGER DEFAULT 10, -- 人数限制
status VARCHAR(20) DEFAULT 'upcoming', -- 状态:upcoming/ongoing/finished/cancelled
created_at TIMESTAMP DEFAULT NOW()
);活动报名表(activity_participants)
CREATE TABLE activity_participants (
id SERIAL PRIMARY KEY,
activity_id INTEGER REFERENCES activities(id),
user_id INTEGER REFERENCES users(id),
signed_in BOOLEAN DEFAULT FALSE, -- 是否签到
signed_in_at TIMESTAMP, -- 签到时间
joined_at TIMESTAMP DEFAULT NOW(),
UNIQUE(activity_id, user_id)
);AI 对话记录表(ai_conversations)
CREATE TABLE ai_conversations (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
role VARCHAR(20), -- user/assistant
content TEXT,
created_at TIMESTAMP DEFAULT NOW()
);订单表(orders)
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
type VARCHAR(50), -- 类型:medical/grocery
amount DECIMAL(10, 2), -- 金额
status VARCHAR(20) DEFAULT 'pending', -- 状态:pending/paid/completed/cancelled/refunded
detail JSONB, -- 订单详情(JSON)
paid_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);V1.0 开发计划
时间表(6周,42天)
| 周次 | 任务 | 负责人 | 产出 |
|---|---|---|---|
| 第1周 | 技术准备 + 用户系统 | Codex | 后端框架、数据库、注册登录 |
| 第2周 | 活动模块(后端) | Codex | API 开发、数据库完善 |
| 第3周 | 活动模块(前端) | Codex | Flutter 界面、地图集成 |
| 第4周 | AI 管家 + 医疗服务 | Codex | 语音交互、挂号/问诊 |
| 第5周 | 支付系统 + 联调测试 | Codex | 微信支付、整体测试 |
| 第6周 | 适老化优化 + 内测准备 | Codex + Claude Code | 审阅代码、修复 bug |
每周里程碑
第1周末:
- ✅ 用户注册登录可用
- ✅ 个人资料填写完整
- ✅ 数据库表结构完成
第2周末:
- ✅ 活动创建、列表、详情 API 完成
- ✅ 报名、取消报名逻辑完成
第3周末:
- ✅ Flutter APP 能浏览活动、报名
- ✅ 地图选点、导航功能可用
第4周末:
- ✅ AI 语音交互可用
- ✅ 挂号、问诊功能可用
第5周末:
- ✅ 支付流程跑通
- ✅ 订单管理完成
第6周末:
- ✅ 内测版本提交应用商店审核
- ✅ 种子用户邀请码生成
V1.0 测试计划
内测目标
- 种子用户: 500 人(从合伙人资源中筛选)
- 测试周期: 2 周
- 反馈渠道: 微信群 + APP 内反馈按钮
测试重点
-
易用性测试(最重要)
- 60-70 岁用户能否独立完成注册
- 平均完成一次活动报名的时间
- 语音识别准确率
-
功能测试
- 活动创建、报名、签到流程
- AI 管家对话、快捷指令
- 挂号、支付流程
-
性能测试
- 页面加载速度(< 2 秒)
- 接口响应时间(< 500ms)
- 并发支持(500 人同时在线)
-
安全测试
- 个人信息加密
- 支付安全
- 实名认证
验收标准(能否进入 V1.1)
- 注册成功率 > 90%
- 日活用户 > 100 人
- 活动创建数 > 50 个
- 活动报名成功率 > 95%
- AI 对话满意度 > 80%
- 严重 bug < 5 个
- 用户留存率(7日)> 40%
版本 V1.1(体验优化版)
目标: 提升用户体验,增加留存,准备公测
发布时间: V1.0 后 3 周(2026年4月下旬)
V1.1 新增功能
1. 社区队长体系(2周)
目标: 激励活跃用户组织活动,降低运营成本
功能点:
- 队长申请机制
- 条件:组织过 3 次活动 + 好评率 > 90%
- 申请流程:填写申请表 → 平台审核(1-3天) → 授予称号
- 队长权益
- 见习队长:专属标识、活动优先推荐
- 银牌队长(20次):免费会员 1 年
- 金牌队长(50次):月度补贴 500 元
- 队长排行榜
- 按本月组织活动次数排名
- 展示前 10 名队长
2. 会员订阅系统(1周)
会员权益:
- 活动报名优先(限额活动优先)
- AI 管家无限对话(免费用户每天 20 次)
- 专属客服(1v1 微信)
- 生日礼物
定价:
- 月卡:29 元/月
- 年卡:299 元/年(省 49 元)
3. 新增 2 个服务板块(2周)
家政服务
- 保洁(钟点工)
- 维修(水电、家电)
- 陪护(陪同就医、陪聊)
日常消费
- 生鲜配送(对接 2-3 家本地商家)
- 日化用品
4. 用户体验优化
- 新手引导(首次使用时的动画引导)
- 消息推送(活动提醒、AI 关怀)
- 分享功能(活动分享到微信)
V1.1 验收标准
- 用户数达到 2000 人
- 社区队长 > 20 人
- 会员付费率 > 5%
- 7 日留存率 > 50%
版本 V1.2(功能丰富版)
目标: 丰富功能,满足更多需求,扩大规模
发布时间: V1.1 后 4 周(2026年5月下旬)
V1.2 新增功能
1. 健康管理模块(2周)
- 健康手环接入(小米、华为)
- 健康数据记录(步数、心率、睡眠)
- 健康报告(每周生成)
- 异常提醒(心率过高自动通知)
2. 内容社区(1周)
- 朋友圈(发图文、点赞、评论)
- 话题广场(#话题 形式)
3. 子女端小程序(2周)
- 查看父母活动记录
- 查看健康数据
- 远程代办服务(帮父母下单)
- 一键续费会员
4. 新增 3 个服务板块(2周)
- 候鸟养老(旅居短租)
- 文化教育(老年大学课程)
- 智能设备(健康手环、智能药盒)
V1.2 验收标准
- 用户数达到 5000 人
- 子女端用户 > 1000 人
- 月活用户 > 1500 人
版本 V2.0(完整产品)
目标: 完整功能,商业化运营,区域扩张
发布时间: V1.2 后 6 周(2026年7月)
V2.0 新增功能
1. 商家后台(Web 端)(3周)
- 商家注册、认证
- 服务发布、管理
- 订单管理、财务结算
- 数据看板(订单量、收入、用户评价)
2. 补全剩余 4 个服务板块(3周)
- 康养护理
- 金融理财(合规展示)
- 法律服务
- 其他本地生活
3. 高级功能
- 积分系统
- 优惠券
- 拼团活动
- 老年大学线上课程
V2.0 验收标准
- 用户数达到 10000 人
- 入驻商家 > 100 家
- 月收入 > 10 万元
- 覆盖成都 5 个区
附录
适老化设计规范
视觉规范
| 项目 | 标准 | 说明 |
|---|---|---|
| 字体大小 | 最小 18sp | 可调至 24sp |
| 对比度 | WCAG AAA 级 | 文字与背景对比度 > 7:1 |
| 按钮大小 | 最小 48x48dp | 易于点击 |
| 间距 | 最小 16dp | 避免误触 |
| 颜色 | 避免红绿 | 防色盲 |
交互规范
| 项目 | 标准 |
|---|---|
| 页面层级 | 最多 3 层 |
| 每页输入项 | 最多 3 个 |
| 操作反馈 | 0.5 秒内必须有反馈 |
| 错误提示 | 简单明了,避免术语 |
| 返回按钮 | 每页左上角必须有 |
| 底部导航 | 最多 5 个 Tab |
语音交互规范
| 项目 | 标准 |
|---|---|
| 识别准确率 | > 90%(普通话) |
| 播报速度 | 可调速(慢/正常/快) |
| 唤醒方式 | 点击按钮,不用语音唤醒 |
| 打断支持 | 播报时可随时打断 |
关键指标定义
用户增长指标
- 注册用户数: 完成手机号注册的用户总数
- 实名认证率: 实名认证用户 / 注册用户
- 日活用户(DAU): 每天至少打开 APP 1 次的用户数
- 月活用户(MAU): 每月至少打开 APP 1 次的用户数
留存指标
- 次日留存: 注册后第 2 天再次打开的用户比例
- 7 日留存: 注册后第 7 天再次打开的用户比例
- 30 日留存: 注册后第 30 天再次打开的用户比例
活动指标
- 活动创建数: 每天/每月创建的活动数量
- 活动报名率: 报名人数 / 活动浏览人数
- 活动完成率: 签到人数 / 报名人数
- 活动复购率: 参加过 2 次及以上活动的用户比例
商业化指标
- 会员付费率: 付费会员 / 注册用户
- ARPU: 平均每用户收入
- 订单转化率: 支付订单数 / 浏览服务的用户数
风险与对策
高风险项
| 风险 | 影响 | 对策 |
|---|---|---|
| 老年人学习成本高 | 留存率低 | 极简 UI + 线下培训 + 子女辅助 |
| 活动安全事故 | 法律风险 | 实名认证 + 公共场所限制 + 保险 |
| 商家服务质量差 | 用户投诉 | 评价体系 + 保证金 + 黑名单 |
| 医疗合规问题 | 被监管处罚 | 只做挂号/咨询,不诊断/开药 |
| 支付安全 | 资金损失 | 使用官方 SDK + 二次确认 |
中风险项
| 风险 | 影响 | 对策 |
|---|---|---|
| 竞品模仿 | 市场份额流失 | 快速迭代 + 社区运营 + 品牌建设 |
| 用户增长慢 | 无法规模化 | 利用合伙人资源 + 线下推广 |
| 技术故障 | 用户体验差 | 完善监控 + 快速响应 |
成本与收入预测
V1.0 开发成本(6周)
| 项目 | 金额(万元) |
|---|---|
| 开发人力 | 8-10 |
| UI 设计 | 0.3-0.5 |
| 服务器/云 | 1 |
| AI API | 0.5 |
| 支付/短信 | 0.3 |
| 测试补贴 | 0.5 |
| 合计 | 10.6-12.8 |
V1.0 内测期收入预测(2周,500人)
| 项目 | 单价 | 数量 | 收入(元) |
|---|---|---|---|
| 挂号服务(平台抽成 20%) | 50 × 20% = 10 | 50 单 | 500 |
| 在线问诊(平台抽成 30%) | 19.9 × 30% = 6 | 30 单 | 180 |
| 生鲜配送(平台抽成 15%) | 50 × 15% = 7.5 | 100 单 | 750 |
| 合计 | 1430 |
内测期主要目标是验证模式,不追求盈利
V1.1 公测期收入预测(1个月,2000人)
| 项目 | 单价 | 数量 | 收入(元) |
|---|---|---|---|
| 会员订阅(付费率 5%) | 299 | 100 人 | 29900 |
| 挂号服务 | 10 | 200 单 | 2000 |
| 在线问诊 | 6 | 100 单 | 600 |
| 生鲜配送 | 7.5 | 400 单 | 3000 |
| 家政服务(抽成 20%) | 100 × 20% = 20 | 50 单 | 1000 |
| 合计 | 36500 |
V2.0 稳定期收入预测(1个月,10000人)
| 项目 | 单价 | 数量 | 收入(元) |
|---|---|---|---|
| 会员订阅(付费率 8%) | 299 | 800 人 | 239200 |
| 服务交易抽成 | 平均 15 | 3000 单 | 45000 |
| 商家入驻费 | 5000 | 5 家 | 25000 |
| 广告/品牌合作 | - | - | 20000 |
| 合计 | 329200 |
预计 12 个月后实现盈亏平衡
下一步行动(本周)
立即执行
- Codex: 开始详细技术方案设计(数据库 ER 图、API 文档)
- Claude Code: 审阅本 PRD,提出补充建议
- 范总: 对接合伙人朱源惠
- 确认种子用户名单(500人)
- 确认合作医院(2-3家)
- 确认生鲜商家(2-3家)
- UI 设计师: 开始招募(预算 3-5千)
本周内完成
- 技术方案文档 V1.0
- API 接口文档 V1.0
- 数据库设计文档 V1.0
- 开发环境搭建(服务器、域名、OSS)
文档结束
版本历史:
- V1.0 (2026-02-16): 初始版本,定义 V1.0-V2.0 迭代路径
来源:STATUS.md
伴享项目状态文档
最后更新:2026-02-17 | 当前版本:v1.1.0+2
📦 版本信息
| 字段 | 内容 |
|---|---|
| 当前版本 | v1.1.2+4 |
| 发布日期 | 2026-02-17 |
| APK 文件 | banxiang-v1.1.2+4.apk |
| 测试状态 | 🔄 范总测试中(发现点击 bug,v1.1.3 修复中) |
技术栈
| 层级 | 技术 |
|---|---|
| 客户端 | Flutter 3.x |
| 后端 | Node.js |
| 数据库 | PostgreSQL(计划中) |
| 地图 | 高德地图 |
| 支付 | 微信支付 |
| 数据 | 全 mock,暂无真实后端 |
✅ 已实现功能
用户注册与登录
| 功能 | 状态 | 备注 |
|---|---|---|
| 手机号注册 | ✅ 完成 | |
| 手机号验证码登录 | ✅ 完成 | mock 实现 |
| 填写用户基本信息 | ✅ 完成 | 昵称、头像等 |
| 头像选择 | ✅ 完成(v1.1.1) | 已接入 image_picker |
| 填写兴趣爱好 | ✅ 完成 | |
| 新手设置完成进入主界面 | ✅ 完成 |
主界面
| 功能 | 状态 | 备注 |
|---|---|---|
| 底部导航栏 | ✅ 完成 | 首页 / 好友 / 发布 / 消息 / 我的 |
| 活动双列瀑布流 Feed | ✅ 完成 | 小红书风格 |
| Feed 卡片用户头像/昵称 | ✅ 完成(v1.1.1) | |
| 活动详情页 | ✅ 完成 | 轮播图 + 点赞 + 评论 |
| 发布功能 | ✅ 完成 | 图片/视频多选,最多 9 张 |
| 我的页面 | ✅ 完成(v1.1.2) | 头像/昵称/兴趣标签/编辑入口,点击响应修复中 |
| 消息页面 | ✅ 完成(v1.1.2) | mock 消息列表,点击响应修复中 |
| 好友页面 | ✅ 完成(v1.1.2) | 关注/粉丝两个 Tab |
UI / 主题
| 功能 | 状态 | 备注 |
|---|---|---|
| 橙色主题 | ✅ 完成 | #FF6B35 |
| 暖黄背景色 | ✅ 完成 | #FFF8F0 |
🚧 已知问题 / 空壳功能
| 问题 | 类型 | 优先级 |
|---|---|---|
| 首页 Feed 卡片无用户头像/用户名 | 未实现 | 高 |
| 好友页面 | 空壳 | 高 |
| 消息页面 | 空壳 | 高 |
| 我的页面 | 空壳 | 高 |
| 右上角搜索 | 未实现 | 中 |
| 铃铛通知图标 | 未实现 | 中 |
| 全部数据为 mock,无真实后端 | 架构 | 高 |
🗓️ 版本历史
| 版本 | 日期 | 变更内容 |
|---|---|---|
| v1.0.0+1 | — | MVP 基础功能 |
| v1.1.0+2 | 2026-02-17 | 小红书风格改造(橙色主题 + 瀑布流)+ 登录跳转修复 + 暖黄背景 |
| v1.1.1+3 | 2026-02-17 | 头像选择 Bug 修复 + Feed 卡片补用户头像/昵称 |
| v1.1.2+4 | 2026-02-17 | 我的页面 + 消息页面 + 好友页面 |
| v1.1.3+5 | 进行中 | 点击交互修复 + 首页刷新 |
🚀 下个版本计划(V1.1 待开发)
P0 — 核心功能(必须完成)
| 功能模块 | 说明 |
|---|---|
| 社区队长体系 | 核心社区运营机制 |
| 会员订阅系统 | 商业化核心功能 |
P1 — 重要功能
| 功能模块 | 说明 |
|---|---|
| 新手引导 | 提升新用户留存 |
| 微信分享 | 社交裂变传播 |
| 家政服务 | 垂直服务场景 |
| 日常消费 | 垂直服务场景 |
| 消息推送 | 用户触达与留存 |
📌 备注
- 当前版本为演示/测试版本,所有数据均为 mock 数据
- 后端真实接入(PostgreSQL + Node.js API)尚未开始
- 高德地图和微信支付已列入技术栈,集成工作待规划
来源:技术方案-V1.0-MVP架构.md
slug: tech-v1-0-mvp-architecture
「伴享」技术方案 V1.0 — MVP架构
版本: V1.0
对应PRD: PRD-V1.0-MVP核心功能
更新日期: 2026-02-16
1. 技术架构总览
1.1 系统架构图
┌────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌──────────────────┐ ┌───────────────────────┐ │
│ │ Flutter APP │ │ 子女端(V1.2预留) │ │
│ │ iOS + Android │ │ 微信小程序 │ │
│ └────────┬─────────┘ └───────────────────────┘ │
└───────────┼────────────────────────────────────────┘
│ HTTPS + WebSocket
┌───────────▼────────────────────────────────────────┐
│ API网关层(Nginx) │
│ SSL终止 │ 限流 │ 日志 │ 路由 │ CORS │ 压缩 │
└───────────┬────────────────────────────────────────┘
│
┌───────────▼────────────────────────────────────────┐
│ 业务服务层(Node.js + Express) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 用户服务 │ │ 活动服务 │ │ AI管家 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 医疗服务 │ │ 支付服务 │ │ 通知服务 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└───────────┬────────────────────────────────────────┘
│
┌───────────▼────────────────────────────────────────┐
│ 数据层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │PostgreSQL│ │ Redis │ │ 阿里云OSS │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└────────────────────────────────────────────────────┘1.2 技术选型
| 层级 | 技术 | 版本 | 选型理由 |
|---|---|---|---|
| 前端 | Flutter | 3.x | 跨平台、性能好、适老化组件丰富 |
| 后端 | Node.js + Express | 22 + 4.x | 生态成熟、AI集成方便 |
| 数据库 | PostgreSQL | 15+ | JSON支持好、地理空间查询 |
| 缓存 | Redis | 7.x | 会话管理、限流、缓存 |
| 文件存储 | 阿里云OSS | - | 图片/语音文件 |
| AI模型 | 通义千问 | qwen-max | 国产、函数调用支持好 |
| 语音 | 讯飞ASR/TTS | - | 中文识别准确率高 |
| 地图 | 高德地图 | - | 国内POI数据全 |
| 支付 | 微信支付V3 | - | 银发群体使用率高 |
| 推送 | JPush | - | 全平台推送 |
| 部署 | Docker Compose | - | MVP阶段够用 |
2. 数据库设计
2.1 ER关系概览
users ──< activity_participants >── activities
users ──< ai_conversations
users ──< orders
users ──< appointments >── doctors >── departments >── hospitals
users ──< consultations >── doctors
users ──< family_links
users ──< notifications
users ── ai_user_preferences2.2 完整DDL
-- ===========================
-- 伴享 V1.0 DDL
-- PostgreSQL 15+
-- ===========================
CREATE EXTENSION IF NOT EXISTS earthdistance CASCADE;
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- 1. 用户表
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
phone VARCHAR(11) UNIQUE NOT NULL,
nickname VARCHAR(50),
avatar_url TEXT,
birth_year INTEGER,
birth_month INTEGER,
gender VARCHAR(10) CHECK (gender IN ('male', 'female', 'other')),
city VARCHAR(50) DEFAULT '成都',
district VARCHAR(50),
interests TEXT[] DEFAULT '{}',
real_name VARCHAR(50),
id_card_hash VARCHAR(64),
id_card_encrypted TEXT,
verified BOOLEAN DEFAULT FALSE,
emergency_contact_name VARCHAR(50),
emergency_contact_phone VARCHAR(11),
font_size VARCHAR(10) DEFAULT 'medium',
speech_speed VARCHAR(10) DEFAULT 'normal',
auto_voice BOOLEAN DEFAULT TRUE,
last_login_at TIMESTAMP,
login_count INTEGER DEFAULT 0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_users_phone ON users(phone);
CREATE INDEX idx_users_city ON users(city);
CREATE INDEX idx_users_interests ON users USING GIN(interests);
-- 2. 短信验证码
CREATE TABLE sms_codes (
id BIGSERIAL PRIMARY KEY,
phone VARCHAR(11) NOT NULL,
code VARCHAR(6) NOT NULL,
purpose VARCHAR(20) DEFAULT 'login',
used BOOLEAN DEFAULT FALSE,
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- 3. 家庭关联
CREATE TABLE family_links (
id BIGSERIAL PRIMARY KEY,
parent_user_id BIGINT REFERENCES users(id),
child_user_id BIGINT,
invite_code VARCHAR(6),
status VARCHAR(20) DEFAULT 'active',
linked_at TIMESTAMP DEFAULT NOW(),
UNIQUE(parent_user_id, child_user_id)
);
CREATE TABLE invite_codes (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
code VARCHAR(6) UNIQUE NOT NULL,
used BOOLEAN DEFAULT FALSE,
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- 4. 活动表
CREATE TABLE activities (
id BIGSERIAL PRIMARY KEY,
creator_id BIGINT REFERENCES users(id) NOT NULL,
title VARCHAR(100) NOT NULL,
category VARCHAR(50) NOT NULL,
description TEXT,
cover_image_url TEXT,
location_lat DECIMAL(10,7) NOT NULL,
location_lng DECIMAL(10,7) NOT NULL,
location_address TEXT NOT NULL,
location_name VARCHAR(100),
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP,
max_participants INTEGER DEFAULT 10 CHECK (max_participants BETWEEN 5 AND 15),
current_participants INTEGER DEFAULT 0,
status VARCHAR(20) DEFAULT 'upcoming',
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_activities_status_time ON activities(status, start_time);
CREATE INDEX idx_activities_category ON activities(category);
-- 5. 活动报名
CREATE TABLE activity_participants (
id BIGSERIAL PRIMARY KEY,
activity_id BIGINT REFERENCES activities(id),
user_id BIGINT REFERENCES users(id),
status VARCHAR(20) DEFAULT 'registered',
signed_in_at TIMESTAMP,
signed_in_lat DECIMAL(10,7),
signed_in_lng DECIMAL(10,7),
rating INTEGER CHECK (rating BETWEEN 1 AND 5),
review TEXT,
joined_at TIMESTAMP DEFAULT NOW(),
cancelled_at TIMESTAMP,
UNIQUE(activity_id, user_id)
);
-- 6. AI对话
CREATE TABLE ai_conversations (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
session_id VARCHAR(36) NOT NULL,
role VARCHAR(20) NOT NULL,
content TEXT NOT NULL,
content_type VARCHAR(20) DEFAULT 'text',
voice_url TEXT,
intent VARCHAR(50),
metadata JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_ai_conv_user ON ai_conversations(user_id, session_id);
CREATE TABLE ai_user_preferences (
user_id BIGINT PRIMARY KEY REFERENCES users(id),
preferred_hospital VARCHAR(100),
preferred_doctor VARCHAR(100),
home_address TEXT,
common_destinations JSONB,
dietary_restrictions TEXT[],
updated_at TIMESTAMP DEFAULT NOW()
);
-- 7. 医院/科室/医生/排班
CREATE TABLE hospitals (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
address TEXT,
lat DECIMAL(10,7),
lng DECIMAL(10,7),
phone VARCHAR(20),
logo_url TEXT,
level VARCHAR(20),
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE departments (
id BIGSERIAL PRIMARY KEY,
hospital_id BIGINT REFERENCES hospitals(id),
name VARCHAR(50) NOT NULL,
description TEXT,
sort_order INTEGER DEFAULT 0
);
CREATE TABLE doctors (
id BIGSERIAL PRIMARY KEY,
hospital_id BIGINT REFERENCES hospitals(id),
department_id BIGINT REFERENCES departments(id),
name VARCHAR(50) NOT NULL,
title VARCHAR(50),
avatar_url TEXT,
specialty TEXT,
rating DECIMAL(2,1) DEFAULT 5.0,
rating_count INTEGER DEFAULT 0,
status VARCHAR(20) DEFAULT 'active'
);
CREATE TABLE doctor_schedules (
id BIGSERIAL PRIMARY KEY,
doctor_id BIGINT REFERENCES doctors(id),
schedule_date DATE NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
max_patients INTEGER DEFAULT 30,
current_patients INTEGER DEFAULT 0,
fee DECIMAL(10,2),
status VARCHAR(20) DEFAULT 'available'
);
-- 8. 预约/问诊
CREATE TABLE appointments (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(20) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
hospital_id BIGINT REFERENCES hospitals(id),
department_id BIGINT REFERENCES departments(id),
doctor_id BIGINT REFERENCES doctors(id),
schedule_id BIGINT REFERENCES doctor_schedules(id),
patient_name VARCHAR(50),
patient_phone VARCHAR(11),
appointment_date DATE,
appointment_time TIME,
fee DECIMAL(10,2),
status VARCHAR(20) DEFAULT 'pending',
paid_at TIMESTAMP,
cancelled_at TIMESTAMP,
cancel_reason TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE consultations (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(20) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
doctor_id BIGINT REFERENCES doctors(id),
symptom_description TEXT,
images TEXT[],
doctor_reply TEXT,
fee DECIMAL(10,2) DEFAULT 19.90,
status VARCHAR(20) DEFAULT 'pending',
replied_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
-- 9. 订单
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(20) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
order_type VARCHAR(50) NOT NULL,
amount DECIMAL(10,2) NOT NULL,
status VARCHAR(20) DEFAULT 'pending',
detail JSONB,
wx_transaction_id VARCHAR(50),
paid_at TIMESTAMP,
completed_at TIMESTAMP,
cancelled_at TIMESTAMP,
refund_amount DECIMAL(10,2),
refund_at TIMESTAMP,
refund_reason TEXT,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_orders_user ON orders(user_id, created_at DESC);
-- 10. 通知
CREATE TABLE notifications (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
type VARCHAR(50) NOT NULL,
title VARCHAR(100),
content TEXT,
data JSONB,
is_read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_notif_user ON notifications(user_id, is_read, created_at DESC);
-- 11. 审计日志
CREATE TABLE audit_logs (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT,
action VARCHAR(50),
resource_type VARCHAR(50),
resource_id BIGINT,
detail JSONB,
ip_address INET,
created_at TIMESTAMP DEFAULT NOW()
);3. API文档
3.1 规范
- Base URL:
https://api.banxiang.com/api/v1 - 认证:
Authorization: Bearer <JWT> - 响应格式:
{ "success": true, "data": {...} }/{ "success": false, "error": {"code":"...", "message":"..."} }
3.2 完整接口清单
| 模块 | 方法 | 路径 | 描述 |
|---|---|---|---|
| 认证 | POST | /auth/send-code | 发送验证码 |
| 认证 | POST | /auth/login | 登录/注册 |
| 认证 | POST | /auth/refresh | 刷新Token |
| 用户 | GET | /users/me | 获取当前用户 |
| 用户 | PUT | /users/profile | 更新资料 |
| 用户 | POST | /users/verify | 实名认证 |
| 用户 | PUT | /users/emergency-contact | 紧急联系人 |
| 用户 | PUT | /users/settings | 更新设置 |
| 家庭 | POST | /family/generate-code | 生成邀请码 |
| 家庭 | POST | /family/link | 绑定子女 |
| 家庭 | GET | /family/members | 家人列表 |
| 活动 | GET | /activities | 活动列表 |
| 活动 | GET | /activities/:id | 活动详情 |
| 活动 | POST | /activities | 创建活动 |
| 活动 | PUT | /activities/:id | 修改活动 |
| 活动 | DELETE | /activities/:id | 取消活动 |
| 活动 | POST | /activities/:id/join | 报名 |
| 活动 | POST | /activities/:id/cancel | 取消报名 |
| 活动 | POST | /activities/:id/sign-in | 签到 |
| 活动 | POST | /activities/:id/review | 评价 |
| 活动 | GET | /users/me/activities | 我的活动 |
| AI | POST | /ai/chat | 文字对话(SSE) |
| AI | POST | /ai/voice | 语音对话 |
| AI | GET | /ai/history | 对话历史 |
| 医疗 | GET | /medical/hospitals | 医院列表 |
| 医疗 | GET | /medical/hospitals/:id/departments | 科室 |
| 医疗 | GET | /medical/doctors | 医生列表 |
| 医疗 | GET | /medical/doctors/:id/schedules | 排班 |
| 医疗 | POST | /medical/appointments | 创建预约 |
| 医疗 | POST | /medical/appointments/:id/cancel | 取消 |
| 医疗 | POST | /medical/consultations | 创建问诊 |
| 订单 | POST | /orders/create | 创建订单 |
| 订单 | GET | /orders | 订单列表 |
| 订单 | GET | /orders/:orderNo | 订单详情 |
| 订单 | POST | /orders/:orderNo/refund | 退款 |
| 通知 | GET | /notifications | 通知列表 |
| 通知 | PUT | /notifications/:id/read | 标记已读 |
| 上传 | POST | /upload/image | 上传图片 |
| 上传 | POST | /upload/voice | 上传语音 |
4. Flutter组件架构
4.1 项目结构
banxiang_app/
├── lib/
│ ├── main.dart
│ ├── app.dart
│ ├── config/
│ │ ├── theme.dart # 适老化主题
│ │ ├── routes.dart
│ │ └── constants.dart
│ ├── core/
│ │ ├── api/
│ │ │ ├── api_client.dart # Dio封装
│ │ │ └── endpoints.dart
│ │ ├── models/ # 数据模型
│ │ ├── providers/ # Riverpod状态管理
│ │ ├── services/ # 业务服务
│ │ └── utils/
│ ├── features/
│ │ ├── auth/
│ │ ├── home/
│ │ ├── activity/
│ │ ├── ai_butler/
│ │ ├── medical/
│ │ ├── profile/
│ │ └── notification/
│ └── shared/
│ ├── widgets/ # BX适老化组件库
│ └── layouts/
├── assets/
│ ├── images/
│ ├── fonts/
│ └── animations/
├── test/
└── pubspec.yaml4.2 适老化组件库(BX Design System)
/// BX适老化按钮
class BxButton extends StatelessWidget {
final String text;
final VoidCallback onPressed;
final BxButtonStyle style; // primary / secondary / danger
final bool loading;
// 最小高度48dp,字号18sp,圆角12dp
// 点击区域≥48x48dp
// loading状态显示转圈+文字
}
/// BX适老化输入框
class BxInput extends StatelessWidget {
final String label;
final String hint;
final TextInputType keyboardType;
final bool voiceEnabled; // 右侧语音输入按钮
// 高度56dp,字号18sp
// label在输入框上方
// 错误提示在下方,红色16sp
}
/// BX确认弹窗(防误操作)
class BxConfirmDialog extends StatelessWidget {
final String title;
final String message;
final String confirmText;
final String cancelText;
// 标题22sp,正文18sp
// 按钮大且间隔远
// 危险操作confirmText用红色
}
/// BX活动卡片
class BxActivityCard extends StatelessWidget {
final Activity activity;
final double distance;
// 大标题18sp,时间地点16sp
// 报名按钮在右侧
// 已满员显示灰色
}4.3 核心代码示例
API客户端
// core/api/api_client.dart
class ApiClient {
late final Dio _dio;
ApiClient() {
_dio = Dio(BaseOptions(
baseUrl: 'https://api.banxiang.com/api/v1',
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 30),
));
_dio.interceptors.addAll([
AuthInterceptor(), // 自动附加JWT
LogInterceptor(),
ErrorInterceptor(), // 统一错误处理
]);
}
Future<T> get<T>(String path, {Map<String, dynamic>? params}) async {
final response = await _dio.get(path, queryParameters: params);
return response.data['data'] as T;
}
Future<T> post<T>(String path, {dynamic data}) async {
final response = await _dio.post(path, data: data);
return response.data['data'] as T;
}
}AI管家对话页面
// features/ai_butler/chat_page.dart
class AiChatPage extends ConsumerStatefulWidget {
@override
ConsumerState<AiChatPage> createState() => _AiChatPageState();
}
class _AiChatPageState extends ConsumerState<AiChatPage> {
final _controller = TextEditingController();
bool _isRecording = false;
@override
Widget build(BuildContext context) {
final messages = ref.watch(aiChatProvider);
return Scaffold(
appBar: AppBar(title: Text('🤖 小伴 · AI管家')),
body: Column(
children: [
// 消息列表
Expanded(
child: ListView.builder(
reverse: true,
itemCount: messages.length,
itemBuilder: (ctx, i) => ChatBubble(
message: messages[i],
fontSize: ref.watch(fontSizeProvider),
),
),
),
// 快捷指令栏
QuickActions(
actions: ['附近活动', '挂号', '买菜', '天气'],
onTap: (action) => _sendMessage(action),
),
// 输入栏
ChatInputBar(
controller: _controller,
onSend: () => _sendMessage(_controller.text),
onVoiceStart: _startRecording,
onVoiceEnd: _stopRecording,
isRecording: _isRecording,
),
],
),
);
}
void _sendMessage(String text) {
ref.read(aiChatProvider.notifier).sendMessage(text);
_controller.clear();
}
}活动推荐算法
// core/services/recommendation_service.dart
double calculateRecommendScore(User user, Activity activity, double distanceKm) {
// 兴趣匹配度 (0-1)
final commonInterests = user.interests
.where((i) => i == activity.category)
.length;
final interestScore = commonInterests > 0 ? 1.0 : 0.0;
// 距离分 (0-1), 10km内线性衰减
final distanceScore = 1 - (distanceKm / 10).clamp(0, 1);
// 时间分 (0-1), 168小时(一周)内线性衰减
final hoursDiff = activity.startTime.difference(DateTime.now()).inHours;
final timeScore = 1 - (hoursDiff / 168).clamp(0, 1);
// 热度分 (0-1)
final hotScore = activity.currentParticipants / activity.maxParticipants;
return interestScore * 0.4 + distanceScore * 0.3 + timeScore * 0.2 + hotScore * 0.1;
}5. AI管家技术方案
5.1 架构
用户输入(文字/语音)
↓
┌─────────────┐
│ 语音处理 │ ← 讯飞ASR(语音→文字)
└──────┬──────┘
↓
┌─────────────┐
│ 意图识别 │ ← 通义千问 Function Calling
└──────┬──────┘
↓
┌─────────────────────────────┐
│ 任务路由 │
│ ├── 活动查询 → 调用活动API │
│ ├── 挂号预约 → 调用医疗API │
│ ├── 生鲜购买 → 调用商品API │
│ └── 闲聊/咨询 → 直接对话 │
└──────┬──────────────────────┘
↓
┌─────────────┐
│ 响应生成 │ ← 通义千问生成回复
└──────┬──────┘
↓
┌─────────────┐
│ 语音合成 │ ← 讯飞TTS(文字→语音)
└──────┬──────┘
↓
返回用户(文字+语音+操作按钮)5.2 Function Calling定义
// AI工具定义
const tools = [
{
type: 'function',
function: {
name: 'search_activities',
description: '搜索附近的活动',
parameters: {
type: 'object',
properties: {
category: { type: 'string', description: '活动类型' },
timeRange: { type: 'string', enum: ['today', 'tomorrow', 'week'] },
lat: { type: 'number' },
lng: { type: 'number' }
}
}
}
},
{
type: 'function',
function: {
name: 'book_appointment',
description: '预约挂号',
parameters: {
type: 'object',
properties: {
hospitalName: { type: 'string' },
departmentName: { type: 'string' },
doctorName: { type: 'string' },
date: { type: 'string' },
time: { type: 'string' }
}
}
}
},
{
type: 'function',
function: {
name: 'order_grocery',
description: '生鲜配送下单',
parameters: {
type: 'object',
properties: {
items: {
type: 'array',
items: {
type: 'object',
properties: {
name: { type: 'string' },
quantity: { type: 'number' }
}
}
},
deliveryAddress: { type: 'string' }
}
}
}
}
];5.3 System Prompt
你是「小伴」,「伴享」APP的AI智能管家。你服务的是50-70岁的银发群体。
规则:
1. 说话简洁、亲切、温暖,像家人一样
2. 每次回复不超过100字
3. 称呼用户为"X阿姨"或"X叔叔"(根据性别和姓氏)
4. 不使用网络用语、不说英文
5. 涉及医疗健康的建议必须加"仅供参考,建议咨询医生"
6. 涉及支付前必须明确告知金额并确认
7. 不确定的信息不要编造,说"我帮您查查"
8. 提供操作选项时,用简短的按钮文字
用户信息:
- 姓名:{userName}
- 城市:{city}
- 兴趣:{interests}
- 常去医院:{preferredHospital}
- 家庭住址:{homeAddress}6. 部署方案
6.1 服务器配置(MVP阶段)
| 服务 | 配置 | 月费用 |
|---|---|---|
| 应用服务器 | 阿里云ECS 2核4G | ¥200/月 |
| 数据库 | 阿里云RDS PostgreSQL 2核4G | ¥300/月 |
| Redis | 阿里云Redis 1G | ¥100/月 |
| OSS | 按量计费 | ¥50/月 |
| CDN | 按量计费 | ¥50/月 |
| 合计 | ¥700/月 |
6.2 Docker Compose
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://banxiang:xxx@db:5432/banxiang
- REDIS_URL=redis://redis:6379
- QWEN_API_KEY=${QWEN_API_KEY}
- XUNFEI_APP_ID=${XUNFEI_APP_ID}
- WX_PAY_MCH_ID=${WX_PAY_MCH_ID}
depends_on:
- db
- redis
restart: always
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
- POSTGRES_DB=banxiang
- POSTGRES_USER=banxiang
- POSTGRES_PASSWORD=${DB_PASSWORD}
restart: always
redis:
image: redis:7-alpine
volumes:
- redisdata:/data
restart: always
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- app
restart: always
volumes:
pgdata:
redisdata:6.3 CI/CD流程
代码推送 → GitHub Actions
├── 运行测试
├── 构建Docker镜像
├── 推送到阿里云容器镜像
└── SSH到服务器执行 docker compose pull && docker compose up -d6.4 监控方案
| 维度 | 工具 | 说明 |
|---|---|---|
| 应用监控 | PM2 + 阿里云ARMS | 错误率、响应时间 |
| 服务器监控 | 阿里云云监控 | CPU/内存/磁盘 |
| 日志 | Winston + 阿里云SLS | 结构化日志 |
| 报警 | 钉钉/飞书Webhook | 异常自动通知 |
7. 安全方案
7.1 数据安全
| 层面 | 措施 |
|---|---|
| 传输 | HTTPS + TLS 1.3 |
| 存储 | 敏感字段AES-256加密 |
| 身份证 | 哈希索引 + 加密存储,不存明文 |
| JWT | HS256签名,7天有效期 |
| 密钥管理 | 环境变量,不入代码库 |
7.2 接口安全
| 措施 | 配置 |
|---|---|
| 全局限流 | 100次/分钟/IP |
| 登录限流 | 5次/分钟/手机号 |
| 验证码限流 | 3次/5分钟/手机号 |
| SQL注入防护 | 参数化查询 |
| XSS防护 | 输出转义 + CSP头 |
| CORS | 白名单域名 |
文档结束
来源:技术方案-V1.1-扩展架构.md
slug: tech-v1-1-extension
「伴享」技术方案 V1.1 — 扩展架构
版本: V1.1
对应PRD: PRD-V1.1-体验优化版
更新日期: 2026-02-16
1. 架构变更概述
V1.1在V1.0基础上新增:社区队长、会员订阅、家政服务、日常消费。无架构层面重大变更,主要是新增数据表和API端点。
1.1 变更影响矩阵
| 层级 | 变更 | 影响范围 |
|---|---|---|
| 数据库 | 新增6张表 | 队长/会员/服务商/服务人员/商品/购物车 |
| API | 新增4组端点 | /captains, /membership, /services, /products |
| Flutter | 新增4个Feature模块 | captain/, membership/, housekeeping/, shopping/ |
| 第三方 | 无新增 | - |
| 部署 | 无变更 | 同V1.0 Docker Compose |
2. 新增数据库表
2.1 增量DDL
-- ===========================
-- V1.1 增量DDL
-- ===========================
-- 1. 队长相关
CREATE TABLE captain_applications (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
bio TEXT,
specialties TEXT[],
serving_area VARCHAR(50),
contact_info JSONB,
status VARCHAR(20) DEFAULT 'pending'
CHECK (status IN ('pending', 'approved', 'rejected')),
reviewer_note TEXT,
reviewed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE captains (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT UNIQUE REFERENCES users(id),
level VARCHAR(20) DEFAULT 'trainee'
CHECK (level IN ('trainee', 'silver', 'gold', 'honor')),
bio TEXT,
specialties TEXT[],
serving_area VARCHAR(50),
total_activities INTEGER DEFAULT 0,
total_participants INTEGER DEFAULT 0,
total_new_users INTEGER DEFAULT 0,
avg_rating DECIMAL(2,1) DEFAULT 0,
monthly_subsidy DECIMAL(10,2) DEFAULT 0,
status VARCHAR(20) DEFAULT 'active',
approved_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 2. 会员
CREATE TABLE memberships (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
plan VARCHAR(20) NOT NULL CHECK (plan IN ('monthly', 'yearly')),
price DECIMAL(10,2) NOT NULL,
paid_by_user_id BIGINT REFERENCES users(id),
starts_at TIMESTAMP NOT NULL,
expires_at TIMESTAMP NOT NULL,
auto_renew BOOLEAN DEFAULT FALSE,
status VARCHAR(20) DEFAULT 'active'
CHECK (status IN ('active', 'expired', 'cancelled')),
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_membership_user ON memberships(user_id, status);
-- 用户表新增字段
ALTER TABLE users ADD COLUMN is_member BOOLEAN DEFAULT FALSE;
ALTER TABLE users ADD COLUMN member_expires_at TIMESTAMP;
ALTER TABLE users ADD COLUMN is_captain BOOLEAN DEFAULT FALSE;
ALTER TABLE users ADD COLUMN captain_level VARCHAR(20);
-- 3. 服务商
CREATE TABLE service_providers (
id BIGSERIAL PRIMARY KEY,
company_name VARCHAR(100),
category VARCHAR(50),
contact_phone VARCHAR(20),
license_no VARCHAR(50),
address TEXT,
lat DECIMAL(10,7),
lng DECIMAL(10,7),
rating DECIMAL(2,1) DEFAULT 5.0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- 4. 服务人员
CREATE TABLE service_workers (
id BIGSERIAL PRIMARY KEY,
provider_id BIGINT REFERENCES service_providers(id),
name VARCHAR(50),
avatar_url TEXT,
skills TEXT[],
rating DECIMAL(2,1) DEFAULT 5.0,
service_count INTEGER DEFAULT 0,
hourly_rate DECIMAL(10,2),
status VARCHAR(20) DEFAULT 'available',
created_at TIMESTAMP DEFAULT NOW()
);
-- 5. 服务订单
CREATE TABLE service_orders (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(20) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
worker_id BIGINT REFERENCES service_workers(id),
service_type VARCHAR(50),
scheduled_date DATE,
scheduled_time TIME,
duration_hours DECIMAL(3,1),
address TEXT,
requirements TEXT,
amount DECIMAL(10,2),
platform_fee DECIMAL(10,2),
status VARCHAR(20) DEFAULT 'pending',
rating INTEGER CHECK (rating BETWEEN 1 AND 5),
review TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
-- 6. 商品
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
provider_id BIGINT REFERENCES service_providers(id),
name VARCHAR(100),
category VARCHAR(50),
description TEXT,
image_url TEXT,
price DECIMAL(10,2),
unit VARCHAR(20),
stock INTEGER DEFAULT 0,
status VARCHAR(20) DEFAULT 'available',
created_at TIMESTAMP DEFAULT NOW()
);
-- 7. 购物车
CREATE TABLE cart_items (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
product_id BIGINT REFERENCES products(id),
quantity INTEGER DEFAULT 1,
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(user_id, product_id)
);
-- 8. 配送订单
CREATE TABLE delivery_orders (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(20) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
provider_id BIGINT REFERENCES service_providers(id),
items JSONB,
total_amount DECIMAL(10,2),
delivery_fee DECIMAL(10,2) DEFAULT 0,
delivery_address TEXT,
delivery_phone VARCHAR(11),
estimated_delivery TIMESTAMP,
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT NOW()
);
-- 9. 队长排行榜物化视图
CREATE MATERIALIZED VIEW captain_monthly_ranking AS
SELECT
c.user_id,
u.nickname,
u.avatar_url,
c.level,
COUNT(a.id) AS monthly_activities,
c.avg_rating
FROM captains c
JOIN users u ON c.user_id = u.id
LEFT JOIN activities a ON a.creator_id = c.user_id
AND a.start_time >= date_trunc('month', CURRENT_DATE)
WHERE c.status = 'active'
GROUP BY c.user_id, u.nickname, u.avatar_url, c.level, c.avg_rating
ORDER BY monthly_activities DESC;3. 新增API端点
3.1 队长模块 /captains
| 方法 | 路径 | 描述 |
|---|---|---|
| POST | /captains/apply | 申请成为队长 |
| GET | /captains/application-status | 查看申请状态 |
| GET | /captains/me/dashboard | 队长数据面板 |
| GET | /captains/ranking | 队长排行榜 |
| GET | /captains/:userId | 查看队长主页 |
管理端(内部):
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | /admin/captains/applications | 待审核列表 |
| POST | /admin/captains/applications/:id/approve | 审核通过 |
| POST | /admin/captains/applications/:id/reject | 审核拒绝 |
3.2 会员模块 /membership
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | /membership/plans | 会员方案列表 |
| GET | /membership/status | 当前会员状态 |
| POST | /membership/subscribe | 开通会员 |
| POST | /membership/generate-pay-link | 生成子女代付链接 |
| GET | /membership/pay/:token | 子女代付页面数据 |
| POST | /membership/pay/:token/confirm | 子女确认支付 |
3.3 家政服务 /services/housekeeping
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | /services/housekeeping/workers | 服务人员列表 |
| GET | /services/housekeeping/workers/:id | 人员详情 |
| POST | /services/housekeeping/orders | 预约下单 |
| GET | /services/housekeeping/orders | 我的服务订单 |
| POST | /services/housekeeping/orders/:id/cancel | 取消 |
| POST | /services/housekeeping/orders/:id/review | 评价 |
3.4 日常消费 /shopping
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | /shopping/providers | 商家列表 |
| GET | /shopping/products | 商品列表 |
| GET | /shopping/cart | 购物车 |
| POST | /shopping/cart/add | 加入购物车 |
| PUT | /shopping/cart/:id | 修改数量 |
| DELETE | /shopping/cart/:id | 删除 |
| POST | /shopping/orders | 配送下单 |
| GET | /shopping/orders | 配送订单列表 |
4. Flutter新增模块
4.1 新增Feature模块
features/
├── captain/ # 社区队长
│ ├── captain_apply_page.dart
│ ├── captain_dashboard_page.dart
│ ├── captain_ranking_page.dart
│ └── captain_profile_page.dart
├── membership/ # 会员中心
│ ├── membership_page.dart
│ ├── pay_link_page.dart
│ └── widgets/
├── housekeeping/ # 家政服务
│ ├── worker_list_page.dart
│ ├── worker_detail_page.dart
│ ├── booking_page.dart
│ └── widgets/
├── shopping/ # 日常消费
│ ├── provider_list_page.dart
│ ├── product_list_page.dart
│ ├── cart_page.dart
│ ├── checkout_page.dart
│ └── widgets/
└── onboarding/ # 新手引导
├── onboarding_page.dart
└── guide_overlay.dart4.2 微信分享集成
// 使用 fluwx 插件
dependencies:
fluwx: ^4.x
// 活动分享
Future<void> shareActivity(Activity activity) async {
await fluwx.shareToWeChat(
WeChatShareWebPageModel(
webPage: 'https://h5.banxiang.com/activity/${activity.id}',
title: activity.title,
description: '来「伴享」一起参加吧!还剩${activity.remainingSlots}个名额',
thumbnail: WeChatImage.network(activity.coverImage),
scene: WeChatScene.session,
),
);
}5. 队长等级自动计算
// 定时任务:每日凌晨更新队长等级
async function updateCaptainLevels() {
const captains = await db.query('SELECT * FROM captains WHERE status = $1', ['active']);
for (const captain of captains.rows) {
let newLevel = 'trainee';
if (captain.total_activities >= 50 && captain.avg_rating >= 4.75 && captain.total_new_users >= 100) {
newLevel = 'gold';
} else if (captain.total_activities >= 20 && captain.avg_rating >= 4.5 && captain.total_new_users >= 20) {
newLevel = 'silver';
}
if (newLevel !== captain.level) {
await db.query('UPDATE captains SET level = $1, updated_at = NOW() WHERE id = $2', [newLevel, captain.id]);
// 发送升级通知
await sendNotification(captain.user_id, 'CAPTAIN_LEVEL_UP', { newLevel });
}
}
// 刷新排行榜
await db.query('REFRESH MATERIALIZED VIEW captain_monthly_ranking');
}6. 会员权限中间件
// middleware/membership.js
function requireMembership(req, res, next) {
if (!req.user.is_member || new Date(req.user.member_expires_at) < new Date()) {
return res.status(403).json({
success: false,
error: {
code: 'MEMBERSHIP_REQUIRED',
message: '此功能需要开通会员',
upgrade_url: '/membership/plans'
}
});
}
next();
}
// 免费用户限额检查
function checkFreeLimit(type) {
return async (req, res, next) => {
if (req.user.is_member) return next();
const limits = {
ai_chat: 20, // 每天20条
activity_join: 3, // 每月3次
};
const count = await getUsageCount(req.user.id, type);
if (count >= limits[type]) {
return res.status(403).json({
success: false,
error: {
code: 'FREE_LIMIT_EXCEEDED',
message: type === 'ai_chat'
? '今日AI对话次数已用完,开通会员享无限对话'
: '本月活动次数已用完,开通会员享无限参与',
upgrade_url: '/membership/plans'
}
});
}
next();
};
}7. 子女代付H5页面
技术栈:Vue 3 + Vant(H5页面,微信内置浏览器打开)
流程:
1. 父母端生成代付链接 → 分享到微信
2. 子女点击链接 → 打开H5页面
3. H5页面展示:父母信息 + 会员方案 + 价格
4. 子女点击支付 → 调起微信支付JSAPI
5. 支付成功 → 后端更新会员状态 → Push通知父母文档结束
来源:技术方案-V1.2-进阶架构.md
slug: tech-v1-2-advanced
「伴享」技术方案 V1.2 — 进阶架构
版本: V1.2
对应PRD: PRD-V1.2-功能丰富版
更新日期: 2026-02-16
1. 架构变更概述
V1.2引入两个重大变更:健康数据架构(时序数据+预警引擎)和子女端小程序(微信小程序+独立API层)。
1.1 变更影响矩阵
| 层级 | 变更 | 说明 |
|---|---|---|
| 数据库 | 新增8张表 | 健康设备/记录/预警/报告+子女用户+关联+社区内容 |
| API | 新增3组端点 | /health, /child, /posts |
| 新增服务 | 健康数据同步Worker | 定时拉取手环数据 |
| 新增服务 | 预警检测引擎 | 实时异常检测 |
| 新增客户端 | 微信小程序(子女端) | Taro + React |
| 新增服务产品 | 候鸟/文教/设备 | 复用service_products表 |
1.2 架构图更新
┌───────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ │
│ │ Flutter APP │ │ 子女端小程序 │ │ 代付H5 │ │
│ │ (父母端) │ │ (Taro+React) │ │ (Vue3) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬─────┘ │
└─────────┼─────────────────┼─────────────────┼─────────┘
│ │ │
┌─────────▼─────────────────▼─────────────────▼─────────┐
│ API网关 (Nginx) │
│ /api/v1/* → 主APP API │
│ /api/child/* → 子女端API │
│ /api/h5/* → H5页面API │
└─────────┬─────────────────────────────────────────────┘
│
┌─────────▼─────────────────────────────────────────────┐
│ Node.js 业务服务层 │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │用户 │ │活动 │ │AI │ │医疗 │ │支付 │ │
│ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │队长 │ │会员 │ │健康⭐│ │子女⭐│ │社区⭐│ │
│ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │
└─────────┬─────────────────────────────────────────────┘
│
┌─────────▼─────────────────────────────────────────────┐
│ 后台Worker层(新增) │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 健康数据同步Worker│ │ 预警检测引擎 │ │
│ │ (每30分钟/每小时) │ │ (实时处理) │ │
│ └─────────────────┘ └─────────────────┘ │
└───────────────────────────────────────────────────────┘2. 健康数据架构
2.1 数据流
华为健康API / 小米运动API
↓ (OAuth2 + 定时拉取)
┌─────────────────────┐
│ 健康数据同步Worker │ ← Bull队列 + Redis
│ 每30分钟执行一次 │
└──────────┬──────────┘
↓ 写入
┌─────────────────────┐
│ health_records表 │ ← 时序数据
└──────────┬──────────┘
↓ 触发
┌─────────────────────┐
│ 预警检测引擎 │
│ 检查阈值 → │
│ ├── 正常 → 跳过 │
│ └── 异常 → │
│ ├── 写入alerts │
│ ├── Push用户 │
│ └── Push子女端 │
└─────────────────────┘2.2 增量DDL
-- ===========================
-- V1.2 增量DDL
-- ===========================
-- 1. 健康设备绑定
CREATE TABLE health_devices (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
brand VARCHAR(20) NOT NULL,
device_model VARCHAR(50),
device_id VARCHAR(100),
auth_token_encrypted TEXT,
refresh_token_encrypted TEXT,
sync_interval INTEGER DEFAULT 60,
last_sync_at TIMESTAMP,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- 2. 健康记录(时序数据,按月分区)
CREATE TABLE health_records (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
record_type VARCHAR(20) NOT NULL,
value JSONB NOT NULL,
recorded_at TIMESTAMP NOT NULL,
source VARCHAR(20) DEFAULT 'device',
created_at TIMESTAMP DEFAULT NOW()
) PARTITION BY RANGE (recorded_at);
-- 按月创建分区(示例)
CREATE TABLE health_records_2026_04 PARTITION OF health_records
FOR VALUES FROM ('2026-04-01') TO ('2026-05-01');
CREATE TABLE health_records_2026_05 PARTITION OF health_records
FOR VALUES FROM ('2026-05-01') TO ('2026-06-01');
CREATE INDEX idx_health_user_type_time
ON health_records(user_id, record_type, recorded_at DESC);
-- 3. 健康预警
CREATE TABLE health_alerts (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
alert_type VARCHAR(50),
record_id BIGINT,
value JSONB,
threshold JSONB,
severity VARCHAR(20) DEFAULT 'warning',
notified_user BOOLEAN DEFAULT FALSE,
notified_family BOOLEAN DEFAULT FALSE,
acknowledged BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
-- 4. 健康周报
CREATE TABLE health_reports (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
report_type VARCHAR(20) DEFAULT 'weekly',
period_start DATE,
period_end DATE,
content JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
-- 5. 子女用户
CREATE TABLE child_users (
id BIGSERIAL PRIMARY KEY,
wx_openid VARCHAR(50) UNIQUE NOT NULL,
wx_unionid VARCHAR(50),
nickname VARCHAR(50),
avatar_url TEXT,
phone VARCHAR(11),
created_at TIMESTAMP DEFAULT NOW()
);
-- 6. 子女-父母关联
CREATE TABLE child_parent_links (
id BIGSERIAL PRIMARY KEY,
child_id BIGINT REFERENCES child_users(id),
parent_user_id BIGINT REFERENCES users(id),
relationship VARCHAR(20) DEFAULT 'child',
notification_enabled BOOLEAN DEFAULT TRUE,
alert_phone VARCHAR(11),
linked_at TIMESTAMP DEFAULT NOW(),
UNIQUE(child_id, parent_user_id)
);
-- 7. 社区动态
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
content TEXT,
images TEXT[],
topic_id BIGINT,
location VARCHAR(100),
like_count INTEGER DEFAULT 0,
comment_count INTEGER DEFAULT 0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE post_likes (
post_id BIGINT REFERENCES posts(id),
user_id BIGINT REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW(),
PRIMARY KEY(post_id, user_id)
);
CREATE TABLE post_comments (
id BIGSERIAL PRIMARY KEY,
post_id BIGINT REFERENCES posts(id),
user_id BIGINT REFERENCES users(id),
content TEXT,
reply_to_id BIGINT,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE topics (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE,
description TEXT,
post_count INTEGER DEFAULT 0,
is_official BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
-- 8. 通用服务产品表(候鸟/文教/设备)
CREATE TABLE service_products (
id BIGSERIAL PRIMARY KEY,
provider_id BIGINT REFERENCES service_providers(id),
category VARCHAR(50),
subcategory VARCHAR(50),
title VARCHAR(200),
description TEXT,
images TEXT[],
price DECIMAL(10,2),
price_unit VARCHAR(20),
commission_rate DECIMAL(4,2),
location VARCHAR(100),
available_from DATE,
available_to DATE,
stock INTEGER,
sales_count INTEGER DEFAULT 0,
rating DECIMAL(2,1) DEFAULT 5.0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);2.3 健康数据同步Worker
// workers/health-sync.js
const Queue = require('bull');
const healthSyncQueue = new Queue('health-sync', process.env.REDIS_URL);
// 每30分钟同步一次
healthSyncQueue.process(async (job) => {
const { userId, brand, authToken } = job.data;
let data;
if (brand === 'huawei') {
data = await fetchHuaweiHealthData(authToken);
} else if (brand === 'xiaomi') {
data = await fetchXiaomiHealthData(authToken);
}
// 写入数据库
for (const record of data.records) {
await db.query(
`INSERT INTO health_records (user_id, record_type, value, recorded_at, source)
VALUES ($1, $2, $3, $4, 'device')
ON CONFLICT DO NOTHING`,
[userId, record.type, record.value, record.timestamp]
);
}
// 触发预警检测
await alertEngine.check(userId, data.records);
});
// 调度:为每个绑定设备的用户创建定时任务
async function scheduleHealthSync() {
const devices = await db.query(
'SELECT * FROM health_devices WHERE status = $1', ['active']
);
for (const device of devices.rows) {
healthSyncQueue.add(
{ userId: device.user_id, brand: device.brand, authToken: device.auth_token_encrypted },
{ repeat: { every: device.sync_interval * 60 * 1000 } }
);
}
}2.4 预警检测引擎
// services/alert-engine.js
const THRESHOLDS = {
blood_pressure: {
systolic: { min: 85, max: 150 },
diastolic: { min: 55, max: 100 }
},
heart_rate: { min: 50, max: 120 },
blood_sugar: { min: 3.5, max: 7.0 }
};
async function checkAlerts(userId, records) {
for (const record of records) {
const threshold = THRESHOLDS[record.type];
if (!threshold) continue;
let isAlert = false;
let alertValue = {};
if (record.type === 'blood_pressure') {
const { systolic, diastolic } = record.value;
if (systolic > threshold.systolic.max || systolic < threshold.systolic.min ||
diastolic > threshold.diastolic.max || diastolic < threshold.diastolic.min) {
isAlert = true;
alertValue = { systolic, diastolic };
}
} else if (record.type === 'heart_rate') {
const { bpm } = record.value;
if (bpm > threshold.max || bpm < threshold.min) {
isAlert = true;
alertValue = { bpm };
}
}
if (isAlert) {
// 写入预警记录
const alert = await db.query(
`INSERT INTO health_alerts (user_id, alert_type, value, threshold, severity)
VALUES ($1, $2, $3, $4, $5) RETURNING id`,
[userId, record.type, alertValue, threshold,
determineSeverity(record.type, alertValue, threshold)]
);
// 通知用户
await pushNotification(userId, {
type: 'HEALTH_ALERT',
title: '健康提醒',
message: formatAlertMessage(record.type, alertValue),
data: { alertId: alert.rows[0].id }
});
// 通知子女
const childLinks = await db.query(
'SELECT child_id FROM child_parent_links WHERE parent_user_id = $1 AND notification_enabled = true',
[userId]
);
for (const link of childLinks.rows) {
await pushChildNotification(link.child_id, {
type: 'PARENT_HEALTH_ALERT',
parentUserId: userId,
alertType: record.type,
value: alertValue
});
}
}
}
}3. 子女端小程序架构
3.1 技术选型
| 技术 | 选择 | 理由 |
|---|---|---|
| 框架 | Taro 3.x + React | 跨平台小程序框架,后续可扩支付宝 |
| 状态管理 | Zustand | 轻量、简单 |
| UI库 | Taro UI | 适配微信小程序 |
| 请求 | Taro.request封装 | 小程序网络请求 |
3.2 项目结构
banxiang-child-miniapp/
├── src/
│ ├── app.tsx
│ ├── app.config.ts
│ ├── pages/
│ │ ├── index/ # 首页(父母状态概览)
│ │ ├── health/ # 健康数据
│ │ ├── activities/ # 活动记录
│ │ ├── proxy/ # 代办服务
│ │ └── profile/ # 我的
│ ├── components/
│ │ ├── HealthCard.tsx
│ │ ├── ActivityCard.tsx
│ │ └── AlertBanner.tsx
│ ├── services/
│ │ ├── api.ts
│ │ └── auth.ts
│ └── stores/
│ ├── authStore.ts
│ └── parentStore.ts
├── config/
└── package.json3.3 子女端API端点
| 方法 | 路径 | 描述 |
|---|---|---|
| POST | /child/auth/wx-login | 微信登录 |
| POST | /child/bind | 绑定父母 |
| GET | /child/parents | 已绑定父母列表 |
| GET | /child/parents/:id/overview | 父母状态概览 |
| GET | /child/parents/:id/health | 健康数据 |
| GET | /child/parents/:id/health/trends | 趋势数据 |
| GET | /child/parents/:id/health/reports | 周报列表 |
| GET | /child/parents/:id/activities | 活动记录 |
| POST | /child/parents/:id/proxy-order | 代办下单 |
| POST | /child/parents/:id/membership | 代付会员 |
| GET | /child/alerts | 预警通知列表 |
| PUT | /child/alerts/:id/ack | 确认预警 |
3.4 微信登录流程
// 子女端登录
router.post('/child/auth/wx-login', async (req, res) => {
const { code } = req.body;
// 换取openid
const wxRes = await axios.get(
`https://api.weixin.qq.com/sns/jscode2session?appid=${APPID}&secret=${SECRET}&js_code=${code}&grant_type=authorization_code`
);
const { openid, unionid } = wxRes.data;
// 查找或创建用户
let user = await db.query('SELECT * FROM child_users WHERE wx_openid = $1', [openid]);
if (!user.rows.length) {
user = await db.query(
'INSERT INTO child_users (wx_openid, wx_unionid) VALUES ($1, $2) RETURNING *',
[openid, unionid]
);
}
const token = jwt.sign({ childId: user.rows[0].id, type: 'child' }, JWT_SECRET);
res.json({ success: true, data: { token, user: user.rows[0] } });
});4. 内容审核方案
4.1 双重审核机制
用户发布内容
↓
┌─────────────────┐
│ 机器审核(实时)│
│ ├── 文字:敏感词库 + 通义千问审核
│ └── 图片:阿里云内容安全API
└──────┬──────────┘
↓
├── 通过 → 直接发布
├── 疑似 → 标记待人工审核,临时发布
└── 违规 → 拦截,通知用户
↓
┌─────────────────┐
│ 人工审核(异步)│ ← 疑似内容队列
│ 管理后台审核 │
└─────────────────┘4.2 敏感词库
- 基础库:政治/色情/暴力/赌博
- 医疗库:虚假医疗广告、伪科学养生
- 诈骗库:常见诈骗话术、钓鱼链接
- 自定义库:平台运营过程中积累
5. 部署变更
5.1 新增服务
# docker-compose.yml 新增
services:
# 健康数据同步Worker
health-worker:
build: .
command: node workers/health-sync.js
environment:
- REDIS_URL=redis://redis:6379
- DATABASE_URL=postgres://...
depends_on:
- db
- redis
restart: always
# 预警检测(与主服务共用,通过Bull队列触发)
# 无需独立服务,health-worker内集成5.2 服务器升级
| 服务 | V1.0配置 | V1.2配置 | 原因 |
|---|---|---|---|
| ECS | 2核4G | 4核8G | Worker增加 |
| RDS | 2核4G | 2核4G | 暂不变,健康数据用分区 |
| Redis | 1G | 2G | Bull队列+更多缓存 |
| 月费 | ¥700 | ¥1000 |
6. 华为/小米健康API接入
6.1 华为健康
- OAuth2授权: 用户在APP内跳转华为健康授权页
- API文档: https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/open-platform-oauth-0000001050123437
- 数据类型: 步数、心率、血压、血糖、睡眠
- 频率限制: 1000次/天/用户
6.2 小米运动
- OAuth2授权: 小米开放平台授权
- API文档: https://dev.mi.com/docs
- 数据类型: 步数、心率、睡眠
- 注意: 小米手环不支持血压直接测量,需外接血压计
文档结束
来源:技术方案-V2.0-完整架构.md
slug: tech-v2-0-full-architecture
「伴享」技术方案 V2.0 — 完整架构
版本: V2.0
对应PRD: PRD-V2.0-完整产品
更新日期: 2026-02-16
1. 架构演进
V2.0标志着产品从MVP走向完整商业化。核心变更:商家后台Web端、完整9大服务板块、积分/优惠券/拼团、Elasticsearch搜索。
1.1 完整架构图
┌───────────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────────┐ │
│ │Flutter │ │子女端 │ │商家后台 │ │管理后台 │ │
│ │APP │ │小程序 │ │Web │ │Web(内部) │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └──────┬──────┘ │
└───────┼────────────┼────────────┼───────────────┼─────────┘
│ │ │ │
┌───────▼────────────▼────────────▼───────────────▼─────────┐
│ Nginx API网关 │
│ /api/v1/* → APP /api/merchant/* → 商家 │
│ /api/child/* → 子女 /api/admin/* → 管理 │
└────────────────────────┬──────────────────────────────────┘
│
┌────────────────────────▼──────────────────────────────────┐
│ 业务服务层 (Node.js) │
│ 用户│活动│AI管家│医疗│支付│通知│队长│会员│健康│子女│社区 │
│ 商家│积分│优惠券│拼团│家政│配送│候鸟│文教│法律│设备│课程 │
└────────────────────────┬──────────────────────────────────┘
│
┌────────────────────────▼──────────────────────────────────┐
│ Worker层 │
│ 健康同步│预警检测│队长等级│结算│积分过期│排行榜│会员到期 │
└────────────────────────┬──────────────────────────────────┘
│
┌────────────────────────▼──────────────────────────────────┐
│ 数据层 │
│ PostgreSQL │ Redis │ OSS │ Elasticsearch │
└───────────────────────────────────────────────────────────┘1.2 新增技术组件
| 组件 | 用途 | 版本 |
|---|---|---|
| Elasticsearch | 全文搜索+日志 | 8.x |
| React + Ant Design Pro | 商家后台 | React 18 |
| Bull | 任务队列 | 4.x |
2. 商家后台架构
2.1 技术选型
- 前端: React 18 + Ant Design Pro + ECharts + Vite
- 状态管理: Zustand
- 部署: Nginx静态托管 + CDN
2.2 项目结构
banxiang-merchant-web/
├── src/
│ ├── pages/
│ │ ├── login/ # 登录
│ │ ├── register/ # 注册+资质
│ │ ├── dashboard/ # 数据看板
│ │ ├── services/ # 服务管理
│ │ ├── orders/ # 订单管理
│ │ ├── finance/ # 财务结算
│ │ ├── reviews/ # 评价管理
│ │ └── settings/ # 店铺设置
│ ├── components/
│ ├── services/api.ts
│ └── stores/
└── package.json2.3 增量DDL
-- ===========================
-- V2.0 增量DDL
-- ===========================
-- 1. 商家
CREATE TABLE merchants (
id BIGSERIAL PRIMARY KEY,
company_name VARCHAR(200) NOT NULL,
credit_code VARCHAR(18) UNIQUE,
category VARCHAR(50) NOT NULL,
store_name VARCHAR(100),
store_description TEXT,
store_logo_url TEXT,
contact_name VARCHAR(50),
contact_phone VARCHAR(11),
contact_email VARCHAR(100),
business_license_url TEXT,
industry_license_url TEXT,
other_licenses TEXT[],
address TEXT,
lat DECIMAL(10,7),
lng DECIMAL(10,7),
service_area TEXT[],
business_hours JSONB,
annual_fee DECIMAL(10,2) DEFAULT 0,
commission_rate DECIMAL(4,2),
level VARCHAR(20) DEFAULT 'normal'
CHECK (level IN ('normal', 'certified', 'strategic')),
rating DECIMAL(2,1) DEFAULT 5.0,
total_orders INTEGER DEFAULT 0,
total_revenue DECIMAL(12,2) DEFAULT 0,
status VARCHAR(20) DEFAULT 'pending',
approved_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE merchant_accounts (
id BIGSERIAL PRIMARY KEY,
merchant_id BIGINT REFERENCES merchants(id),
phone VARCHAR(11) UNIQUE NOT NULL,
password_hash VARCHAR(100),
role VARCHAR(20) DEFAULT 'owner',
last_login_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE merchant_services (
id BIGSERIAL PRIMARY KEY,
merchant_id BIGINT REFERENCES merchants(id),
title VARCHAR(200) NOT NULL,
category VARCHAR(50),
subcategory VARCHAR(50),
description TEXT,
images TEXT[],
price DECIMAL(10,2),
original_price DECIMAL(10,2),
price_unit VARCHAR(20),
stock INTEGER,
service_duration VARCHAR(50),
is_online BOOLEAN DEFAULT TRUE,
sales_count INTEGER DEFAULT 0,
rating DECIMAL(2,1) DEFAULT 5.0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE merchant_settlements (
id BIGSERIAL PRIMARY KEY,
merchant_id BIGINT REFERENCES merchants(id),
period_start DATE,
period_end DATE,
total_orders INTEGER,
gross_amount DECIMAL(12,2),
commission_amount DECIMAL(12,2),
net_amount DECIMAL(12,2),
bank_account_encrypted JSONB,
status VARCHAR(20) DEFAULT 'pending',
paid_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE merchant_daily_stats (
merchant_id BIGINT REFERENCES merchants(id),
stat_date DATE,
page_views INTEGER DEFAULT 0,
order_count INTEGER DEFAULT 0,
revenue DECIMAL(10,2) DEFAULT 0,
avg_rating DECIMAL(2,1),
PRIMARY KEY(merchant_id, stat_date)
);
-- 2. 积分
CREATE TABLE point_accounts (
user_id BIGINT PRIMARY KEY REFERENCES users(id),
total_points INTEGER DEFAULT 0,
available_points INTEGER DEFAULT 0,
used_points INTEGER DEFAULT 0,
expired_points INTEGER DEFAULT 0,
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE point_transactions (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
type VARCHAR(20),
action VARCHAR(50),
points INTEGER,
balance INTEGER,
reference_id VARCHAR(50),
description TEXT,
expires_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE point_products (
id BIGSERIAL PRIMARY KEY,
title VARCHAR(100),
description TEXT,
image_url TEXT,
points_required INTEGER,
stock INTEGER,
category VARCHAR(20),
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- 3. 优惠券
CREATE TABLE coupon_templates (
id BIGSERIAL PRIMARY KEY,
title VARCHAR(100),
type VARCHAR(20),
value DECIMAL(10,2),
min_amount DECIMAL(10,2),
applicable_categories TEXT[],
merchant_id BIGINT REFERENCES merchants(id),
total_count INTEGER,
issued_count INTEGER DEFAULT 0,
valid_days INTEGER,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE user_coupons (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
template_id BIGINT REFERENCES coupon_templates(id),
status VARCHAR(20) DEFAULT 'available',
used_order_no VARCHAR(20),
expires_at TIMESTAMP,
used_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
-- 4. 拼团
CREATE TABLE group_buy_campaigns (
id BIGSERIAL PRIMARY KEY,
service_id BIGINT REFERENCES merchant_services(id),
original_price DECIMAL(10,2),
group_price DECIMAL(10,2),
min_members INTEGER DEFAULT 3,
valid_hours INTEGER DEFAULT 24,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE group_buy_orders (
id BIGSERIAL PRIMARY KEY,
campaign_id BIGINT REFERENCES group_buy_campaigns(id),
initiator_id BIGINT REFERENCES users(id),
current_members INTEGER DEFAULT 1,
status VARCHAR(20) DEFAULT 'pending',
expires_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE group_buy_members (
group_order_id BIGINT REFERENCES group_buy_orders(id),
user_id BIGINT REFERENCES users(id),
order_no VARCHAR(20),
joined_at TIMESTAMP DEFAULT NOW(),
PRIMARY KEY(group_order_id, user_id)
);
-- 5. 课程
CREATE TABLE courses (
id BIGSERIAL PRIMARY KEY,
title VARCHAR(200),
category VARCHAR(50),
instructor_name VARCHAR(50),
description TEXT,
cover_image TEXT,
type VARCHAR(20),
video_url TEXT,
live_room_id VARCHAR(50),
scheduled_at TIMESTAMP,
duration_minutes INTEGER,
price DECIMAL(10,2) DEFAULT 0,
enrollment_count INTEGER DEFAULT 0,
rating DECIMAL(2,1) DEFAULT 5.0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE course_enrollments (
course_id BIGINT REFERENCES courses(id),
user_id BIGINT REFERENCES users(id),
progress DECIMAL(5,2) DEFAULT 0,
completed BOOLEAN DEFAULT FALSE,
enrolled_at TIMESTAMP DEFAULT NOW(),
PRIMARY KEY(course_id, user_id)
);3. 商家API端点
| 方法 | 路径 | 描述 |
|---|---|---|
| POST | /merchant/register | 商家注册 |
| POST | /merchant/auth/login | 登录 |
| GET | /merchant/dashboard | 看板 |
| GET/POST/PUT/DELETE | /merchant/services/* | 服务CRUD |
| GET/POST | /merchant/orders/* | 订单管理 |
| GET/POST | /merchant/settlements/* | 结算管理 |
| GET | /merchant/stats/* | 数据统计 |
| GET/POST | /merchant/reviews/* | 评价管理 |
| PUT | /merchant/settings | 店铺设置 |
| POST | /merchant/coupons | 创建优惠券 |
4. 结算系统
// workers/settlement.js - 每月1日凌晨生成结算单
cron.schedule('0 2 1 * *', async () => {
const merchants = await db.query('SELECT * FROM merchants WHERE status = $1', ['active']);
const lastMonth = moment().subtract(1, 'month');
for (const m of merchants.rows) {
const stats = await db.query(`
SELECT COUNT(*) as cnt, COALESCE(SUM(amount), 0) as gross
FROM orders o
JOIN merchant_services ms ON o.detail->>'serviceId' = ms.id::text
WHERE ms.merchant_id = $1 AND o.status = 'completed'
AND o.completed_at BETWEEN $2 AND $3
`, [m.id, lastMonth.startOf('month').toDate(), lastMonth.endOf('month').toDate()]);
const gross = parseFloat(stats.rows[0].gross);
const commission = gross * m.commission_rate / 100;
await db.query(`
INSERT INTO merchant_settlements
(merchant_id, period_start, period_end, total_orders, gross_amount, commission_amount, net_amount)
VALUES ($1, $2, $3, $4, $5, $6, $7)
`, [m.id, lastMonth.startOf('month').format('YYYY-MM-DD'),
lastMonth.endOf('month').format('YYYY-MM-DD'),
stats.rows[0].cnt, gross, commission, gross - commission]);
}
});5. Elasticsearch搜索
// 商家/服务索引,使用ik_max_word分词器
// 支持:全文搜索 + 地理位置排序 + 分类筛选 + 评分排序// GET /api/v1/search?q=保洁&category=housekeeping&lat=30.57&lng=104.07
router.get('/search', async (req, res) => {
const { q, category, lat, lng, page = 1, size = 20 } = req.query;
const result = await esClient.search({
index: 'banxiang_services',
body: {
query: {
bool: {
must: [{ multi_match: { query: q, fields: ['title^2', 'description'] } }],
filter: category ? [{ term: { category } }] : []
}
},
sort: lat ? [{ _geo_distance: { location: { lat, lon: lng }, order: 'asc' } }] : [{ salesCount: 'desc' }],
from: (page - 1) * size, size
}
});
res.json({ success: true, data: result.hits });
});6. 完整部署方案
6.1 服务器配置
| 服务 | 配置 | 月费 |
|---|---|---|
| 应用服务器 | ECS 4核8G × 2 | ¥800 |
| 数据库 | RDS PG 4核8G(主从) | ¥600 |
| Redis | 2G | ¥150 |
| Elasticsearch | 2核4G | ¥300 |
| OSS + CDN | 按量 | ¥200 |
| 月合计 | ¥2050 |
6.2 Docker Compose
version: '3.8'
services:
app:
build: .
ports: ["3000:3000"]
deploy: { replicas: 2 }
depends_on: [db, redis, es]
restart: always
worker:
build: .
command: node workers/index.js
depends_on: [db, redis]
restart: always
db:
image: postgres:15
volumes: [pgdata:/var/lib/postgresql/data]
restart: always
redis:
image: redis:7-alpine
volumes: [redisdata:/data]
restart: always
es:
image: elasticsearch:8.12.0
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes: [esdata:/usr/share/elasticsearch/data]
restart: always
nginx:
image: nginx:alpine
ports: ["80:80", "443:443"]
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./merchant-web/dist:/var/www/merchant
depends_on: [app]
restart: always
volumes:
pgdata:
redisdata:
esdata:6.3 Nginx关键配置
# APP API + SSE支持
server {
listen 443 ssl;
server_name api.banxiang.com;
location /api/ { proxy_pass http://app:3000; }
location /api/v1/ai/chat {
proxy_pass http://app:3000;
proxy_buffering off;
proxy_http_version 1.1;
}
}
# 商家后台SPA
server {
listen 443 ssl;
server_name merchant.banxiang.com;
root /var/www/merchant;
location / { try_files $uri /index.html; }
location /api/merchant/ { proxy_pass http://app:3000; }
}7. 数据库表总览(全版本49张表)
| 版本 | 表数 | 核心表 |
|---|---|---|
| V1.0 | 17张 | users, activities, ai_conversations, orders, hospitals等 |
| V1.1 | 9张 | captains, memberships, service_providers, products等 |
| V1.2 | 11张 | health_records, child_users, posts, service_products等 |
| V2.0 | 12张 | merchants, point_accounts, coupon_templates, courses等 |
| 合计 | 49张 |
8. 向微服务演进路线
V2.0 (当前): 模块化单体
→ 代码按服务边界分离,共享数据库
V3.0 (计划): 拆分核心服务
→ 用户服务(独立DB)
→ 活动服务(独立DB)
→ AI管家服务(独立,GPU资源)
→ 其余保持单体
V4.0 (远期): 完整微服务
→ 所有服务独立
→ API Gateway统一入口
→ 服务间gRPC通信
→ K8s编排9. 安全合规清单
| 项目 | 状态 | 说明 |
|---|---|---|
| 《个人信息保护法》合规 | ✅ | 最小收集、明确告知、分项授权 |
| 数据加密 | ✅ | TLS 1.3 + AES-256 |
| 健康数据隔离 | ✅ | 单独加密存储 |
| 医疗免责声明 | ✅ | 所有页面标注 |
| 金融合规 | ✅ | 仅信息展示,不销售 |
| 老年人权益 | ✅ | 无自动续费、大额二次确认 |
| RBAC权限 | ✅ | 用户/商家/管理员角色分离 |
| 审计日志 | ✅ | 全操作记录 |
| 数据备份 | ✅ | 每日自动+跨区域 |
| 安全渗透测试 | 📋 | V2.0上线前完成 |
文档结束