备份与迷雾的差异分析、合并执行,附属数据改挂坐标键
备份(.rondbackup)与迷雾(.fwss)各加一层「先看差异再动手」: - 迷雾:上传先出差异页,说清叠加能补多少、整体替换会丢多少,并在真实底图上 用绿/灰/红标出会新增 / 不变 / 会丢的区域 - 备份:与当前数据集按 UUID 逐条比对(rond 每次导出都会重排 Z_PK,编号认不出人), 新增合入、冲突逐条选、仅站内有逐条勾选删除,全在一个事务里执行; 合入的行写回 entity_raw,保证再传同一份备份时差异归零 - 地点按坐标对齐:站点的「补全地址」会把地点改名,拿名称当键会让一整个地点的 到访全变成假冲突 - 附属数据(备注/结论/访客票/图片)从 dataset_id+src_pk 换成坐标键,换数据集不再失联; 访客票没有 dataset_id,回填按活跃数据集认领 - 修正 contentHash 拿 Z_PK 当指纹的隐患,以及两处「src_pk 跨快照稳定」的错误注释 导出格式(.rondbackup / .fwss)保持原样,往返测试通过。
This commit is contained in:
+28
-20
@@ -40,26 +40,28 @@ var pageFiles = map[string]struct {
|
||||
files []string
|
||||
entry string
|
||||
}{
|
||||
"home": {[]string{"templates/layout.html", "templates/home.html"}, "layout"},
|
||||
"map": {[]string{"templates/layout.html", "templates/map.html"}, "layout"},
|
||||
"places": {[]string{"templates/layout.html", "templates/places.html"}, "layout"},
|
||||
"place": {[]string{"templates/layout.html", "templates/place.html"}, "layout"},
|
||||
"timeline": {[]string{"templates/layout.html", "templates/timeline.html"}, "layout"},
|
||||
"stats": {[]string{"templates/layout.html", "templates/stats.html"}, "layout"},
|
||||
"report": {[]string{"templates/layout.html", "templates/report.html"}, "layout"},
|
||||
"admin/index": {[]string{"templates/layout.html", "templates/admin/index.html"}, "layout"},
|
||||
"admin/settings": {[]string{"templates/layout.html", "templates/admin/settings.html"}, "layout"},
|
||||
"admin/password": {[]string{"templates/layout.html", "templates/admin/password.html"}, "layout"},
|
||||
"admin/login": {[]string{"templates/admin/login.html"}, "login"},
|
||||
"admin/twofa-login": {[]string{"templates/admin/twofa-login.html"}, "login2"},
|
||||
"admin/twofa": {[]string{"templates/layout.html", "templates/admin/twofa.html"}, "layout"},
|
||||
"admin/fog-mask": {[]string{"templates/layout.html", "templates/admin/fog-mask.html"}, "layout"},
|
||||
"admin/notes": {[]string{"templates/layout.html", "templates/admin/notes.html"}, "layout"},
|
||||
"admin/edit": {[]string{"templates/layout.html", "templates/admin/edit.html"}, "layout"},
|
||||
"admin/topics": {[]string{"templates/layout.html", "templates/admin/topics.html"}, "layout"},
|
||||
"admin/photos": {[]string{"templates/layout.html", "templates/admin/photos.html"}, "layout"},
|
||||
"topics": {[]string{"templates/layout.html", "templates/topics.html"}, "layout"},
|
||||
"topic": {[]string{"templates/layout.html", "templates/topic.html"}, "layout"},
|
||||
"home": {[]string{"templates/layout.html", "templates/home.html"}, "layout"},
|
||||
"map": {[]string{"templates/layout.html", "templates/map.html"}, "layout"},
|
||||
"places": {[]string{"templates/layout.html", "templates/places.html"}, "layout"},
|
||||
"place": {[]string{"templates/layout.html", "templates/place.html"}, "layout"},
|
||||
"timeline": {[]string{"templates/layout.html", "templates/timeline.html"}, "layout"},
|
||||
"stats": {[]string{"templates/layout.html", "templates/stats.html"}, "layout"},
|
||||
"report": {[]string{"templates/layout.html", "templates/report.html"}, "layout"},
|
||||
"admin/index": {[]string{"templates/layout.html", "templates/admin/index.html"}, "layout"},
|
||||
"admin/settings": {[]string{"templates/layout.html", "templates/admin/settings.html"}, "layout"},
|
||||
"admin/password": {[]string{"templates/layout.html", "templates/admin/password.html"}, "layout"},
|
||||
"admin/login": {[]string{"templates/admin/login.html"}, "login"},
|
||||
"admin/twofa-login": {[]string{"templates/admin/twofa-login.html"}, "login2"},
|
||||
"admin/twofa": {[]string{"templates/layout.html", "templates/admin/twofa.html"}, "layout"},
|
||||
"admin/fog-mask": {[]string{"templates/layout.html", "templates/admin/fog-mask.html"}, "layout"},
|
||||
"admin/fog-preview": {[]string{"templates/layout.html", "templates/admin/fog-preview.html"}, "layout"},
|
||||
"admin/backup-preview": {[]string{"templates/layout.html", "templates/admin/backup-preview.html"}, "layout"},
|
||||
"admin/notes": {[]string{"templates/layout.html", "templates/admin/notes.html"}, "layout"},
|
||||
"admin/edit": {[]string{"templates/layout.html", "templates/admin/edit.html"}, "layout"},
|
||||
"admin/topics": {[]string{"templates/layout.html", "templates/admin/topics.html"}, "layout"},
|
||||
"admin/photos": {[]string{"templates/layout.html", "templates/admin/photos.html"}, "layout"},
|
||||
"topics": {[]string{"templates/layout.html", "templates/topics.html"}, "layout"},
|
||||
"topic": {[]string{"templates/layout.html", "templates/topic.html"}, "layout"},
|
||||
}
|
||||
|
||||
type pageSet struct {
|
||||
@@ -229,6 +231,9 @@ func (s *Server) routes() {
|
||||
s.mux.HandleFunc("POST /admin/twofa/disable", s.requireAdmin(s.twofaDisable))
|
||||
s.mux.HandleFunc("GET /admin", s.requireAdmin(s.adminHome))
|
||||
s.mux.HandleFunc("POST /admin/upload", s.requireAdmin(s.adminUpload))
|
||||
s.mux.HandleFunc("POST /admin/preview", s.requireAdmin(s.adminBackupPreview))
|
||||
s.mux.HandleFunc("GET /admin/preview/{token}", s.requireAdmin(s.adminBackupPreviewPage))
|
||||
s.mux.HandleFunc("POST /admin/preview/{token}/merge", s.requireAdmin(s.adminBackupMerge))
|
||||
s.mux.HandleFunc("POST /admin/datasets/{id}/activate", s.requireAdmin(s.adminActivate))
|
||||
s.mux.HandleFunc("POST /admin/datasets/{id}/delete", s.requireAdmin(s.adminDelete))
|
||||
s.mux.HandleFunc("POST /admin/place/note", s.requireAdmin(s.adminPlaceNote))
|
||||
@@ -261,6 +266,9 @@ func (s *Server) routes() {
|
||||
s.mux.HandleFunc("POST /admin/edit/weather", s.requireAdmin(s.editWeatherCreate))
|
||||
s.mux.HandleFunc("POST /admin/gpx", s.requireAdmin(s.adminGpxUpload))
|
||||
s.mux.HandleFunc("POST /admin/gpx/delete", s.requireAdmin(s.adminGpxDelete))
|
||||
s.mux.HandleFunc("POST /admin/fog/preview", s.requireAdmin(s.adminFogPreview))
|
||||
s.mux.HandleFunc("GET /admin/fog/preview/{token}", s.requireAdmin(s.adminFogPreviewPage))
|
||||
s.mux.HandleFunc("GET /admin/fog/preview/{token}/{z}/{x}/{y}", s.requireAdmin(s.adminFogDiffTile))
|
||||
s.mux.HandleFunc("POST /admin/fog", s.requireAdmin(s.adminFogUpload))
|
||||
s.mux.HandleFunc("POST /admin/fog/clear", s.requireAdmin(s.adminFogClear))
|
||||
s.mux.HandleFunc("GET /admin/fog/export", s.requireAdmin(s.adminFogExport))
|
||||
|
||||
Reference in New Issue
Block a user