darkeril

半享项目总文档

半享项目总文档

说明:本文件为历史文档合并版,便于统一查阅。


来源:CODE-MAP.md

CODE MAP(Flutter 项目)

版本:v1.1.0+2 | 更新:2026-02-17

1) 目录树(文件级,聚焦 lib/)

banxiang_app/
├── lib/
│   ├── main.dart
│   ├── theme.dart
│   ├── models/
│   │   ├── activity.dart
│   │   ├── hospital.dart
│   │   ├── message.dart
│   │   └── user.dart
│   ├── screens/
│   │   ├── activity_detail_screen.dart
│   │   ├── activity_list_screen.dart
│   │   ├── ai_chat_screen.dart
│   │   ├── booking_screen.dart
│   │   ├── create_activity_screen.dart
│   │   ├── department_screen.dart
│   │   ├── doctor_list_screen.dart
│   │   ├── home_screen.dart
│   │   ├── hospital_list_screen.dart
│   │   ├── login_screen.dart
│   │   ├── main_screen.dart
│   │   ├── medical_screen.dart
│   │   ├── messages_screen.dart
│   │   ├── order_list_screen.dart
│   │   ├── payment_screen.dart
│   │   ├── profile_screen.dart
│   │   ├── profile_setup_screen.dart
│   │   ├── publish_screen.dart
│   │   └── services_screen.dart
│   ├── services/
│   │   ├── activity_service.dart
│   │   ├── ai_service.dart
│   │   ├── auth_service.dart
│   │   └── medical_service.dart
│   └── utils/
│       └── constants.dart

2) 文件说明

文件说明
main.dart应用入口,读取本地token后决定进入登录页或活动广场页
theme.dart定义全局浅色主题 AppTheme.lightTheme
models/activity.dart活动实体模型,承载标题、分类、时间、地点、人数等基础字段
models/hospital.dart医疗相关实体,含 Hospital、Doctor、Appointment 三类模型
models/message.dart聊天消息模型,含文本、发送方与时间
models/user.dart用户资料模型,含手机号、昵称、性别、兴趣等
screens/activity_list_screen.dart活动广场页,瀑布流展示活动卡片+底部导航+发布入口
screens/activity_detail_screen.dart活动详情页,含图片轮播、评论区、点赞与报名底栏
screens/login_screen.dart手机验证码模拟登录页,登录后按新老用户分流
screens/profile_setup_screen.dart新用户三步资料完善流程
screens/profile_screen.dart个人资料编辑页
screens/publish_screen.dart发布页,支持图片/视频上传
screens/ai_chat_screen.dartAI聊天页,支持快捷提问和消息渲染
screens/services_screen.dart生活服务总入口页
screens/medical_screen.dart医疗健康服务聚合页
screens/messages_screen.dart消息通知页(空壳)
screens/main_screen.dart底部Tab主容器(旧版,已不作入口)
services/auth_service.dart认证与用户资料服务,管理登录态与资料更新
services/activity_service.dart活动 mock 数据服务
services/ai_service.dartAI回复 mock 服务,基于关键词规则
services/medical_service.dart医疗 mock 数据服务
utils/constants.dart应用常量(应用名、活动分类、兴趣标签等)

3) 核心方法索引

文件方法说明
main.dartmain读取token决定首屏
login_screen.dart_login校验验证码+写token+登录分流
profile_setup_screen.dart_finishSetup提交资料跳转活动页
activity_list_screen.dart_buildBody构建瀑布流活动列表
activity_list_screen.dart_buildFloatingActionButton构建中心悬浮发布按钮
activity_detail_screen.dart_toggleLike切换点赞状态
activity_detail_screen.dart_postComment发布评论
publish_screen.dart_publish校验并发布
publish_screen.dart_pickImages多选图片(最多9张)
auth_service.dartcheckLoginStatus读取token恢复登录态
auth_service.dartupdateProfile更新用户资料
activity_service.dartgetActivities按分类筛选活动
ai_service.dartmockChat基于关键词返回AI回复

4) 数据模型汇总

模型主要字段用途
Activityid, title, category, time, location, maxParticipants, currentParticipants社区活动核心实体
Userid, phone, nickname, avatar, birthYear, gender, city, interests用户画像
Hospitalid, name, address, departments医院实体
Doctorid, name, department, title, fee医生实体
Appointmentid, hospitalName, doctorName, time, status, fee预约订单
Messagetext, isUser, timeAI聊天消息

来源:PRD-V1.0-MVP核心功能.md


slug: prd-v1-0-mvp

「伴享」PRD V1.0 — MVP核心功能

版本: V1.0 MVP
目标: 6周内上线,500人内测,验证"社交活动+AI管家+医疗服务"三大核心能力
发布时间: 2026年4月初
文档更新: 2026-02-16


目录

  1. 版本概述
  2. 用户系统
  3. 社交活动模块
  4. AI智能管家
  5. 医疗健康服务
  6. 支付系统
  7. 消息与通知系统
  8. 适老化设计规范
  9. 非功能性需求
  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字),可左右滑动

数据结构

-- 用户表
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:1WCAG 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 兼容性要求

平台最低版本
iOS14.0+
Android8.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需求评审通过

文档结束


来源:PRD-V1.1-体验优化版.md


slug: prd-v1-1-experience

「伴享」PRD V1.1 — 体验优化版

版本: V1.1
目标: V1.0后3周上线,2000人公测,提升留存,引入社区队长和会员体系
发布时间: 2026年4月下旬
前置条件: V1.0内测Gate条件全部达标


1. 版本概述

1.1 核心目标

维度目标衡量指标
用户增长2000人公测注册用户≥2000
留存提升7日留存50%+较V1.0提升10%
社区运营社区队长体系运转队长≥20人
商业验证会员付费起步付费率>5%
服务扩展新增家政+日用消费服务板块从1→3

1.2 新增功能清单

模块功能优先级开发周期
社区队长申请/审核/等级/排行榜P02周
会员订阅月卡/年卡/权益/子女代付P01周
家政服务保洁/维修/陪护P11周
日常消费生鲜配送/日化用品P11周
新手引导首次使用动画引导P10.5周
分享功能活动分享到微信P10.5周
消息推送活动提醒/AI关怀P10.5周

2. 社区队长体系

2.1 需求描述

社区队长是「伴享」增长引擎的核心。借鉴Meet5 Community Captains模式,从广场舞队长、社区积极分子、退休干部、太极教练等人群中招募,赋予组织权限和激励,驱动线下活动供给和用户增长。

2.2 用户故事

  • US-CQ.1: 作为活跃用户,我组织了3次以上活动,希望获得官方认可
  • US-CQ.2: 作为社区队长,我希望看到自己的等级和排名
  • US-CQ.3: 作为社区队长,我希望组织活动能获得补贴
  • US-CQ.4: 作为普通用户,我希望优先参加队长组织的活动(更有保障)

2.3 队长等级体系

等级条件权益标识
见习队长累计组织3次活动,好评率>80%专属标识🏅、活动优先推荐、队长培训群铜色徽章
银牌队长累计20次、好评率>90%、活跃用户带新>20人免费会员1年、活动补贴20元/次、月度队长聚会银色徽章
金牌队长累计50次、好评率>95%、带新>100人月度奖金500元、平台分成5%、专属客服金色徽章
荣誉队长年度评选TOP10品牌大使、媒体曝光、年度旅行奖励钻石徽章

2.4 交互流程

队长申请

我的 → 社区队长 → 申请成为队长

申请条件检查:
  ├── 已实名认证 ✓
  ├── 累计组织≥3次活动 ✓
  └── 好评率≥80% ✓

填写申请信息:
  ├── 自我介绍(100字以内)
  ├── 擅长活动类型(多选)
  ├── 活动区域(选择区域)
  └── 联系方式确认

提交申请 → 后台审核(1-3天)
  ├── 通过 → Push通知"恭喜成为见习队长!" + 解锁队长功能
  └── 拒绝 → 通知原因 + 建议继续积累

队长主页

┌──────────────────────────────────┐
│  🏅 银牌队长 · 李教练             │
│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
│  累计活动:28次  好评率:96%       │
│  活跃粉丝:156人  排名:#5        │
├──────────────────────────────────┤
│  📊 本月数据                      │
│  组织活动 8次  新增粉丝 23人      │
│  获得好评 52个  补贴收入 ¥160     │
├──────────────────────────────────┤
│  🎯 升级进度                      │
│  距金牌队长还需:                  │
│  ▓▓▓▓▓▓▓▓░░ 28/50次活动         │
│  ▓▓▓▓▓▓▓▓▓░ 96%/95%好评         │
│  ▓▓▓▓▓░░░░░ 56/100带新          │
├──────────────────────────────────┤
│  [创建活动]  [我的粉丝]  [收入明细] │
└──────────────────────────────────┘

2.5 数据结构

-- 队长信息表
CREATE TABLE captains (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT UNIQUE REFERENCES users(id),
  level VARCHAR(20) DEFAULT 'trainee'
    CHECK (level IN ('trainee', 'silver', 'gold', 'honor')),
  bio TEXT,
  specialties TEXT[],
  serving_area VARCHAR(50),
  total_activities INTEGER DEFAULT 0,
  total_participants INTEGER DEFAULT 0,
  total_new_users INTEGER DEFAULT 0,
  avg_rating DECIMAL(2,1) DEFAULT 0,
  monthly_subsidy DECIMAL(10,2) DEFAULT 0,
  status VARCHAR(20) DEFAULT 'pending'
    CHECK (status IN ('pending', 'active', 'suspended', 'revoked')),
  approved_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

-- 队长申请表
CREATE TABLE captain_applications (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  bio TEXT,
  specialties TEXT[],
  serving_area VARCHAR(50),
  contact_info JSONB,
  status VARCHAR(20) DEFAULT 'pending'
    CHECK (status IN ('pending', 'approved', 'rejected')),
  reviewer_note TEXT,
  reviewed_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 队长排行榜(月度物化视图)
CREATE MATERIALIZED VIEW captain_monthly_ranking AS
SELECT 
  c.user_id,
  u.nickname,
  u.avatar_url,
  c.level,
  COUNT(a.id) AS monthly_activities,
  SUM(ap.cnt) AS monthly_participants,
  AVG(ap.avg_rating) AS monthly_avg_rating
FROM captains c
JOIN users u ON c.user_id = u.id
LEFT JOIN activities a ON a.creator_id = c.user_id 
  AND a.start_time >= date_trunc('month', CURRENT_DATE)
LEFT JOIN (
  SELECT activity_id, COUNT(*) cnt, AVG(rating) avg_rating
  FROM activity_participants 
  WHERE status = 'signed_in'
  GROUP BY activity_id
) ap ON ap.activity_id = a.id
WHERE c.status = 'active'
GROUP BY c.user_id, u.nickname, u.avatar_url, c.level
ORDER BY monthly_activities DESC;

2.6 API接口

POST /api/v1/captains/apply

{
  "bio": "退休体育老师,太极拳教练,组织活动经验丰富",
  "specialties": ["太极", "晨练", "户外徒步"],
  "servingArea": "武侯区"
}

GET /api/v1/captains/ranking

{
  "ranking": [
    {
      "rank": 1,
      "userId": 5,
      "nickname": "李教练",
      "level": "silver",
      "monthlyActivities": 12,
      "monthlyParticipants": 98,
      "avgRating": 4.9
    }
  ]
}

GET /api/v1/captains/me/dashboard

{
  "level": "silver",
  "stats": {
    "totalActivities": 28,
    "totalParticipants": 312,
    "totalNewUsers": 56,
    "avgRating": 4.8,
    "monthlySubsidy": 160
  },
  "upgradeProgress": {
    "nextLevel": "gold",
    "activities": { "current": 28, "required": 50 },
    "rating": { "current": 96, "required": 95 },
    "newUsers": { "current": 56, "required": 100 }
  }
}

2.7 验收标准

  • 满足条件的用户可申请队长
  • 审核1-3天内完成
  • 队长主页展示数据准确
  • 排行榜每日更新
  • 等级自动升降
  • 活动补贴按月结算

3. 会员订阅系统

3.1 需求描述

会员体系是核心变现手段之一。提供基础会员和尊享会员两档,支持子女代付(重要转化场景)。

3.2 会员权益对比

功能免费用户基础会员(29元/月 或 299元/年)尊享会员(待V2.0)
活动参与每月3次无限次无限+优先
AI管家每天20条无限对话专属AI+家庭共享
服务预约基础优先预约+专属折扣5%VIP折扣10%
客服专属客服(微信1v1)专属客服+电话
生日礼物电子贺卡+优惠券实物礼品
标识会员标识✨VIP标识👑

3.3 交互流程

开通会员

我的 → 会员中心

┌──────────────────────────────────┐
│  ✨ 伴享会员                      │
│                                   │
│  解锁全部功能,让生活更便捷       │
│                                   │
│  ┌────────────┐ ┌────────────┐  │
│  │   月卡      │ │   年卡      │  │
│  │  29元/月    │ │ 299元/年   │  │
│  │            │ │ 省49元 🔥  │  │
│  │  [开通]    │ │ [开通]     │  │
│  └────────────┘ └────────────┘  │
│                                   │
│  或者让子女帮您开通:              │
│  [生成代付链接]                   │
│                                   │
│  会员权益:                        │
│  ✅ 活动不限次                    │
│  ✅ AI管家不限量                  │
│  ✅ 服务优先预约+折扣             │
│  ✅ 专属客服                      │
│  ✅ 生日礼物                      │
└──────────────────────────────────┘

子女代付

父母端:会员中心 → [生成代付链接] → 生成微信分享卡片

子女微信:收到分享卡片 → 打开支付页面 → 微信支付

父母端:收到Push通知 "您的子女为您开通了会员✨"

3.4 数据结构

-- 会员表
CREATE TABLE memberships (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  plan VARCHAR(20) NOT NULL CHECK (plan IN ('monthly', 'yearly')),
  price DECIMAL(10, 2) NOT NULL,
  paid_by_user_id BIGINT REFERENCES users(id),  -- 代付人(子女)
  starts_at TIMESTAMP NOT NULL,
  expires_at TIMESTAMP NOT NULL,
  auto_renew BOOLEAN DEFAULT FALSE,  -- 明确不设自动续费
  status VARCHAR(20) DEFAULT 'active'
    CHECK (status IN ('active', 'expired', 'cancelled')),
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_membership_user ON memberships(user_id, status);

3.5 API接口

POST /api/v1/membership/subscribe

{
  "plan": "yearly",
  "payForUserId": null  // 为自己开通
}
// Response
{
  "orderNo": "MEM20260420001",
  "amount": 299,
  "wxPayParams": { ... }
}

POST /api/v1/membership/generate-pay-link

// 生成子女代付链接
// Response
{
  "payLink": "https://pay.banxiang.com/member/xxx",
  "shareCard": {
    "title": "张阿姨邀请您为TA开通伴享会员",
    "description": "299元/年,让父母的生活更便捷",
    "imageUrl": "https://..."
  },
  "expiresAt": "2026-04-21T10:00:00Z"
}

3.6 验收标准

  • 支付后立即生效
  • 不设自动续费(合规要求)
  • 到期前7天/3天/1天提醒续费
  • 子女代付链接24小时有效
  • 会员标识在头像/个人页显示
  • 免费用户超出限额时引导开通会员

4. 家政服务

4.1 需求描述

接入成都本地2-3家家政公司,提供保洁、维修、陪护三项基础服务。

4.2 用户故事

  • US-HP.1: 作为用户,我希望一键预约保洁阿姨上门
  • US-HP.2: 作为用户,我希望看到服务人员的评价和资质
  • US-HP.3: 作为用户,我希望服务完成后可以评价

4.3 服务列表

服务价格区间平台佣金服务时长
钟点保洁40-60元/时15%2-4小时
深度保洁200-400元/次15%4-8小时
水电维修50-200元/次12%按需
家电维修80-300元/次12%按需
陪同就医100-200元/次10%半天/全天
陪聊服务50-80元/时10%1-3小时

4.4 交互流程

服务Tab → 家政服务

┌──────────────────────────────────┐
│  🏠 家政服务                      │
├──────────────────────────────────┤
│ ┌────────┐ ┌────────┐ ┌────────┐│
│ │ 🧹     │ │ 🔧     │ │ 🤝     ││
│ │ 保洁   │ │ 维修   │ │ 陪护   ││
│ └────────┘ └────────┘ └────────┘│
├──────────────────────────────────┤
│  推荐服务人员:                    │
│  ┌────────────────────────────┐  │
│  │ 👩 李阿姨  好评率98%        │  │
│  │ 擅长:保洁  服务次数:320    │  │
│  │ ¥50/小时  [预约]           │  │
│  └────────────────────────────┘  │
└──────────────────────────────────┘

4.5 数据结构

-- 服务商表
CREATE TABLE service_providers (
  id BIGSERIAL PRIMARY KEY,
  company_name VARCHAR(100),
  category VARCHAR(50),          -- housekeeping/repair/companion
  contact_phone VARCHAR(20),
  license_no VARCHAR(50),
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 服务人员表
CREATE TABLE service_workers (
  id BIGSERIAL PRIMARY KEY,
  provider_id BIGINT REFERENCES service_providers(id),
  name VARCHAR(50),
  avatar_url TEXT,
  skills TEXT[],
  rating DECIMAL(2,1) DEFAULT 5.0,
  service_count INTEGER DEFAULT 0,
  hourly_rate DECIMAL(10,2),
  status VARCHAR(20) DEFAULT 'available',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 服务订单表
CREATE TABLE service_orders (
  id BIGSERIAL PRIMARY KEY,
  order_no VARCHAR(20) UNIQUE NOT NULL,
  user_id BIGINT REFERENCES users(id),
  worker_id BIGINT REFERENCES service_workers(id),
  service_type VARCHAR(50),
  scheduled_date DATE,
  scheduled_time TIME,
  duration_hours DECIMAL(3,1),
  address TEXT,
  requirements TEXT,
  amount DECIMAL(10,2),
  platform_fee DECIMAL(10,2),
  status VARCHAR(20) DEFAULT 'pending'
    CHECK (status IN ('pending', 'paid', 'confirmed', 'in_progress', 'completed', 'cancelled')),
  rating INTEGER CHECK (rating BETWEEN 1 AND 5),
  review TEXT,
  created_at TIMESTAMP DEFAULT NOW()
);

4.6 API接口

GET /api/v1/services/housekeeping/workers

Query: type=cleaning|repair|companion&lat=30.57&lng=104.07

POST /api/v1/services/housekeeping/orders

{
  "workerId": 1,
  "serviceType": "cleaning",
  "scheduledDate": "2026-04-22",
  "scheduledTime": "09:00",
  "durationHours": 3,
  "address": "武侯区XX小区3栋2单元501",
  "requirements": "重点打扫厨房和卫生间"
}

4.7 验收标准

  • 服务人员展示评价和资质
  • 预约流程≤3步
  • 支付前二次确认
  • 服务完成后可评价
  • 订单可取消(提前24小时免费,之内收取30%)

5. 日常消费服务

5.1 需求描述

整合2-3家本地生鲜/日化商家,用户可在线选购,30分钟-2小时配送到家。

5.2 交互流程

服务Tab → 日常消费 → 商家列表

选择商家 → 浏览商品(分类:蔬菜/水果/肉蛋/日化)

加入购物车 → 确认订单(地址+时间)→ 微信支付

等待配送 → 收货确认 → 评价

5.3 数据结构

-- 商品表
CREATE TABLE products (
  id BIGSERIAL PRIMARY KEY,
  provider_id BIGINT REFERENCES service_providers(id),
  name VARCHAR(100),
  category VARCHAR(50),
  description TEXT,
  image_url TEXT,
  price DECIMAL(10,2),
  unit VARCHAR(20),           -- 斤/个/盒/份
  stock INTEGER DEFAULT 0,
  status VARCHAR(20) DEFAULT 'available',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 购物车表
CREATE TABLE cart_items (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  product_id BIGINT REFERENCES products(id),
  quantity INTEGER DEFAULT 1,
  created_at TIMESTAMP DEFAULT NOW(),
  UNIQUE(user_id, product_id)
);

-- 配送订单表
CREATE TABLE delivery_orders (
  id BIGSERIAL PRIMARY KEY,
  order_no VARCHAR(20) UNIQUE NOT NULL,
  user_id BIGINT REFERENCES users(id),
  provider_id BIGINT REFERENCES service_providers(id),
  items JSONB,                 -- [{productId, name, qty, price}]
  total_amount DECIMAL(10,2),
  delivery_fee DECIMAL(10,2) DEFAULT 0,
  delivery_address TEXT,
  delivery_phone VARCHAR(11),
  estimated_delivery TIMESTAMP,
  status VARCHAR(20) DEFAULT 'pending',
  created_at TIMESTAMP DEFAULT NOW()
);

5.4 验收标准

  • 商品展示清晰(大图+价格+单位)
  • 购物车增删改查正常
  • 满30元免配送费,否则收5元
  • 订单实时状态更新

6. 新手引导

6.1 交互流程

首次打开APP → 3张引导卡片(可跳过)
  ├── 卡片1: "发现身边的好活动" + 活动截图
  ├── 卡片2: "AI管家,一句话搞定" + AI管家截图
  └── 卡片3: "便捷生活服务" + 服务截图

首次进入首页 → 高亮引导浮层(逐步指引)
  ├── Step 1: "点这里搜索活动" → 高亮搜索栏
  ├── Step 2: "这是AI管家入口" → 高亮底部Tab
  └── Step 3: "这是服务入口" → 高亮服务Tab

7. 分享功能

7.1 活动分享到微信

活动详情页 → 右上角分享按钮

选择:微信好友 / 朋友圈

生成分享卡片:
  ┌────────────────────────┐
  │ 🏃 太极晨练·人民公园    │
  │ 4月3日 7:00  还剩4个名额│
  │ 来「伴享」一起参加吧!  │
  │ [伴享APP logo]          │
  └────────────────────────┘

接收者点击 → H5落地页(含下载引导)

7.2 验收标准

  • 微信分享卡片展示正确
  • H5落地页可查看活动详情
  • 引导下载APP

8. V1.1验收标准总表

指标目标值判定
注册用户≥2000必达
社区队长≥20人必达
会员付费率>5%必达
7日留存率>50%必达
家政服务订单>50单/月目标
配送服务订单>100单/月目标
分享率>10%用户目标
NPS>40目标

进入V1.2的Gate条件

  • 所有"必达"指标达标
  • 社区队长运营SOP建立
  • 商家合作流程跑通
  • V1.2需求评审通过

文档结束


来源:PRD-V1.2-功能丰富版.md


slug: prd-v1-2-feature-rich

「伴享」PRD V1.2 — 功能丰富版

版本: V1.2
目标: V1.1后4周上线,5000人规模,健康管理+子女端+3个新服务
发布时间: 2026年5月下旬
前置条件: V1.1 Gate条件达标


1. 版本概述

1.1 核心目标

维度目标衡量指标
用户规模5000注册用户注册≥5000
子女覆盖子女端1000+用户小程序用户≥1000
健康数据手环接入用户>500健康数据活跃
月活1500+月活MAU≥1500
服务扩展总计6个服务板块新增候鸟/文教/设备

1.2 新增功能清单

模块功能优先级开发周期
健康管理手环接入/数据展示/异常报警/周报P02周
子女端小程序活动查看/健康数据/代办/代付P02周
内容社区朋友圈/话题广场P11周
候鸟养老旅居产品/短期度假P11周
文化教育老年大学/兴趣班P11周
智能设备设备商城/配对绑定P21周

2. 健康管理模块

2.1 需求描述

接入华为/小米智能手环手表,自动采集步数、心率、血压、血糖、睡眠数据,建立电子健康档案,数据可视化展示,异常情况自动报警通知子女。

重要声明:本模块为健康记录工具,所有数据仅供参考,不构成医疗诊断。

2.2 用户故事

  • US-HM.1: 作为用户,我希望手环数据自动同步到APP,不用手动录入
  • US-HM.2: 作为用户,我希望看到清晰的健康趋势图(血压/心率/步数)
  • US-HM.3: 作为子女,我希望父母血压异常时能收到通知
  • US-HM.4: 作为用户,我希望每周收到健康总结报告

2.3 功能详情

2.3.1 设备绑定

支持设备(MVP阶段):

  • 华为手环系列(Band 8/9)
  • 华为手表系列(GT 4/5)
  • 小米手环系列(Band 8/9)
  • 小米手表系列

绑定流程

健康管理 → 绑定设备 → 选择品牌

华为:通过华为健康API OAuth授权
小米:通过小米运动API OAuth授权

授权成功 → 自动同步历史7天数据

设置同步频率:每30分钟/每小时/手动

2.3.2 健康数据看板

┌──────────────────────────────────┐
│  ❤️ 我的健康                      │
│  2026年4月20日 周一               │
├──────────────────────────────────┤
│  今日概览                         │
│  ┌────┐ ┌────┐ ┌────┐ ┌────┐  │
│  │🚶  │ │❤️  │ │💤  │ │🩸  │  │
│  │步数 │ │心率 │ │睡眠 │ │血压 │  │
│  │6,842│ │72  │ │7.2h│ │正常 │  │
│  └────┘ └────┘ └────┘ └────┘  │
├──────────────────────────────────┤
│  血压趋势(近7天)               │
│  ┌────────────────────────────┐ │
│  │ 140─╮                      │ │
│  │ 130─│─╮     ╭─╮           │ │
│  │ 120─╰─╯─╮─╭╯ ╰─╮─●      │ │
│  │  80─────╰╯──────╰──      │ │
│  │  周一 二 三 四 五 六 日    │ │
│  └────────────────────────────┘ │
│  收缩压: 125 mmHg  舒张压: 82   │
│  状态: ✅ 正常范围               │
├──────────────────────────────────┤
│  本周报告 →                       │
│  异常预警设置 →                   │
│  健康档案 →                       │
└──────────────────────────────────┘

2.3.3 异常预警

指标正常范围预警阈值动作
收缩压90-140 mmHg>150 或 <85Push通知+子女通知
舒张压60-90 mmHg>100 或 <55Push通知+子女通知
心率60-100 bpm>120 或 <50Push通知+子女通知+建议就医
血糖3.9-6.1 mmol/L>7.0 或 <3.5Push通知+子女通知
步数>3000步/天连续3天<1000关怀提醒
睡眠6-9小时<4小时或>11小时关怀提醒

预警流程

数据同步 → 异常检测引擎
  ├── 达到预警阈值
  │   ├── Push通知用户:"您的血压偏高(155/95),建议休息并测量"
  │   ├── 通知子女端:"父/母血压异常(155/95),请关注"
  │   └── 记录预警日志
  └── 正常 → 不通知

2.3.4 每周健康报告

每周一生成上周健康报告,Push通知用户和子女:

📊 张阿姨的健康周报(4.14-4.20)

✅ 步数:平均6,200步/天(目标6,000 ✓)
⚠️ 血压:平均128/83,周三偏高(142/92)
✅ 心率:平均72bpm,范围正常
✅ 睡眠:平均7.1小时,质量良好

💡 建议:
1. 血压偶有波动,建议减少盐分摄入
2. 步数达标,继续保持!
3. 周末可适当增加户外活动

⚠️ 以上仅供参考,不构成医疗建议

2.4 数据结构

-- 设备绑定表
CREATE TABLE health_devices (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  brand VARCHAR(20) NOT NULL,        -- huawei/xiaomi
  device_model VARCHAR(50),
  device_id VARCHAR(100),
  auth_token TEXT,                    -- 加密存储
  refresh_token TEXT,
  sync_interval INTEGER DEFAULT 60,  -- 分钟
  last_sync_at TIMESTAMP,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 健康数据表(时序数据)
CREATE TABLE health_records (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  record_type VARCHAR(20) NOT NULL,  -- steps/heart_rate/blood_pressure/blood_sugar/sleep
  value JSONB NOT NULL,              -- 灵活存储不同类型数据
  recorded_at TIMESTAMP NOT NULL,
  source VARCHAR(20),                -- device/manual
  created_at TIMESTAMP DEFAULT NOW()
);

-- 分区索引(按用户和时间查询)
CREATE INDEX idx_health_user_type_time 
  ON health_records(user_id, record_type, recorded_at DESC);

-- value字段示例:
-- steps: {"count": 6842}
-- heart_rate: {"bpm": 72}
-- blood_pressure: {"systolic": 125, "diastolic": 82}
-- blood_sugar: {"mmol": 5.8, "timing": "fasting"}
-- sleep: {"duration_hours": 7.2, "deep_hours": 2.1, "light_hours": 4.5, "rem_hours": 0.6}

-- 预警记录表
CREATE TABLE health_alerts (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  alert_type VARCHAR(50),
  record_id BIGINT REFERENCES health_records(id),
  value JSONB,
  threshold JSONB,
  notified_user BOOLEAN DEFAULT FALSE,
  notified_family BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 健康报告表
CREATE TABLE health_reports (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  report_type VARCHAR(20) DEFAULT 'weekly',
  period_start DATE,
  period_end DATE,
  content JSONB,
  created_at TIMESTAMP DEFAULT NOW()
);

2.5 API接口

POST /api/v1/health/devices/bind

{
  "brand": "huawei",
  "authCode": "xxx"  // OAuth回调code
}

GET /api/v1/health/dashboard

{
  "today": {
    "steps": 6842,
    "heartRate": { "current": 72, "min": 58, "max": 98 },
    "bloodPressure": { "systolic": 125, "diastolic": 82, "status": "normal" },
    "sleep": { "duration": 7.2, "quality": "good" }
  },
  "trends": {
    "bloodPressure": [
      { "date": "2026-04-14", "systolic": 128, "diastolic": 83 },
      { "date": "2026-04-15", "systolic": 132, "diastolic": 85 }
    ]
  },
  "alerts": []
}

GET /api/v1/health/reports/weekly

Query: week=2026-W16

2.6 验收标准

  • 华为/小米手环成功绑定和数据同步
  • 健康看板数据展示正确
  • 趋势图展示近7/30天数据
  • 异常预警5分钟内通知用户和子女
  • 每周一自动生成周报
  • 所有健康数据单独加密存储
  • 页面标注"仅供参考,不构成医疗建议"

3. 子女端小程序

3.1 需求描述

微信小程序,子女通过扫码绑定父母账号后,可查看父母活动、健康数据、代办服务、代付会员。

3.2 用户故事

  • US-CW.1: 作为子女,我希望知道父母今天参加了什么活动
  • US-CW.2: 作为子女,我希望看到父母的血压心率数据
  • US-CW.3: 作为子女,我希望帮父母预约挂号
  • US-CW.4: 作为子女,我希望帮父母续费会员

3.3 功能模块

子女端小程序
├── 首页(父母状态概览)
│   ├── 今日健康数据卡片
│   ├── 最近活动记录
│   └── 预警通知列表
├── 健康
│   ├── 实时数据
│   ├── 趋势图
│   └── 历史周报
├── 活动
│   ├── 参与的活动列表
│   └── 活动详情(地点/时间/参与者)
├── 代办
│   ├── 帮父母挂号
│   ├── 帮父母预约家政
│   └── 帮父母购物
├── 我的
│   ├── 绑定的父母列表
│   ├── 帮父母充值会员
│   └── 消息通知设置

3.4 交互流程

绑定流程

子女打开小程序 → 微信一键登录

输入父母分享的邀请码 / 扫描二维码

确认绑定信息(显示父母昵称头像)

绑定成功 → 进入首页

首页

┌──────────────────────────────────┐
│  👵 妈妈 · 张阿姨                │
│  在线 · 今日步数 6,842            │
├──────────────────────────────────┤
│  ❤️ 健康状态                      │
│  血压 125/82 ✅  心率 72 ✅       │
│  睡眠 7.2h ✅   步数 6842 ✅     │
│  [查看详情 →]                     │
├──────────────────────────────────┤
│  📅 最近活动                      │
│  4/20 太极晨练·人民公园 ✓已签到   │
│  4/22 茶话会·宽窄巷子 报名中      │
│  [查看全部 →]                     │
├──────────────────────────────────┤
│  🔔 消息                          │
│  暂无预警,一切正常 ✅             │
├──────────────────────────────────┤
│  [帮妈妈挂号] [帮妈妈续会员]     │
└──────────────────────────────────┘

3.5 数据结构

-- 子女用户表(微信小程序)
CREATE TABLE child_users (
  id BIGSERIAL PRIMARY KEY,
  wx_openid VARCHAR(50) UNIQUE NOT NULL,
  wx_unionid VARCHAR(50),
  nickname VARCHAR(50),
  avatar_url TEXT,
  phone VARCHAR(11),
  created_at TIMESTAMP DEFAULT NOW()
);

-- 子女-父母关联表
CREATE TABLE child_parent_links (
  id BIGSERIAL PRIMARY KEY,
  child_id BIGINT REFERENCES child_users(id),
  parent_user_id BIGINT REFERENCES users(id),
  relationship VARCHAR(20) DEFAULT 'child', -- child/daughter/son
  notification_enabled BOOLEAN DEFAULT TRUE,
  alert_phone VARCHAR(11),
  linked_at TIMESTAMP DEFAULT NOW(),
  UNIQUE(child_id, parent_user_id)
);

3.6 API接口(子女端)

GET /api/v1/child/parents/:parentId/overview

{
  "parent": {
    "nickname": "张阿姨",
    "avatar": "...",
    "lastOnline": "2026-04-20T08:30:00Z"
  },
  "health": {
    "steps": 6842,
    "bloodPressure": { "systolic": 125, "diastolic": 82, "status": "normal" },
    "heartRate": 72,
    "sleep": 7.2
  },
  "recentActivities": [
    { "id": 1, "title": "太极晨练", "date": "2026-04-20", "status": "signed_in" }
  ],
  "alerts": [],
  "membershipExpires": "2027-04-20"
}

POST /api/v1/child/parents/:parentId/proxy-order

{
  "orderType": "appointment",
  "data": {
    "hospitalId": 1,
    "departmentId": 3,
    "doctorId": 1,
    "slotDate": "2026-04-25",
    "slotTime": "09:00"
  }
}

3.7 验收标准

  • 微信扫码5秒内完成绑定
  • 健康数据实时同步(延迟<5分钟)
  • 预警通知30秒内到达子女端
  • 代办功能正确创建订单
  • 支持绑定多位父母
  • 小程序加载 < 2秒

4. 内容社区

4.1 朋友圈

功能

  • 发布图文动态(最多9张图+500字文字)
  • 点赞、评论
  • 仅展示好友和同城动态
  • 内容审核(敏感词+图片鉴黄)

4.2 话题广场

功能

  • 预设话题:#今日晨练 #养生食谱 #退休生活 #带孙记
  • 用户可创建话题
  • 话题热度排行

4.3 数据结构

-- 动态表
CREATE TABLE posts (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  content TEXT,
  images TEXT[],
  topic_id BIGINT,
  location VARCHAR(100),
  like_count INTEGER DEFAULT 0,
  comment_count INTEGER DEFAULT 0,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 点赞表
CREATE TABLE post_likes (
  id BIGSERIAL PRIMARY KEY,
  post_id BIGINT REFERENCES posts(id),
  user_id BIGINT REFERENCES users(id),
  created_at TIMESTAMP DEFAULT NOW(),
  UNIQUE(post_id, user_id)
);

-- 评论表
CREATE TABLE post_comments (
  id BIGSERIAL PRIMARY KEY,
  post_id BIGINT REFERENCES posts(id),
  user_id BIGINT REFERENCES users(id),
  content TEXT,
  reply_to_id BIGINT REFERENCES post_comments(id),
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 话题表
CREATE TABLE topics (
  id BIGSERIAL PRIMARY KEY,
  name VARCHAR(50) UNIQUE,
  description TEXT,
  post_count INTEGER DEFAULT 0,
  is_official BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMP DEFAULT NOW()
);

4.4 验收标准

  • 发布动态流程 < 1分钟
  • 图片上传支持压缩(<2MB/张)
  • 内容审核延迟 < 5秒
  • 点赞/评论实时更新

5. 新增3个服务板块

5.1 候鸟养老

产品类型价格区间合作方佣金
旅居短租(攀枝花/三亚/大理)2000-5000元/月养老社区/民宿8%
短期度假(5-7天)1000-3000元/次旅行社10%
候鸟团(含交通+住宿+活动)3000-8000元/人旅行社10%

5.2 文化教育

服务价格合作方
老年大学课程(书法/摄影/绘画)200-500元/期老年大学/培训机构
兴趣班(太极/舞蹈/合唱)100-300元/月文化馆/私人教练
线上讲座(健康/防诈/数码)免费/9.9元专家/志愿者

5.3 智能设备商城

设备价格区间佣金
健康手环(华为/小米)200-500元5-8%
智能血压计200-400元8%
智能药盒100-300元10%
紧急呼叫器100-200元10%

5.4 数据结构

-- 通用服务产品表(候鸟养老/文化教育/智能设备共用)
CREATE TABLE service_products (
  id BIGSERIAL PRIMARY KEY,
  provider_id BIGINT REFERENCES service_providers(id),
  category VARCHAR(50),       -- travel/education/device
  subcategory VARCHAR(50),
  title VARCHAR(200),
  description TEXT,
  images TEXT[],
  price DECIMAL(10,2),
  price_unit VARCHAR(20),     -- 元/月、元/期、元/个
  commission_rate DECIMAL(4,2),
  location VARCHAR(100),
  available_from DATE,
  available_to DATE,
  stock INTEGER,
  sales_count INTEGER DEFAULT 0,
  rating DECIMAL(2,1) DEFAULT 5.0,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

6. V1.2验收标准总表

指标目标值判定
注册用户≥5000必达
月活用户≥1500必达
子女端用户≥1000必达
手环绑定用户≥500目标
健康预警准确率>95%必达
子女端NPS>40目标
内容社区日发帖>50条目标
新增服务板块上线3个必达

进入V2.0的Gate条件

  • 核心指标达标
  • 健康数据安全审计通过
  • 子女端体验满意度>80%
  • 商家合作模式验证成功

文档结束


来源:PRD-V2.0-完整产品.md


slug: prd-v2-0-full-product

「伴享」PRD V2.0 — 完整产品版

版本: V2.0
目标: V1.2后6周上线,10000用户,100+商家入驻,月收入10万+,完整商业化
发布时间: 2026年7月
前置条件: V1.2 Gate条件达标


1. 版本概述

1.1 核心目标

维度目标衡量指标
用户规模10000注册注册≥10000
商家生态100+商家入驻入驻≥100家
月收入10万+GMV≥100万
服务完整全部9个板块上线9/9
覆盖范围成都5个区武侯/青羊/锦江/成华/金牛

1.2 新增功能清单

模块功能优先级开发周期
商家后台(Web)注册/认证/服务管理/订单/数据/结算P03周
康养护理居家护理/康复/心理咨询P01周
金融理财适老理财信息/保险咨询(合规展示)P11周
法律服务遗嘱咨询/权益保护P11周
积分系统签到积分/消费积分/积分兑换P11周
优惠券平台券/商家券/新人券P10.5周
拼团活动活动拼团/服务拼团P21周
线上课程老年大学直播/录播课P21周

2. 商家后台(Web端)

2.1 需求描述

为入驻商家提供独立的Web管理后台,支持商家自助注册、资质认证、服务发布与管理、订单处理、财务结算、数据分析。

2.2 用户故事

  • US-BZ.1: 作为商家,我希望在线完成入驻申请
  • US-BZ.2: 作为商家,我希望自助发布和管理服务/商品
  • US-BZ.3: 作为商家,我希望实时看到订单并及时处理
  • US-BZ.4: 作为商家,我希望了解我的客户画像和销售数据
  • US-BZ.5: 作为商家,我希望收入按时结算到账

2.3 功能模块

商家后台(Web端)
├── 注册与认证
│   ├── 商家注册(企业信息+联系人)
│   ├── 资质上传(营业执照+行业许可证)
│   └── 平台审核(1-3个工作日)
├── 服务管理
│   ├── 服务/商品发布(标题/描述/价格/图片)
│   ├── 服务列表管理(上下架/编辑/删除)
│   ├── 库存管理(实物商品)
│   └── 排班管理(服务类商家)
├── 订单管理
│   ├── 订单列表(待处理/进行中/已完成/已取消)
│   ├── 订单详情(用户信息脱敏/服务内容/金额)
│   ├── 确认/拒绝订单
│   └── 退款处理
├── 财务结算
│   ├── 收入明细(佣金扣除后)
│   ├── 月度结算单
│   ├── 提现到银行卡(T+7结算)
│   └── 发票管理
├── 数据看板
│   ├── 核心指标(订单量/收入/评价/复购率)
│   ├── 用户画像(年龄/性别/区域分布)
│   ├── 热销服务TOP10
│   └── 趋势图(日/周/月)
├── 店铺设置
│   ├── 店铺信息编辑
│   ├── 营业时间设置
│   └── 服务区域设置
└── 消息通知
    ├── 新订单提醒
    ├── 用户评价通知
    └── 平台公告

2.4 商家入驻流程

商家后台首页 → [立即入驻]

Step 1: 基本信息
  ├── 公司名称
  ├── 统一社会信用代码
  ├── 服务类目(医疗/康养/家政/候鸟/消费/文教/金融/法律/设备)
  ├── 联系人姓名+手机
  └── 店铺名称+简介

Step 2: 资质上传
  ├── 营业执照(必传)
  ├── 行业许可证(如医疗机构执业许可证)
  └── 其他资质(选传)

Step 3: 确认并提交

平台审核(1-3工作日)
  ├── 通过 → 短信+邮件通知 → 开通后台权限
  └── 拒绝 → 说明原因 → 可修改后重新提交

2.5 数据结构

-- 商家表
CREATE TABLE merchants (
  id BIGSERIAL PRIMARY KEY,
  company_name VARCHAR(200) NOT NULL,
  credit_code VARCHAR(18) UNIQUE,    -- 统一社会信用代码
  category VARCHAR(50) NOT NULL,
  store_name VARCHAR(100),
  store_description TEXT,
  store_logo_url TEXT,
  contact_name VARCHAR(50),
  contact_phone VARCHAR(11),
  contact_email VARCHAR(100),
  business_license_url TEXT,
  industry_license_url TEXT,
  other_licenses TEXT[],
  address TEXT,
  lat DECIMAL(10,7),
  lng DECIMAL(10,7),
  service_area TEXT[],               -- 服务区域列表
  business_hours JSONB,              -- {"mon":{"open":"09:00","close":"18:00"}, ...}
  annual_fee DECIMAL(10,2) DEFAULT 0,
  commission_rate DECIMAL(4,2),
  level VARCHAR(20) DEFAULT 'normal'
    CHECK (level IN ('normal', 'certified', 'strategic')),
  rating DECIMAL(2,1) DEFAULT 5.0,
  rating_count INTEGER DEFAULT 0,
  total_orders INTEGER DEFAULT 0,
  total_revenue DECIMAL(12,2) DEFAULT 0,
  status VARCHAR(20) DEFAULT 'pending'
    CHECK (status IN ('pending', 'active', 'suspended', 'closed')),
  approved_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

-- 商家账户表(登录)
CREATE TABLE merchant_accounts (
  id BIGSERIAL PRIMARY KEY,
  merchant_id BIGINT REFERENCES merchants(id),
  phone VARCHAR(11) UNIQUE NOT NULL,
  password_hash VARCHAR(100),
  role VARCHAR(20) DEFAULT 'owner',
  last_login_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 商家服务/商品表
CREATE TABLE merchant_services (
  id BIGSERIAL PRIMARY KEY,
  merchant_id BIGINT REFERENCES merchants(id),
  title VARCHAR(200) NOT NULL,
  category VARCHAR(50),
  subcategory VARCHAR(50),
  description TEXT,
  images TEXT[],
  price DECIMAL(10,2),
  original_price DECIMAL(10,2),
  price_unit VARCHAR(20),
  stock INTEGER,
  service_duration VARCHAR(50),      -- 服务时长
  is_online BOOLEAN DEFAULT TRUE,
  sort_order INTEGER DEFAULT 0,
  sales_count INTEGER DEFAULT 0,
  rating DECIMAL(2,1) DEFAULT 5.0,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

-- 商家结算表
CREATE TABLE merchant_settlements (
  id BIGSERIAL PRIMARY KEY,
  merchant_id BIGINT REFERENCES merchants(id),
  period_start DATE,
  period_end DATE,
  total_orders INTEGER,
  gross_amount DECIMAL(12,2),
  commission_amount DECIMAL(12,2),
  net_amount DECIMAL(12,2),
  bank_account JSONB,               -- 银行账户信息(加密)
  status VARCHAR(20) DEFAULT 'pending'
    CHECK (status IN ('pending', 'confirmed', 'paid')),
  paid_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 商家数据日报表
CREATE TABLE merchant_daily_stats (
  id BIGSERIAL PRIMARY KEY,
  merchant_id BIGINT REFERENCES merchants(id),
  stat_date DATE,
  page_views INTEGER DEFAULT 0,
  unique_visitors INTEGER DEFAULT 0,
  order_count INTEGER DEFAULT 0,
  revenue DECIMAL(10,2) DEFAULT 0,
  avg_rating DECIMAL(2,1),
  new_reviews INTEGER DEFAULT 0,
  UNIQUE(merchant_id, stat_date)
);

2.6 API接口(商家端)

POST /api/v1/merchant/register

{
  "companyName": "成都XX家政服务有限公司",
  "creditCode": "91510100XXXXXXXX",
  "category": "housekeeping",
  "storeName": "XX家政",
  "contactName": "王经理",
  "contactPhone": "13800138001",
  "businessLicense": "base64..."
}

GET /api/v1/merchant/dashboard

{
  "overview": {
    "todayOrders": 12,
    "todayRevenue": 2400,
    "monthOrders": 156,
    "monthRevenue": 31200,
    "avgRating": 4.8,
    "pendingOrders": 3
  },
  "trends": {
    "daily": [
      { "date": "2026-07-01", "orders": 8, "revenue": 1600 }
    ]
  },
  "topServices": [
    { "id": 1, "title": "钟点保洁", "orders": 45, "revenue": 9000 }
  ]
}

POST /api/v1/merchant/services

{
  "title": "钟点保洁",
  "category": "housekeeping",
  "subcategory": "cleaning",
  "description": "专业保洁阿姨上门服务",
  "price": 50,
  "priceUnit": "元/小时",
  "images": ["base64..."],
  "serviceDuration": "2-4小时"
}

GET /api/v1/merchant/orders

Query: status=pending|confirmed|completed|cancelled&page=1&pageSize=20

POST /api/v1/merchant/orders/:id/confirm POST /api/v1/merchant/orders/:id/reject

GET /api/v1/merchant/settlements

Query: month=2026-07

2.7 验收标准

  • 商家自助注册到审核通过全流程跑通
  • 服务发布后C端可见
  • 订单实时推送(WebSocket)
  • 数据看板数据准确,延迟<1小时
  • 结算T+7到账
  • Web端兼容Chrome/Safari/Edge

3. 补全剩余服务板块

3.1 康养护理

服务价格佣金合作方
居家护理(专业护工)200-400元/天10%护理机构
康复训练(上门)150-300元/次12%康复中心
心理咨询(线上/线下)200-500元/次8%心理咨询师

3.2 金融理财(合规展示)

重要:平台仅提供信息展示,不销售金融产品,不提供投资建议。

内容形式合规要求
适老理财产品信息信息列表+跳转银行官网持牌机构+风险提示
保险产品咨询预约咨询+信息展示持牌保险公司+免责声明
金融防诈知识文章/视频权威来源

3.3 法律服务

服务价格佣金
遗嘱咨询500-2000元/次10%
权益保护咨询200-500元/次10%
法律文书代写1000-5000元/份8%

4. 积分系统

4.1 积分获取

行为积分每日上限
每日签到5分5分
连续签到7天额外20分-
参加活动10分/次30分
发布动态5分/条15分
消费(每1元)1分无上限
邀请新用户50分/人200分
评价服务3分/次15分

4.2 积分兑换

商品所需积分
会员月卡优惠券(5元)200分
服务折扣券(9折)500分
实物礼品(水杯/毛巾等)1000-3000分
活动优先权300分

4.3 数据结构

-- 积分账户表
CREATE TABLE point_accounts (
  user_id BIGINT PRIMARY KEY REFERENCES users(id),
  total_points INTEGER DEFAULT 0,
  available_points INTEGER DEFAULT 0,
  used_points INTEGER DEFAULT 0,
  expired_points INTEGER DEFAULT 0,
  updated_at TIMESTAMP DEFAULT NOW()
);

-- 积分流水表
CREATE TABLE point_transactions (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  type VARCHAR(20),              -- earn/use/expire
  action VARCHAR(50),            -- sign_in/activity/spend/invite/redeem
  points INTEGER,
  balance INTEGER,
  reference_id VARCHAR(50),      -- 关联订单号等
  description TEXT,
  expires_at TIMESTAMP,          -- 积分过期时间(获取后1年)
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_points_user_time ON point_transactions(user_id, created_at DESC);

-- 积分商品表
CREATE TABLE point_products (
  id BIGSERIAL PRIMARY KEY,
  title VARCHAR(100),
  description TEXT,
  image_url TEXT,
  points_required INTEGER,
  stock INTEGER,
  category VARCHAR(20),           -- coupon/gift/privilege
  coupon_detail JSONB,            -- 如果是优惠券,券面详情
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

5. 优惠券系统

5.1 券类型

类型说明发放场景
新人券新注册用户获10元无门槛券注册完成
满减券满50减5 / 满100减10活动发放/积分兑换
服务折扣券指定服务9折会员权益/活动
商家券商家自行发放商家后台配置

5.2 数据结构

-- 优惠券模板
CREATE TABLE coupon_templates (
  id BIGSERIAL PRIMARY KEY,
  title VARCHAR(100),
  type VARCHAR(20),              -- amount/discount/service
  value DECIMAL(10,2),           -- 金额或折扣率
  min_amount DECIMAL(10,2),      -- 最低消费
  applicable_categories TEXT[],  -- 适用类目
  merchant_id BIGINT,            -- 商家券关联商家
  total_count INTEGER,
  issued_count INTEGER DEFAULT 0,
  valid_days INTEGER,            -- 领取后有效天数
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 用户优惠券
CREATE TABLE user_coupons (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  template_id BIGINT REFERENCES coupon_templates(id),
  status VARCHAR(20) DEFAULT 'available',
  used_order_no VARCHAR(20),
  expires_at TIMESTAMP,
  used_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

6. 拼团活动

6.1 需求描述

用户发起拼团,邀请好友一起参加活动或购买服务,达到成团人数后享受优惠价。

场景示例

  • 3人成团参加书法班,每人优惠30元
  • 5人成团预约候鸟养老旅居,每人优惠200元

6.2 数据结构

CREATE TABLE group_buy_campaigns (
  id BIGSERIAL PRIMARY KEY,
  service_id BIGINT REFERENCES merchant_services(id),
  original_price DECIMAL(10,2),
  group_price DECIMAL(10,2),
  min_members INTEGER DEFAULT 3,
  max_members INTEGER DEFAULT 10,
  valid_hours INTEGER DEFAULT 24,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE group_buy_orders (
  id BIGSERIAL PRIMARY KEY,
  campaign_id BIGINT REFERENCES group_buy_campaigns(id),
  initiator_id BIGINT REFERENCES users(id),
  current_members INTEGER DEFAULT 1,
  status VARCHAR(20) DEFAULT 'pending', -- pending/success/failed/expired
  expires_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE group_buy_members (
  id BIGSERIAL PRIMARY KEY,
  group_order_id BIGINT REFERENCES group_buy_orders(id),
  user_id BIGINT REFERENCES users(id),
  order_no VARCHAR(20),
  joined_at TIMESTAMP DEFAULT NOW(),
  UNIQUE(group_order_id, user_id)
);

7. 线上课程

7.1 功能

  • 直播课:老年大学教师在线授课(接入腾讯云直播SDK)
  • 录播课:历史课程回放
  • 课程分类:健康养生/书法绘画/数码技能/防诈知识
  • 课程评价和收藏

7.2 数据结构

CREATE TABLE courses (
  id BIGSERIAL PRIMARY KEY,
  title VARCHAR(200),
  category VARCHAR(50),
  instructor_name VARCHAR(50),
  instructor_avatar TEXT,
  description TEXT,
  cover_image TEXT,
  type VARCHAR(20),               -- live/recorded
  video_url TEXT,                  -- 录播URL
  live_room_id VARCHAR(50),       -- 直播间ID
  scheduled_at TIMESTAMP,         -- 直播时间
  duration_minutes INTEGER,
  price DECIMAL(10,2) DEFAULT 0,  -- 0=免费
  enrollment_count INTEGER DEFAULT 0,
  rating DECIMAL(2,1) DEFAULT 5.0,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE course_enrollments (
  id BIGSERIAL PRIMARY KEY,
  course_id BIGINT REFERENCES courses(id),
  user_id BIGINT REFERENCES users(id),
  progress DECIMAL(5,2) DEFAULT 0,  -- 观看进度百分比
  completed BOOLEAN DEFAULT FALSE,
  enrolled_at TIMESTAMP DEFAULT NOW(),
  UNIQUE(course_id, user_id)
);

8. V2.0验收标准总表

指标目标值判定
注册用户≥10000必达
月活用户≥3000必达
入驻商家≥100家必达
月收入≥10万元必达
服务板块9个全部上线必达
会员付费率>8%必达
覆盖区域成都5个区必达
商家满意度>80%目标
用户NPS>50目标

9. 后续规划

V2.0完成后,产品进入成熟运营阶段,后续重点:

  1. V2.1: AI管家2.0(更多Agent能力:自动缴费、叫车)
  2. V2.2: 商家SaaS工具升级(CRM、营销工具)
  3. V3.0: 多城市版本(重庆、昆明),区域代理系统
  4. V3.1: 尊享会员上线(299元/年,家庭共享)
  5. V4.0: 开放平台API,第三方服务接入

文档结束


来源:PRD-产品需求文档.md


slug: banxiang-prd

「伴享」银发社交平台 - 产品需求文档(PRD)

文档版本: V1.0
创建日期: 2026-02-16
负责人: 范子琪
技术团队: Codex + Claude Code


📋 文档目的

本文档定义「伴享」APP 从 MVP 到完整产品的迭代路径,每个版本明确功能范围、开发周期、验收标准,确保团队聚焦、小步快跑、快速验证。


🎯 产品定位

一句话定位: 让银发群体"不孤独、不麻烦、不掉队"的智慧生活社交平台

核心能力:

  1. 社交活动 - 线下小组活动,对抗孤独
  2. 生活服务 - 本地商家一站式服务
  3. AI 管家 - 语音交互,降低数字门槛

🚀 版本迭代规划总览

版本核心目标关键功能周期里程碑
V1.0 MVP跑通闭环,验证模式社交活动 + AI 管家 + 1个服务6周500人内测
V1.1提升体验,增加留存优化交互 + 社区队长 + 2个服务3周2000人公测
V1.2丰富功能,扩大规模健康管理 + 5个服务 + 子女端4周5000人
V2.0完整产品,商业化全部 9 个服务 + 商家后台6周10000人

版本 V1.0 MVP(最小可行产品)

目标: 6周内上线,500人内测,验证"社交+服务+AI"模式是否成立

发布时间: 2026年4月初(开发6周)


V1.0 功能清单

✅ 必做功能(P0)

1. 用户系统(2周)

功能点:

  • 手机号注册/登录(短信验证码)
  • 个人资料设置
    • 昵称、头像
    • 出生年月(自动计算年龄)
    • 性别、居住城市
    • 兴趣标签(多选,最多5个)
      • 预设标签:太极、晨练、书法、摄影、舞蹈、旅游、茶艺、手工、唱歌、棋牌
  • 实名认证(调用第三方 API,姓名+身份证号)
  • 紧急联系人(姓名+手机号,用于活动安全)
  • 子女账号关联(生成6位邀请码,子女扫码绑定)

适老化设计要求:

  • 字体最小 18sp,可调至 24sp
  • 表单输入框大(最小高度 56dp)
  • 每页最多 3 个输入项,避免信息过载
  • 支持语音输入(调用系统语音识别)

验收标准:

  • 注册流程 < 3 分钟
  • 70岁老人能独立完成(或在子女协助下完成)

2. 社交活动模块(4周)— 核心差异化

功能点:

2.1 活动发现(首页)
  • 活动列表
    • 显示:活动名称、时间、地点、人数(已报名/总人数)、距离
    • 排序:默认按时间排序,可切换"离我最近"
    • 筛选:全部/今天/明天/本周
  • 活动分类标签
    • 晨练、太极、茶话会、书法、摄影、舞蹈、户外徒步、手工、唱歌、棋牌
  • 智能推荐(基于兴趣标签 + 地理位置)
    • 算法:标签匹配度 60% + 距离权重 40%
    • 首页顶部展示 3 个推荐活动(卡片样式)
2.2 活动详情页
  • 活动信息展示
    • 标题、封面图(可选)
    • 时间、地点(显示地图)
    • 人数限制、已报名人数
    • 活动描述(支持图文)
    • 发起人信息(昵称、头像、年龄)
  • 操作按钮
    • "立即报名"(未报名)
    • "取消报名"(已报名,活动开始前 2 小时可取消)
    • "查看路线"(调起地图导航)
  • 参与者列表(只显示昵称、头像,保护隐私)
2.3 活动创建(任何用户都可发起)
  • 填写活动信息
    • 活动名称(必填,20字内)
    • 活动类型(单选)
    • 时间选择(日期+时间,不能早于当前时间)
    • 地点选择(地图选点 或 搜索地址)
      • 限制:只能选公共场所(公园、茶馆、社区中心、广场等)
      • 系统检测非公共场所时弹出提示:"为了您的安全,请选择公共场所"
    • 人数限制(5-15人,默认 10 人)
    • 活动描述(选填,200字内)
    • 上传封面图(选填)
  • 发布审核
    • 自动审核:检测敏感词、地点类型
    • 通过后立即上线
2.4 我的活动
  • 我报名的活动(按时间排序)
  • 我发起的活动
  • 活动状态
    • 待开始、进行中、已结束
2.5 活动签到(安全机制)
  • 活动开始前 15 分钟,参与者收到提醒通知
  • 活动开始后,参与者需签到
    • 签到方式:GPS 位置验证(距离活动地点 < 500米)
    • 未签到用户显示为"未到场"
  • 紧急联系按钮
    • 长按 3 秒自动拨打紧急联系人

适老化设计要求:

  • 地图界面简化(只保留必要功能)
  • 活动卡片大、间距宽(最小点击区域 48x48dp)
  • 用大图标 + 文字标签(不只用图标)

验收标准:

  • 从发现活动到报名成功 < 1 分钟
  • 60岁用户能独立创建活动(通过率 > 80%)

3. AI 智能管家(3周)— 核心卖点

功能点:

3.1 语音交互入口
  • 首页底部导航栏有"AI 管家"入口(中间位置,突出)
  • 点击进入对话界面
  • 支持文字输入 + 语音输入
    • 语音按钮:大圆形按钮,按住说话,松手识别
    • 语音识别:调用讯飞/百度 ASR API
    • 语音播报:调用 TTS API
3.2 基础对话能力
  • 接入大模型(通义千问 / 文心一言)
  • 对话历史记录(保存最近 30 条)
  • 支持打断(语音播报时可随时打断)
3.3 快捷指令(MVP 阶段只做 3 个)
  • 附近活动
    • 指令:"帮我找附近的活动" / "今天有什么活动"
    • 返回:推荐 3 个活动,点击跳转详情页
  • 挂号服务(调用合作医院 API)
    • 指令:"我要挂号" / "帮我挂个号"
    • 流程:选择医院 → 选择科室 → 选择医生 → 选择时间 → 确认支付
    • 结果:发送短信提醒,生成订单
  • 生鲜配送(对接合作商家)
    • 指令:"我要买菜" / "帮我订菜"
    • 流程:展示商家清单 → 选择商品 → 填写地址 → 确认支付
    • 结果:订单生成,配送上门

适老化设计要求:

  • 对话气泡字体大(16-18sp)
  • AI 回复简洁(每条 < 100 字)
  • 语音播报速度可调(慢速模式)

验收标准:

  • 语音识别准确率 > 90%(普通话)
  • 快捷指令成功率 > 85%
  • 从语音提问到得到结果 < 30 秒

4. 生活服务(只做 1 个板块,3周)

MVP 阶段只做医疗健康板块(最刚需)

4.1 医疗健康服务
  • 在线挂号
    • 接入 2-3 家成都本地医院(利用合伙人资源)
    • 流程:选医院 → 选科室 → 选医生 → 选时间 → 支付
    • 订单管理:查看订单、取消挂号(提前 1 天可退)
  • 在线问诊(文字咨询,非视频)
    • 对接 1-2 个医生
    • 流程:描述病情 → 上传照片(可选) → 医生回复
    • 收费:19.9 元/次
  • 订单记录
    • 查看历史订单
    • 订单状态:待支付、已预约、已完成、已取消

适老化设计要求:

  • 医生头像、科室图标大
  • 流程简化(最多 3 步)
  • 支付前二次确认(防误操作)

验收标准:

  • 挂号成功率 > 95%
  • 问诊响应时间 < 2 小时

5. 支付系统(2周)

功能点:

  • 接入微信支付
  • 接入支付宝(可选,优先微信)
  • 订单管理
    • 查看订单列表(按时间倒序)
    • 订单详情:商品/服务、金额、状态、时间
    • 订单状态:待支付、已支付、已完成、已取消、已退款
  • 退款功能
    • 符合条件的订单可申请退款
    • 退款审核(人工审核,1-3 个工作日)

MVP 阶段不做:

  • ❌ 会员订阅(V1.1 再做)
  • ❌ 积分系统
  • ❌ 优惠券

验收标准:

  • 支付成功率 > 99%
  • 支付流程 < 1 分钟

🔶 不做的功能(留到后续版本)

V1.0 明确不做:

  • ❌ 社区队长体系(V1.1)
  • ❌ 健康管理(手环接入)(V1.2)
  • ❌ 内容社区(朋友圈)(V1.2)
  • ❌ 子女端小程序(V1.2)
  • ❌ 商家后台(V2.0)
  • ❌ 会员订阅(V1.1)
  • ❌ 其他 8 个服务板块(V1.1-V2.0 逐步加)

V1.0 技术方案

架构设计

┌─────────────────────────────────────────┐
│          Flutter APP(iOS + Android)     │
├─────────────────────────────────────────┤
│  用户系统 │ 活动模块 │ AI管家 │ 医疗服务 │
└────────────────┬────────────────────────┘
                 │ HTTPS API
┌────────────────▼────────────────────────┐
│         Node.js + Express 后端           │
├─────────────────────────────────────────┤
│  用户服务 │ 活动服务 │ AI服务 │ 支付服务 │
└────────────────┬────────────────────────┘

┌────────────────▼────────────────────────┐
│   PostgreSQL(用户/活动/订单数据)        │
│   Redis(会话/缓存)                     │
│   OSS(图片/文件存储)                   │
└─────────────────────────────────────────┘

技术栈确认

层级技术选型理由
移动端Flutter 3.x跨平台、性能好、适老化组件丰富
后端Node.js 22 + Express 4.x我们擅长、生态成熟、AI 集成方便
数据库PostgreSQL 15关系型数据、稳定可靠
缓存Redis 7.x高性能、会话管理
存储阿里云 OSS图片/文件存储
AI通义千问 API国产、价格低、支持语音
地图高德地图 API国内覆盖好
支付微信支付 V3银发群体使用率高
短信阿里云短信稳定可靠
语音讯飞 ASR + TTS识别准确率高

数据库设计(核心表)

用户表(users)

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  phone VARCHAR(11) UNIQUE NOT NULL,          -- 手机号
  nickname VARCHAR(50),                        -- 昵称
  avatar_url TEXT,                             -- 头像
  birth_year INTEGER,                          -- 出生年份
  gender VARCHAR(10),                          -- 性别:male/female/other
  city VARCHAR(50),                            -- 城市
  interests TEXT[],                            -- 兴趣标签(数组)
  real_name VARCHAR(50),                       -- 真实姓名(实名认证)
  id_card VARCHAR(18),                         -- 身份证号(加密存储)
  verified BOOLEAN DEFAULT FALSE,              -- 是否实名认证
  emergency_contact_name VARCHAR(50),          -- 紧急联系人姓名
  emergency_contact_phone VARCHAR(11),         -- 紧急联系人电话
  created_at TIMESTAMP DEFAULT NOW()
);

活动表(activities)

CREATE TABLE activities (
  id SERIAL PRIMARY KEY,
  creator_id INTEGER REFERENCES users(id),     -- 发起人
  title VARCHAR(100) NOT NULL,                 -- 活动名称
  category VARCHAR(50),                        -- 分类
  description TEXT,                            -- 描述
  cover_image_url TEXT,                        -- 封面图
  location_lat DECIMAL(10, 7),                 -- 纬度
  location_lng DECIMAL(10, 7),                 -- 经度
  location_address TEXT,                       -- 详细地址
  start_time TIMESTAMP NOT NULL,               -- 开始时间
  max_participants INTEGER DEFAULT 10,         -- 人数限制
  status VARCHAR(20) DEFAULT 'upcoming',       -- 状态:upcoming/ongoing/finished/cancelled
  created_at TIMESTAMP DEFAULT NOW()
);

活动报名表(activity_participants)

CREATE TABLE activity_participants (
  id SERIAL PRIMARY KEY,
  activity_id INTEGER REFERENCES activities(id),
  user_id INTEGER REFERENCES users(id),
  signed_in BOOLEAN DEFAULT FALSE,             -- 是否签到
  signed_in_at TIMESTAMP,                      -- 签到时间
  joined_at TIMESTAMP DEFAULT NOW(),
  UNIQUE(activity_id, user_id)
);

AI 对话记录表(ai_conversations)

CREATE TABLE ai_conversations (
  id SERIAL PRIMARY KEY,
  user_id INTEGER REFERENCES users(id),
  role VARCHAR(20),                            -- user/assistant
  content TEXT,
  created_at TIMESTAMP DEFAULT NOW()
);

订单表(orders)

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  user_id INTEGER REFERENCES users(id),
  type VARCHAR(50),                            -- 类型:medical/grocery
  amount DECIMAL(10, 2),                       -- 金额
  status VARCHAR(20) DEFAULT 'pending',        -- 状态:pending/paid/completed/cancelled/refunded
  detail JSONB,                                -- 订单详情(JSON)
  paid_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

V1.0 开发计划

时间表(6周,42天)

周次任务负责人产出
第1周技术准备 + 用户系统Codex后端框架、数据库、注册登录
第2周活动模块(后端)CodexAPI 开发、数据库完善
第3周活动模块(前端)CodexFlutter 界面、地图集成
第4周AI 管家 + 医疗服务Codex语音交互、挂号/问诊
第5周支付系统 + 联调测试Codex微信支付、整体测试
第6周适老化优化 + 内测准备Codex + Claude Code审阅代码、修复 bug

每周里程碑

第1周末:

  • ✅ 用户注册登录可用
  • ✅ 个人资料填写完整
  • ✅ 数据库表结构完成

第2周末:

  • ✅ 活动创建、列表、详情 API 完成
  • ✅ 报名、取消报名逻辑完成

第3周末:

  • ✅ Flutter APP 能浏览活动、报名
  • ✅ 地图选点、导航功能可用

第4周末:

  • ✅ AI 语音交互可用
  • ✅ 挂号、问诊功能可用

第5周末:

  • ✅ 支付流程跑通
  • ✅ 订单管理完成

第6周末:

  • ✅ 内测版本提交应用商店审核
  • ✅ 种子用户邀请码生成

V1.0 测试计划

内测目标

  • 种子用户: 500 人(从合伙人资源中筛选)
  • 测试周期: 2 周
  • 反馈渠道: 微信群 + APP 内反馈按钮

测试重点

  1. 易用性测试(最重要)

    • 60-70 岁用户能否独立完成注册
    • 平均完成一次活动报名的时间
    • 语音识别准确率
  2. 功能测试

    • 活动创建、报名、签到流程
    • AI 管家对话、快捷指令
    • 挂号、支付流程
  3. 性能测试

    • 页面加载速度(< 2 秒)
    • 接口响应时间(< 500ms)
    • 并发支持(500 人同时在线)
  4. 安全测试

    • 个人信息加密
    • 支付安全
    • 实名认证

验收标准(能否进入 V1.1)

  • 注册成功率 > 90%
  • 日活用户 > 100 人
  • 活动创建数 > 50 个
  • 活动报名成功率 > 95%
  • AI 对话满意度 > 80%
  • 严重 bug < 5 个
  • 用户留存率(7日)> 40%

版本 V1.1(体验优化版)

目标: 提升用户体验,增加留存,准备公测

发布时间: V1.0 后 3 周(2026年4月下旬)


V1.1 新增功能

1. 社区队长体系(2周)

目标: 激励活跃用户组织活动,降低运营成本

功能点:

  • 队长申请机制
    • 条件:组织过 3 次活动 + 好评率 > 90%
    • 申请流程:填写申请表 → 平台审核(1-3天) → 授予称号
  • 队长权益
    • 见习队长:专属标识、活动优先推荐
    • 银牌队长(20次):免费会员 1 年
    • 金牌队长(50次):月度补贴 500 元
  • 队长排行榜
    • 按本月组织活动次数排名
    • 展示前 10 名队长

2. 会员订阅系统(1周)

会员权益:

  • 活动报名优先(限额活动优先)
  • AI 管家无限对话(免费用户每天 20 次)
  • 专属客服(1v1 微信)
  • 生日礼物

定价:

  • 月卡:29 元/月
  • 年卡:299 元/年(省 49 元)

3. 新增 2 个服务板块(2周)

家政服务

  • 保洁(钟点工)
  • 维修(水电、家电)
  • 陪护(陪同就医、陪聊)

日常消费

  • 生鲜配送(对接 2-3 家本地商家)
  • 日化用品

4. 用户体验优化

  • 新手引导(首次使用时的动画引导)
  • 消息推送(活动提醒、AI 关怀)
  • 分享功能(活动分享到微信)

V1.1 验收标准

  • 用户数达到 2000 人
  • 社区队长 > 20 人
  • 会员付费率 > 5%
  • 7 日留存率 > 50%

版本 V1.2(功能丰富版)

目标: 丰富功能,满足更多需求,扩大规模

发布时间: V1.1 后 4 周(2026年5月下旬)


V1.2 新增功能

1. 健康管理模块(2周)

  • 健康手环接入(小米、华为)
  • 健康数据记录(步数、心率、睡眠)
  • 健康报告(每周生成)
  • 异常提醒(心率过高自动通知)

2. 内容社区(1周)

  • 朋友圈(发图文、点赞、评论)
  • 话题广场(#话题 形式)

3. 子女端小程序(2周)

  • 查看父母活动记录
  • 查看健康数据
  • 远程代办服务(帮父母下单)
  • 一键续费会员

4. 新增 3 个服务板块(2周)

  • 候鸟养老(旅居短租)
  • 文化教育(老年大学课程)
  • 智能设备(健康手环、智能药盒)

V1.2 验收标准

  • 用户数达到 5000 人
  • 子女端用户 > 1000 人
  • 月活用户 > 1500 人

版本 V2.0(完整产品)

目标: 完整功能,商业化运营,区域扩张

发布时间: V1.2 后 6 周(2026年7月)


V2.0 新增功能

1. 商家后台(Web 端)(3周)

  • 商家注册、认证
  • 服务发布、管理
  • 订单管理、财务结算
  • 数据看板(订单量、收入、用户评价)

2. 补全剩余 4 个服务板块(3周)

  • 康养护理
  • 金融理财(合规展示)
  • 法律服务
  • 其他本地生活

3. 高级功能

  • 积分系统
  • 优惠券
  • 拼团活动
  • 老年大学线上课程

V2.0 验收标准

  • 用户数达到 10000 人
  • 入驻商家 > 100 家
  • 月收入 > 10 万元
  • 覆盖成都 5 个区

附录

适老化设计规范

视觉规范

项目标准说明
字体大小最小 18sp可调至 24sp
对比度WCAG AAA 级文字与背景对比度 > 7:1
按钮大小最小 48x48dp易于点击
间距最小 16dp避免误触
颜色避免红绿防色盲

交互规范

项目标准
页面层级最多 3 层
每页输入项最多 3 个
操作反馈0.5 秒内必须有反馈
错误提示简单明了,避免术语
返回按钮每页左上角必须有
底部导航最多 5 个 Tab

语音交互规范

项目标准
识别准确率> 90%(普通话)
播报速度可调速(慢/正常/快)
唤醒方式点击按钮,不用语音唤醒
打断支持播报时可随时打断

关键指标定义

用户增长指标

  • 注册用户数: 完成手机号注册的用户总数
  • 实名认证率: 实名认证用户 / 注册用户
  • 日活用户(DAU): 每天至少打开 APP 1 次的用户数
  • 月活用户(MAU): 每月至少打开 APP 1 次的用户数

留存指标

  • 次日留存: 注册后第 2 天再次打开的用户比例
  • 7 日留存: 注册后第 7 天再次打开的用户比例
  • 30 日留存: 注册后第 30 天再次打开的用户比例

活动指标

  • 活动创建数: 每天/每月创建的活动数量
  • 活动报名率: 报名人数 / 活动浏览人数
  • 活动完成率: 签到人数 / 报名人数
  • 活动复购率: 参加过 2 次及以上活动的用户比例

商业化指标

  • 会员付费率: 付费会员 / 注册用户
  • ARPU: 平均每用户收入
  • 订单转化率: 支付订单数 / 浏览服务的用户数

风险与对策

高风险项

风险影响对策
老年人学习成本高留存率低极简 UI + 线下培训 + 子女辅助
活动安全事故法律风险实名认证 + 公共场所限制 + 保险
商家服务质量差用户投诉评价体系 + 保证金 + 黑名单
医疗合规问题被监管处罚只做挂号/咨询,不诊断/开药
支付安全资金损失使用官方 SDK + 二次确认

中风险项

风险影响对策
竞品模仿市场份额流失快速迭代 + 社区运营 + 品牌建设
用户增长慢无法规模化利用合伙人资源 + 线下推广
技术故障用户体验差完善监控 + 快速响应

成本与收入预测

V1.0 开发成本(6周)

项目金额(万元)
开发人力8-10
UI 设计0.3-0.5
服务器/云1
AI API0.5
支付/短信0.3
测试补贴0.5
合计10.6-12.8

V1.0 内测期收入预测(2周,500人)

项目单价数量收入(元)
挂号服务(平台抽成 20%)50 × 20% = 1050 单500
在线问诊(平台抽成 30%)19.9 × 30% = 630 单180
生鲜配送(平台抽成 15%)50 × 15% = 7.5100 单750
合计1430

内测期主要目标是验证模式,不追求盈利

V1.1 公测期收入预测(1个月,2000人)

项目单价数量收入(元)
会员订阅(付费率 5%)299100 人29900
挂号服务10200 单2000
在线问诊6100 单600
生鲜配送7.5400 单3000
家政服务(抽成 20%)100 × 20% = 2050 单1000
合计36500

V2.0 稳定期收入预测(1个月,10000人)

项目单价数量收入(元)
会员订阅(付费率 8%)299800 人239200
服务交易抽成平均 153000 单45000
商家入驻费50005 家25000
广告/品牌合作--20000
合计329200

预计 12 个月后实现盈亏平衡


下一步行动(本周)

立即执行

  1. Codex: 开始详细技术方案设计(数据库 ER 图、API 文档)
  2. Claude Code: 审阅本 PRD,提出补充建议
  3. 范总: 对接合伙人朱源惠
    • 确认种子用户名单(500人)
    • 确认合作医院(2-3家)
    • 确认生鲜商家(2-3家)
  4. UI 设计师: 开始招募(预算 3-5千)

本周内完成

  • 技术方案文档 V1.0
  • API 接口文档 V1.0
  • 数据库设计文档 V1.0
  • 开发环境搭建(服务器、域名、OSS)

文档结束


版本历史:

  • V1.0 (2026-02-16): 初始版本,定义 V1.0-V2.0 迭代路径

来源:STATUS.md

伴享项目状态文档

最后更新:2026-02-17 | 当前版本:v1.1.0+2


📦 版本信息

字段内容
当前版本v1.1.2+4
发布日期2026-02-17
APK 文件banxiang-v1.1.2+4.apk
测试状态🔄 范总测试中(发现点击 bug,v1.1.3 修复中)

技术栈

层级技术
客户端Flutter 3.x
后端Node.js
数据库PostgreSQL(计划中)
地图高德地图
支付微信支付
数据全 mock,暂无真实后端

✅ 已实现功能

用户注册与登录

功能状态备注
手机号注册✅ 完成
手机号验证码登录✅ 完成mock 实现
填写用户基本信息✅ 完成昵称、头像等
头像选择✅ 完成(v1.1.1)已接入 image_picker
填写兴趣爱好✅ 完成
新手设置完成进入主界面✅ 完成

主界面

功能状态备注
底部导航栏✅ 完成首页 / 好友 / 发布 / 消息 / 我的
活动双列瀑布流 Feed✅ 完成小红书风格
Feed 卡片用户头像/昵称✅ 完成(v1.1.1)
活动详情页✅ 完成轮播图 + 点赞 + 评论
发布功能✅ 完成图片/视频多选,最多 9 张
我的页面✅ 完成(v1.1.2)头像/昵称/兴趣标签/编辑入口,点击响应修复中
消息页面✅ 完成(v1.1.2)mock 消息列表,点击响应修复中
好友页面✅ 完成(v1.1.2)关注/粉丝两个 Tab

UI / 主题

功能状态备注
橙色主题✅ 完成#FF6B35
暖黄背景色✅ 完成#FFF8F0

🚧 已知问题 / 空壳功能

问题类型优先级
首页 Feed 卡片无用户头像/用户名未实现
好友页面空壳
消息页面空壳
我的页面空壳
右上角搜索未实现
铃铛通知图标未实现
全部数据为 mock,无真实后端架构

🗓️ 版本历史

版本日期变更内容
v1.0.0+1MVP 基础功能
v1.1.0+22026-02-17小红书风格改造(橙色主题 + 瀑布流)+ 登录跳转修复 + 暖黄背景
v1.1.1+32026-02-17头像选择 Bug 修复 + Feed 卡片补用户头像/昵称
v1.1.2+42026-02-17我的页面 + 消息页面 + 好友页面
v1.1.3+5进行中点击交互修复 + 首页刷新

🚀 下个版本计划(V1.1 待开发)

P0 — 核心功能(必须完成)

功能模块说明
社区队长体系核心社区运营机制
会员订阅系统商业化核心功能

P1 — 重要功能

功能模块说明
新手引导提升新用户留存
微信分享社交裂变传播
家政服务垂直服务场景
日常消费垂直服务场景
消息推送用户触达与留存

📌 备注

  • 当前版本为演示/测试版本,所有数据均为 mock 数据
  • 后端真实接入(PostgreSQL + Node.js API)尚未开始
  • 高德地图和微信支付已列入技术栈,集成工作待规划

来源:技术方案-V1.0-MVP架构.md


slug: tech-v1-0-mvp-architecture

「伴享」技术方案 V1.0 — MVP架构

版本: V1.0
对应PRD: PRD-V1.0-MVP核心功能
更新日期: 2026-02-16


1. 技术架构总览

1.1 系统架构图

┌────────────────────────────────────────────────────┐
│                    客户端层                          │
│  ┌──────────────────┐  ┌───────────────────────┐  │
│  │  Flutter APP      │  │  子女端(V1.2预留)    │  │
│  │  iOS + Android    │  │  微信小程序            │  │
│  └────────┬─────────┘  └───────────────────────┘  │
└───────────┼────────────────────────────────────────┘
            │ HTTPS + WebSocket
┌───────────▼────────────────────────────────────────┐
│                  API网关层(Nginx)                   │
│  SSL终止 │ 限流 │ 日志 │ 路由 │ CORS │ 压缩        │
└───────────┬────────────────────────────────────────┘

┌───────────▼────────────────────────────────────────┐
│              业务服务层(Node.js + Express)          │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐           │
│  │ 用户服务  │ │ 活动服务  │ │ AI管家   │           │
│  └──────────┘ └──────────┘ └──────────┘           │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐           │
│  │ 医疗服务  │ │ 支付服务  │ │ 通知服务  │           │
│  └──────────┘ └──────────┘ └──────────┘           │
└───────────┬────────────────────────────────────────┘

┌───────────▼────────────────────────────────────────┐
│                   数据层                             │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐           │
│  │PostgreSQL│ │  Redis   │ │ 阿里云OSS │           │
│  └──────────┘ └──────────┘ └──────────┘           │
└────────────────────────────────────────────────────┘

1.2 技术选型

层级技术版本选型理由
前端Flutter3.x跨平台、性能好、适老化组件丰富
后端Node.js + Express22 + 4.x生态成熟、AI集成方便
数据库PostgreSQL15+JSON支持好、地理空间查询
缓存Redis7.x会话管理、限流、缓存
文件存储阿里云OSS-图片/语音文件
AI模型通义千问qwen-max国产、函数调用支持好
语音讯飞ASR/TTS-中文识别准确率高
地图高德地图-国内POI数据全
支付微信支付V3-银发群体使用率高
推送JPush-全平台推送
部署Docker Compose-MVP阶段够用

2. 数据库设计

2.1 ER关系概览

users ──< activity_participants >── activities
users ──< ai_conversations
users ──< orders
users ──< appointments >── doctors >── departments >── hospitals
users ──< consultations >── doctors
users ──< family_links
users ──< notifications
users ── ai_user_preferences

2.2 完整DDL

-- ===========================
-- 伴享 V1.0 DDL
-- PostgreSQL 15+
-- ===========================

CREATE EXTENSION IF NOT EXISTS earthdistance CASCADE;
CREATE EXTENSION IF NOT EXISTS pgcrypto;

-- 1. 用户表
CREATE TABLE users (
  id BIGSERIAL PRIMARY KEY,
  phone VARCHAR(11) UNIQUE NOT NULL,
  nickname VARCHAR(50),
  avatar_url TEXT,
  birth_year INTEGER,
  birth_month INTEGER,
  gender VARCHAR(10) CHECK (gender IN ('male', 'female', 'other')),
  city VARCHAR(50) DEFAULT '成都',
  district VARCHAR(50),
  interests TEXT[] DEFAULT '{}',
  real_name VARCHAR(50),
  id_card_hash VARCHAR(64),
  id_card_encrypted TEXT,
  verified BOOLEAN DEFAULT FALSE,
  emergency_contact_name VARCHAR(50),
  emergency_contact_phone VARCHAR(11),
  font_size VARCHAR(10) DEFAULT 'medium',
  speech_speed VARCHAR(10) DEFAULT 'normal',
  auto_voice BOOLEAN DEFAULT TRUE,
  last_login_at TIMESTAMP,
  login_count INTEGER DEFAULT 0,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_users_phone ON users(phone);
CREATE INDEX idx_users_city ON users(city);
CREATE INDEX idx_users_interests ON users USING GIN(interests);

-- 2. 短信验证码
CREATE TABLE sms_codes (
  id BIGSERIAL PRIMARY KEY,
  phone VARCHAR(11) NOT NULL,
  code VARCHAR(6) NOT NULL,
  purpose VARCHAR(20) DEFAULT 'login',
  used BOOLEAN DEFAULT FALSE,
  expires_at TIMESTAMP NOT NULL,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 3. 家庭关联
CREATE TABLE family_links (
  id BIGSERIAL PRIMARY KEY,
  parent_user_id BIGINT REFERENCES users(id),
  child_user_id BIGINT,
  invite_code VARCHAR(6),
  status VARCHAR(20) DEFAULT 'active',
  linked_at TIMESTAMP DEFAULT NOW(),
  UNIQUE(parent_user_id, child_user_id)
);

CREATE TABLE invite_codes (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  code VARCHAR(6) UNIQUE NOT NULL,
  used BOOLEAN DEFAULT FALSE,
  expires_at TIMESTAMP NOT NULL,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 4. 活动表
CREATE TABLE activities (
  id BIGSERIAL PRIMARY KEY,
  creator_id BIGINT REFERENCES users(id) NOT NULL,
  title VARCHAR(100) NOT NULL,
  category VARCHAR(50) NOT NULL,
  description TEXT,
  cover_image_url TEXT,
  location_lat DECIMAL(10,7) NOT NULL,
  location_lng DECIMAL(10,7) NOT NULL,
  location_address TEXT NOT NULL,
  location_name VARCHAR(100),
  start_time TIMESTAMP NOT NULL,
  end_time TIMESTAMP,
  max_participants INTEGER DEFAULT 10 CHECK (max_participants BETWEEN 5 AND 15),
  current_participants INTEGER DEFAULT 0,
  status VARCHAR(20) DEFAULT 'upcoming',
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_activities_status_time ON activities(status, start_time);
CREATE INDEX idx_activities_category ON activities(category);

-- 5. 活动报名
CREATE TABLE activity_participants (
  id BIGSERIAL PRIMARY KEY,
  activity_id BIGINT REFERENCES activities(id),
  user_id BIGINT REFERENCES users(id),
  status VARCHAR(20) DEFAULT 'registered',
  signed_in_at TIMESTAMP,
  signed_in_lat DECIMAL(10,7),
  signed_in_lng DECIMAL(10,7),
  rating INTEGER CHECK (rating BETWEEN 1 AND 5),
  review TEXT,
  joined_at TIMESTAMP DEFAULT NOW(),
  cancelled_at TIMESTAMP,
  UNIQUE(activity_id, user_id)
);

-- 6. AI对话
CREATE TABLE ai_conversations (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  session_id VARCHAR(36) NOT NULL,
  role VARCHAR(20) NOT NULL,
  content TEXT NOT NULL,
  content_type VARCHAR(20) DEFAULT 'text',
  voice_url TEXT,
  intent VARCHAR(50),
  metadata JSONB,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_ai_conv_user ON ai_conversations(user_id, session_id);

CREATE TABLE ai_user_preferences (
  user_id BIGINT PRIMARY KEY REFERENCES users(id),
  preferred_hospital VARCHAR(100),
  preferred_doctor VARCHAR(100),
  home_address TEXT,
  common_destinations JSONB,
  dietary_restrictions TEXT[],
  updated_at TIMESTAMP DEFAULT NOW()
);

-- 7. 医院/科室/医生/排班
CREATE TABLE hospitals (
  id BIGSERIAL PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  address TEXT,
  lat DECIMAL(10,7),
  lng DECIMAL(10,7),
  phone VARCHAR(20),
  logo_url TEXT,
  level VARCHAR(20),
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE departments (
  id BIGSERIAL PRIMARY KEY,
  hospital_id BIGINT REFERENCES hospitals(id),
  name VARCHAR(50) NOT NULL,
  description TEXT,
  sort_order INTEGER DEFAULT 0
);

CREATE TABLE doctors (
  id BIGSERIAL PRIMARY KEY,
  hospital_id BIGINT REFERENCES hospitals(id),
  department_id BIGINT REFERENCES departments(id),
  name VARCHAR(50) NOT NULL,
  title VARCHAR(50),
  avatar_url TEXT,
  specialty TEXT,
  rating DECIMAL(2,1) DEFAULT 5.0,
  rating_count INTEGER DEFAULT 0,
  status VARCHAR(20) DEFAULT 'active'
);

CREATE TABLE doctor_schedules (
  id BIGSERIAL PRIMARY KEY,
  doctor_id BIGINT REFERENCES doctors(id),
  schedule_date DATE NOT NULL,
  start_time TIME NOT NULL,
  end_time TIME NOT NULL,
  max_patients INTEGER DEFAULT 30,
  current_patients INTEGER DEFAULT 0,
  fee DECIMAL(10,2),
  status VARCHAR(20) DEFAULT 'available'
);

-- 8. 预约/问诊
CREATE TABLE appointments (
  id BIGSERIAL PRIMARY KEY,
  order_no VARCHAR(20) UNIQUE NOT NULL,
  user_id BIGINT REFERENCES users(id),
  hospital_id BIGINT REFERENCES hospitals(id),
  department_id BIGINT REFERENCES departments(id),
  doctor_id BIGINT REFERENCES doctors(id),
  schedule_id BIGINT REFERENCES doctor_schedules(id),
  patient_name VARCHAR(50),
  patient_phone VARCHAR(11),
  appointment_date DATE,
  appointment_time TIME,
  fee DECIMAL(10,2),
  status VARCHAR(20) DEFAULT 'pending',
  paid_at TIMESTAMP,
  cancelled_at TIMESTAMP,
  cancel_reason TEXT,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE consultations (
  id BIGSERIAL PRIMARY KEY,
  order_no VARCHAR(20) UNIQUE NOT NULL,
  user_id BIGINT REFERENCES users(id),
  doctor_id BIGINT REFERENCES doctors(id),
  symptom_description TEXT,
  images TEXT[],
  doctor_reply TEXT,
  fee DECIMAL(10,2) DEFAULT 19.90,
  status VARCHAR(20) DEFAULT 'pending',
  replied_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 9. 订单
CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  order_no VARCHAR(20) UNIQUE NOT NULL,
  user_id BIGINT REFERENCES users(id),
  order_type VARCHAR(50) NOT NULL,
  amount DECIMAL(10,2) NOT NULL,
  status VARCHAR(20) DEFAULT 'pending',
  detail JSONB,
  wx_transaction_id VARCHAR(50),
  paid_at TIMESTAMP,
  completed_at TIMESTAMP,
  cancelled_at TIMESTAMP,
  refund_amount DECIMAL(10,2),
  refund_at TIMESTAMP,
  refund_reason TEXT,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_orders_user ON orders(user_id, created_at DESC);

-- 10. 通知
CREATE TABLE notifications (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  type VARCHAR(50) NOT NULL,
  title VARCHAR(100),
  content TEXT,
  data JSONB,
  is_read BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_notif_user ON notifications(user_id, is_read, created_at DESC);

-- 11. 审计日志
CREATE TABLE audit_logs (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT,
  action VARCHAR(50),
  resource_type VARCHAR(50),
  resource_id BIGINT,
  detail JSONB,
  ip_address INET,
  created_at TIMESTAMP DEFAULT NOW()
);

3. API文档

3.1 规范

  • Base URL: https://api.banxiang.com/api/v1
  • 认证: Authorization: Bearer <JWT>
  • 响应格式: { "success": true, "data": {...} } / { "success": false, "error": {"code":"...", "message":"..."} }

3.2 完整接口清单

模块方法路径描述
认证POST/auth/send-code发送验证码
认证POST/auth/login登录/注册
认证POST/auth/refresh刷新Token
用户GET/users/me获取当前用户
用户PUT/users/profile更新资料
用户POST/users/verify实名认证
用户PUT/users/emergency-contact紧急联系人
用户PUT/users/settings更新设置
家庭POST/family/generate-code生成邀请码
家庭POST/family/link绑定子女
家庭GET/family/members家人列表
活动GET/activities活动列表
活动GET/activities/:id活动详情
活动POST/activities创建活动
活动PUT/activities/:id修改活动
活动DELETE/activities/:id取消活动
活动POST/activities/:id/join报名
活动POST/activities/:id/cancel取消报名
活动POST/activities/:id/sign-in签到
活动POST/activities/:id/review评价
活动GET/users/me/activities我的活动
AIPOST/ai/chat文字对话(SSE)
AIPOST/ai/voice语音对话
AIGET/ai/history对话历史
医疗GET/medical/hospitals医院列表
医疗GET/medical/hospitals/:id/departments科室
医疗GET/medical/doctors医生列表
医疗GET/medical/doctors/:id/schedules排班
医疗POST/medical/appointments创建预约
医疗POST/medical/appointments/:id/cancel取消
医疗POST/medical/consultations创建问诊
订单POST/orders/create创建订单
订单GET/orders订单列表
订单GET/orders/:orderNo订单详情
订单POST/orders/:orderNo/refund退款
通知GET/notifications通知列表
通知PUT/notifications/:id/read标记已读
上传POST/upload/image上传图片
上传POST/upload/voice上传语音

4. Flutter组件架构

4.1 项目结构

banxiang_app/
├── lib/
│   ├── main.dart
│   ├── app.dart
│   ├── config/
│   │   ├── theme.dart          # 适老化主题
│   │   ├── routes.dart
│   │   └── constants.dart
│   ├── core/
│   │   ├── api/
│   │   │   ├── api_client.dart # Dio封装
│   │   │   └── endpoints.dart
│   │   ├── models/             # 数据模型
│   │   ├── providers/          # Riverpod状态管理
│   │   ├── services/           # 业务服务
│   │   └── utils/
│   ├── features/
│   │   ├── auth/
│   │   ├── home/
│   │   ├── activity/
│   │   ├── ai_butler/
│   │   ├── medical/
│   │   ├── profile/
│   │   └── notification/
│   └── shared/
│       ├── widgets/            # BX适老化组件库
│       └── layouts/
├── assets/
│   ├── images/
│   ├── fonts/
│   └── animations/
├── test/
└── pubspec.yaml

4.2 适老化组件库(BX Design System)

/// BX适老化按钮
class BxButton extends StatelessWidget {
  final String text;
  final VoidCallback onPressed;
  final BxButtonStyle style; // primary / secondary / danger
  final bool loading;
  
  // 最小高度48dp,字号18sp,圆角12dp
  // 点击区域≥48x48dp
  // loading状态显示转圈+文字
}

/// BX适老化输入框
class BxInput extends StatelessWidget {
  final String label;
  final String hint;
  final TextInputType keyboardType;
  final bool voiceEnabled; // 右侧语音输入按钮
  
  // 高度56dp,字号18sp
  // label在输入框上方
  // 错误提示在下方,红色16sp
}

/// BX确认弹窗(防误操作)
class BxConfirmDialog extends StatelessWidget {
  final String title;
  final String message;
  final String confirmText;
  final String cancelText;
  
  // 标题22sp,正文18sp
  // 按钮大且间隔远
  // 危险操作confirmText用红色
}

/// BX活动卡片
class BxActivityCard extends StatelessWidget {
  final Activity activity;
  final double distance;
  
  // 大标题18sp,时间地点16sp
  // 报名按钮在右侧
  // 已满员显示灰色
}

4.3 核心代码示例

API客户端

// core/api/api_client.dart
class ApiClient {
  late final Dio _dio;
  
  ApiClient() {
    _dio = Dio(BaseOptions(
      baseUrl: 'https://api.banxiang.com/api/v1',
      connectTimeout: const Duration(seconds: 10),
      receiveTimeout: const Duration(seconds: 30),
    ));
    
    _dio.interceptors.addAll([
      AuthInterceptor(),   // 自动附加JWT
      LogInterceptor(),
      ErrorInterceptor(),  // 统一错误处理
    ]);
  }
  
  Future<T> get<T>(String path, {Map<String, dynamic>? params}) async {
    final response = await _dio.get(path, queryParameters: params);
    return response.data['data'] as T;
  }
  
  Future<T> post<T>(String path, {dynamic data}) async {
    final response = await _dio.post(path, data: data);
    return response.data['data'] as T;
  }
}

AI管家对话页面

// features/ai_butler/chat_page.dart
class AiChatPage extends ConsumerStatefulWidget {
  @override
  ConsumerState<AiChatPage> createState() => _AiChatPageState();
}

class _AiChatPageState extends ConsumerState<AiChatPage> {
  final _controller = TextEditingController();
  bool _isRecording = false;
  
  @override
  Widget build(BuildContext context) {
    final messages = ref.watch(aiChatProvider);
    
    return Scaffold(
      appBar: AppBar(title: Text('🤖 小伴 · AI管家')),
      body: Column(
        children: [
          // 消息列表
          Expanded(
            child: ListView.builder(
              reverse: true,
              itemCount: messages.length,
              itemBuilder: (ctx, i) => ChatBubble(
                message: messages[i],
                fontSize: ref.watch(fontSizeProvider),
              ),
            ),
          ),
          // 快捷指令栏
          QuickActions(
            actions: ['附近活动', '挂号', '买菜', '天气'],
            onTap: (action) => _sendMessage(action),
          ),
          // 输入栏
          ChatInputBar(
            controller: _controller,
            onSend: () => _sendMessage(_controller.text),
            onVoiceStart: _startRecording,
            onVoiceEnd: _stopRecording,
            isRecording: _isRecording,
          ),
        ],
      ),
    );
  }
  
  void _sendMessage(String text) {
    ref.read(aiChatProvider.notifier).sendMessage(text);
    _controller.clear();
  }
}

活动推荐算法

// core/services/recommendation_service.dart
double calculateRecommendScore(User user, Activity activity, double distanceKm) {
  // 兴趣匹配度 (0-1)
  final commonInterests = user.interests
      .where((i) => i == activity.category)
      .length;
  final interestScore = commonInterests > 0 ? 1.0 : 0.0;
  
  // 距离分 (0-1), 10km内线性衰减
  final distanceScore = 1 - (distanceKm / 10).clamp(0, 1);
  
  // 时间分 (0-1), 168小时(一周)内线性衰减
  final hoursDiff = activity.startTime.difference(DateTime.now()).inHours;
  final timeScore = 1 - (hoursDiff / 168).clamp(0, 1);
  
  // 热度分 (0-1)
  final hotScore = activity.currentParticipants / activity.maxParticipants;
  
  return interestScore * 0.4 + distanceScore * 0.3 + timeScore * 0.2 + hotScore * 0.1;
}

5. AI管家技术方案

5.1 架构

用户输入(文字/语音)

┌─────────────┐
│  语音处理   │  ← 讯飞ASR(语音→文字)
└──────┬──────┘

┌─────────────┐
│  意图识别   │  ← 通义千问 Function Calling
└──────┬──────┘

┌─────────────────────────────┐
│        任务路由              │
│  ├── 活动查询 → 调用活动API  │
│  ├── 挂号预约 → 调用医疗API  │
│  ├── 生鲜购买 → 调用商品API  │
│  └── 闲聊/咨询 → 直接对话    │
└──────┬──────────────────────┘

┌─────────────┐
│  响应生成   │  ← 通义千问生成回复
└──────┬──────┘

┌─────────────┐
│  语音合成   │  ← 讯飞TTS(文字→语音)
└──────┬──────┘

  返回用户(文字+语音+操作按钮)

5.2 Function Calling定义

// AI工具定义
const tools = [
  {
    type: 'function',
    function: {
      name: 'search_activities',
      description: '搜索附近的活动',
      parameters: {
        type: 'object',
        properties: {
          category: { type: 'string', description: '活动类型' },
          timeRange: { type: 'string', enum: ['today', 'tomorrow', 'week'] },
          lat: { type: 'number' },
          lng: { type: 'number' }
        }
      }
    }
  },
  {
    type: 'function',
    function: {
      name: 'book_appointment',
      description: '预约挂号',
      parameters: {
        type: 'object',
        properties: {
          hospitalName: { type: 'string' },
          departmentName: { type: 'string' },
          doctorName: { type: 'string' },
          date: { type: 'string' },
          time: { type: 'string' }
        }
      }
    }
  },
  {
    type: 'function',
    function: {
      name: 'order_grocery',
      description: '生鲜配送下单',
      parameters: {
        type: 'object',
        properties: {
          items: {
            type: 'array',
            items: {
              type: 'object',
              properties: {
                name: { type: 'string' },
                quantity: { type: 'number' }
              }
            }
          },
          deliveryAddress: { type: 'string' }
        }
      }
    }
  }
];

5.3 System Prompt

你是「小伴」,「伴享」APP的AI智能管家。你服务的是50-70岁的银发群体。

规则:
1. 说话简洁、亲切、温暖,像家人一样
2. 每次回复不超过100字
3. 称呼用户为"X阿姨"或"X叔叔"(根据性别和姓氏)
4. 不使用网络用语、不说英文
5. 涉及医疗健康的建议必须加"仅供参考,建议咨询医生"
6. 涉及支付前必须明确告知金额并确认
7. 不确定的信息不要编造,说"我帮您查查"
8. 提供操作选项时,用简短的按钮文字

用户信息:
- 姓名:{userName}
- 城市:{city}
- 兴趣:{interests}
- 常去医院:{preferredHospital}
- 家庭住址:{homeAddress}

6. 部署方案

6.1 服务器配置(MVP阶段)

服务配置月费用
应用服务器阿里云ECS 2核4G¥200/月
数据库阿里云RDS PostgreSQL 2核4G¥300/月
Redis阿里云Redis 1G¥100/月
OSS按量计费¥50/月
CDN按量计费¥50/月
合计¥700/月

6.2 Docker Compose

version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://banxiang:xxx@db:5432/banxiang
      - REDIS_URL=redis://redis:6379
      - QWEN_API_KEY=${QWEN_API_KEY}
      - XUNFEI_APP_ID=${XUNFEI_APP_ID}
      - WX_PAY_MCH_ID=${WX_PAY_MCH_ID}
    depends_on:
      - db
      - redis
    restart: always

  db:
    image: postgres:15
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      - POSTGRES_DB=banxiang
      - POSTGRES_USER=banxiang
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    restart: always

  redis:
    image: redis:7-alpine
    volumes:
      - redisdata:/data
    restart: always

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - app
    restart: always

volumes:
  pgdata:
  redisdata:

6.3 CI/CD流程

代码推送 → GitHub Actions
  ├── 运行测试
  ├── 构建Docker镜像
  ├── 推送到阿里云容器镜像
  └── SSH到服务器执行 docker compose pull && docker compose up -d

6.4 监控方案

维度工具说明
应用监控PM2 + 阿里云ARMS错误率、响应时间
服务器监控阿里云云监控CPU/内存/磁盘
日志Winston + 阿里云SLS结构化日志
报警钉钉/飞书Webhook异常自动通知

7. 安全方案

7.1 数据安全

层面措施
传输HTTPS + TLS 1.3
存储敏感字段AES-256加密
身份证哈希索引 + 加密存储,不存明文
JWTHS256签名,7天有效期
密钥管理环境变量,不入代码库

7.2 接口安全

措施配置
全局限流100次/分钟/IP
登录限流5次/分钟/手机号
验证码限流3次/5分钟/手机号
SQL注入防护参数化查询
XSS防护输出转义 + CSP头
CORS白名单域名

文档结束


来源:技术方案-V1.1-扩展架构.md


slug: tech-v1-1-extension

「伴享」技术方案 V1.1 — 扩展架构

版本: V1.1
对应PRD: PRD-V1.1-体验优化版
更新日期: 2026-02-16


1. 架构变更概述

V1.1在V1.0基础上新增:社区队长、会员订阅、家政服务、日常消费。无架构层面重大变更,主要是新增数据表和API端点。

1.1 变更影响矩阵

层级变更影响范围
数据库新增6张表队长/会员/服务商/服务人员/商品/购物车
API新增4组端点/captains, /membership, /services, /products
Flutter新增4个Feature模块captain/, membership/, housekeeping/, shopping/
第三方无新增-
部署无变更同V1.0 Docker Compose

2. 新增数据库表

2.1 增量DDL

-- ===========================
-- V1.1 增量DDL
-- ===========================

-- 1. 队长相关
CREATE TABLE captain_applications (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  bio TEXT,
  specialties TEXT[],
  serving_area VARCHAR(50),
  contact_info JSONB,
  status VARCHAR(20) DEFAULT 'pending'
    CHECK (status IN ('pending', 'approved', 'rejected')),
  reviewer_note TEXT,
  reviewed_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE captains (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT UNIQUE REFERENCES users(id),
  level VARCHAR(20) DEFAULT 'trainee'
    CHECK (level IN ('trainee', 'silver', 'gold', 'honor')),
  bio TEXT,
  specialties TEXT[],
  serving_area VARCHAR(50),
  total_activities INTEGER DEFAULT 0,
  total_participants INTEGER DEFAULT 0,
  total_new_users INTEGER DEFAULT 0,
  avg_rating DECIMAL(2,1) DEFAULT 0,
  monthly_subsidy DECIMAL(10,2) DEFAULT 0,
  status VARCHAR(20) DEFAULT 'active',
  approved_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

-- 2. 会员
CREATE TABLE memberships (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  plan VARCHAR(20) NOT NULL CHECK (plan IN ('monthly', 'yearly')),
  price DECIMAL(10,2) NOT NULL,
  paid_by_user_id BIGINT REFERENCES users(id),
  starts_at TIMESTAMP NOT NULL,
  expires_at TIMESTAMP NOT NULL,
  auto_renew BOOLEAN DEFAULT FALSE,
  status VARCHAR(20) DEFAULT 'active'
    CHECK (status IN ('active', 'expired', 'cancelled')),
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_membership_user ON memberships(user_id, status);

-- 用户表新增字段
ALTER TABLE users ADD COLUMN is_member BOOLEAN DEFAULT FALSE;
ALTER TABLE users ADD COLUMN member_expires_at TIMESTAMP;
ALTER TABLE users ADD COLUMN is_captain BOOLEAN DEFAULT FALSE;
ALTER TABLE users ADD COLUMN captain_level VARCHAR(20);

-- 3. 服务商
CREATE TABLE service_providers (
  id BIGSERIAL PRIMARY KEY,
  company_name VARCHAR(100),
  category VARCHAR(50),
  contact_phone VARCHAR(20),
  license_no VARCHAR(50),
  address TEXT,
  lat DECIMAL(10,7),
  lng DECIMAL(10,7),
  rating DECIMAL(2,1) DEFAULT 5.0,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 4. 服务人员
CREATE TABLE service_workers (
  id BIGSERIAL PRIMARY KEY,
  provider_id BIGINT REFERENCES service_providers(id),
  name VARCHAR(50),
  avatar_url TEXT,
  skills TEXT[],
  rating DECIMAL(2,1) DEFAULT 5.0,
  service_count INTEGER DEFAULT 0,
  hourly_rate DECIMAL(10,2),
  status VARCHAR(20) DEFAULT 'available',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 5. 服务订单
CREATE TABLE service_orders (
  id BIGSERIAL PRIMARY KEY,
  order_no VARCHAR(20) UNIQUE NOT NULL,
  user_id BIGINT REFERENCES users(id),
  worker_id BIGINT REFERENCES service_workers(id),
  service_type VARCHAR(50),
  scheduled_date DATE,
  scheduled_time TIME,
  duration_hours DECIMAL(3,1),
  address TEXT,
  requirements TEXT,
  amount DECIMAL(10,2),
  platform_fee DECIMAL(10,2),
  status VARCHAR(20) DEFAULT 'pending',
  rating INTEGER CHECK (rating BETWEEN 1 AND 5),
  review TEXT,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 6. 商品
CREATE TABLE products (
  id BIGSERIAL PRIMARY KEY,
  provider_id BIGINT REFERENCES service_providers(id),
  name VARCHAR(100),
  category VARCHAR(50),
  description TEXT,
  image_url TEXT,
  price DECIMAL(10,2),
  unit VARCHAR(20),
  stock INTEGER DEFAULT 0,
  status VARCHAR(20) DEFAULT 'available',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 7. 购物车
CREATE TABLE cart_items (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  product_id BIGINT REFERENCES products(id),
  quantity INTEGER DEFAULT 1,
  created_at TIMESTAMP DEFAULT NOW(),
  UNIQUE(user_id, product_id)
);

-- 8. 配送订单
CREATE TABLE delivery_orders (
  id BIGSERIAL PRIMARY KEY,
  order_no VARCHAR(20) UNIQUE NOT NULL,
  user_id BIGINT REFERENCES users(id),
  provider_id BIGINT REFERENCES service_providers(id),
  items JSONB,
  total_amount DECIMAL(10,2),
  delivery_fee DECIMAL(10,2) DEFAULT 0,
  delivery_address TEXT,
  delivery_phone VARCHAR(11),
  estimated_delivery TIMESTAMP,
  status VARCHAR(20) DEFAULT 'pending',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 9. 队长排行榜物化视图
CREATE MATERIALIZED VIEW captain_monthly_ranking AS
SELECT 
  c.user_id,
  u.nickname,
  u.avatar_url,
  c.level,
  COUNT(a.id) AS monthly_activities,
  c.avg_rating
FROM captains c
JOIN users u ON c.user_id = u.id
LEFT JOIN activities a ON a.creator_id = c.user_id 
  AND a.start_time >= date_trunc('month', CURRENT_DATE)
WHERE c.status = 'active'
GROUP BY c.user_id, u.nickname, u.avatar_url, c.level, c.avg_rating
ORDER BY monthly_activities DESC;

3. 新增API端点

3.1 队长模块 /captains

方法路径描述
POST/captains/apply申请成为队长
GET/captains/application-status查看申请状态
GET/captains/me/dashboard队长数据面板
GET/captains/ranking队长排行榜
GET/captains/:userId查看队长主页

管理端(内部):

方法路径描述
GET/admin/captains/applications待审核列表
POST/admin/captains/applications/:id/approve审核通过
POST/admin/captains/applications/:id/reject审核拒绝

3.2 会员模块 /membership

方法路径描述
GET/membership/plans会员方案列表
GET/membership/status当前会员状态
POST/membership/subscribe开通会员
POST/membership/generate-pay-link生成子女代付链接
GET/membership/pay/:token子女代付页面数据
POST/membership/pay/:token/confirm子女确认支付

3.3 家政服务 /services/housekeeping

方法路径描述
GET/services/housekeeping/workers服务人员列表
GET/services/housekeeping/workers/:id人员详情
POST/services/housekeeping/orders预约下单
GET/services/housekeeping/orders我的服务订单
POST/services/housekeeping/orders/:id/cancel取消
POST/services/housekeeping/orders/:id/review评价

3.4 日常消费 /shopping

方法路径描述
GET/shopping/providers商家列表
GET/shopping/products商品列表
GET/shopping/cart购物车
POST/shopping/cart/add加入购物车
PUT/shopping/cart/:id修改数量
DELETE/shopping/cart/:id删除
POST/shopping/orders配送下单
GET/shopping/orders配送订单列表

4. Flutter新增模块

4.1 新增Feature模块

features/
├── captain/                 # 社区队长
│   ├── captain_apply_page.dart
│   ├── captain_dashboard_page.dart
│   ├── captain_ranking_page.dart
│   └── captain_profile_page.dart
├── membership/              # 会员中心
│   ├── membership_page.dart
│   ├── pay_link_page.dart
│   └── widgets/
├── housekeeping/            # 家政服务
│   ├── worker_list_page.dart
│   ├── worker_detail_page.dart
│   ├── booking_page.dart
│   └── widgets/
├── shopping/                # 日常消费
│   ├── provider_list_page.dart
│   ├── product_list_page.dart
│   ├── cart_page.dart
│   ├── checkout_page.dart
│   └── widgets/
└── onboarding/              # 新手引导
    ├── onboarding_page.dart
    └── guide_overlay.dart

4.2 微信分享集成

// 使用 fluwx 插件
dependencies:
  fluwx: ^4.x

// 活动分享
Future<void> shareActivity(Activity activity) async {
  await fluwx.shareToWeChat(
    WeChatShareWebPageModel(
      webPage: 'https://h5.banxiang.com/activity/${activity.id}',
      title: activity.title,
      description: '来「伴享」一起参加吧!还剩${activity.remainingSlots}个名额',
      thumbnail: WeChatImage.network(activity.coverImage),
      scene: WeChatScene.session,
    ),
  );
}

5. 队长等级自动计算

// 定时任务:每日凌晨更新队长等级
async function updateCaptainLevels() {
  const captains = await db.query('SELECT * FROM captains WHERE status = $1', ['active']);
  
  for (const captain of captains.rows) {
    let newLevel = 'trainee';
    
    if (captain.total_activities >= 50 && captain.avg_rating >= 4.75 && captain.total_new_users >= 100) {
      newLevel = 'gold';
    } else if (captain.total_activities >= 20 && captain.avg_rating >= 4.5 && captain.total_new_users >= 20) {
      newLevel = 'silver';
    }
    
    if (newLevel !== captain.level) {
      await db.query('UPDATE captains SET level = $1, updated_at = NOW() WHERE id = $2', [newLevel, captain.id]);
      // 发送升级通知
      await sendNotification(captain.user_id, 'CAPTAIN_LEVEL_UP', { newLevel });
    }
  }
  
  // 刷新排行榜
  await db.query('REFRESH MATERIALIZED VIEW captain_monthly_ranking');
}

6. 会员权限中间件

// middleware/membership.js
function requireMembership(req, res, next) {
  if (!req.user.is_member || new Date(req.user.member_expires_at) < new Date()) {
    return res.status(403).json({
      success: false,
      error: {
        code: 'MEMBERSHIP_REQUIRED',
        message: '此功能需要开通会员',
        upgrade_url: '/membership/plans'
      }
    });
  }
  next();
}

// 免费用户限额检查
function checkFreeLimit(type) {
  return async (req, res, next) => {
    if (req.user.is_member) return next();
    
    const limits = {
      ai_chat: 20,       // 每天20条
      activity_join: 3,   // 每月3次
    };
    
    const count = await getUsageCount(req.user.id, type);
    if (count >= limits[type]) {
      return res.status(403).json({
        success: false,
        error: {
          code: 'FREE_LIMIT_EXCEEDED',
          message: type === 'ai_chat' 
            ? '今日AI对话次数已用完,开通会员享无限对话' 
            : '本月活动次数已用完,开通会员享无限参与',
          upgrade_url: '/membership/plans'
        }
      });
    }
    next();
  };
}

7. 子女代付H5页面

技术栈:Vue 3 + Vant(H5页面,微信内置浏览器打开)

流程:
1. 父母端生成代付链接 → 分享到微信
2. 子女点击链接 → 打开H5页面
3. H5页面展示:父母信息 + 会员方案 + 价格
4. 子女点击支付 → 调起微信支付JSAPI
5. 支付成功 → 后端更新会员状态 → Push通知父母

文档结束


来源:技术方案-V1.2-进阶架构.md


slug: tech-v1-2-advanced

「伴享」技术方案 V1.2 — 进阶架构

版本: V1.2
对应PRD: PRD-V1.2-功能丰富版
更新日期: 2026-02-16


1. 架构变更概述

V1.2引入两个重大变更:健康数据架构(时序数据+预警引擎)和子女端小程序(微信小程序+独立API层)。

1.1 变更影响矩阵

层级变更说明
数据库新增8张表健康设备/记录/预警/报告+子女用户+关联+社区内容
API新增3组端点/health, /child, /posts
新增服务健康数据同步Worker定时拉取手环数据
新增服务预警检测引擎实时异常检测
新增客户端微信小程序(子女端)Taro + React
新增服务产品候鸟/文教/设备复用service_products表

1.2 架构图更新

┌───────────────────────────────────────────────────────┐
│                      客户端层                          │
│  ┌──────────────┐  ┌──────────────┐  ┌────────────┐  │
│  │ Flutter APP  │  │ 子女端小程序  │  │ 代付H5     │  │
│  │ (父母端)     │  │ (Taro+React) │  │ (Vue3)     │  │
│  └──────┬───────┘  └──────┬───────┘  └──────┬─────┘  │
└─────────┼─────────────────┼─────────────────┼─────────┘
          │                 │                 │
┌─────────▼─────────────────▼─────────────────▼─────────┐
│                   API网关 (Nginx)                       │
│  /api/v1/*  →  主APP API                                │
│  /api/child/* → 子女端API                               │
│  /api/h5/*   → H5页面API                                │
└─────────┬─────────────────────────────────────────────┘

┌─────────▼─────────────────────────────────────────────┐
│              Node.js 业务服务层                          │
│  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐       │
│  │用户  │ │活动  │ │AI    │ │医疗  │ │支付  │       │
│  └──────┘ └──────┘ └──────┘ └──────┘ └──────┘       │
│  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐       │
│  │队长  │ │会员  │ │健康⭐│ │子女⭐│ │社区⭐│       │
│  └──────┘ └──────┘ └──────┘ └──────┘ └──────┘       │
└─────────┬─────────────────────────────────────────────┘

┌─────────▼─────────────────────────────────────────────┐
│                 后台Worker层(新增)                     │
│  ┌─────────────────┐  ┌─────────────────┐             │
│  │ 健康数据同步Worker│  │ 预警检测引擎    │             │
│  │ (每30分钟/每小时) │  │ (实时处理)      │             │
│  └─────────────────┘  └─────────────────┘             │
└───────────────────────────────────────────────────────┘

2. 健康数据架构

2.1 数据流

华为健康API / 小米运动API
     ↓ (OAuth2 + 定时拉取)
┌─────────────────────┐
│  健康数据同步Worker  │  ← Bull队列 + Redis
│  每30分钟执行一次    │
└──────────┬──────────┘
           ↓ 写入
┌─────────────────────┐
│  health_records表   │  ← 时序数据
└──────────┬──────────┘
           ↓ 触发
┌─────────────────────┐
│  预警检测引擎       │
│  检查阈值 →          │
│  ├── 正常 → 跳过     │
│  └── 异常 →          │
│      ├── 写入alerts  │
│      ├── Push用户    │
│      └── Push子女端  │
└─────────────────────┘

2.2 增量DDL

-- ===========================
-- V1.2 增量DDL
-- ===========================

-- 1. 健康设备绑定
CREATE TABLE health_devices (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  brand VARCHAR(20) NOT NULL,
  device_model VARCHAR(50),
  device_id VARCHAR(100),
  auth_token_encrypted TEXT,
  refresh_token_encrypted TEXT,
  sync_interval INTEGER DEFAULT 60,
  last_sync_at TIMESTAMP,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 2. 健康记录(时序数据,按月分区)
CREATE TABLE health_records (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT NOT NULL,
  record_type VARCHAR(20) NOT NULL,
  value JSONB NOT NULL,
  recorded_at TIMESTAMP NOT NULL,
  source VARCHAR(20) DEFAULT 'device',
  created_at TIMESTAMP DEFAULT NOW()
) PARTITION BY RANGE (recorded_at);

-- 按月创建分区(示例)
CREATE TABLE health_records_2026_04 PARTITION OF health_records
  FOR VALUES FROM ('2026-04-01') TO ('2026-05-01');
CREATE TABLE health_records_2026_05 PARTITION OF health_records
  FOR VALUES FROM ('2026-05-01') TO ('2026-06-01');

CREATE INDEX idx_health_user_type_time 
  ON health_records(user_id, record_type, recorded_at DESC);

-- 3. 健康预警
CREATE TABLE health_alerts (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  alert_type VARCHAR(50),
  record_id BIGINT,
  value JSONB,
  threshold JSONB,
  severity VARCHAR(20) DEFAULT 'warning',
  notified_user BOOLEAN DEFAULT FALSE,
  notified_family BOOLEAN DEFAULT FALSE,
  acknowledged BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 4. 健康周报
CREATE TABLE health_reports (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  report_type VARCHAR(20) DEFAULT 'weekly',
  period_start DATE,
  period_end DATE,
  content JSONB,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 5. 子女用户
CREATE TABLE child_users (
  id BIGSERIAL PRIMARY KEY,
  wx_openid VARCHAR(50) UNIQUE NOT NULL,
  wx_unionid VARCHAR(50),
  nickname VARCHAR(50),
  avatar_url TEXT,
  phone VARCHAR(11),
  created_at TIMESTAMP DEFAULT NOW()
);

-- 6. 子女-父母关联
CREATE TABLE child_parent_links (
  id BIGSERIAL PRIMARY KEY,
  child_id BIGINT REFERENCES child_users(id),
  parent_user_id BIGINT REFERENCES users(id),
  relationship VARCHAR(20) DEFAULT 'child',
  notification_enabled BOOLEAN DEFAULT TRUE,
  alert_phone VARCHAR(11),
  linked_at TIMESTAMP DEFAULT NOW(),
  UNIQUE(child_id, parent_user_id)
);

-- 7. 社区动态
CREATE TABLE posts (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  content TEXT,
  images TEXT[],
  topic_id BIGINT,
  location VARCHAR(100),
  like_count INTEGER DEFAULT 0,
  comment_count INTEGER DEFAULT 0,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE post_likes (
  post_id BIGINT REFERENCES posts(id),
  user_id BIGINT REFERENCES users(id),
  created_at TIMESTAMP DEFAULT NOW(),
  PRIMARY KEY(post_id, user_id)
);

CREATE TABLE post_comments (
  id BIGSERIAL PRIMARY KEY,
  post_id BIGINT REFERENCES posts(id),
  user_id BIGINT REFERENCES users(id),
  content TEXT,
  reply_to_id BIGINT,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE topics (
  id BIGSERIAL PRIMARY KEY,
  name VARCHAR(50) UNIQUE,
  description TEXT,
  post_count INTEGER DEFAULT 0,
  is_official BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 8. 通用服务产品表(候鸟/文教/设备)
CREATE TABLE service_products (
  id BIGSERIAL PRIMARY KEY,
  provider_id BIGINT REFERENCES service_providers(id),
  category VARCHAR(50),
  subcategory VARCHAR(50),
  title VARCHAR(200),
  description TEXT,
  images TEXT[],
  price DECIMAL(10,2),
  price_unit VARCHAR(20),
  commission_rate DECIMAL(4,2),
  location VARCHAR(100),
  available_from DATE,
  available_to DATE,
  stock INTEGER,
  sales_count INTEGER DEFAULT 0,
  rating DECIMAL(2,1) DEFAULT 5.0,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

2.3 健康数据同步Worker

// workers/health-sync.js
const Queue = require('bull');
const healthSyncQueue = new Queue('health-sync', process.env.REDIS_URL);

// 每30分钟同步一次
healthSyncQueue.process(async (job) => {
  const { userId, brand, authToken } = job.data;
  
  let data;
  if (brand === 'huawei') {
    data = await fetchHuaweiHealthData(authToken);
  } else if (brand === 'xiaomi') {
    data = await fetchXiaomiHealthData(authToken);
  }
  
  // 写入数据库
  for (const record of data.records) {
    await db.query(
      `INSERT INTO health_records (user_id, record_type, value, recorded_at, source)
       VALUES ($1, $2, $3, $4, 'device')
       ON CONFLICT DO NOTHING`,
      [userId, record.type, record.value, record.timestamp]
    );
  }
  
  // 触发预警检测
  await alertEngine.check(userId, data.records);
});

// 调度:为每个绑定设备的用户创建定时任务
async function scheduleHealthSync() {
  const devices = await db.query(
    'SELECT * FROM health_devices WHERE status = $1', ['active']
  );
  for (const device of devices.rows) {
    healthSyncQueue.add(
      { userId: device.user_id, brand: device.brand, authToken: device.auth_token_encrypted },
      { repeat: { every: device.sync_interval * 60 * 1000 } }
    );
  }
}

2.4 预警检测引擎

// services/alert-engine.js
const THRESHOLDS = {
  blood_pressure: {
    systolic: { min: 85, max: 150 },
    diastolic: { min: 55, max: 100 }
  },
  heart_rate: { min: 50, max: 120 },
  blood_sugar: { min: 3.5, max: 7.0 }
};

async function checkAlerts(userId, records) {
  for (const record of records) {
    const threshold = THRESHOLDS[record.type];
    if (!threshold) continue;
    
    let isAlert = false;
    let alertValue = {};
    
    if (record.type === 'blood_pressure') {
      const { systolic, diastolic } = record.value;
      if (systolic > threshold.systolic.max || systolic < threshold.systolic.min ||
          diastolic > threshold.diastolic.max || diastolic < threshold.diastolic.min) {
        isAlert = true;
        alertValue = { systolic, diastolic };
      }
    } else if (record.type === 'heart_rate') {
      const { bpm } = record.value;
      if (bpm > threshold.max || bpm < threshold.min) {
        isAlert = true;
        alertValue = { bpm };
      }
    }
    
    if (isAlert) {
      // 写入预警记录
      const alert = await db.query(
        `INSERT INTO health_alerts (user_id, alert_type, value, threshold, severity)
         VALUES ($1, $2, $3, $4, $5) RETURNING id`,
        [userId, record.type, alertValue, threshold, 
         determineSeverity(record.type, alertValue, threshold)]
      );
      
      // 通知用户
      await pushNotification(userId, {
        type: 'HEALTH_ALERT',
        title: '健康提醒',
        message: formatAlertMessage(record.type, alertValue),
        data: { alertId: alert.rows[0].id }
      });
      
      // 通知子女
      const childLinks = await db.query(
        'SELECT child_id FROM child_parent_links WHERE parent_user_id = $1 AND notification_enabled = true',
        [userId]
      );
      for (const link of childLinks.rows) {
        await pushChildNotification(link.child_id, {
          type: 'PARENT_HEALTH_ALERT',
          parentUserId: userId,
          alertType: record.type,
          value: alertValue
        });
      }
    }
  }
}

3. 子女端小程序架构

3.1 技术选型

技术选择理由
框架Taro 3.x + React跨平台小程序框架,后续可扩支付宝
状态管理Zustand轻量、简单
UI库Taro UI适配微信小程序
请求Taro.request封装小程序网络请求

3.2 项目结构

banxiang-child-miniapp/
├── src/
│   ├── app.tsx
│   ├── app.config.ts
│   ├── pages/
│   │   ├── index/          # 首页(父母状态概览)
│   │   ├── health/         # 健康数据
│   │   ├── activities/     # 活动记录
│   │   ├── proxy/          # 代办服务
│   │   └── profile/        # 我的
│   ├── components/
│   │   ├── HealthCard.tsx
│   │   ├── ActivityCard.tsx
│   │   └── AlertBanner.tsx
│   ├── services/
│   │   ├── api.ts
│   │   └── auth.ts
│   └── stores/
│       ├── authStore.ts
│       └── parentStore.ts
├── config/
└── package.json

3.3 子女端API端点

方法路径描述
POST/child/auth/wx-login微信登录
POST/child/bind绑定父母
GET/child/parents已绑定父母列表
GET/child/parents/:id/overview父母状态概览
GET/child/parents/:id/health健康数据
GET/child/parents/:id/health/trends趋势数据
GET/child/parents/:id/health/reports周报列表
GET/child/parents/:id/activities活动记录
POST/child/parents/:id/proxy-order代办下单
POST/child/parents/:id/membership代付会员
GET/child/alerts预警通知列表
PUT/child/alerts/:id/ack确认预警

3.4 微信登录流程

// 子女端登录
router.post('/child/auth/wx-login', async (req, res) => {
  const { code } = req.body;
  
  // 换取openid
  const wxRes = await axios.get(
    `https://api.weixin.qq.com/sns/jscode2session?appid=${APPID}&secret=${SECRET}&js_code=${code}&grant_type=authorization_code`
  );
  
  const { openid, unionid } = wxRes.data;
  
  // 查找或创建用户
  let user = await db.query('SELECT * FROM child_users WHERE wx_openid = $1', [openid]);
  if (!user.rows.length) {
    user = await db.query(
      'INSERT INTO child_users (wx_openid, wx_unionid) VALUES ($1, $2) RETURNING *',
      [openid, unionid]
    );
  }
  
  const token = jwt.sign({ childId: user.rows[0].id, type: 'child' }, JWT_SECRET);
  res.json({ success: true, data: { token, user: user.rows[0] } });
});

4. 内容审核方案

4.1 双重审核机制

用户发布内容

┌─────────────────┐
│  机器审核(实时)│
│  ├── 文字:敏感词库 + 通义千问审核
│  └── 图片:阿里云内容安全API
└──────┬──────────┘

  ├── 通过 → 直接发布
  ├── 疑似 → 标记待人工审核,临时发布
  └── 违规 → 拦截,通知用户

┌─────────────────┐
│  人工审核(异步)│  ← 疑似内容队列
│  管理后台审核    │
└─────────────────┘

4.2 敏感词库

  • 基础库:政治/色情/暴力/赌博
  • 医疗库:虚假医疗广告、伪科学养生
  • 诈骗库:常见诈骗话术、钓鱼链接
  • 自定义库:平台运营过程中积累

5. 部署变更

5.1 新增服务

# docker-compose.yml 新增
services:
  # 健康数据同步Worker
  health-worker:
    build: .
    command: node workers/health-sync.js
    environment:
      - REDIS_URL=redis://redis:6379
      - DATABASE_URL=postgres://...
    depends_on:
      - db
      - redis
    restart: always

  # 预警检测(与主服务共用,通过Bull队列触发)
  # 无需独立服务,health-worker内集成

5.2 服务器升级

服务V1.0配置V1.2配置原因
ECS2核4G4核8GWorker增加
RDS2核4G2核4G暂不变,健康数据用分区
Redis1G2GBull队列+更多缓存
月费¥700¥1000

6. 华为/小米健康API接入

6.1 华为健康

6.2 小米运动

  • OAuth2授权: 小米开放平台授权
  • API文档: https://dev.mi.com/docs
  • 数据类型: 步数、心率、睡眠
  • 注意: 小米手环不支持血压直接测量,需外接血压计

文档结束


来源:技术方案-V2.0-完整架构.md


slug: tech-v2-0-full-architecture

「伴享」技术方案 V2.0 — 完整架构

版本: V2.0
对应PRD: PRD-V2.0-完整产品
更新日期: 2026-02-16


1. 架构演进

V2.0标志着产品从MVP走向完整商业化。核心变更:商家后台Web端完整9大服务板块积分/优惠券/拼团Elasticsearch搜索

1.1 完整架构图

┌───────────────────────────────────────────────────────────┐
│                        客户端层                             │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────────┐ │
│  │Flutter  │  │子女端   │  │商家后台 │  │管理后台     │ │
│  │APP      │  │小程序   │  │Web     │  │Web(内部)  │ │
│  └────┬────┘  └────┬────┘  └────┬────┘  └──────┬──────┘ │
└───────┼────────────┼────────────┼───────────────┼─────────┘
        │            │            │               │
┌───────▼────────────▼────────────▼───────────────▼─────────┐
│                    Nginx API网关                            │
│  /api/v1/* → APP    /api/merchant/* → 商家                 │
│  /api/child/* → 子女  /api/admin/* → 管理                  │
└────────────────────────┬──────────────────────────────────┘

┌────────────────────────▼──────────────────────────────────┐
│                   业务服务层 (Node.js)                      │
│  用户│活动│AI管家│医疗│支付│通知│队长│会员│健康│子女│社区  │
│  商家│积分│优惠券│拼团│家政│配送│候鸟│文教│法律│设备│课程  │
└────────────────────────┬──────────────────────────────────┘

┌────────────────────────▼──────────────────────────────────┐
│                    Worker层                                 │
│  健康同步│预警检测│队长等级│结算│积分过期│排行榜│会员到期  │
└────────────────────────┬──────────────────────────────────┘

┌────────────────────────▼──────────────────────────────────┐
│                     数据层                                  │
│  PostgreSQL │ Redis │ OSS │ Elasticsearch                  │
└───────────────────────────────────────────────────────────┘

1.2 新增技术组件

组件用途版本
Elasticsearch全文搜索+日志8.x
React + Ant Design Pro商家后台React 18
Bull任务队列4.x

2. 商家后台架构

2.1 技术选型

  • 前端: React 18 + Ant Design Pro + ECharts + Vite
  • 状态管理: Zustand
  • 部署: Nginx静态托管 + CDN

2.2 项目结构

banxiang-merchant-web/
├── src/
│   ├── pages/
│   │   ├── login/           # 登录
│   │   ├── register/        # 注册+资质
│   │   ├── dashboard/       # 数据看板
│   │   ├── services/        # 服务管理
│   │   ├── orders/          # 订单管理
│   │   ├── finance/         # 财务结算
│   │   ├── reviews/         # 评价管理
│   │   └── settings/        # 店铺设置
│   ├── components/
│   ├── services/api.ts
│   └── stores/
└── package.json

2.3 增量DDL

-- ===========================
-- V2.0 增量DDL
-- ===========================

-- 1. 商家
CREATE TABLE merchants (
  id BIGSERIAL PRIMARY KEY,
  company_name VARCHAR(200) NOT NULL,
  credit_code VARCHAR(18) UNIQUE,
  category VARCHAR(50) NOT NULL,
  store_name VARCHAR(100),
  store_description TEXT,
  store_logo_url TEXT,
  contact_name VARCHAR(50),
  contact_phone VARCHAR(11),
  contact_email VARCHAR(100),
  business_license_url TEXT,
  industry_license_url TEXT,
  other_licenses TEXT[],
  address TEXT,
  lat DECIMAL(10,7),
  lng DECIMAL(10,7),
  service_area TEXT[],
  business_hours JSONB,
  annual_fee DECIMAL(10,2) DEFAULT 0,
  commission_rate DECIMAL(4,2),
  level VARCHAR(20) DEFAULT 'normal'
    CHECK (level IN ('normal', 'certified', 'strategic')),
  rating DECIMAL(2,1) DEFAULT 5.0,
  total_orders INTEGER DEFAULT 0,
  total_revenue DECIMAL(12,2) DEFAULT 0,
  status VARCHAR(20) DEFAULT 'pending',
  approved_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE merchant_accounts (
  id BIGSERIAL PRIMARY KEY,
  merchant_id BIGINT REFERENCES merchants(id),
  phone VARCHAR(11) UNIQUE NOT NULL,
  password_hash VARCHAR(100),
  role VARCHAR(20) DEFAULT 'owner',
  last_login_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE merchant_services (
  id BIGSERIAL PRIMARY KEY,
  merchant_id BIGINT REFERENCES merchants(id),
  title VARCHAR(200) NOT NULL,
  category VARCHAR(50),
  subcategory VARCHAR(50),
  description TEXT,
  images TEXT[],
  price DECIMAL(10,2),
  original_price DECIMAL(10,2),
  price_unit VARCHAR(20),
  stock INTEGER,
  service_duration VARCHAR(50),
  is_online BOOLEAN DEFAULT TRUE,
  sales_count INTEGER DEFAULT 0,
  rating DECIMAL(2,1) DEFAULT 5.0,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE merchant_settlements (
  id BIGSERIAL PRIMARY KEY,
  merchant_id BIGINT REFERENCES merchants(id),
  period_start DATE,
  period_end DATE,
  total_orders INTEGER,
  gross_amount DECIMAL(12,2),
  commission_amount DECIMAL(12,2),
  net_amount DECIMAL(12,2),
  bank_account_encrypted JSONB,
  status VARCHAR(20) DEFAULT 'pending',
  paid_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE merchant_daily_stats (
  merchant_id BIGINT REFERENCES merchants(id),
  stat_date DATE,
  page_views INTEGER DEFAULT 0,
  order_count INTEGER DEFAULT 0,
  revenue DECIMAL(10,2) DEFAULT 0,
  avg_rating DECIMAL(2,1),
  PRIMARY KEY(merchant_id, stat_date)
);

-- 2. 积分
CREATE TABLE point_accounts (
  user_id BIGINT PRIMARY KEY REFERENCES users(id),
  total_points INTEGER DEFAULT 0,
  available_points INTEGER DEFAULT 0,
  used_points INTEGER DEFAULT 0,
  expired_points INTEGER DEFAULT 0,
  updated_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE point_transactions (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  type VARCHAR(20),
  action VARCHAR(50),
  points INTEGER,
  balance INTEGER,
  reference_id VARCHAR(50),
  description TEXT,
  expires_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE point_products (
  id BIGSERIAL PRIMARY KEY,
  title VARCHAR(100),
  description TEXT,
  image_url TEXT,
  points_required INTEGER,
  stock INTEGER,
  category VARCHAR(20),
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

-- 3. 优惠券
CREATE TABLE coupon_templates (
  id BIGSERIAL PRIMARY KEY,
  title VARCHAR(100),
  type VARCHAR(20),
  value DECIMAL(10,2),
  min_amount DECIMAL(10,2),
  applicable_categories TEXT[],
  merchant_id BIGINT REFERENCES merchants(id),
  total_count INTEGER,
  issued_count INTEGER DEFAULT 0,
  valid_days INTEGER,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE user_coupons (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  template_id BIGINT REFERENCES coupon_templates(id),
  status VARCHAR(20) DEFAULT 'available',
  used_order_no VARCHAR(20),
  expires_at TIMESTAMP,
  used_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

-- 4. 拼团
CREATE TABLE group_buy_campaigns (
  id BIGSERIAL PRIMARY KEY,
  service_id BIGINT REFERENCES merchant_services(id),
  original_price DECIMAL(10,2),
  group_price DECIMAL(10,2),
  min_members INTEGER DEFAULT 3,
  valid_hours INTEGER DEFAULT 24,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE group_buy_orders (
  id BIGSERIAL PRIMARY KEY,
  campaign_id BIGINT REFERENCES group_buy_campaigns(id),
  initiator_id BIGINT REFERENCES users(id),
  current_members INTEGER DEFAULT 1,
  status VARCHAR(20) DEFAULT 'pending',
  expires_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE group_buy_members (
  group_order_id BIGINT REFERENCES group_buy_orders(id),
  user_id BIGINT REFERENCES users(id),
  order_no VARCHAR(20),
  joined_at TIMESTAMP DEFAULT NOW(),
  PRIMARY KEY(group_order_id, user_id)
);

-- 5. 课程
CREATE TABLE courses (
  id BIGSERIAL PRIMARY KEY,
  title VARCHAR(200),
  category VARCHAR(50),
  instructor_name VARCHAR(50),
  description TEXT,
  cover_image TEXT,
  type VARCHAR(20),
  video_url TEXT,
  live_room_id VARCHAR(50),
  scheduled_at TIMESTAMP,
  duration_minutes INTEGER,
  price DECIMAL(10,2) DEFAULT 0,
  enrollment_count INTEGER DEFAULT 0,
  rating DECIMAL(2,1) DEFAULT 5.0,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE course_enrollments (
  course_id BIGINT REFERENCES courses(id),
  user_id BIGINT REFERENCES users(id),
  progress DECIMAL(5,2) DEFAULT 0,
  completed BOOLEAN DEFAULT FALSE,
  enrolled_at TIMESTAMP DEFAULT NOW(),
  PRIMARY KEY(course_id, user_id)
);

3. 商家API端点

方法路径描述
POST/merchant/register商家注册
POST/merchant/auth/login登录
GET/merchant/dashboard看板
GET/POST/PUT/DELETE/merchant/services/*服务CRUD
GET/POST/merchant/orders/*订单管理
GET/POST/merchant/settlements/*结算管理
GET/merchant/stats/*数据统计
GET/POST/merchant/reviews/*评价管理
PUT/merchant/settings店铺设置
POST/merchant/coupons创建优惠券

4. 结算系统

// workers/settlement.js - 每月1日凌晨生成结算单
cron.schedule('0 2 1 * *', async () => {
  const merchants = await db.query('SELECT * FROM merchants WHERE status = $1', ['active']);
  const lastMonth = moment().subtract(1, 'month');
  
  for (const m of merchants.rows) {
    const stats = await db.query(`
      SELECT COUNT(*) as cnt, COALESCE(SUM(amount), 0) as gross
      FROM orders o
      JOIN merchant_services ms ON o.detail->>'serviceId' = ms.id::text
      WHERE ms.merchant_id = $1 AND o.status = 'completed'
        AND o.completed_at BETWEEN $2 AND $3
    `, [m.id, lastMonth.startOf('month').toDate(), lastMonth.endOf('month').toDate()]);
    
    const gross = parseFloat(stats.rows[0].gross);
    const commission = gross * m.commission_rate / 100;
    
    await db.query(`
      INSERT INTO merchant_settlements 
      (merchant_id, period_start, period_end, total_orders, gross_amount, commission_amount, net_amount)
      VALUES ($1, $2, $3, $4, $5, $6, $7)
    `, [m.id, lastMonth.startOf('month').format('YYYY-MM-DD'), 
        lastMonth.endOf('month').format('YYYY-MM-DD'),
        stats.rows[0].cnt, gross, commission, gross - commission]);
  }
});

5. Elasticsearch搜索

// 商家/服务索引,使用ik_max_word分词器
// 支持:全文搜索 + 地理位置排序 + 分类筛选 + 评分排序
// GET /api/v1/search?q=保洁&category=housekeeping&lat=30.57&lng=104.07
router.get('/search', async (req, res) => {
  const { q, category, lat, lng, page = 1, size = 20 } = req.query;
  const result = await esClient.search({
    index: 'banxiang_services',
    body: {
      query: {
        bool: {
          must: [{ multi_match: { query: q, fields: ['title^2', 'description'] } }],
          filter: category ? [{ term: { category } }] : []
        }
      },
      sort: lat ? [{ _geo_distance: { location: { lat, lon: lng }, order: 'asc' } }] : [{ salesCount: 'desc' }],
      from: (page - 1) * size, size
    }
  });
  res.json({ success: true, data: result.hits });
});

6. 完整部署方案

6.1 服务器配置

服务配置月费
应用服务器ECS 4核8G × 2¥800
数据库RDS PG 4核8G(主从)¥600
Redis2G¥150
Elasticsearch2核4G¥300
OSS + CDN按量¥200
月合计¥2050

6.2 Docker Compose

version: '3.8'
services:
  app:
    build: .
    ports: ["3000:3000"]
    deploy: { replicas: 2 }
    depends_on: [db, redis, es]
    restart: always
  worker:
    build: .
    command: node workers/index.js
    depends_on: [db, redis]
    restart: always
  db:
    image: postgres:15
    volumes: [pgdata:/var/lib/postgresql/data]
    restart: always
  redis:
    image: redis:7-alpine
    volumes: [redisdata:/data]
    restart: always
  es:
    image: elasticsearch:8.12.0
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes: [esdata:/usr/share/elasticsearch/data]
    restart: always
  nginx:
    image: nginx:alpine
    ports: ["80:80", "443:443"]
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./merchant-web/dist:/var/www/merchant
    depends_on: [app]
    restart: always
volumes:
  pgdata:
  redisdata:
  esdata:

6.3 Nginx关键配置

# APP API + SSE支持
server {
    listen 443 ssl;
    server_name api.banxiang.com;
    location /api/ { proxy_pass http://app:3000; }
    location /api/v1/ai/chat {
        proxy_pass http://app:3000;
        proxy_buffering off;
        proxy_http_version 1.1;
    }
}
# 商家后台SPA
server {
    listen 443 ssl;
    server_name merchant.banxiang.com;
    root /var/www/merchant;
    location / { try_files $uri /index.html; }
    location /api/merchant/ { proxy_pass http://app:3000; }
}

7. 数据库表总览(全版本49张表)

版本表数核心表
V1.017张users, activities, ai_conversations, orders, hospitals等
V1.19张captains, memberships, service_providers, products等
V1.211张health_records, child_users, posts, service_products等
V2.012张merchants, point_accounts, coupon_templates, courses等
合计49张

8. 向微服务演进路线

V2.0 (当前): 模块化单体
  → 代码按服务边界分离,共享数据库

V3.0 (计划): 拆分核心服务
  → 用户服务(独立DB)
  → 活动服务(独立DB)
  → AI管家服务(独立,GPU资源)
  → 其余保持单体

V4.0 (远期): 完整微服务
  → 所有服务独立
  → API Gateway统一入口
  → 服务间gRPC通信
  → K8s编排

9. 安全合规清单

项目状态说明
《个人信息保护法》合规最小收集、明确告知、分项授权
数据加密TLS 1.3 + AES-256
健康数据隔离单独加密存储
医疗免责声明所有页面标注
金融合规仅信息展示,不销售
老年人权益无自动续费、大额二次确认
RBAC权限用户/商家/管理员角色分离
审计日志全操作记录
数据备份每日自动+跨区域
安全渗透测试📋V2.0上线前完成

文档结束

On this page

半享项目总文档来源:CODE-MAP.mdCODE MAP(Flutter 项目)1) 目录树(文件级,聚焦 lib/)2) 文件说明3) 核心方法索引4) 数据模型汇总来源:PRD-V1.0-MVP核心功能.mdslug: prd-v1-0-mvp「伴享」PRD V1.0 — MVP核心功能目录1. 版本概述1.1 核心目标1.2 功能范围1.3 用户故事地图2. 用户系统2.1 注册登录需求描述用户故事交互流程UI要求数据结构API接口验收标准2.2 实名认证需求描述用户故事交互流程API接口验收标准2.3 紧急联系人需求描述API接口验收标准2.4 子女账号关联需求描述交互流程数据结构API接口验收标准3. 社交活动模块3.1 活动发现(首页)需求描述用户故事交互流程UI要求推荐算法数据结构API接口验收标准3.2 活动创建需求描述用户故事交互流程API接口验收标准3.3 活动报名与取消API接口验收标准3.4 活动签到需求描述交互流程API接口验收标准3.5 活动评价需求描述API接口验收标准3.6 我的活动需求描述API接口4. AI智能管家4.1 对话界面需求描述用户故事交互流程UI要求数据结构API接口验收标准4.2 快捷指令:附近活动交互流程验收标准4.3 快捷指令:挂号服务交互流程API接口验收标准4.4 快捷指令:生鲜配送交互流程验收标准5. 医疗健康服务5.1 服务入口交互流程5.2 在线挂号数据结构5.3 在线问诊数据结构API接口验收标准6. 支付系统6.1 微信支付集成数据结构API接口验收标准7. 消息与通知系统7.1 通知类型数据结构8. 适老化设计规范8.1 视觉规范8.2 交互规范8.3 语音交互规范9. 非功能性需求9.1 性能要求9.2 安全要求9.3 兼容性要求10. 验收标准与测试计划10.1 内测验收标准10.2 测试计划10.3 进入V1.1的Gate条件来源:PRD-V1.1-体验优化版.mdslug: prd-v1-1-experience「伴享」PRD V1.1 — 体验优化版1. 版本概述1.1 核心目标1.2 新增功能清单2. 社区队长体系2.1 需求描述2.2 用户故事2.3 队长等级体系2.4 交互流程队长申请队长主页2.5 数据结构2.6 API接口2.7 验收标准3. 会员订阅系统3.1 需求描述3.2 会员权益对比3.3 交互流程开通会员子女代付3.4 数据结构3.5 API接口3.6 验收标准4. 家政服务4.1 需求描述4.2 用户故事4.3 服务列表4.4 交互流程4.5 数据结构4.6 API接口4.7 验收标准5. 日常消费服务5.1 需求描述5.2 交互流程5.3 数据结构5.4 验收标准6. 新手引导6.1 交互流程7. 分享功能7.1 活动分享到微信7.2 验收标准8. V1.1验收标准总表进入V1.2的Gate条件来源:PRD-V1.2-功能丰富版.mdslug: prd-v1-2-feature-rich「伴享」PRD V1.2 — 功能丰富版1. 版本概述1.1 核心目标1.2 新增功能清单2. 健康管理模块2.1 需求描述2.2 用户故事2.3 功能详情2.3.1 设备绑定2.3.2 健康数据看板2.3.3 异常预警2.3.4 每周健康报告2.4 数据结构2.5 API接口2.6 验收标准3. 子女端小程序3.1 需求描述3.2 用户故事3.3 功能模块3.4 交互流程绑定流程首页3.5 数据结构3.6 API接口(子女端)3.7 验收标准4. 内容社区4.1 朋友圈4.2 话题广场4.3 数据结构4.4 验收标准5. 新增3个服务板块5.1 候鸟养老5.2 文化教育5.3 智能设备商城5.4 数据结构6. V1.2验收标准总表进入V2.0的Gate条件来源:PRD-V2.0-完整产品.mdslug: prd-v2-0-full-product「伴享」PRD V2.0 — 完整产品版1. 版本概述1.1 核心目标1.2 新增功能清单2. 商家后台(Web端)2.1 需求描述2.2 用户故事2.3 功能模块2.4 商家入驻流程2.5 数据结构2.6 API接口(商家端)2.7 验收标准3. 补全剩余服务板块3.1 康养护理3.2 金融理财(合规展示)3.3 法律服务4. 积分系统4.1 积分获取4.2 积分兑换4.3 数据结构5. 优惠券系统5.1 券类型5.2 数据结构6. 拼团活动6.1 需求描述6.2 数据结构7. 线上课程7.1 功能7.2 数据结构8. V2.0验收标准总表9. 后续规划来源:PRD-产品需求文档.mdslug: banxiang-prd「伴享」银发社交平台 - 产品需求文档(PRD)📋 文档目的🎯 产品定位🚀 版本迭代规划总览版本 V1.0 MVP(最小可行产品)V1.0 功能清单✅ 必做功能(P0)1. 用户系统(2周)2. 社交活动模块(4周)— 核心差异化2.1 活动发现(首页)2.2 活动详情页2.3 活动创建(任何用户都可发起)2.4 我的活动2.5 活动签到(安全机制)3. AI 智能管家(3周)— 核心卖点3.1 语音交互入口3.2 基础对话能力3.3 快捷指令(MVP 阶段只做 3 个)4. 生活服务(只做 1 个板块,3周)4.1 医疗健康服务5. 支付系统(2周)🔶 不做的功能(留到后续版本)V1.0 技术方案架构设计技术栈确认数据库设计(核心表)用户表(users)活动表(activities)活动报名表(activity_participants)AI 对话记录表(ai_conversations)订单表(orders)V1.0 开发计划时间表(6周,42天)每周里程碑V1.0 测试计划内测目标测试重点验收标准(能否进入 V1.1)版本 V1.1(体验优化版)V1.1 新增功能1. 社区队长体系(2周)2. 会员订阅系统(1周)3. 新增 2 个服务板块(2周)家政服务日常消费4. 用户体验优化V1.1 验收标准版本 V1.2(功能丰富版)V1.2 新增功能1. 健康管理模块(2周)2. 内容社区(1周)3. 子女端小程序(2周)4. 新增 3 个服务板块(2周)V1.2 验收标准版本 V2.0(完整产品)V2.0 新增功能1. 商家后台(Web 端)(3周)2. 补全剩余 4 个服务板块(3周)3. 高级功能V2.0 验收标准附录适老化设计规范视觉规范交互规范语音交互规范关键指标定义用户增长指标留存指标活动指标商业化指标风险与对策高风险项中风险项成本与收入预测V1.0 开发成本(6周)V1.0 内测期收入预测(2周,500人)V1.1 公测期收入预测(1个月,2000人)V2.0 稳定期收入预测(1个月,10000人)下一步行动(本周)立即执行本周内完成来源:STATUS.md伴享项目状态文档📦 版本信息技术栈✅ 已实现功能用户注册与登录主界面UI / 主题🚧 已知问题 / 空壳功能🗓️ 版本历史🚀 下个版本计划(V1.1 待开发)P0 — 核心功能(必须完成)P1 — 重要功能📌 备注来源:技术方案-V1.0-MVP架构.mdslug: tech-v1-0-mvp-architecture「伴享」技术方案 V1.0 — MVP架构1. 技术架构总览1.1 系统架构图1.2 技术选型2. 数据库设计2.1 ER关系概览2.2 完整DDL3. API文档3.1 规范3.2 完整接口清单4. Flutter组件架构4.1 项目结构4.2 适老化组件库(BX Design System)4.3 核心代码示例API客户端AI管家对话页面活动推荐算法5. AI管家技术方案5.1 架构5.2 Function Calling定义5.3 System Prompt6. 部署方案6.1 服务器配置(MVP阶段)6.2 Docker Compose6.3 CI/CD流程6.4 监控方案7. 安全方案7.1 数据安全7.2 接口安全来源:技术方案-V1.1-扩展架构.mdslug: tech-v1-1-extension「伴享」技术方案 V1.1 — 扩展架构1. 架构变更概述1.1 变更影响矩阵2. 新增数据库表2.1 增量DDL3. 新增API端点3.1 队长模块 /captains3.2 会员模块 /membership3.3 家政服务 /services/housekeeping3.4 日常消费 /shopping4. Flutter新增模块4.1 新增Feature模块4.2 微信分享集成5. 队长等级自动计算6. 会员权限中间件7. 子女代付H5页面来源:技术方案-V1.2-进阶架构.mdslug: tech-v1-2-advanced「伴享」技术方案 V1.2 — 进阶架构1. 架构变更概述1.1 变更影响矩阵1.2 架构图更新2. 健康数据架构2.1 数据流2.2 增量DDL2.3 健康数据同步Worker2.4 预警检测引擎3. 子女端小程序架构3.1 技术选型3.2 项目结构3.3 子女端API端点3.4 微信登录流程4. 内容审核方案4.1 双重审核机制4.2 敏感词库5. 部署变更5.1 新增服务5.2 服务器升级6. 华为/小米健康API接入6.1 华为健康6.2 小米运动来源:技术方案-V2.0-完整架构.mdslug: tech-v2-0-full-architecture「伴享」技术方案 V2.0 — 完整架构1. 架构演进1.1 完整架构图1.2 新增技术组件2. 商家后台架构2.1 技术选型2.2 项目结构2.3 增量DDL3. 商家API端点4. 结算系统5. Elasticsearch搜索6. 完整部署方案6.1 服务器配置6.2 Docker Compose6.3 Nginx关键配置7. 数据库表总览(全版本49张表)8. 向微服务演进路线9. 安全合规清单