HaniBlindBox/.kiro/specs/user-auth-migration/requirements.md
2026-01-02 16:02:03 +08:00

117 lines
6.2 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.

# Requirements Document
## Introduction
本文档定义了将PHP用户认证系统迁移到.NET 8的需求规范。迁移范围包括微信小程序登录、手机号验证码登录、JWT Token管理、用户信息管理、手机号绑定、登录记录和账号注销功能。迁移过程中需要保持与现有UniApp前端的100%兼容性。
## Glossary
- **Auth_System**: 用户认证系统负责处理用户登录、注册、Token管理等功能
- **Wechat_Service**: 微信服务负责与微信API交互获取openid和用户信息
- **Sms_Service**: 短信服务负责验证短信验证码发送验证码暂不迁移继续使用PHP接口
- **Jwt_Service**: JWT服务负责生成、验证和刷新JWT Token
- **User_Service**: 用户服务,负责用户信息的增删改查
- **Redis_Cache**: Redis缓存服务用于存储验证码和防抖锁
- **IP_Location_Service**: IP地理位置服务用于解析用户登录IP的地理位置
## Requirements
### Requirement 1: 微信小程序登录
**User Story:** As a 用户, I want to 通过微信小程序授权登录, so that 我可以快速进入系统而无需输入账号密码
#### Acceptance Criteria
1. WHEN 用户提交微信授权code, THE Auth_System SHALL 调用微信API获取openid和unionid
2. WHEN 获取到openid后, THE Auth_System SHALL 查找是否存在该用户优先通过unionid查找其次通过openid查找
3. WHEN 用户不存在时, THE Auth_System SHALL 自动创建新用户并生成默认头像和昵称
4. WHEN 用户存在时, THE Auth_System SHALL 更新用户的unionid如果之前为空
5. WHEN 登录成功后, THE Auth_System SHALL 生成JWT Token并返回给客户端
6. WHEN 用户在3秒内重复请求登录, THE Auth_System SHALL 返回"请勿频繁登录"错误(防抖机制)
7. IF 微信API调用失败, THEN THE Auth_System SHALL 返回明确的错误信息
8. WHEN 用户提供推荐人ID(pid), THE Auth_System SHALL 记录推荐关系
### Requirement 2: 手机号验证码登录
**User Story:** As a 用户, I want to 通过手机号和验证码登录, so that 我可以在没有微信的情况下也能登录系统
#### Acceptance Criteria
1. WHEN 用户提交手机号和验证码登录, THE Auth_System SHALL 从Redis获取并验证验证码是否正确
2. WHEN 验证码验证通过后, THE Auth_System SHALL 删除Redis中的验证码
3. WHEN 手机号用户不存在时, THE Auth_System SHALL 自动创建新用户并生成默认头像和昵称
4. WHEN 登录成功后, THE Auth_System SHALL 生成JWT Token并返回
5. IF 验证码错误或过期, THEN THE Auth_System SHALL 返回"验证码错误"
6. WHEN 用户在3秒内重复请求登录, THE Auth_System SHALL 返回"请勿频繁登录"错误
7. WHEN 用户提供推荐人ID(pid), THE Auth_System SHALL 记录推荐关系
**注意:** 发送短信验证码接口暂不迁移继续使用PHP原有接口
### Requirement 3: JWT Token管理
**User Story:** As a 系统, I want to 使用JWT Token进行用户认证, so that 可以实现无状态的安全认证
#### Acceptance Criteria
1. WHEN 用户登录成功, THE Jwt_Service SHALL 生成包含用户ID的JWT Token
2. THE Jwt_Service SHALL 使用配置的密钥对Token进行签名
3. WHEN 请求携带Token访问受保护接口, THE Auth_System SHALL 验证Token的有效性
4. IF Token无效或过期, THEN THE Auth_System SHALL 返回状态码-1未登录
5. WHEN Token即将过期时, THE Jwt_Service SHALL 支持Token刷新功能
6. THE Auth_System SHALL 同时在数据库UserAccount表中存储account_token用于兼容旧系统
### Requirement 4: 用户信息管理
**User Story:** As a 用户, I want to 查看和修改我的个人信息, so that 我可以维护我的账户资料
#### Acceptance Criteria
1. WHEN 用户请求获取个人信息, THE User_Service SHALL 返回用户的完整信息包括余额、积分、VIP等级等
2. WHEN 用户更新昵称, THE User_Service SHALL 验证昵称不为空并保存
3. WHEN 用户上传新头像, THE User_Service SHALL 将Base64图片上传到腾讯云COS并更新头像URL
4. THE User_Service SHALL 对手机号进行脱敏处理显示为138****8000格式
5. WHEN 返回用户信息时, THE User_Service SHALL 计算并返回用户的VIP等级和相关权益
### Requirement 5: 手机号绑定
**User Story:** As a 用户, I want to 绑定我的手机号, so that 我可以使用手机号登录并接收重要通知
#### Acceptance Criteria
1. WHEN 用户请求绑定手机号, THE Auth_System SHALL 验证短信验证码
2. WHEN 手机号已被其他用户绑定, THE Auth_System SHALL 合并两个账户保留手机号用户迁移openid
3. WHEN 账户合并后, THE Auth_System SHALL 返回新的Token
4. WHEN 手机号未被绑定, THE Auth_System SHALL 直接更新当前用户的手机号
5. IF 验证码错误, THEN THE Auth_System SHALL 返回"验证码错误"
### Requirement 6: 登录记录
**User Story:** As a 系统管理员, I want to 记录用户的登录信息, so that 可以进行安全审计和用户行为分析
#### Acceptance Criteria
1. WHEN 用户登录成功, THE Auth_System SHALL 记录登录日志包括用户ID、设备类型、IP地址、登录时间
2. WHEN 记录登录时, THE IP_Location_Service SHALL 解析IP地址获取省份和城市信息
3. THE Auth_System SHALL 更新UserAccount表中的最后登录时间和IP信息
4. WHEN 用户调用recordLogin接口, THE Auth_System SHALL 返回用户的uid、昵称和头像
### Requirement 7: 账号注销
**User Story:** As a 用户, I want to 注销我的账号, so that 我可以删除我在系统中的所有数据
#### Acceptance Criteria
1. WHEN 用户请求注销账号, THE Auth_System SHALL 记录注销请求日志
2. THE Auth_System SHALL 返回注销成功的消息
3. WHEN type参数为0时表示注销账号type为1时表示取消注销
### Requirement 8: API接口文档更新
**User Story:** As a 开发者, I want to 在迁移完成后更新API接口文档, so that 可以追踪迁移进度和新接口地址
#### Acceptance Criteria
1. WHEN 每个接口迁移完成后, THE 开发者 SHALL 在docs/API接口文档.md中标记该接口为"已迁移"
2. THE 文档 SHALL 记录新接口的完整地址
3. THE 文档 SHALL 保留原接口信息以便对比