From 49bd7b74c68af68e1c438a0502d04de9b74bc300 Mon Sep 17 00:00:00 2001 From: toom1996 <23cm.cn@gmail.com> Date: Mon, 21 Sep 2026 23:04:38 +0800 Subject: [PATCH] =?UTF-8?q?fix(street):=20=E5=AE=A1=E6=A0=B8=E9=A1=B5?= =?UTF-8?q?=E3=80=8C=E8=AE=BE=E4=B8=BA=E4=B8=BB=E5=9B=BE=E3=80=8D=E6=94=B9?= =?UTF-8?q?=E4=B8=BAGET=E9=93=BE=E6=8E=A5=E5=B9=B6=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8B=BE=E9=80=89=E6=89=B9=E9=87=8F=E5=B9=B6=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/handler/backstage_handler.go | 29 +++++++++++++++++---------- internal/router/backstage_test.go | 12 +++++++++++ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/internal/handler/backstage_handler.go b/internal/handler/backstage_handler.go index 7ff2ded..a05b10f 100644 --- a/internal/handler/backstage_handler.go +++ b/internal/handler/backstage_handler.go @@ -1353,8 +1353,11 @@ button.ghost{background:#fff;color:#111;border:1px solid #ccc} .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:10px;margin-top:14px} .cell{background:#fff;border:1px solid #eee;border-radius:8px;overflow:hidden} .cell img{width:100%;display:block;aspect-ratio:2/3;object-fit:cover} -.cell .acts{padding:8px;display:flex;gap:6px} -.cell .acts button{margin:0;flex:1;padding:7px;font-size:13px} +.cell .acts{padding:8px;display:flex;flex-wrap:wrap;gap:6px} +.cell .acts button{margin:0;flex:1 1 auto;padding:7px;font-size:13px} +.btn{display:inline-block;flex:1 1 auto;margin:0;padding:7px 10px;background:#fff;color:#111;border:1px solid #ccc;border-radius:6px;text-decoration:none;font-size:13px;text-align:center} +.chk{display:flex;align-items:center;gap:4px;flex:1 1 auto;font-size:12px;color:#333;white-space:nowrap;cursor:pointer} +.chk input{margin:0}
管理后台 · 草稿审核 #{{.Draft.ID}}返回列表 · 退出
@@ -1364,14 +1367,13 @@ button.ghost{background:#fff;color:#111;border:1px solid #ccc} {{range .Draft.Fields}}
{{if eq .Type "textarea"}}{{else}}{{end}}
{{end}} -{{if eq .Draft.Kind "street"}}{{if .Draft.MainID}}
当前主图:#{{.Draft.MainID}}(折叠视图;点「拆出」可恢复独立主图)
{{end}} +{{if eq .Draft.Kind "street"}}
{{if .Draft.MainID}}当前主图:#{{.Draft.MainID}}。操作三步:① 在下方任意「主图」上点「设为主图」切换当前主图 → ② 勾选要并入的图 → ③ 点页面底部「并入到当前主图」。连拍快速归并可用每张图上的「并入上一张」。{{else}}尚未选定主图:请在下方某张图上点「设为主图」(页面会带上 ?main= 参数),再勾选要并入的图、点底部「并入到当前主图」。{{end}}

主副图分组({{len .Draft.Groups}} 组 · 共 {{.Draft.ImageCount}} 张)

{{if .Draft.Groups}}{{range .Draft.Groups}}
-
-
+设为主图
@@ -1387,22 +1389,27 @@ button.ghost{background:#fff;color:#111;border:1px solid #ccc}
{{end}} {{end}} {{end}}{{else}}

该草稿暂无图片。

{{end}} -

全部图片(点选并入当前主图)

+

全部图片(勾选后批量并入当前主图)

+
+ +
{{range .Draft.Images}}
-{{.Name}}{{if eq .IsDetail 1}} · 副图{{end}} +{{.Name}}{{if eq .IsDetail 1}} · 副图 #{{.ParentImageID}}{{else if eq .ID $.Draft.MainID}} · 当前主图{{end}}
{{if eq .IsDetail 1}} -
-
+ +
{{else}} -
-
+设为主图 + {{end}} +
{{end}}
+
{{else}}

图片管理({{len .Draft.Images}} 张)

diff --git a/internal/router/backstage_test.go b/internal/router/backstage_test.go index 9d4e18d..f365ced 100644 --- a/internal/router/backstage_test.go +++ b/internal/router/backstage_test.go @@ -452,4 +452,16 @@ func TestBackstageStreetRenderGroups(t *testing.T) { if !strings.Contains(body, "detail-a") { t.Fatalf("应渲染副图 detail-a") } + // 「设为主图」必须是带 ?main= 的 GET 链接:选主图只改 URL,不写库。 + // (曾被误写成 POST 到 /admin/reviews/street/7,而该路由只有 GET,导致 404、主图根本选不了。) + if !strings.Contains(body, `href="/admin/reviews/street/7?main=1"`) { + t.Fatalf("「设为主图」应是带 ?main= 的 GET 链接") + } + if strings.Contains(body, `action="/admin/reviews/street/7"`) { + t.Fatalf("不应存在 POST 到详情页的表单(该路由只有 GET)") + } + // 批量并入:勾选框 + 独立提交按钮,用 form="batch" 关联(零 JS、不嵌套表单)。 + if !strings.Contains(body, `id="batch"`) || !strings.Contains(body, `form="batch"`) { + t.Fatalf("应有勾选批量并入当前主图的表单") + } }