# 最新版本地审查:账号编辑布局与逻辑缺陷 本次按用户要求只审查本地代码、复现问题并提出方案,没有连接服务器,没有调用真实上游,没有修改业务代码,也没有部署。 核对本地发布源码包的 SHA-256 清单:3,940 个后端及前端源码文件完全一致。以下结论针对 `optional-controls-20260915` 发布源码,不代表重新检查了服务器运行状态。 结论:账号编辑的问题同时涉及布局、表单状态和保存方式,不能只靠增加弹窗宽度解决。优先修复旧配置回写与保存竞争,再调整信息分区。 ## 已复现的缺陷 ### R01 · P1:重新打开同一账号,普通保存仍可能回写旧流量策略 位置:[EditAccountModal.vue](frontend/src/components/account/EditAccountModal.vue#L4385)、同文件第 6126 行。 触发:先独立保存“严格 RPM 开启”,关闭弹窗;该账号随后被更新为关闭;重新打开同一账号,传入的账号数据已是关闭状态。普通保存仍将旧的 `savedTrafficPolicy` 合入请求,重新写成开启。 原因:缓存只在账号 ID 改变时清除,不随重新打开、较新的账号快照或实际配置更新而失效。它无条件覆盖普通表单的 extra。 本地复现:传入更新后的关闭配置,最终提交 `strict_rpm_enabled=true`。 方案:用账号版本和本次编辑会话管理草稿;成功独立保存后更新共同的数据源,不长期保留一个优先级高于新快照的覆盖对象。普通保存只提交真正修改的字段,可辅以版本冲突检测。 ### R02 · P1:独立保存与页脚保存可以同时执行 位置:[EditAccountModal.vue](frontend/src/components/account/EditAccountModal.vue#L3100)、[AccountTrafficControls.vue](frontend/src/components/account/AccountTrafficControls.vue#L75)。 触发:点击“保存流量控制”,请求尚未完成时再点页脚保存。父组件不知道子组件正在保存,会立即发出第二个更新请求,并允许关闭编辑。 本地复现:故意挂起流量保存后,普通账号更新请求仍立即发出。根据返回顺序,可能显示部分成功、丢失保存反馈,或让旧 extra 在后写入时覆盖新策略。 方案:共享提交状态并阻止并行修改;更完整的方案是统一草稿与保存事务。保留独立保存时,需要明确处理部分成功、等待中的关闭和顺序冲突。 ### R03 · P2:页脚保存会静默丢弃尚未保存的流量草稿 位置:[EditAccountModal.vue](frontend/src/components/account/EditAccountModal.vue#L188)、同文件第 5346 行。 触发:启用 RPM 或修改参数后,直接点击大弹窗页脚的保存,而没有点击区域内“保存流量控制”。账号保存成功并关闭,流量修改并未提交,也没有未保存提示。 本地复现:修改严格 RPM 开关后普通保存,既没有提交该配置,也没有阻止关闭。 方案:统一保存;或者将流量控制真正移出主表单,明确标注独立生效,关闭和主保存时提示尚未保存的草稿。 ### R04 · P2:切换保护策略会覆盖未保存的并发编辑 位置:[EditAccountModal.vue](frontend/src/components/account/EditAccountModal.vue#L4135)。 触发:将并发从 128 改成 256,未普通保存时应用另一策略。策略接口只知道原已保存值 128,返回后 `syncAntiDegradeState` 将输入框覆盖成 128。 本地复现:界面输入 256,切换完成后回到 128。后端“保留已保存并发”仍然成立;这里是前端草稿丢失。 方案:区分草稿字段与服务端已保存字段,仅更新策略管理的身份/TLS 字段。应用策略前也可要求先处理脏表单,但不能直接无提示回填整张表单。 ### R05 · P2:独立区域的无效输入会阻塞主表单;关闭开关也可能保存失败 位置:[AccountTrafficControls.vue](frontend/src/components/account/AccountTrafficControls.vue#L7)、第 73 行;[account_traffic_policy.go](backend/internal/service/account_traffic_policy.go#L48)。 两条触发路径: - RPM 填入 0,折叠该区域后保存账号名等普通设置。子区域仍属于主 `