--- 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需求评审通过 --- **文档结束**