Files
chaohua_coze/docs/user-system-design.md
jaystar 4b2fec96e9 fix: 修复编译错误并完成全栈验证
**前端修复**:
- 移除重复的@tarojs/taro导入
- 完善UserInfo接口类型定义(新增weiboBound/weiboName字段)

**后端修复**:
- 安装jsonwebtoken及@types/jsonwebtoken依赖

**构建验证**:
- 前端所有平台构建通过(H5/微信小程序/抖音小程序)
- 后端NestJS构建通过
- ESLint检查通过
- TypeScript编译通过
2026-03-16 12:09:12 +08:00

5.7 KiB
Raw Permalink Blame History

用户系统与数据隔离设计方案

架构设计

用户体系

微信用户(小程序用户)
    └── 绑定微博账号
         └── 管理微博超话
              └── 超话签到记录

数据隔离原则

  • 每个微信用户通过 openid 唯一标识
  • 每个微信用户可以绑定一个微博账号
  • 微博账号通过 weibo_uid 唯一标识
  • 所有数据通过 user_id微信用户ID进行隔离

数据库表结构

1. 用户表 (users)

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  wechat_openid VARCHAR(64) NOT NULL UNIQUE,  -- 微信openid
  wechat_unionid VARCHAR(64),                  -- 微信unionid可选
  nickname VARCHAR(128),                       -- 微信昵称
  avatar VARCHAR(512),                         -- 微信头像
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

CREATE INDEX idx_users_wechat_openid ON users(wechat_openid);

2. 微博账号绑定表 (weibo_accounts)

CREATE TABLE weibo_accounts (
  id SERIAL PRIMARY KEY,
  user_id INTEGER NOT NULL REFERENCES users(id),  -- 关联用户
  weibo_uid VARCHAR(64) NOT NULL,                  -- 微博用户ID
  weibo_name VARCHAR(128),                         -- 微博昵称
  access_token TEXT,                               -- 微博访问令牌
  refresh_token TEXT,                              -- 刷新令牌
  expires_at TIMESTAMP WITH TIME ZONE,             -- 令牌过期时间
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  UNIQUE(user_id),                                 -- 一个微信用户只能绑定一个微博账号
  UNIQUE(weibo_uid)                                -- 一个微博账号只能被绑定一次
);

CREATE INDEX idx_weibo_accounts_user_id ON weibo_accounts(user_id);
CREATE INDEX idx_weibo_accounts_weibo_uid ON weibo_accounts(weibo_uid);

3. 关注的超话表 (followed_topics)

CREATE TABLE followed_topics (
  id SERIAL PRIMARY KEY,
  user_id INTEGER NOT NULL REFERENCES users(id),  -- 用户ID
  topic_id VARCHAR(64) NOT NULL,                   -- 超话ID
  topic_name VARCHAR(256) NOT NULL,                -- 超话名称
  topic_cover VARCHAR(512),                        -- 超话封面
  member_count INTEGER DEFAULT 0,                  -- 成员数
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  UNIQUE(user_id, topic_id)                        -- 防止重复关注
);

CREATE INDEX idx_followed_topics_user_id ON followed_topics(user_id);
CREATE INDEX idx_followed_topics_topic_id ON followed_topics(topic_id);

4. 签到记录表 (signin_records)

CREATE TABLE signin_records (
  id SERIAL PRIMARY KEY,
  user_id INTEGER NOT NULL REFERENCES users(id),  -- 用户ID
  topic_id VARCHAR(64) NOT NULL,                   -- 超话ID
  sign_date DATE NOT NULL,                         -- 签到日期
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  UNIQUE(user_id, topic_id, sign_date)             -- 每天每个超话只能签到一次
);

CREATE INDEX idx_signin_records_user_id ON signin_records(user_id);
CREATE INDEX idx_signin_records_topic_id ON signin_records(topic_id);
CREATE INDEX idx_signin_records_sign_date ON signin_records(sign_date);

认证流程

1. 微信小程序登录流程

用户打开小程序
    ↓
调用 wx.login() 获取 code
    ↓
发送 code 到后端 /api/auth/wechat-login
    ↓
后端调用微信API换取 openid
    ↓
创建/查询用户记录
    ↓
返回 JWT token包含 user_id
    ↓
前端存储 token后续请求携带

2. 微博账号绑定流程

用户点击"绑定微博"
    ↓
前端请求 /api/weibo/bind-url
    ↓
后端生成微博OAuth授权URL
    ↓
前端展示二维码或跳转授权页
    ↓
用户扫码授权
    ↓
微博回调到 /api/weibo/callback
    ↓
后端换取 access_token 和用户信息
    ↓
保存微博账号绑定关系
    ↓
同步用户关注的超话列表

3. 微博API调用流程

前端请求需要微博数据的接口
    ↓
后端验证 JWT token获取 user_id
    ↓
查询该用户的微博账号绑定信息
    ↓
检查 access_token 是否过期
    ↓
使用 access_token 调用微博API
    ↓
返回数据给前端

API设计

认证相关

  • POST /api/auth/wechat-login - 微信登录
  • POST /api/auth/logout - 登出
  • GET /api/auth/me - 获取当前用户信息

微博绑定相关

  • GET /api/weibo/bind-url - 获取微博授权URL
  • GET /api/weibo/callback - 微博授权回调
  • GET /api/weibo/status - 查询微博绑定状态
  • DELETE /api/weibo/unbind - 解除微博绑定

超话管理相关

  • GET /api/topics - 获取关注的超话列表(真实微博数据)
  • POST /api/topics/sync - 同步超话列表
  • POST /api/topics/signin - 超话签到
  • GET /api/topics/records - 获取签到记录

安全考虑

  1. Token安全JWT token 设置合理过期时间,敏感操作需要验证
  2. 微博Token加密access_token 加密存储,定期检查过期
  3. 数据隔离:所有查询必须带 user_id 条件
  4. 权限验证:每个接口验证用户身份和微博绑定状态

前端存储

  • 使用 Taro.setStorageSync 存储 JWT token
  • 每次请求通过 header 携带 token
  • 退出登录时清除 token

注意事项

微博开放平台申请

需要申请以下权限:

  • 用户基本信息读取
  • 用户关注的超话列表读取
  • 超话签到功能

开发环境模拟

由于微博API需要申请权限开发阶段

  1. 模拟OAuth流程
  2. 使用模拟数据测试
  3. 预留真实API接口