# 全菜单与弹窗真实后端审计 ## 审计范围 本次范围扩大到客户端、运营端所有已挂路由页面,以及页面中的新增、编辑、删除、提交、导入、上传、详情、预览等主要弹窗/动作。 审计依据: - `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,确认清库后不会显示假数据。