fix(pc): 找回被 #feedback 吞掉的表单校验错误 + 收集任务文案精简

naive 的 NFormItem 一旦用了 #feedback 插槽,renderExplains 就永不渲染
(children || feedback ? feedback : …),校验错误被完全遮住 —— 用户看到的是
"红框 + 一句无关的正常提示",现象上等价于"点了保存没反应"。RoleFormModal 里
早就记录过这个机制,但只在自己那个文件绕开了,没固化成约定,于是扩散到 7 处。

- 7 处 validate() 的 catch 改成 message.error(firstError(errors) ?? 兜底)
  (login / org / role / user / task 建改任务 / 材料规则 / 表单设计)
- ⚠️ firstError 必须摊平后再取:naive reject 出来的是嵌套数组,
  errors[0].message 恒为 undefined,兜底文案会把每条错误都吞成"请检查表单填写"
- 批次号在"修改"时置灰(task_code = 批次号 + 4 位序号,且同时是文件目录名,
  而服务端 update 无条件写 batch_no、没有"编码已生成"的保护)
- 删掉「本期范围」区块(收集模式 / 认定类型恒定,请求体里仍写死 1)
- 清掉教材式描述:extras_json / extra_ 前缀 / 幂等 / 接收能力 / 识别结果只用于提示
- 规则沉淀进 frontend-pc/AGENTS.md 第 10 条与交接摘要 §一·四十
This commit is contained in:
2026-10-13 15:06:34 +08:00
parent 31e7483464
commit e94e76ba0f
10 changed files with 457 additions and 73 deletions
@@ -1,6 +1,6 @@
---
name: project-guide
description: PC 管理端的技术栈、目录结构、菜单与权限模型,以及九条最容易写错的约定。开始任何 PC 端改动前加载本技能。
description: PC 管理端的技术栈、目录结构、菜单与权限模型,以及十条最容易写错的约定。开始任何 PC 端改动前加载本技能。
---
# 项目总览(PC 管理端)
@@ -42,7 +42,7 @@ src/
- 平台运营要**先选学校**(`stores/acting-tenant.ts` → 请求头 `X-Tenant-Id`);
不选就不发请求,否则会把各租户数据混在一起且看起来正常。
## 九条最容易写错的约定
## 十条最容易写错的约定
1. **没有 auto-import**:组件与 API 全显式 import,标签写 **PascalCase**。
漏 import 是**静默故障**(未知自定义元素 → 样式整块丢掉,typecheck/lint 全绿);
@@ -67,6 +67,15 @@ src/
9. **页面内的页签用工具条分段按钮,不要 `NTabs`**:`NTabPane` 要额外 flex 化才能维持
`.page-card` 高度链,否则表格高度算成 0、**一行都看不见**(本仓踩过);
且第 5 条那个 `tab="..."` 的坑也在这条路上。各页签的 list/page 状态分开维护。
10. **`#feedback` 会遮住校验错误**:`NFormItem` 只要用了这个插槽,
`renderExplains`(校验错误)就**永不渲染**(`children || feedback ? feedback : …`),
用户看到的是「红框 + 一句无关的正常提示」=「点了保存没反应」。
所以带 `#feedback` 的表单,`validate()` 失败必须自己
`message.error(firstError(errors) ?? '请检查表单填写')`。
⚠️ `firstError` **必须摊平后再取**(naive reject 的是**嵌套数组**,`errors[0].message` 恒为
`undefined`);写法抄 `src/views/tenant/TenantEditModal.vue`。
⚠️ 该插槽**不接收任何参数**,没有 `#feedback="{ status }"` 这种写法 ——
想内联渲染错误只能给 `feedback` **prop** 传渲染函数(要自写包装组件)。
## 开发