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

215 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 用户系统与数据隔离设计方案
## 架构设计
### 用户体系
```
微信用户(小程序用户)
└── 绑定微博账号
└── 管理微博超话
└── 超话签到记录
```
### 数据隔离原则
- 每个微信用户通过 `openid` 唯一标识
- 每个微信用户可以绑定一个微博账号
- 微博账号通过 `weibo_uid` 唯一标识
- 所有数据通过 `user_id`微信用户ID进行隔离
---
## 数据库表结构
### 1. 用户表 (users)
```sql
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)
```sql
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)
```sql
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)
```sql
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接口