5.2 KiB
5.2 KiB
工作人员唯一冲突提示操作日志
操作时间:2026-08-11 13:29:44 操作类型:修改 影响模块:平台总后台、气站后台、配送点后台工作人员新增与编辑
操作前状态
staff_account的用户名和非空联系电话分别由数据库唯一索引保护,但三个后台的工作人员写入入口都会把 PostgreSQL 原始错误直接返回前端。- 用户遇到重复数据时会看到约束名、SQLSTATE 等数据库实现细节,无法判断需要修改用户名还是联系电话。
- 保存失败后各前端会保留现有表单;5173平台后台若已上传头像,重新保存时仍会再次上传同一文件,可能产生重复或孤立资源。
- 公共
UpdateAllowedByIdentity没有为特定资源转换数据库错误的扩展点。
具体操作
- 新增工作人员写入错误转换器:
- 精确识别
idx_staff_account_username,返回“该用户名已存在”。 - 精确识别
idx_staff_account_phone,返回“该联系电话已被其他工作人员使用”。 - 未识别数据库错误只写服务端日志,客户端统一收到“保存失败,请稍后重试”。
- 精确识别
- 新增公共工作人员创建函数,让平台、气站、配送点三个入口统一执行错误转换。
- 以向下兼容方式扩展公共白名单更新函数:原函数签名和行为保持不变,工作人员编辑入口使用带错误转换器的新函数。
- 三个后台的工作人员创建均接入用户名和联系电话冲突转换;三个后台的工作人员编辑均接入联系电话冲突转换。
- 新增5173头像上传结果缓存:
- 头像上传成功但资源保存失败时,下一次保存复用同一受控 URI。
- 选择新文件、清除头像或重新加载资料时清空缓存。
- 头像上传本身失败时自动清空缓存,允许再次上传。
- 新增头像失败重试行为检查脚本,并加入平台后台脚本命令。
操作后状态
- 三个后台均不再向工作人员表单暴露数据库表名、索引名或 SQLSTATE。
- 用户名重复只在新建时返回明确提示;联系电话重复在新建和编辑时均返回明确提示。
- 联系电话继续允许留空,非空值保持全表唯一;已归档工作人员继续占用用户名和非空联系电话。
- 保存失败后表单、下拉选择和头像预览保持不变;5173再次保存不会重复上传已经成功上传的头像。
- 现有 HTTP 200 加 JSON 业务错误结构保持不变,没有新增保存前查重接口或数据库迁移。
代码变更
backend/api/internal/logic/common/staff_error.go:新增CreateStaffRecord和StaffWriteError,统一处理创建写入、唯一冲突与未知错误脱敏。backend/api/internal/logic/common/staff_error_test.go:覆盖已知冲突、包装错误、未知错误脱敏、创建和编辑写入路径。backend/api/internal/logic/common/staff_wiring_test.go:验证三个后台的创建和编辑入口均接入公共错误转换链路。backend/api/internal/logic/common/base.go:新增UpdateAllowedByIdentityWithError,原UpdateAllowedByIdentity保持兼容。backend/api/internal/logic/platform/staff/staff.go:接入平台工作人员创建和编辑错误转换。backend/api/internal/logic/gas/staff.go:接入气站工作人员创建和编辑错误转换。backend/api/internal/logic/delivery/staff.go:接入配送点工作人员创建和编辑错误转换。frontend/platform_admin/src/views/resource/avatar-upload-cache.ts:新增单次保存流程头像 URI 缓存。frontend/platform_admin/src/views/resource/use-resource-avatar.ts:接入头像上传缓存及失效规则。frontend/platform_admin/scripts/check-avatar-upload-cache.mjs、package.json:新增头像失败重试行为检查命令。
验证结果
go test ./internal/logic/common:通过,工作人员冲突转换、未知错误脱敏、创建和编辑路径均通过。go test ./internal/logic/platform/staff ./internal/logic/gas ./internal/logic/delivery:通过,三个工作人员处理器编译与既有测试正常。go test ./...:通过,后端完整回归测试正常。npm.cmd run avatar-retry:check:通过,同一头像保存重试仅上传一次,重置与上传失败后可以再次上传。npm.cmd run type:check:通过。npm.cmd run resource-pages:check:通过,详情46类、新建25类、编辑23类。npm.cmd run build:通过,Vite生产构建完成。git diff --check:通过,未发现空白符错误。
风险评估
- 唯一冲突识别依赖当前 PostgreSQL 约束名;模型继续沿用现有索引定义时行为稳定,相关常量和测试可防止无意改名。
- 未识别工作人员写入错误会对客户端脱敏,但原始错误仍写入服务端日志,便于定位数据库连接或约束异常。
- 头像 URI只在当前5173资料页实例中缓存;页面卸载、选择新头像或清除头像后立即失效,不跨账户复用。
- 气站后台和配送点后台当前没有真实头像文件上传能力,本次不为其增加头像缓存或改变现有表单结构。
- 本次不修改气站与配送点联动、详情唯一标识展示或编辑页冗余详情请求等独立问题。