Files
lislgosms/docs/all-menu-dialog-real-backend-audit.md

16 KiB

全菜单与弹窗真实后端审计

审计范围

本次范围扩大到客户端、运营端所有已挂路由页面,以及页面中的新增、编辑、删除、提交、导入、上传、详情、预览等主要弹窗/动作。

审计依据:

  • 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 调用。
  • 企业信息、认证状态、提交时间、法人信息、二维码、人脸/打款认证结果全是前端状态。
  • 点击提交只改本地 statusstep

影响:

  • 客户端提交企业认证后,运营端无法看到真实待审记录。
  • 发送前认证校验依赖真实 Tenant.certificationStatus,该页面不会改变真实状态。

修复:

  • 接入企业认证查询、提交、重新提交接口。
  • 上传营业执照/材料必须走真实文件对象和对象存储。
  • 提交后写 EnterpriseCertification,运营端审核后同步 Tenant.certificationStatus

客户端短信发送详情仍是静态表

文件:src/apps/client/ClientSendDetailPage.tsx

状态:已修复。

问题:

  • sendDetailRows 是静态数组。
  • 查询条件只过滤本地数组。
  • 发送记录、回执状态、运营商、省份均不是数据库记录。

影响:

  • 发送链路真实跑通后,客户端详情页看不到真实短信。
  • 清空数据后仍会显示假记录。

修复:

  • 已接入 GET /api/client/operations/messages
  • 查询按当前租户隔离,支持应用、手机号、状态过滤。
  • 页面展示真实 SmsMessageRecord、回执记录、通道运营商和发送地区;空库时显示空态。

客户端短信上行记录仍是静态表

文件:src/apps/client/ClientUplinkMessagesPage.tsx

状态:已修复。

问题:

  • uplinkMessagesmatchedSendRecords 是静态数组。
  • “添加到应用黑名单”按钮没有 API 动作。

影响:

  • Gateway/真实 API 写入的上行短信无法在客户端展示。
  • 上行匹配下发记录的业务闭环不存在。

修复:

  • 已接入 GET /api/client/operations/uplink-messages
  • 详情优先展示上行列表响应中已匹配的真实 messageRecord;仅对历史兼容数据在缺少内嵌记录且存在平台 messageId 时回查 GET /api/client/operations/messages
  • 页面分开展示供应商 MO 的上行网关消息 ID 与关联平台消息 ID,不再把缺少平台 messageId 误判为没有匹配记录。
  • 客户端保持只读,不提供越权的运营黑名单写操作。

运营端短信上行记录仍是静态表

文件:src/apps/admin/AdminSmsUplinkRecordsPage.tsx

状态:已修复。

问题:

  • uplinkMessagesmatchedRecord 是静态数组。
  • 查询、详情、匹配下发记录均在前端完成。
  • “添加到应用黑名单”按钮没有 API 动作。

影响:

  • 运营端看不到真实上行记录。
  • 上行匹配和人工处理无法验收。

修复:

  • 已接入 GET /api/admin/operations/uplink-messages,返回真实上行记录、企业和通道信息。
  • 详情优先展示上行列表响应中已匹配的真实 messageRecord;仅对历史兼容数据在缺少内嵌记录且存在平台 messageId 时回查 GET /api/admin/operations/messages
  • 页面分开展示供应商 MO 的上行网关消息 ID 与关联平台消息 ID,并显示匹配状态和原因。
  • 已匹配或人工认领到企业应用后,恢复“加入应用黑名单”按钮并调用真实 POST /api/admin/dictionaries/blacklists/enterprise;未匹配应用时不允许写入。

运营端短信任务进度仍是静态任务

文件: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

状态:已修复。

问题:

  • channelOptionsdefaultProvinceRoutesdefaultNationalRoutes 是静态数据。
  • 新增/编辑省网、全国通道只改本地 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 已恢复短信模板新增/编辑/删除和变量维护,真实保存到 SmsTemplateTemplateVariable
  • 彩信应用、彩信签名、彩信模板当前明确标记待开发,不展示演示数组。

修复:

  • 企业管理、企业应用、企业签名与引流信息、企业模板已按 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/previewPOST /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 文本回执,按状态/结果列统计成功、失败行,并派生 completedpartialfailed 任务状态。
  • 导入记录保存真实 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,确认清库后不会显示假数据。