1458 lines
40 KiB
Markdown
1458 lines
40 KiB
Markdown
---
|
||
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, -- 会话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**
|
||
```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需求评审通过
|
||
|
||
---
|
||
|
||
**文档结束** |