修「填了显示名却说还没有中文名」,并给枚举拼错拦一道

用户报:把某行的导出值改成 MKPOICategoryCarRent、又手填了显示名「租车」,
保存成功、框里也回填了,页面却仍挂着「还没有中文名」。

两件事叠在一起:

1. 判断错了。Missing 只看内置表,没看有没有自定义覆盖 ——
   填过了还照样提示。改成 categoryLabelMissing(v) && 没有覆盖。
   补 TestCategoryLabelMissingRespectsOverride,并做变异验证(去掉那半个条件即报错)。

2. 值本身是拼错的。MKPOICategoryCarRent 不是真机的枚举,正确是
   MKPOICategoryCarRental(少了个 al)——站内看不出任何异常,但导回手机后
   那个地点显示不出类别。这正是加「显示名」时提醒过的风险,所以补一道防线:
   编辑页把内置枚举名渲染给脚本,往 poi_category 写值的两个入口
   (类别台账的「改名」、地点行内编辑的「自定义类别」)都过 okEnum(),
   不在已知枚举里就 confirm,还能猜「你是不是想写 MKPOICategoryCarRental」。
   中文值和已知枚举不打扰。

另外:这次用脚本往模板写 JS 时,\n 被多转义一层成了真换行,JS 单引号字符串
含裸换行 ⇒ 整块 <script> 语法错误、页面交互全哑,而模板解析测试照样通过。
新增 inline_script_test.go 扫所有内联脚本块(现在 31 个),字符串跨行就报错
并指出文件行号,已做变异验证。
This commit is contained in:
tamakyi
2026-09-20 12:22:11 +08:00
parent 82e63412c0
commit 693ee82ab8
5 changed files with 245 additions and 1 deletions
+16 -1
View File
@@ -8,6 +8,7 @@ import (
"log"
"math"
"net/http"
"sort"
"strconv"
"strings"
"time"
@@ -134,6 +135,7 @@ func (s *Server) editPage(w http.ResponseWriter, r *http.Request) {
// 已有类别去重:新建表单、每行编辑的下拉、顶部类别台账都用它(提交值仍是原始标识符);
// 顺手带上地点数,台账要按用量排序、也要知道改一下会影响多少行
catNames := s.categoryLabels(ctx)
d.KnownCategories = knownCategoryNames()
crows, err := s.db.QueryContext(ctx, `SELECT poi_category, count(*) FROM places
WHERE dataset_id=$1 AND COALESCE(poi_category,'')<>'' GROUP BY 1 ORDER BY 1`, ds.ID)
if err != nil {
@@ -149,9 +151,11 @@ func (s *Server) editPage(w http.ResponseWriter, r *http.Request) {
return
}
d.Categories = append(d.Categories, EditOption{Label: c, Name: categoryLabel(c, catNames)})
// Missing 是「还得你补一个中文名」:自己是枚举、内置表没有**且**你也没填过。
// 只看内置表会把已经填好的又标成「还没有中文名」(2026-09-20 用户就这么撞上了)。
d.CategoryRows = append(d.CategoryRows, EditCategory{
Value: c, Label: categoryLabel(c, catNames), Places: n,
Custom: catNames[c] != "", Missing: categoryLabelMissing(c),
Custom: catNames[c] != "", Missing: categoryLabelMissing(c) && catNames[c] == "",
})
}
crows.Close()
@@ -554,6 +558,17 @@ func categoryLabelMissing(v string) bool {
return !ok
}
// knownCategoryNames 列出内置表认得的枚举名(排序后)。页面改「导出值」时拿它提醒:
// 真机只认它自己那套枚举,拼错的串站内看不出问题,导回手机后那个地点就显示不出类别了。
func knownCategoryNames() []string {
out := make([]string, 0, len(poiCategoryText))
for k := range poiCategoryText {
out = append(out, k)
}
sort.Strings(out)
return out
}
// categoryLabels 读站点自定义的类别显示名。读不到就是空 map,各处自动退回内置名。
func (s *Server) categoryLabels(ctx context.Context) map[string]string {
out := map[string]string{}