Files
junhong_cmp_fiber/docs/7月迭代/独立方案/历史方案/前端共性方案-历史稿.md
2026-07-17 16:39:41 +08:00

15 KiB
Raw Blame History

7月迭代前端技术方案

历史状态:共性前端来源稿;本地审批交互已废弃,最终以前端标准章节和各独立方案为准。 当前方案:标准评审稿。 适用端后台管理端、代理端、C 端 H5/公众号 最后更新2026-07-14 说明:当前仓库不包含前端源码,本文定义页面、交互和接口契约;实际目录、状态库和组件名称由前端仓库现状映射,禁止据此凭空更换前端技术栈。


一、目标与边界

本方案解决七月迭代中跨需求的前端共性问题:

  • 审批任务、退款和充值使用同一套动态审批展示。
  • Excel 导入、批量订购和导出使用统一的异步任务交互。
  • 站内消息统一未读数、列表、已读和业务跳转。
  • 配置类页面不让用户直接编辑 JSON 或依赖前端自行校验业务规则。
  • 金额、状态、时间、权限和错误展示使用统一口径。

本文不指定 Vue、React、Pinia、Redux 或具体 UI 组件库。实现时必须优先复用前端仓库现有的请求封装、权限指令、上传组件、表格和轮询 Hook。


二、系统上下文

flowchart LR
    AdminUser[平台/代理后台用户] --> AdminWeb[后台管理前端]
    Customer[C端客户] --> ClientWeb[C端 H5/公众号]
    AdminWeb -->|/api/admin/*| API[Junhong API]
    ClientWeb -->|/api/c/v1/*| API
    API --> DB[(PostgreSQL)]
    API --> Redis[(Redis)]
    API --> Queue[Asynq]
    Queue --> Worker[Worker]
    Worker --> APIData[业务数据/对象存储/Gateway]
    AdminWeb -->|轮询未读数、任务状态| API

前端只根据 API 返回的权限、状态和可操作项渲染,不自行推导“谁能审批”“是否允许扣款”或“当前流程下一步是谁”。


三、模块边界

建议在现有前端目录结构中映射以下模块,不要求创建新的全局架构:

模块 负责内容 不负责内容
Approval 待办列表、流程详情、流程定义配置、审批动作 退款或充值的业务表单
Notification 未读数、通知列表、标记已读、业务跳转 审批状态计算
AsyncTask 导入、批量订购、导出的轮询与结果展示 各业务文件解析
Refund 退款申请、编辑、重新提交、业务处理状态 动态审批节点渲染的内部规则
Recharge 代理在线充值、员工线下代充值、重新提交 钱包入账和审批人判断
SystemConfig 配置表单和版本刷新 直接编辑任意 JSON

全局状态只保留跨页面共享的数据:登录用户、菜单/按钮权限、通知未读数。列表数据、详情数据和表单草稿默认留在页面或模块级状态,避免把服务端状态复制到全局 Store 后长期失真。


四、接口与类型约定

4.1 路径前缀

  • 后台管理:/api/admin/*
  • C 端:/api/c/v1/*
  • 回调接口不由前端调用。

专项文档出现省略 /api 的路径时,以本节和真实路由注册为准,并应在评审前修正。

4.2 枚举和显示

  • 生命周期状态使用后端返回的 status 做逻辑判断,使用 status_name 做中文展示。
  • 前端不得维护另一份与后端重复的中文状态映射;只有颜色、图标等纯展示映射可以留在前端。
  • 金额 API 统一使用“分”,输入组件展示“元”,提交前做整数转换,禁止浮点数直接乘除后提交。
  • 时间统一使用后端 ISO 8601 值,展示层按现有项目时区和格式化工具处理。

4.3 请求幂等

审批等敏感写操作由前端生成 request_id。一次用户操作从首次提交到网络重试必须复用同一个值;用户明确重新发起操作时才生成新值。

按钮提交后进入 loading 并禁止重复点击。前端防重只是体验控制,后端仍必须执行状态条件更新和唯一约束。


五、统一异步任务交互

适用:设备批量分配、批量订购、导出任务。

不适用于临期状态:临期列表、详情和首页数量由接口实时 SQL 计算;每日任务只生成 15/7/3 天通知,前端不轮询或维护临期快照。

stateDiagram-v2
    [*] --> Editing: 填写参数/选择文件
    Editing --> Submitting: 提交
    Submitting --> Processing: 创建任务成功
    Submitting --> Editing: 参数或上传失败
    Processing --> Processing: 轮询进度
    Processing --> Completed: 全部或部分完成
    Processing --> Failed: 任务失败
    Processing --> Cancelled: 用户取消且后端确认
    Completed --> [*]
    Failed --> Editing: 修正后重新提交
    Cancelled --> [*]

5.1 轮询规则

  • 创建成功后立即请求一次详情,再按 2 秒、3 秒、5 秒逐步退避,最大间隔 10 秒。
  • 页面不可见时暂停轮询,恢复可见时立即刷新。
  • 达到终态、离开页面或组件销毁时停止轮询。
  • 连续网络失败不把业务任务标记为失败,展示“状态获取失败,点击重试”。
  • 服务端返回 retry_after_seconds 时优先采用服务端建议。

5.2 结果展示

  • 必须同时展示总数、成功数、失败数和任务状态。
  • 部分成功不能只弹一个成功 Toast失败明细要留在页面并支持下载或复制具体能力按专项方案。
  • 导出任务完成后展示下载按钮和链接过期时间;链接过期时重新获取任务详情,不重新创建导出任务。

5.3 Excel 模板

  • 设备批量分配、批量订购等 Excel 模板由前端作为静态资源维护,后端不提供模板下载 API。
  • 模板文件名包含版本号,下载入口与对应上传表单放在同一页面。
  • 后端仍必须严格校验表头和内容,不能因为模板由前端提供就信任文件结构。
  • 模板字段变更需要前后端同批发布,并保留对用户本地旧模板的可理解错误提示。

六、统一审批交互

stateDiagram-v2
    [*] --> Loading
    Loading --> ReadOnly: 当前用户无待处理资格
    Loading --> Actionable: 当前用户是待处理审批人
    Actionable --> EditingAction: 打开通过/驳回/退回弹框
    EditingAction --> Uploading: 上传附件
    Uploading --> EditingAction: 上传成功或失败后返回
    EditingAction --> Submitting: 意见和附件校验通过
    Submitting --> EditingAction: 请求失败且任务仍可操作
    Submitting --> ReadOnly: 操作成功或状态已被他人改变
    ReadOnly --> [*]

6.1 页面建议

页面 建议路由 主要能力
待我审批 /approvals/tasks 状态、业务类型、提交人、当前节点、提交时间筛选
审批详情 /approvals/instances/:instance_id 业务快照、业务资料、动态节点时间线、审批人和意见、当前可操作按钮
流程定义 /settings/approval-flows 草稿、发布版本、停用、业务绑定
流程定义编辑 /settings/approval-flows/:id 串行节点配置、角色/账号选择、或签/会签、发布前校验

第一版只支持串行节点,前端使用“有序节点列表编辑器”,不建设拖拽 DAG/BPMN 设计器。节点可上移、下移、增加和删除;开始、结束节点由系统生成且不可删除。

6.2 动态详情

审批详情按接口返回的 tasks[]assignees[] 渲染,禁止写死“部门领导”和“财务”两个字段。

详情首屏必须先渲染 business_snapshot:业务标题、业务单号、提交人、审批关键字段和业务资料。业务资料来自发起时快照,审批附件来自某位审批人的操作记录,页面用两个区域展示;审批人不需要跳转到实时业务页才能知道正在审批什么。

操作按钮显示条件同时满足:

  • 流程状态为审批中。
  • 当前任务状态为待审批。
  • 当前账号对应的审批人状态为待处理。
  • 接口返回相应操作权限。

操作成功后重新请求审批实例和关联业务详情,不做乐观状态推进。

审批详情可返回 action_form.fields。前端只渲染后端声明的受控字段类型;退款金额和操作密码均由流程节点配置决定,且只有当前动作会完成该节点时才出现。金额展示元、提交分;操作密码不写入全局 Store、本地存储或重试缓存请求结束立即清空。节点没有动作字段时不显示额外表单禁止根据“财务审核”等节点名称自行添加输入项。

每个通过、驳回、退回弹框统一包含“审批意见”和“附件”:

  • 通过意见可选;驳回、退回意见必填,最多 1000 字。
  • 意见使用普通多行文本框,不提供富文本编辑器。
  • 附件最多 5 个、单个默认不超过 20MB允许图片、PDF、Word、Excel打开动作弹框时先生成 request_id,申请 purpose=approval_attachment 且绑定该 request_id 的上传凭证,上传完成后提交 file_key + file_name。前端校验只用于体验,最终以后端对象元数据和上传归属校验为准。
  • 文件仍在上传时禁止提交审批;删除尚未提交的附件只影响本地表单,不调用删除历史审批附件。
  • 网络重试复用原 request_id、意见和附件集合;操作成功后清空本地表单。
  • 时间线按审批人展示各自意见和附件。审批附件和业务资料分别通过审批实例权限校验接口换取短期 URL不直接拼对象存储地址。

6.3 业务处理中的展示

审批通过与退款到账、钱包入账不是同一时刻。退款和充值详情必须同时展示:

  • 审批状态。
  • 业务处理状态。
  • 业务处理失败原因和“系统重试中/联系管理员”的提示;非代理钱包退款审批通过后显示“待人工退款”,仅财务确认权限可见确认完成入口。

不能仅根据业务单原状态显示“待审批”。

6.4 存量历史记录

业务详情接口增加 approval_source

  • none:当前业务不需要审批,例如代理在线充值;隐藏审批区域。
  • workflow:存在通用审批实例,展示动态时间线和 available_actions
  • legacy:发布前已经结束的历史记录,没有完整流程实例;只读展示原业务状态、旧审批摘要和审计信息,不生成虚假节点。

如果一条仍需审批的退款或员工线下充值返回 approval_instance_id=null,前端按数据迁移异常展示并禁止任何审批操作,不能退回旧业务单审批接口。


七、页面与需求映射

需求 页面/入口 关键交互
01 后台 资产详情复机操作 界面不变,展示后端真实结果
02 后台 + C端 卡/设备列表实名策略C端流程页 单条/批量设置C端按接口策略跳转
03/07/11/12/13 后台 原有列表和详情 新筛选、新字段、动态审批摘要
05 后台 套餐分配弹框、已分配列表 生效条件覆盖和修改提示
08 后台 设备管理批量操作 “批量分配代理”和“批量分配套餐系列”两个入口,上传、任务轮询、失败明细
09 后台 + C端 系统配置;支付页 后台配置支付方式C端隐藏并由后端兜底拦截
10 后台 卡/设备资产详情 手动设置或取消当前卡限速,单位 kbps,不提供套餐限速配置
14 后台 各业务列表导出 字段选择、权限过滤、统一导出任务
15 C端 + 后台 当前套餐卡片、后台代购 当前套餐旁“续费”复用购买流程;下架套餐仅在合法续费入口展示
16 - 已移出 7 月迭代 不建设分销码、代理申请、提现材料和相关审批页面
17 后台/代理端 代理信用、钱包详情 元/分转换、欠款状态、额度权限
18/20/21 后台 待办、退款、充值详情 动态审批时间线、处理状态、退回重提
19 后台 批量订购 参数确认、上传、逐行结果和金额汇总
22 后台 + 代理端 + C端 临期列表、首页提醒 15/7/3 天分级、续费跳转、到期后自动消失

八、站内消息

  • 登录后和进入后台布局时立即获取未读数,之后每 30 秒轮询。
  • 页面不可见时暂停,恢复时立即刷新。
  • 铃铛数字超过 99 显示 99+
  • 通知点击只按受控的 ref_type + ref_id 路由表跳转,不接受后端返回任意 URL。
  • 标记已读失败不阻止查看业务详情,但需要在下次轮询时恢复真实未读状态。
  • 通知正文按纯文本展示;若未来支持富文本,必须使用受控模板和统一净化,不直接渲染任意 HTML。

九、权限与敏感数据

  • 菜单和按钮根据登录返回的权限控制可见性,但后端权限校验是最终依据。
  • 审批人资格由任务接口返回,前端不根据角色名称推导。
  • 导出字段由后端返回允许字段集合;前端只能在允许集合中选择。
  • 退款凭证、充值凭证、身份证、营业执照和审批附件使用现有对象存储上传流程,不提交本地路径或长期公开 URL。审批附件额外提交清理后的原文件名作为展示快照。
  • 列表和详情对无权限与不存在统一展示,避免通过前端文案泄露资源存在性。

十、停机发布

  1. 发布前进入维护模式,前端统一展示维护页并停止提交写请求。
  2. 维护窗口内执行数据库迁移,同时发布 API、Worker/Relay 和前端静态资源。
  3. 初始化并启用退款、充值流程定义和业务绑定,执行存量待审批单回填。
  4. 前端只调用任务级审批 API不保留退款或线下充值的业务单级通过/驳回按钮,也不保留线下充值“确认入账”按钮。
  5. 人工验证登录、菜单权限、流程发起、存量历史展示、待办、审批详情、退回重提和业务处理状态。
  6. 验证通过后解除维护模式;失败则在开放访问前回滚整套应用版本。

前端必须容忍新增响应字段且不依赖字段顺序,但本次不要求支持旧后端与新前端或新后端与旧前端交叉运行。


十一、待前端仓库确认

以下内容不影响当前接口和交互评审,但实施前必须在前端仓库确认:

  • 后台、代理端和 C 端分别使用的框架版本与目录结构。
  • 现有权限指令、请求封装、上传组件和导出 Hook 的真实名称。
  • 是否已有通用任务轮询组件和流程时间线组件。
  • 实际菜单路由和按钮权限编码。
  • 表格是否支持服务端返回的动态导出字段配置。

确认后只补充实现映射,不改变本文已经评审通过的业务状态和 API 契约。