feat(admin): 补品种管理和记录事项两个后台页

## 这两个页面是漏的,不是新需求
Step 2 我说了「记录类型后台可配」,接口加了(GET/POST/DELETE
/api/admin/record-types)但 React 页面根本没建;品种那次同样只加了接口。
也就是说「可配」这件事在后台上一直是点不到的。补上。

## 品种管理
猫/狗切换,按首字母分段列出(和小程序端的 A-Z 索引对得上)。

首字母是手填的输入框,配了一句说明:多音字自己定(藏獒 Z、柴犬 C)。
不做自动转拼音——Go 没有标准拼音库,而且多音字自动转常出错,
错了以后用户在小程序里按字母索引就找不到那个品种。

## 记录事项
按分组列出 24 种,「表单字段」那列把 DSL 渲染成人话
(体重·数值kg / 状态·单选★),★ 表示这个单选落 category。

字段配置的写法说明直接放在编辑弹窗里,不是写进文档:这东西一年用两次,
去翻文档的成本比它本身还高。

内置那 9 种打了「内置」标签、隐藏删除按钮、code 输入框禁用 —— 但真正的
拦截在 service 层,前端只是别让人白点。

## 报错原样透出
两个页面的保存失败都把后端消息显示出来,不写成「保存失败」。
后端那些消息是特意写具体的(第几行、错在哪、几个档案在用),
包成一句「失败」等于把它们扔了。

## 验证(预生产库实跑 service 层)
  品种  首字母两位/中文 → 拒;物种 bird → 拒;同物种重名「布偶猫」→ 拒
        有 1 个档案在用时删 → 拒并报出数量;没人用 → 删成功
  事项  两个字段都落 category → 「第 2 行」;options 没选项 → 「第 1 行」;
        类型写成 num → 「第 1 行类型 num 不认识」;缺名称 → 「第 1 行缺名称」;
        第二个加 :- → 通过
  tsc --noEmit 通过;npm run build 后重启,/admin/ 返回的资源哈希
  和新构建一致(go:embed 是编译期打包的,不重启看不到新页面)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Blizzard
2026-07-30 11:32:50 +08:00
parent aefb1bc103
commit 69bd56671c
10 changed files with 586 additions and 63 deletions
+4
View File
@@ -10,6 +10,8 @@ import Posts from '@/pages/Posts'
import Comments from '@/pages/Comments'
import Articles from '@/pages/Articles'
import CareTemplates from '@/pages/CareTemplates'
import RecordTypes from '@/pages/RecordTypes'
import Breeds from '@/pages/Breeds'
import CommunityBot from '@/pages/CommunityBot'
import Feedback from '@/pages/Feedback'
import Members from '@/pages/Members'
@@ -37,6 +39,8 @@ export default function App() {
<Route path="comments" element={<Comments />} />
<Route path="articles" element={<Articles />} />
<Route path="care-templates" element={<CareTemplates />} />
<Route path="record-types" element={<RecordTypes />} />
<Route path="breeds" element={<Breeds />} />
<Route path="community-bot" element={<CommunityBot />} />
<Route path="feedback" element={<Feedback />} />
<Route path="members" element={<Members />} />