feat: 实现微信小程序后端接口与用户认证系统
新增微信登录/注册合一接口、资料完善接口和token刷新接口 重构用户服务层,支持自动维护用户类型和资料完整度 引入JWT认证中间件和请求验证中间件 更新文档与测试用例,支持dist构建部署
This commit is contained in:
193
docs/ARCHIVE.md
Normal file
193
docs/ARCHIVE.md
Normal file
@@ -0,0 +1,193 @@
|
||||
# OpenSpec 开发归档
|
||||
|
||||
## 归档日期
|
||||
|
||||
- 2026-03-20
|
||||
|
||||
## 归档范围
|
||||
|
||||
本次归档覆盖微信小程序后端交互相关接口的设计、实现、规范同步与部署调整,涉及:
|
||||
|
||||
- 接口路径统一收敛到 `/api`
|
||||
- 微信登录/注册合一
|
||||
- 微信资料完善接口重构
|
||||
- 微信手机号服务端换取
|
||||
- `users_type` 自动维护
|
||||
- JWT 认证与刷新 token
|
||||
- PocketBase Token 模式访问
|
||||
- OpenAPI 与项目文档同步
|
||||
- dist 构建与部署产物
|
||||
|
||||
---
|
||||
|
||||
## 一、接口演进结果
|
||||
|
||||
### 系统接口
|
||||
|
||||
- `POST /api/test-helloworld`
|
||||
- `POST /api/health`
|
||||
|
||||
### 微信小程序接口
|
||||
|
||||
- `POST /api/wechat/login`
|
||||
- 登录/注册合一
|
||||
- 接收 `users_wx_code`
|
||||
- 自动换取 `users_wx_openid`
|
||||
- 若无账号则自动创建游客账号
|
||||
- 返回 `status`、`is_info_complete`、`token`、完整用户信息
|
||||
|
||||
- `POST /api/wechat/profile`
|
||||
- 从 headers 读取 `users_wx_openid`
|
||||
- 需要 `Authorization`
|
||||
- body 接收:
|
||||
- `users_name`
|
||||
- `users_phone_code`
|
||||
- `users_picture`
|
||||
- 服务端调用微信接口换取真实手机号后写入 `users_phone`
|
||||
|
||||
- `POST /api/wechat/refresh-token`
|
||||
- 仅依赖 `users_wx_openid`
|
||||
- 不要求旧 `Authorization`
|
||||
- 返回新的 JWT token
|
||||
|
||||
---
|
||||
|
||||
## 二、关键业务规则
|
||||
|
||||
### 1. 用户类型 `users_type`
|
||||
|
||||
- 新账号初始化:`游客`
|
||||
- 当且仅当用户首次从:
|
||||
- `users_name` 为空
|
||||
- `users_phone` 为空
|
||||
- `users_picture` 为空
|
||||
|
||||
变为:
|
||||
- 三项全部完整
|
||||
|
||||
时,自动升级为:`注册用户`
|
||||
|
||||
- 后续资料修改不再覆盖已确定类型
|
||||
|
||||
### 2. 用户资料完整度 `is_info_complete`
|
||||
|
||||
以下三项同时存在时为 `true`:
|
||||
|
||||
- `users_name`
|
||||
- `users_phone`
|
||||
- `users_picture`
|
||||
|
||||
否则为 `false`
|
||||
|
||||
### 3. 微信手机号获取
|
||||
|
||||
服务端使用微信官方接口:
|
||||
|
||||
- `getuserphonenumber`
|
||||
|
||||
通过 `users_phone_code` 换取真实手机号,再写入数据库字段 `users_phone`。
|
||||
|
||||
---
|
||||
|
||||
## 三、鉴权规则
|
||||
|
||||
### 标准请求头
|
||||
|
||||
- `Authorization: Bearer <token>`
|
||||
- `users_wx_openid: <openid>`
|
||||
|
||||
### 当前规则
|
||||
|
||||
- `/api/wechat/login`:不需要 token
|
||||
- `/api/wechat/profile`:需要 `users_wx_openid + Authorization`
|
||||
- `/api/wechat/refresh-token`:**只需要** `users_wx_openid`
|
||||
|
||||
---
|
||||
|
||||
## 四、请求格式规则
|
||||
|
||||
所有微信写接口统一要求:
|
||||
|
||||
- `Content-Type: application/json`
|
||||
|
||||
不符合时返回:
|
||||
|
||||
- `415 请求体必须为 application/json`
|
||||
|
||||
---
|
||||
|
||||
## 五、PocketBase 访问策略
|
||||
|
||||
当前统一使用:
|
||||
|
||||
- `POCKETBASE_API_URL`
|
||||
- `POCKETBASE_AUTH_TOKEN`
|
||||
|
||||
已移除:
|
||||
|
||||
- `POCKETBASE_USER_NAME`
|
||||
- `POCKETBASE_PASSWORD`
|
||||
|
||||
---
|
||||
|
||||
## 六、部署与产物
|
||||
|
||||
后端已支持 dist 构建:
|
||||
|
||||
- `npm run build`
|
||||
- 产物目录:`back-end/dist/`
|
||||
|
||||
当前发布目录包含:
|
||||
|
||||
- `dist/src/`
|
||||
- `dist/spec/`
|
||||
- `dist/package.json`
|
||||
- `dist/package-lock.json`
|
||||
- `dist/.env`
|
||||
|
||||
生产启动方式:
|
||||
|
||||
- `npm start`
|
||||
- 实际运行:`node dist/src/index.js`
|
||||
|
||||
---
|
||||
|
||||
## 七、文档同步结果
|
||||
|
||||
已同步更新:
|
||||
|
||||
- `back-end/spec/openapi.yaml`
|
||||
- `docs/api.md`
|
||||
- `docs/deployment.md`
|
||||
- `README.md`
|
||||
|
||||
其中 `openapi.yaml` 已与当前真实接口行为对齐。
|
||||
|
||||
---
|
||||
|
||||
## 八、质量验证结果
|
||||
|
||||
本次归档前已验证通过:
|
||||
|
||||
- `npm run lint`
|
||||
- `npm run test`
|
||||
- `npm run build`
|
||||
|
||||
测试覆盖包括:
|
||||
|
||||
- 系统接口
|
||||
- 统一 404
|
||||
- 登录/注册合一
|
||||
- 非 JSON 拒绝
|
||||
- 资料更新
|
||||
- token 刷新
|
||||
- `users_type` 升级逻辑
|
||||
- `is_info_complete` 返回逻辑
|
||||
|
||||
---
|
||||
|
||||
## 九、当前已知边界
|
||||
|
||||
1. `refresh-token` 当前仅依赖 `users_wx_openid`,未校验旧 token
|
||||
2. 微信手机号能力依赖微信官方 `access_token` 与 `users_phone_code`
|
||||
3. 当前后端为 JavaScript + Express 架构,未引入 TypeScript 编译链
|
||||
Reference in New Issue
Block a user