记忆:后台显示区编辑器(地图点选)+ HasMap 陷阱 + 记忆索引压缩到 8919

This commit is contained in:
tamakyi
2026-10-12 17:35:55 +08:00
parent 7ab33227a5
commit 829a318400
3 changed files with 80 additions and 4 deletions
+47
View File
@@ -46,3 +46,50 @@
我连着写错两版正则(先是 `Z$` 卡在尾部空格)。
- **`--clip` 截图的 `pad=10`**(×scale)又咬了一次:这次用**自校准**绕开的 ——
用单圆掩码反解出 scale 与 offset(实测 2.0 / 19.2),不再手算元素坐标。
## 后台的显示区编辑器(B3,用户诉求的后半)
三个手填输入框(中心纬度/经度/半径)换成**地图 + 圆列表**:点地图加圆、拖圆心移动、
拖圆边改半径、列表里可改半径/定位/删除、可一次清空;改动立刻写进隐藏字段
`areas`(JSON) 与 `crs`,随专题表单一起提交。复用 `/admin/fog-mask` 那套约定
(`/api/map-config` 取底图、底图坐标系随表单带上、后端换算成 GCJ-02),不另起炉灶。
### 实测抓到的 bug(探针一跑就现形)
`/admin/topics` **没设 `p.HasMap = true`** ⇒ 布局不引入 Leaflet。表现极隐蔽:
脚本加载了、`rondTopicAreas` 也在,就是 `window.L` 永远 undefined,`init` 静默返回、
**控制台不报错**、页面看着像「什么都没发生」。已加守卫
`TestTopicsAdminPageLoadsLeaflet`(按函数体截取后断言含 `HasMap = true`)。
记忆里那条「带地图页须 `p.HasMap=true`」是真的会咬人。
### 两个设计上的取舍
- **areas 的初值渲染进隐藏字段**(`value="{{.Form.AreasJSON}}"`),JS 也从隐藏字段读初值,
而不是另传一份。这样脚本没加载上时,表单提交的仍是服务端渲染的原值 ——
否则一次保存就把已有显示区**静默清空**。守卫
`TestTopicAdminUsesMapEditorNotCoordInputs` 钉住了「初值来源」与「旧输入框必须没了」。
- **上限两边各写一份**(前端 `MAX_AREAS/MIN_KM/MAX_KM` vs 后端 Go 常量),并加守卫
`TestTopicAreaLimitsMatchBetweenGoAndJS` 直接比对数字。不一致的表现很别扭:
前端放行、后端拒绝,用户看到一句红字却不知道改哪里。
### 小坑
- 半径输入框套了一层**定宽容器**:站点全局 input 规则是 `width:100%` 且带 10 个 `:not()`
(特异性 (0,11,1)),直接给 input 写宽度压不过。
- `topic-areas.js` 只把**纯函数**(校验/序列化/增删改/几何换算)暴露出来供 node 单测,
另加一个最小测试钩子 `api._map` 供无头验证(同 `window.rondMap._state` 惯例)——
不给把手就只能真拿鼠标点地图,CDP 下很难稳定复现。
### gofmt / 行尾
`gofmt -l` 报的整文件重写有两层原因,已一并处理:
① Go 1.19 起 gofmt 会重排**文档注释**里的缩进列表(我写的 `// ① …` 被要求改成 tab 缩进块);
② 工作区是 CRLF 而 `.gitattributes` 声明 `eol=lf`。
`gofmt -w` 归一后 `git diff` 没有额外噪声 —— 说明 **blob 本来就是 LF,CRLF 只是检出产物**,
之前担心的「模板 CRLF 与 .gitattributes 冲突」不是仓库内容问题。
### 记忆压缩
`MEMORY.md` 压到 **8919**(原 9285):合并「归属口径/防复发」与「跨备份/附属数据」两节
(同属归属)、若干长条目的**理由**下沉 details(规矩一字未删)、收紧自己新加的那条。
12 节 → 11 节。