# 用户系统与数据隔离设计方案 ## 架构设计 ### 用户体系 ``` 微信用户(小程序用户) └── 绑定微博账号 └── 管理微博超话 └── 超话签到记录 ``` ### 数据隔离原则 - 每个微信用户通过 `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接口