40 KiB
| 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管家 │ 消息 │ 我的 │ ← 底部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) -- 报名率越高越热
数据结构
-- 活动表
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=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回复自动语音播报,用户可关闭
- 播报速度:可调(慢速/正常/快速)
数据结构
-- 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需求评审通过
文档结束