feat: complete login and user management flow
This commit is contained in:
@@ -835,7 +835,7 @@
|
||||
2. NestJS 后端实现 Prisma schema、migration、Service、Controller、DTO、单元测试。
|
||||
3. Go Gateway 实现配置、连接管理、CMPP submit/deliver/active test、回执事件发布、单元测试。
|
||||
4. 前端将对应 mock 数据替换为 API 调用,保留现有视觉样式。
|
||||
5. 原型阶段的 mock、localStorage 或静态数据只能作为开发临时兜底,不得作为真实开发完成标准;审核、通道、连接、日志、黑名单、敏感词、报备字段、用户、账务等闭环必须接入真实 API、数据库或 Gateway 回写。
|
||||
5. 原型阶段的 mock、localStorage 或静态数据只能用于早期界面占位;进入系统功能验收后不得继续作为兜底通过路径。审核、通道、连接、日志、黑名单、敏感词、报备字段、用户、账务等闭环必须接入真实 API、数据库或 Gateway 回写;API 不可用时应展示错误态或空态,并将用例标记为阻塞或未通过。
|
||||
6. 补充错误处理、权限校验、操作日志。
|
||||
7. 运行构建和相关测试,并更新测试进度文档。
|
||||
```
|
||||
@@ -1158,10 +1158,40 @@
|
||||
- 不从零手写整个 CMPP 协议栈,也不直接照搬完整开源网关;协议层可复用,服务层按本项目自研。
|
||||
- NestJS 负责业务审核、风控、计费、报备、路由和发送编排。
|
||||
- Go Gateway 只负责 CMPP 连接、协议提交、submit resp、回执、上行事件回传。
|
||||
- 当前项目已进入真实开发阶段;前端 mock、localStorage 或静态数据只能临时兜底,不能作为功能完成标准。涉及审核、通道、连接、日志、安全控制、用户、账务等闭环时,必须接入真实 API、数据库或 Gateway 回写,并补测试。
|
||||
- 当前项目已进入真实开发阶段;前端 mock、localStorage 或静态数据不得作为功能完成标准,也不得作为验收兜底通过路径。涉及审核、通道、连接、日志、安全控制、用户、账务等闭环时,必须接入真实 API、数据库或 Gateway 回写,并补真实后端 smoke 或 E2E 测试。
|
||||
|
||||
请从 docs/first-version-development-requirements.md 的“阶段 0:技术 Spike”开始执行。
|
||||
|
||||
## 追加需求:登录与用户管理闭环
|
||||
|
||||
### 1. 登录入口
|
||||
|
||||
- 客户端和运营端必须使用独立登录页面:客户端 `/client/login`,运营端 `/admin/login`。
|
||||
- 两端登录均输入邮箱或手机号、密码和图形验证码。
|
||||
- 登录接口必须调用真实 NestJS API,不允许前端静态用户、localStorage mock 或纯前端验证码作为验收依据。
|
||||
- 运营端登录仅允许平台管理员;客户端登录仅允许已关联企业的企业管理员。
|
||||
|
||||
### 2. 用户类型和企业关联
|
||||
|
||||
- 运营端用户管理支持创建两类用户:平台管理员、企业管理员。
|
||||
- 平台管理员不得关联企业,只能登录运营端。
|
||||
- 企业管理员必须关联一个企业,只能登录客户端。
|
||||
- 企业管理员登录客户端后,所有客户端 API 必须继承当前企业租户范围,用户、Dashboard、账务、日志等数据不得越权访问其他企业。
|
||||
|
||||
### 3. 用户管理功能
|
||||
|
||||
- 运营端和客户端用户管理均需接入真实 API,支持添加、编辑、启用/禁用、删除、修改密码。
|
||||
- 启用/禁用、删除必须弹窗确认。
|
||||
- 删除采用软删除,历史系统日志、审核记录和业务记录仍可追溯;删除后用户不可登录且列表默认不展示。
|
||||
- 客户端用户字段必须包含邮箱和手机号,并支持邮箱或手机号登录。
|
||||
- 所有创建、编辑、启用、禁用、删除、修改密码动作必须写系统日志。
|
||||
|
||||
### 4. fail2ban
|
||||
|
||||
- 用户连续登录失败 5 次后,账号锁定 24 小时。
|
||||
- 锁定状态必须写入后端持久化字段,后续登录直接拒绝。
|
||||
- 登录成功后清空失败次数和锁定状态。
|
||||
|
||||
第一步请先不要大规模写业务代码,先输出并创建阶段 0 Spike 的最小工程计划,包括:
|
||||
1. 目录结构建议。
|
||||
2. NestJS 与 Go Gateway 的队列消息格式。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## 1. 用例说明
|
||||
|
||||
本文档补充第一版系统功能测试用例,面向验收测试、人工回归测试和后续 E2E 自动化改造。用例不依赖真实运营商 CMPP 网关;Gateway 场景使用项目模拟器、队列契约或测试替身。
|
||||
本文档补充第一版系统功能测试用例,面向验收测试、人工回归测试和后续 E2E 自动化改造。系统功能用例必须依赖真实 NestJS API、Prisma/PostgreSQL、Redis/BullMQ、MinIO 或对应本地服务完成闭环;用例不依赖真实运营商 CMPP 网关,Gateway 场景使用 Go Gateway、本地 SMSC 模拟器、队列契约和连接状态回写 API 验证。
|
||||
|
||||
优先级定义:
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
### TC-CLIENT-003 签名创建、材料上传与提交审核
|
||||
|
||||
- 优先级:P0
|
||||
- 前置条件:MinIO 不可用时使用文件服务 mock 或跳过真实上传。
|
||||
- 前置条件:MinIO 或等价对象存储测试服务可用;如不可用,本用例标记为阻塞或未执行,不得用文件服务 mock 作为验收通过依据。
|
||||
- 步骤:
|
||||
1. 创建短信签名,填写名称、用途、引流信息。
|
||||
2. 上传或登记签名证明材料。
|
||||
@@ -2360,7 +2360,7 @@ npm run test:gateway
|
||||
npm run verify:phase8
|
||||
```
|
||||
|
||||
若测试环境具备 PostgreSQL、Redis、MinIO,再补充执行 E2E smoke 和真实 API HTTP 测试。
|
||||
测试环境必须具备 PostgreSQL、Redis、MinIO 或等价本地服务后,才能将 E2E smoke 和真实 API HTTP 测试记为系统功能通过;缺失时对应用例标记为阻塞或未执行。
|
||||
|
||||
## 17. 新增和更新用例细化执行清单
|
||||
|
||||
@@ -2370,7 +2370,7 @@ npm run verify:phase8
|
||||
|
||||
| 断言类型 | 检查点 |
|
||||
| --- | --- |
|
||||
| 数据来源 | 页面列表、详情、统计卡片、弹窗和下拉选项均必须来自真实 API 响应;网络失败时可有兜底展示,但兜底不能计入通过。 |
|
||||
| 数据来源 | 页面列表、详情、统计卡片、弹窗和下拉选项均必须来自真实 API 响应;网络失败时可以展示错误态或空态,但静态兜底数据不能计入通过。 |
|
||||
| 租户隔离 | 客户端接口必须以当前租户为边界;通过 URL、查询参数或资源 id 访问其他租户数据时,应返回无权限、无数据或明确错误。 |
|
||||
| 状态联动 | 客户、应用、签名、模板、引流信息、通道、连接状态变化后,立即发送、定时到点、导入确认发送都必须重新校验。 |
|
||||
| 日志证据 | 创建、编辑、删除、启停、复制、审核、导入、导出、充值、冲正、发送阻断、连接状态变化、失败动作都必须写系统日志。 |
|
||||
@@ -2421,7 +2421,7 @@ npm run verify:phase8
|
||||
| TC-BILLING-006 | 运营端人工充值金额和短信条数,客户端查看 Dashboard 和账单流水。 | RechargeOrder 状态为 paid/manual_topup;TenantAccount 同步增加;AccountTransaction 类型 recharge;运营日志和客户端流水均可追溯。 |
|
||||
| TC-BILLING-007 | 分别只填金额、只填短信条数。 | 未填项按 0;金额和条数字段方向正确;不会产生 null、NaN 或负数脏数据。 |
|
||||
| TC-BILLING-008 | 对已充值记录执行撤销/冲正,分别覆盖未消费和已部分消费。 | 未消费可全额回退;已消费按规则拒绝或生成人工调整;原订单状态和反向流水清晰;日志记录原因。 |
|
||||
| TC-BILLING-009 | 无权限用户、审核员、管理员、大额审批分别执行充值。 | 权限不足被拒绝并写失败日志;大额充值 pending 时不更新余额;审批通过才入账,驳回不入账。 |
|
||||
| TC-BILLING-009 | 无权限用户、审核员、管理员分别执行充值;大额人工充值不走审批。 | 权限不足被拒绝并写失败日志;有权限用户确认后立即入账;不产生 pending 审批态;充值订单、账户余额、流水和日志同步完成。 |
|
||||
| TC-BILLING-010 | 余额不足发送失败,人工充值后重试发送并模拟 delivered。 | 充值前不扣费;充值后发送成功;冻结、扣费、短信计费记录完整;reconciliation diff 为 0。 |
|
||||
|
||||
### 17.6 系统日志细化
|
||||
@@ -2482,3 +2482,20 @@ npm run verify:phase8
|
||||
| Go Gateway | 连接状态回写契约、登录成功/失败、心跳超时、断线重连、窗口占满、连接数调整。 |
|
||||
| 前端 Smoke | 客户端头像菜单、系统日志分页、运营模板审核搜索、企业认证详情、通道复制/链接日志、安全控制 CRUD、Dashboard 指标跳转。 |
|
||||
| 性能 Smoke | BullMQ 500 TPS、CMPP 连接数变化后的提交能力、慢响应积压恢复。 |
|
||||
|
||||
### 17.9 登录和用户管理闭环
|
||||
|
||||
| 用例编号 | 操作 | 预期结果 |
|
||||
| --- | --- | --- |
|
||||
| TC-AUTH-001 | 打开 `/admin/login`,输入平台管理员邮箱或手机号、密码和正确图形验证码。 | 登录成功进入运营端;session 用户角色为 `platform_admin`;后续运营端 API 使用真实后端。 |
|
||||
| TC-AUTH-002 | 使用企业管理员账号登录 `/admin/login`。 | 登录失败;返回“仅平台管理员可登录运营端”类错误;失败次数累计。 |
|
||||
| TC-AUTH-003 | 打开 `/client/login`,输入已关联企业的企业管理员邮箱或手机号、密码和正确图形验证码。 | 登录成功进入客户端;客户端 API 自动携带当前企业 `tenantId`;Dashboard、用户、日志等仅展示当前企业数据。 |
|
||||
| TC-AUTH-004 | 使用平台管理员或未关联企业的用户登录 `/client/login`。 | 登录失败;不进入客户端。 |
|
||||
| TC-AUTH-005 | 同一用户连续输错密码 5 次。 | 第 5 次后用户锁定 24 小时;锁定期内正确密码也被拒绝;系统记录失败次数和锁定时间。 |
|
||||
| TC-AUTH-006 | 输入错误或过期图形验证码登录。 | 返回 400 可读错误;必须刷新验证码后重试。 |
|
||||
| TC-USER-ADMIN-001 | 运营端新增平台管理员,填写邮箱或手机号、初始密码。 | 创建成功;用户无 `tenantId`;可登录运营端;写 `user.created` 日志。 |
|
||||
| TC-USER-ADMIN-002 | 运营端新增企业管理员但不选择企业。 | 返回 400;不创建用户。 |
|
||||
| TC-USER-ADMIN-003 | 运营端新增企业管理员并选择企业。 | 创建成功;用户关联企业;可登录客户端;客户端数据按该企业隔离。 |
|
||||
| TC-USER-ADMIN-004 | 运营端编辑用户、启用/禁用、删除、修改密码。 | 编辑和改密调用真实 API;启停/删除有确认弹窗;删除后列表不展示且不可登录;均写系统日志。 |
|
||||
| TC-USER-CLIENT-001 | 企业管理员在客户端用户管理新增同企业用户。 | 创建成功;用户自动归属当前企业;不可创建平台管理员;写系统日志。 |
|
||||
| TC-USER-CLIENT-002 | 客户端编辑、启用/禁用、删除、修改密码。 | 调用真实 `/api/client/users` API;仅影响当前企业用户;启停/删除有确认弹窗。 |
|
||||
|
||||
@@ -325,3 +325,32 @@ GET /api/admin/system-logs?page=1&pageSize=2
|
||||
### 剩余说明
|
||||
|
||||
- 根 `npm run dev` 为稳定预览模式,不提供 Vite HMR;保留原因是 Vite 8/Rolldown dev transform 在当前 Windows + 中文路径工作区下会阻塞模块请求并造成白屏。开发时如需热更新,可另行评估降级 Vite 或迁移工作区路径后恢复原生 dev server。
|
||||
|
||||
## 2026-07-02 登录与用户管理闭环补充
|
||||
|
||||
### 本轮修复范围
|
||||
|
||||
- 新增用户登录字段和 fail2ban 持久化字段:`email`、`phone`、`failedLoginCount`、`lockedUntil`、`lastLoginAt`、`deletedAt`。
|
||||
- 登录入口拆分为 `/client/login` 和 `/admin/login`,两端均调用真实验证码和登录 API。
|
||||
- 运营端登录仅允许 `platform_admin`;客户端登录仅允许已关联企业的 `enterprise_admin`。
|
||||
- 运营端用户管理接入真实 `/api/admin/users`,支持平台管理员和企业管理员的新增、编辑、启用/禁用、删除、改密;企业管理员必须关联企业。
|
||||
- 客户端用户管理接入真实 `/api/client/users`,所有操作继承当前登录企业 `tenantId`。
|
||||
- 启用/禁用、删除均通过确认弹窗执行;用户删除采用软删除,不破坏历史日志和业务记录。
|
||||
- 连续 5 次登录失败后锁定 24 小时;登录成功清空失败次数和锁定状态。
|
||||
|
||||
### 已执行测试
|
||||
|
||||
```bash
|
||||
npm --prefix api test -- users.service.spec.ts auth.service.spec.ts
|
||||
npm --prefix api run prisma:generate
|
||||
npm --prefix api run build
|
||||
npm run build
|
||||
```
|
||||
|
||||
### 当前结果
|
||||
|
||||
- `users.service.spec.ts`、`auth.service.spec.ts`:通过,覆盖用户类型约束、企业关联约束、操作日志、端登录隔离和失败次数累计。
|
||||
- API build:通过。
|
||||
- 前端 build:通过,仍有既有大 chunk warning。
|
||||
- `tools/smoke/real-env-smoke.mjs` 已同步企业管理员邮箱/手机号、角色 seed、验证码登录和 CMPP 端口 `17890`。
|
||||
- 真实数据库迁移、浏览器端登录 smoke 需要在生产验证环境执行 `prisma migrate deploy` 后补充记录。
|
||||
|
||||
Reference in New Issue
Block a user