feat: 完成B端认证系统和商户管理模块测试补全

主要变更:
- 新增B端认证系统(后台+H5):登录、登出、Token刷新、密码修改
- 完善商户管理和商户账号管理功能
- 补全单元测试(ShopService: 72.5%, ShopAccountService: 79.8%)
- 新增集成测试(商户管理+商户账号管理)
- 归档OpenSpec提案(add-shop-account-management, implement-b-end-auth-system)
- 完善文档(使用指南、API文档、认证架构说明)

测试统计:
- 13个测试套件,37个测试用例,100%通过率
- 平均覆盖率76.2%,达标

OpenSpec验证:通过(strict模式)
This commit is contained in:
2026-01-15 18:15:17 +08:00
parent 7ccd3d146c
commit 18f35f3ef4
64 changed files with 11875 additions and 242 deletions

View File

@@ -0,0 +1,177 @@
# shop-account-management Specification
## Purpose
TBD - created by archiving change add-shop-account-management. Update Purpose after archive.
## Requirements
### Requirement: 代理商账号分页列表查询
系统 SHALL 提供代理商账号分页列表查询功能支持按店铺ID和账号名称过滤均为可选条件返回账号基本信息。
#### Scenario: 查询指定店铺的账号列表
- **WHEN** 用户传入店铺ID查询参数不传账号名称
- **THEN** 返回该店铺的所有账号user_type=3 且 shop_id=指定店铺ID
- **AND** 包含分页信息(总数、当前页、每页数量)
- **AND** 每条记录包含账号名称username、手机号、创建时间
#### Scenario: 按账号名称模糊查询
- **WHEN** 用户传入账号名称查询参数不传店铺ID
- **THEN** 返回账号名称包含该关键字的所有代理商账号user_type=3
- **AND** 使用 LIKE 模糊匹配
- **AND** 支持分页
#### Scenario: 组合条件查询
- **WHEN** 用户同时传入店铺ID和账号名称查询参数
- **THEN** 返回同时满足两个条件的账号
- **AND** 使用 AND 逻辑组合条件
- **AND** shop_id = 指定店铺ID AND username LIKE '%关键字%'
#### Scenario: 查询所有代理商账号(无过滤条件)
- **WHEN** 用户不传任何查询条件店铺ID和账号名称都为空
- **AND** 当前用户是平台管理员
- **THEN** 返回所有代理商账号user_type=3
- **AND** 支持分页
#### Scenario: 数据权限过滤
- **WHEN** 代理账号访问账号列表(无论是否传查询条件)
- **THEN** 通过 GORM Callback 自动过滤
- **AND** 只返回当前店铺及下级店铺的账号
- **AND** 在数据权限过滤的基础上,再应用用户传入的查询条件
#### Scenario: 空结果处理
- **WHEN** 查询条件无匹配结果
- **THEN** 返回空数组
- **AND** 总数为 0
- **AND** HTTP 状态码 200
### Requirement: 代理商账号新增
系统 SHALL 提供代理商账号新增功能,支持创建绑定到指定店铺的代理账号。
#### Scenario: 新增代理商账号
- **WHEN** 用户提交新增账号请求
- **AND** 提供账号名称、手机号、登录密码、关联店铺ID
- **THEN** 验证店铺存在且未删除
- **AND** 验证手机号唯一性(未被使用)
- **AND** 验证账号名称唯一性(未被使用)
- **AND** 密码使用 bcrypt 加密
- **AND** 创建账号user_type=3shop_id=指定店铺ID
- **AND** 状态默认为启用status=1
- **AND** 返回新创建的账号信息(不包含密码)
#### Scenario: 手机号已存在
- **WHEN** 用户提交的手机号已被使用
- **THEN** 返回错误码 2002手机号已存在
- **AND** HTTP 状态码 400
#### Scenario: 账号名称已存在
- **WHEN** 用户提交的账号名称已被使用
- **THEN** 返回错误码 2001用户名已存在
- **AND** HTTP 状态码 400
#### Scenario: 关联店铺不存在
- **WHEN** 用户提交的店铺ID不存在或已删除
- **THEN** 返回错误码 2103店铺不存在
- **AND** HTTP 状态码 404
### Requirement: 代理商账号编辑
系统 SHALL 提供代理商账号编辑功能,支持更新账号名称,但不允许修改密码和手机号。
#### Scenario: 更新账号名称
- **WHEN** 用户提交编辑账号请求(更新账号名称)
- **THEN** 验证账号存在且未删除
- **AND** 验证新账号名称唯一性(如果修改)
- **AND** 更新账号名称
- **AND** 更新 updater 字段为当前用户ID
- **AND** 返回更新后的账号信息
#### Scenario: 不允许修改手机号
- **WHEN** 编辑请求中包含手机号字段
- **THEN** 忽略该字段
- **AND** 不更新手机号
#### Scenario: 不允许修改密码
- **WHEN** 编辑请求中包含密码字段
- **THEN** 忽略该字段
- **AND** 不更新密码
- **AND** 密码修改需通过专用接口
#### Scenario: 编辑不存在的账号
- **WHEN** 用户尝试编辑不存在或已删除的账号
- **THEN** 返回错误码 2101账号不存在
- **AND** HTTP 状态码 404
### Requirement: 代理商账号密码修改
系统 SHALL 提供代理商账号密码修改功能,支持管理员重置密码,不需要验证旧密码。
#### Scenario: 管理员重置密码
- **WHEN** 管理员提交密码修改请求
- **AND** 提供新密码
- **THEN** 验证账号存在且未删除
- **AND** 验证新密码格式8-32位
- **AND** 使用 bcrypt 加密新密码
- **AND** 更新账号密码
- **AND** 更新 updater 字段为当前用户ID
- **AND** 返回成功响应
#### Scenario: 新密码格式验证
- **WHEN** 用户提交的新密码不符合要求长度不在8-32位
- **THEN** 返回参数验证错误
- **AND** HTTP 状态码 400
#### Scenario: 修改不存在账号的密码
- **WHEN** 用户尝试修改不存在或已删除账号的密码
- **THEN** 返回错误码 2101账号不存在
- **AND** HTTP 状态码 404
### Requirement: 代理商账号启用/禁用
系统 SHALL 提供代理商账号启用/禁用功能,支持快速切换账号状态。
#### Scenario: 启用账号
- **WHEN** 管理员提交启用账号请求
- **THEN** 验证账号存在且未删除
- **AND** 更新账号状态为 1启用
- **AND** 更新 updater 字段为当前用户ID
- **AND** 返回成功响应
#### Scenario: 禁用账号
- **WHEN** 管理员提交禁用账号请求
- **THEN** 验证账号存在且未删除
- **AND** 更新账号状态为 0禁用
- **AND** 更新 updater 字段为当前用户ID
- **AND** 返回成功响应
#### Scenario: 禁用后的账号无法登录
- **WHEN** 账号状态为禁用status=0
- **AND** 用户尝试使用该账号登录
- **THEN** 登录失败
- **AND** 返回账号已禁用错误
#### Scenario: 操作不存在的账号
- **WHEN** 用户尝试启用/禁用不存在或已删除的账号
- **THEN** 返回错误码 2101账号不存在
- **AND** HTTP 状态码 404