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("应有勾选批量并入当前主图的表单")
+ }
}