fix: 修复编译错误并完成全栈验证
**前端修复**: - 移除重复的@tarojs/taro导入 - 完善UserInfo接口类型定义(新增weiboBound/weiboName字段) **后端修复**: - 安装jsonwebtoken及@types/jsonwebtoken依赖 **构建验证**: - 前端所有平台构建通过(H5/微信小程序/抖音小程序) - 后端NestJS构建通过 - ESLint检查通过 - TypeScript编译通过
This commit is contained in:
214
docs/user-system-design.md
Normal file
214
docs/user-system-design.md
Normal file
@@ -0,0 +1,214 @@
|
||||
# 用户系统与数据隔离设计方案
|
||||
|
||||
## 架构设计
|
||||
|
||||
### 用户体系
|
||||
|
||||
```
|
||||
微信用户(小程序用户)
|
||||
└── 绑定微博账号
|
||||
└── 管理微博超话
|
||||
└── 超话签到记录
|
||||
```
|
||||
|
||||
### 数据隔离原则
|
||||
|
||||
- 每个微信用户通过 `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接口
|
||||
Reference in New Issue
Block a user