banxiang/docs/PRD-V1.0-MVP核心功能.md
2026-02-18 18:06:31 +00:00

1458 lines
40 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
slug: prd-v1-0-mvp
---
# 「伴享」PRD V1.0 — MVP核心功能
**版本**: V1.0 MVP
**目标**: 6周内上线500人内测验证"社交活动+AI管家+医疗服务"三大核心能力
**发布时间**: 2026年4月初
**文档更新**: 2026-02-16
---
## 目录
1. [版本概述](#1-版本概述)
2. [用户系统](#2-用户系统)
3. [社交活动模块](#3-社交活动模块)
4. [AI智能管家](#4-ai智能管家)
5. [医疗健康服务](#5-医疗健康服务)
6. [支付系统](#6-支付系统)
7. [消息与通知系统](#7-消息与通知系统)
8. [适老化设计规范](#8-适老化设计规范)
9. [非功能性需求](#9-非功能性需求)
10. [验收标准与测试计划](#10-验收标准与测试计划)
---
## 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字可左右滑动
#### 数据结构
```sql
-- 用户表
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**
```json
// 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**
```json
// 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**
```json
// 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**
```json
// 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**
```json
{
"name": "张明(儿子)",
"phone": "13900139000"
}
```
#### 验收标准
- [ ] 紧急联系人为活动报名必填项
- [ ] 支持修改修改前需短信验证
---
### 2.4 子女账号关联
#### 需求描述
用户生成6位邀请码子女通过微信小程序扫码绑定绑定后子女可查看用户的活动和健康状态V1.2启用健康数据)。
#### 交互流程
```
父母端:
我的 → 家人关联 → 生成邀请码6位字母数字24小时有效
→ 展示邀请码 + 二维码 → 微信分享给子女
子女端V1.0仅做关联小程序V1.2上线):
扫码/输入邀请码 → 确认绑定 → 关联成功
```
#### 数据结构
```sql
-- 家庭关联表
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**
```json
// Response
{
"code": "A3B7K9",
"expiresAt": "2026-04-02T10:00:00Z",
"qrCodeUrl": "https://api.banxiang.com/qr/A3B7K9"
}
```
**POST /api/v1/family/link**
```json
// 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管家 │ 消息 │ 我的 │ ← 底部Tab
```
#### UI要求
- 活动卡片圆角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) -- 报名率越高越热
```
#### 数据结构
```sql
-- 活动表
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**
```json
{
"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**
```json
// 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**
```json
// 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**
```json
// 活动开始前2小时可取消
// Response 200
{
"success": true,
"message": "已取消报名"
}
```
#### 验收标准
- [ ] 报名需有紧急联系人
- [ ] 已满员不可报名
- [ ] 开始前2小时可取消之后不可取消
- [ ] 不可重复报名
- [ ] 取消后名额释放
---
### 3.4 活动签到
#### 需求描述
活动开始前15分钟推送提醒参与者到场后通过GPS定位签到距活动地点500米内
#### 交互流程
```
活动开始前15分钟 → 推送通知"您报名的[活动名]即将开始"
进入活动详情页 → 签到按钮亮起
点击签到 → 获取GPS位置
├── 距离<500m → "签到成功✓" + 打卡动画
└── 距离>500m → "您距活动地点较远,请靠近后重试"
```
#### API接口
**POST /api/v1/activities/:id/sign-in**
```json
// 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**
```json
{
"rating": 5,
"review": "李教练教得真好,明天还来!"
}
```
#### 验收标准
- [ ] 只有已签到的参与者可评价
- [ ] 评价在活动结束后24小时内可提交
- [ ] 评分1-5星必填文字评价选填
---
### 3.6 我的活动
#### 需求描述
用户可查看自己报名的活动和发起的活动,按状态分类。
#### API接口
**GET /api/v1/users/me/activities**
```
Query: type=joined|created&status=upcoming|finished|all&page=1
```
---
## 4. 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回复自动语音播报用户可关闭
- 播报速度:可调(慢速/正常/快速)
#### 数据结构
```sql
-- AI对话记录表
CREATE TABLE ai_conversations (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id) NOT NULL,
session_id VARCHAR(36) NOT NULL, -- 会话IDUUID
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**
```json
// 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**
```json
{
"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**
```json
{
"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 在线挂号
#### 数据结构
```sql
-- 医院表
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 在线问诊
#### 数据结构
```sql
-- 问诊记录表
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**
```json
{
"doctorId": 1,
"symptomDescription": "最近经常头晕,血压偏高",
"images": ["https://...photo1.jpg"]
}
```
#### 验收标准
- [ ] 问诊费19.9元/
- [ ] 医生2小时内回复
- [ ] 支持上传最多3张图片
- [ ] 医疗内容标注"仅供参考不构成医疗建议"
---
## 6. 支付系统
### 6.1 微信支付集成
#### 数据结构
```sql
-- 支付订单表
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**
```json
{
"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**
```json
{
"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内消息 |
#### 数据结构
```sql
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次
**测试重点**:
1. 易用性测试 — 60-70岁用户独立完成核心流程
2. 功能测试 — 所有功能流程跑通
3. 性能测试 — 500人并发
4. 安全测试 — 个人信息加密、支付安全
### 10.3 进入V1.1的Gate条件
- [ ] 所有"必达"指标达标
- [ ] 无P0级Bug
- [ ] 用户反馈汇总完成
- [ ] V1.1需求评审通过
---
**文档结束**