Files
rond-with-you/tools
tamakyi 40441ba900 工具:tools/dedup_site_visits.py —— 以手机包为参照清掉站点侧的历史重复到访
站点数据里有一批「到达时间 + 地点与手机包里某条完全相同、但 UUID 不同」的到访副本(站点侧生成的
UUID)。差异页/合并按 UUID 认人,于是它们被当成「备份新增」,导出到 rond 后就是成对的两条重复记录
(2026-09-29 站长实测:导入后 app 里出现成对的重复条目)。

工具以手机导出的包为参照(数据集的基线):
  * 站点到访的 UUID 在参照里能找到 → 保留(手机自己也有成对条目,那是合法的,不能动)
  * UUID 找不到、且 (到达时间, 地点) 与参照里某条一致 → 判为副本
副本的附属记录(位移/天气/留档)一并删除;若有别的到访的留档指向副本(ZMERGEDTO / ZPARENT),
改指到保留的那条,避免导出时留下悬空引用。**默认只预演,--apply 才动手。**

踩坑记录(都在此提交里修掉):
  * `raw->>` 取出的是 text,与数字比较会报「text = integer 操作符不存在」,导致工具在动手前整个退出;
  * 同一个 UPDATE 里不能给 raw 赋两次值(「对同一列 raw 进行了多次分配」),jsonb_set 要嵌套。

演练验证(本地真实数据:导入含 72 条副本的包 → 执行 → 核对):
  到访 1026 → 954、位移 833 → 809、天气 621 → 589(与手机包一致);
  「同时间同地点」重复组 101 → **31**(= 手机包自身)、悬空引用 0/0。
2026-09-29 17:38:50 +08:00
..
2026-09-18 13:05:49 +08:00
2026-09-18 13:05:49 +08:00
2026-09-18 13:05:49 +08:00

tools

留在这里的都是还在用的工具;一次性探针用完就删(历史里能翻到)。

工具 用途
verify_export_structure.py 结构级对比:导出的 .rondbackup / .fwss 与真机原版比表、列、行数、悬空引用。导出改动后必跑。
verify_rondbackup.py 逐字段对比两个 .rondbackup(含 Z_METADATA 等字节哈希),比上面那个更细。
photo_coord_audit.py 照片导入的坐标体检与批量换算(GCJ-02 / WGS-84)。
audit_db.sql 库内一致性审计:psql "<dsn>" -f tools/audit_db.sql。

验收

../scripts/verify.sh(封了六个环境变量,会数 SKIP,拒绝假绿):

./scripts/verify.sh            # 全量,0 skip 才算过
./scripts/verify.sh --fast     # gofmt + vet + build
./scripts/verify.sh --race --pkg ./internal/web/
./scripts/verify.sh --cover    # 覆盖率,-coverpkg 口径
./scripts/verify.sh --smoke    # 关键页冒烟(要站点在 8080 上跑着)
./scripts/verify.sh --all      # 全量 + 冒烟

--cover 为什么要 -coverpkg

go test -cover 只统计「测试文件所在的那个包」自己的执行。本项目大量代码是被别的包 驱动的——internal/rond 的导出流程由 internal/web 的用例跑,geo/gpx/notes/votes 由 web/stats 跑——按 -cover 量这些包会一律报 0%,看着像没测,其实全都在跑。 --cover 用 -coverpkg=./internal/... 把跨包执行算进来。实测差别:

包 -cover(假) -coverpkg(真)
internal/rond 38.8% 79.1%(由 internal/web 的用例贡献)

关键页冒烟:../scripts/smoke.py

Go 侧模板守卫只能证明「模板里有那段文字」,证明不了浏览器打开后看得到——白屏、JS 抛错、 内容区块被压成 0 高,模板测试全都是绿的。冒烟按三种口径各走一遍:

  1. 站长(浏览器):每页断言 HTTP 200、落点路径没跳走、内容区块在且尺寸非 0、零 JS 报错
  2. 访客(纯 HTTP):公开页 200;后台页必须 303 跳登录(绝不能 200)
  3. 访客(浏览器)抽检:/ 与地点详情,只在访客侧复现的 bug 藏在这里
python scripts/smoke.py --only /map                     # 单页调试
python scripts/smoke.py --shot-dir storage/.verify/smoke # 顺带存整屏截图

依赖 rond-web-verify 技能里的 site_cdp.py(CDP 直连本机 Chrome);用 ROND_CDP 指过去,默认取 ~/.workbuddy/skills/rond-web-verify/scripts/site_cdp.py。 站点得先在 ROND_BASE(默认 http://localhost:8080)上跑着,否则直接报错退出。