fix: harden real backend admin workflows and ui

This commit is contained in:
hectorzhao
2026-07-03 19:29:56 +08:00
parent dd09d91c1e
commit 8cca361441
71 changed files with 5111 additions and 4439 deletions
+405
View File
@@ -0,0 +1,405 @@
# 全菜单与弹窗真实后端审计
## 审计范围
本次范围扩大到客户端、运营端所有已挂路由页面,以及页面中的新增、编辑、删除、提交、导入、上传、详情、预览等主要弹窗/动作。
审计依据:
- `src/routes/AppRoutes.tsx`
- `src/apps/admin/*.tsx`
- `src/apps/client/*.tsx`
- `src/api/adminApi.ts`
- `docs/first-version-development-requirements.md`
- `docs/testing-plan.md`
- `docs/admin-prototype-recovery-scope.md`
审计口径:
1. 第一版短信功能必须走真实 NestJS API + Prisma/PostgreSQL。
2. mock/localStorage/static 数组不能作为系统功能验收通过依据。
3. API 失败只能展示错误态或空态,不能静默回退假数据。
4. 彩信能力当前是待开发边界,但如果菜单仍可进入,需要明确标记或从第一版验收菜单中移除。
## P0:短信第一版必须修复
### 客户端短信应用列表仍是静态数据
文件:`src/apps/client/ClientApplicationsPage.tsx`
状态:已修复。
问题:
- 旧实现没有调用 `clientApi.listApplications()`
- 旧实现的 `applications` 是前端静态数组。
- 旧实现的“接口参数”弹窗展示假企业代码、账号、密码、网关 IP、端口、接入号、绑定 IP。
影响:
- 清空业务数据后页面仍会显示假应用。
- 客户端看到的 CMPP 对接参数不可信。
已完成修复:
- 页面接入真实 `GET /api/client/applications`
- 新增 `GET /api/client/applications/{id}/cmpp-params`,参数弹窗按当前租户读取真实参数。
- 服务层按 `tenantId` 校验应用归属,跨租户应用不可见。
- 空库时显示空态,不再渲染假应用。
### 客户端企业认证是纯前端状态机
文件:`src/apps/client/ClientEnterpriseAuthPage.tsx`
问题:
- 页面没有 API 调用。
- 企业信息、认证状态、提交时间、法人信息、二维码、人脸/打款认证结果全是前端状态。
- 点击提交只改本地 `status``step`
影响:
- 客户端提交企业认证后,运营端无法看到真实待审记录。
- 发送前认证校验依赖真实 `Tenant.certificationStatus`,该页面不会改变真实状态。
修复:
- 接入企业认证查询、提交、重新提交接口。
- 上传营业执照/材料必须走真实文件对象和对象存储。
- 提交后写 `EnterpriseCertification`,运营端审核后同步 `Tenant.certificationStatus`
### 客户端短信发送详情仍是静态表
文件:`src/apps/client/ClientSendDetailPage.tsx`
状态:已修复。
问题:
- `sendDetailRows` 是静态数组。
- 查询条件只过滤本地数组。
- 发送记录、回执状态、运营商、省份均不是数据库记录。
影响:
- 发送链路真实跑通后,客户端详情页看不到真实短信。
- 清空数据后仍会显示假记录。
修复:
- 已接入 `GET /api/client/operations/messages`
- 查询按当前租户隔离,支持应用、手机号、状态过滤。
- 页面展示真实 `SmsMessageRecord`、回执记录、通道运营商和发送地区;空库时显示空态。
### 客户端短信上行记录仍是静态表
文件:`src/apps/client/ClientUplinkMessagesPage.tsx`
状态:已修复。
问题:
- `uplinkMessages``matchedSendRecords` 是静态数组。
- “添加到应用黑名单”按钮没有 API 动作。
影响:
- Gateway/真实 API 写入的上行短信无法在客户端展示。
- 上行匹配下发记录的业务闭环不存在。
修复:
- 已接入 `GET /api/client/operations/uplink-messages`
- 详情弹窗按上行 `messageId` 查询 `GET /api/client/operations/messages`,展示真实匹配的下发记录。
- 原无 API 支撑的“添加到应用黑名单”按钮已移除,后续补真实企业黑名单或应用黑名单 API 后再恢复。
### 运营端短信上行记录仍是静态表
文件:`src/apps/admin/AdminSmsUplinkRecordsPage.tsx`
状态:已修复。
问题:
- `uplinkMessages``matchedRecord` 是静态数组。
- 查询、详情、匹配下发记录均在前端完成。
- “添加到应用黑名单”按钮没有 API 动作。
影响:
- 运营端看不到真实上行记录。
- 上行匹配和人工处理无法验收。
修复:
- 已接入 `GET /api/admin/operations/uplink-messages`,返回真实上行记录、企业和通道信息。
- 详情弹窗按上行 `messageId` 查询 `GET /api/admin/operations/messages`,展示真实匹配的下发记录。
- 原无 API 支撑的“添加到应用黑名单”按钮已移除,后续补真实企业黑名单或应用黑名单 API 后再恢复。
### 运营端短信任务进度仍是静态任务
文件:`src/apps/admin/AdminSmsTaskProgressPage.tsx`
状态:已修复。
问题:
- `taskData` 是静态数组。
- 运营商统计、城市统计、任务详情均来自前端。
- 终止任务只更新本地状态。
影响:
- 真实批量任务、发送进度、分运营商/地区统计无法验收。
修复:
- 已接入 `GET /api/admin/send/batch-tasks`,任务列表和详情均来自真实 `SmsBatchTask` 与关联短信记录。
- 详情弹窗使用真实短信记录聚合通道运营商与发送地区分布;当前数据库未持久化号码归属城市,因此不再展示静态城市分布。
- 已新增 `POST /api/admin/send/batch-tasks/{id}/terminate`,运营终止只取消未提交的 queued/scheduled/ready 消息,已提交部分继续等待回执。
### 运营端通道组表单没有真实保存
文件:`src/apps/admin/AdminChannelGroupFormPage.tsx`
状态:已修复。
问题:
- `channelOptions``defaultProvinceRoutes``defaultNationalRoutes` 是静态数据。
- 新增/编辑省网、全国通道只改本地 state。
- 底部“确认”只 `navigate('/admin/channel-groups')`,没有调用 API。
- 与当前重要规则冲突:省份通道选择、全国优先级唯一、通道组 item carrier、通道 sendRegion 校验都无法在该页面落库。
影响:
- 页面看似可配置通道组,但实际不会保存到真实通道组 item。
- 从 0 测试时无法通过该表单配置发送路由。
修复:
- 已接入真实通道列表和通道组列表,编辑时加载真实通道组 items。
- 已新增 `PUT /api/admin/channel-groups/{id}`,保存时事务更新通道组并重建省网/全国 items。
- 后端校验省份唯一、全国优先级唯一、通道不重复、item carrier 与通道组 carrier 一致、省网通道地区一致。
### 运营端企业管理专项缺口已阶段性关闭
文件:
- `docs/admin-prototype-recovery-scope.md`
- `src/apps/admin/AdminCustomerFormPage.tsx`
- `src/apps/admin/AdminEnterpriseApplicationsPage.tsx`
- `src/apps/admin/AdminSmsApplicationFormPage.tsx`
- `src/apps/admin/AdminEnterpriseSignaturesPage.tsx`
- `src/apps/admin/AdminEnterpriseTemplatesPage.tsx`
问题摘要:
- 企业表单曾从原型完整档案瘦身为租户三字段,阶段 4-1 已恢复真实档案保存。
- 企业删除不存在/过期 ID 曾返回 500,阶段 4-1 已修复为 404。
- 企业应用新增/编辑曾硬编码 `2763`,阶段 4-2 已改为真实企业选择和应用自身 `tenantId`
- 短信应用编辑接口曾待补,阶段 4-2 已补运营端 `GET/POST/PUT /api/admin/enterprise-applications` 和应用路由替换接口。
- 彩信应用当前明确标记待开发,不展示演示数组。
- 企业签名与引流信息曾只剩只读列表,阶段 4-3 已恢复短信签名新增/编辑/删除和引流信息维护,真实保存到 `SmsSignature.drainageInfo`
- 企业模板曾只剩只读列表,阶段 4-4 已恢复短信模板新增/编辑/删除和变量维护,真实保存到 `SmsTemplate``TemplateVariable`
- 彩信应用、彩信签名、彩信模板当前明确标记待开发,不展示演示数组。
修复:
- 企业管理、企业应用、企业签名与引流信息、企业模板已按 `docs/admin-prototype-recovery-scope.md` 阶段 4-1 至 4-4 修复。
- 后续继续按审计清单处理其他 P0/P1 页面。
### 运营端短信通道编辑接口待补
文件:`src/apps/admin/AdminChannelsPage.tsx`
状态:阶段 5 已修复。
问题:
- 创建、复制、启停、删除、链接日志已经接真实 API。
- 旧实现编辑通道时直接提示“短信通道编辑接口待补,当前不做本地模拟保存”。
影响:
- 旧实现中通道创建后无法真实编辑网关、账号、接入号、地区、运营商等关键配置。
修复:
- 已补 `PUT /api/admin/channels/:id`
- 编辑弹窗提交真实更新,密码留空时不覆盖原密码,填写时更新 `passwordCipher`
- 后端继续校验 `gatewayPort` 范围,并写 `sms_channel.update` 操作日志。
- 已补通道更新单元测试,并重新通过通道定向测试、API 全量测试、前后端构建。
## P1:真实接口已接入但能力不完整
### 客户端短信发送导入表格只是展示入口
文件:`src/apps/client/ClientSendPage.tsx`
状态:阶段 6 已修复 CSV/TSV/TXT 文本导入真实预览和确认发送;XLSX 二进制解析后续单列能力补齐。
问题:
- 手动输入号码可调用真实 `clientApi.createBatchTask()`
- 旧实现“导入表格”明确写着“当前原型仅展示上传入口”。
- 旧实现没有真实文件解析、预览、确认导入。
修复:
- 已接入真实 `POST /api/client/send/imports/preview``POST /api/client/send/imports/confirm`
- 客户端读取 CSV/TSV/TXT 文件文本后交由后端预览,后端校验手机号格式、重复号码、黑名单和模板变量列。
- 页面展示总行数、有效号码、错误行和前 5 条错误明细。
- 确认发送走真实导入确认接口,并复用批量任务创建链路。
- 当前后端接口是文本解析,XLSX 二进制解析未标记完成,后续如验收 XLSX 需补解析库和对应测试。
### 客户端签名材料只记录文件元数据
文件:`src/apps/client/ClientSignaturesPage.tsx`
状态:阶段 7 已修复。
问题:
- 签名创建、材料记录、提交审核调用真实 API。
- 旧实现文件本体没有真正上传到 MinIO/对象存储,只创建 `FileObject` 元数据。
修复:
- 已新增 `POST /api/admin/files/upload` multipart 上传接口。
- 服务端先把文件内容写入 MinIO 对象存储,再创建 `FileObject` 元数据。
- 客户端签名页上传材料时先调用真实上传接口,成功后再创建签名材料关联。
- 如果对象存储不可用,上传会失败并阻止材料元数据冒充成功。
### 客户端短信模板功能比原型瘦身
文件:`src/apps/client/ClientTemplatesPage.tsx`
状态:阶段 8 已修复。
问题:
- 列表、新增、提交审核调用真实 API。
- 旧实现缺少编辑模板、签名选择、变量推荐/自定义变量面板等原型交互。
- 旧实现删除实际是改状态为 `disabled`,页面文案需要匹配。
修复:
- 已恢复模板新增/编辑弹窗、推荐变量、自定义变量、变量示例值维护。
- 已补 `PUT /api/client/templates/{id}`,编辑时真实更新 `SmsTemplate` 并重建 `TemplateVariable`
- 模板可绑定签名,签名下拉按应用所属企业和签名绑定应用过滤。
- 删除仍按第一版现有语义写 `disabled`,页面保留删除入口并从列表过滤 disabled。
### 运营端报备回执导入不是真文件导入
文件:`src/apps/admin/AdminReportTasksPage.tsx`
状态:阶段 9 已修复 CSV/TSV/TXT 文本回执真实上传和解析。
问题:
- 报备任务列表和导入动作接了 API。
- 弹窗只输入 `fileName` 和备注,没有真实文件上传/解析。
- `statusAfter` 固定为 `partial`
已完成修复:
- 前端导入弹窗改为真实选择文件,先上传到 `/api/admin/files/upload`,再提交回执内容到报备导入接口。
- 后端解析 CSV/TSV/TXT 文本回执,按状态/结果列统计成功、失败行,并派生 `completed``partial``failed` 任务状态。
- 导入记录保存真实 `fileObjectId`、文件名、行数、成功数、失败数和行级解析结果。
- 未识别状态按失败处理,避免把未知运营商回执误判为报备通过。
### 系统配置与账号设置没有保存接口
状态:本轮已从第一版路由移除。
文件:
- `src/apps/admin/AdminSettingsPage.tsx`
- `src/apps/client/ClientSettingsPage.tsx`
问题:
- 运营端系统配置没有 API。
- 客户端账号设置明确写着“纯前端原型,不会提交到后端”。
已完成修复:
- 运营端系统配置、客户端账号设置当前无真实保存接口,且不属于第一版短信主链路验收入口。
- 已移除对应路由并删除纯前端页面文件,避免直达 URL 展示假功能。
## P2:彩信待开发边界,需要菜单策略
以下页面以彩信为主,当前大量使用静态数组、本地 state 或无 API。第一版若不验收彩信,建议从菜单隐藏或明确标记“待开发”,避免与短信真实功能混淆。
状态:本轮已将可点击彩信待开发路由统一指向占位页,不再进入静态 mock 演示页。
客户端:
- `src/apps/client/ClientMmsSignatureReportPage.tsx`
- `src/apps/client/ClientMmsTemplatesPage.tsx`
- `src/apps/client/ClientMmsSendPage.tsx`
- `src/apps/client/ClientMmsBatchTasksPage.tsx`
- `src/apps/client/ClientMmsSendDetailPage.tsx`
- `src/apps/client/ClientMmsUplinkMessagesPage.tsx`
运营端:
- `src/apps/admin/AdminMmsApplicationFormPage.tsx`
- `src/apps/admin/AdminMmsChannelsPage.tsx`
- `src/apps/admin/AdminMmsRecordsPage.tsx`
- `src/apps/admin/AdminMmsTaskProgressPage.tsx`
- `src/apps/admin/AdminSignatureAuditPage.tsx`
说明:
- `AdminSignatureAuditPage.tsx` 当前实际是“彩信模板审核”,使用 `initialMmsAudits`,通过/拒绝只改本地 state。
- 如果菜单名称仍显示为审核中心能力,需要调整命名或隐藏,避免被误认为短信签名审核真实闭环。
## 已基本接入真实 API 的页面
以下页面未发现明显静态业务主数据兜底,仍需后续做浏览器 smoke 和真实空库验证:
客户端:
- `ClientHome`
- `ClientBatchTasksPage`
- `ClientBillingPage`
- `ClientInvoicesPage`
- `ClientUsersPage`
- `ClientSystemLogsPage`
运营端:
- `AdminHome`
- `AdminMonitorPage`
- `AdminAnalyticsPage`
- `AdminRechargeRecordsPage`
- `AdminBillingPage`
- `AdminUsersPage`
- `AdminSystemLogsPage`
- `AdminSmsAuditPage`
- `AdminTemplateAuditPage`
- `AdminEnterpriseAuditPage`
- `AdminReportRecordsPage`
- `AdminChannelReportPage`
- `AdminSensitiveWordsPage`
- `AdminGlobalBlacklistPage`
- `AdminEnterpriseBlacklistPage`
- `AdminPhoneSegmentsPage`
- `AdminDrainageFieldsPage`
注意:
- “基本接入”不等于业务验收通过;仍要用真实空库和真实 API 操作验证按钮、弹窗和错误态。
- 搜索表达式会对 option 常量、纯 UI 状态产生少量误报,最终修复应以源码和真实页面操作为准。
## 建议修复顺序
1. 先修 P0 短信主链路展示页:客户端应用、发送详情、上行;运营端短信任务进度、短信上行。
2. 修通道组表单真实保存,因为它直接影响发送路由配置。
3. 按企业专项恢复企业管理、企业应用、签名引流、模板。
4. 补短信通道编辑接口。
5. 补 P1 的导入、材料上传、模板编辑、回执导入和设置保存。
6. 彩信页面统一隐藏、标记待开发或单独进入彩信开发计划。
7. 每完成一组,执行真实空库 smoke,确认清库后不会显示假数据。