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:
177
openspec/specs/shop-account-management/spec.md
Normal file
177
openspec/specs/shop-account-management/spec.md
Normal 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=3,shop_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
|
||||
|
||||
Reference in New Issue
Block a user