瀏覽代碼

style(photography): 优化摄影详情页布局和样式

- 调整服务标签页布局,统一图标和文字结构
- 更新模板列表每页显示数量从4个改为3个
- 优化详情页整体背景和间距设置
- 修改模板项高度和布局方式
- 调整分页组件样式和隐藏前后导航按钮
- 更新底部按钮定位方式,移除固定定位
- 统一背景色应用方式,提取公共样式类
- 替换服务标签图标资源文件
panqiuyao 1 周之前
父節點
當前提交
6963f0492f

+ 10 - 0
frontend/src/assets/images/detail/bdt.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>bdt</title>
+    <g id="8.22" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="bdt" fill-rule="nonzero">
+            <rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="32" height="32"></rect>
+            <path d="M18.9596875,26.2165625 C18.9601097,26.2574675 18.9440467,26.2968202 18.9151209,26.3257459 C18.8861952,26.3546717 18.8468425,26.3707347 18.8059375,26.3703125 L5.40625,26.3703125 C5.365345,26.3707347 5.32599232,26.3546717 5.29706658,26.3257459 C5.26814084,26.2968202 5.25207783,26.2574675 5.2525,26.2165625 L5.2525,5.3828125 C5.25207783,5.3419075 5.26814084,5.30255482 5.29706658,5.27362908 C5.32599232,5.24470334 5.365345,5.22864033 5.40625,5.2290625 L18.8059375,5.2290625 C18.8468425,5.22864033 18.8861952,5.24470334 18.9151209,5.27362908 C18.9440467,5.30255482 18.9601097,5.3419075 18.9596875,5.3828125 L18.9596875,8.598125 L20.8509375,8.598125 L20.8509375,5.3828125 C20.8497318,4.25388996 19.93486,3.33901815 18.8059375,3.3378125 L5.40625,3.3378125 C4.27732746,3.33901815 3.36245565,4.25388996 3.36125,5.3828125 L3.36125,26.2165625 C3.36245565,27.345485 4.27732746,28.2603568 5.40625,28.2615625 L18.8059375,28.2615625 C19.93486,28.2603568 20.8497318,27.345485 20.8509375,26.2165625 L20.8509375,22.315625 L18.9596875,22.315625 L18.9596875,26.2165625 Z M22.25125,9.1953125 L20.9990625,10.613125 L25.8046875,14.856875 L13.71125,14.856875 L13.71125,16.7484375 L25.565,16.7484375 L21.0415625,20.295 L22.20875,21.7834375 L29.78125,15.8459375 L22.25125,9.1953125 L22.25125,9.1953125 Z" id="形状" fill="#9334EA"></path>
+        </g>
+    </g>
+</svg>

+ 11 - 0
frontend/src/assets/images/detail/cjt.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>cjt</title>
+    <g id="8.22" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="cjt" fill-rule="nonzero">
+            <rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="32" height="32"></rect>
+            <path d="M6.4,7.4 C6.06862915,7.4 5.8,7.66862915 5.8,8 L5.8,24 C5.8,24.3311875 6.0688125,24.6 6.4,24.6 L25.6,24.6 C25.9313708,24.6 26.2,24.3313708 26.2,24 L26.2,8 C26.2,7.66862915 25.9313708,7.4 25.6,7.4 L6.4,7.4 Z M6.4,5.4 L25.6,5.4 C27.0351875,5.4 28.2,6.5648125 28.2,8 L28.2,24 C28.2,25.4351875 27.0351875,26.6 25.6,26.6 L6.4,26.6 C4.96405965,26.6 3.8,25.4359403 3.8,24 L3.8,8 C3.8,6.5648125 4.9648125,5.4 6.4,5.4 Z" id="形状" fill="#2664EB"></path>
+            <path d="M25.6,24.6 C25.9313708,24.6 26.2,24.3313708 26.2,24 L26.2,19.5775938 C26.2,18.7455938 25.7295938,17.9824063 24.984,17.6095938 L22.0575938,16.1471875 C21.3357465,15.7862168 20.4741982,15.8494719 19.8128125,16.312 L7.9728125,24.6 L25.6,24.6 Z M25.8784062,15.8208125 C27.301317,16.5323196 28.2,17.986708 28.2,19.5775938 L28.2,24 C28.2,25.4351875 27.0351875,26.6000003 25.6,26.6000003 L6.83040625,26.6000003 C6.11426415,26.600433 5.48065289,26.1361387 5.26531291,25.4531392 C5.04997292,24.7701396 5.30270633,24.0263935 5.88959375,23.616 L18.665625,14.6735938 C19.9283816,13.790051 21.5736182,13.6690736 22.9520312,14.3584063 L25.8784375,15.8208125 L25.8784062,15.8208125 Z M10.4,13.6 C11.2836556,13.6 12,12.8836556 12,12 C12,11.1163444 11.2836556,10.4 10.4,10.4 C9.51634442,10.4 8.80000005,11.1163444 8.80000005,12 C8.80000005,12.8836556 9.51634442,13.6 10.4,13.6 L10.4,13.6 Z" id="形状" fill="#2664EB"></path>
+        </g>
+    </g>
+</svg>

+ 10 - 0
frontend/src/assets/images/detail/cptc.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>cptc</title>
+    <g id="8.22" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="cptc" fill-rule="nonzero">
+            <rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="32" height="32"></rect>
+            <path d="M19.3673798,26.1351351 L26.7692308,26.1351351 C27.4486058,26.1351351 28,25.5781524 28,24.8918919 L28,6.24324324 C28,5.55698269 27.4486058,5 26.7692308,5 L17.8424519,5 L16,6.86112542 L14.1575481,5 L5.23076923,5 C4.55139423,5 4,5.55698269 4,6.24324324 L4,24.8918919 C4,25.5781524 4.55139423,26.1351351 5.23076923,26.1351351 L12.6326202,26.1351351 C13.3439904,27.2559238 14.5846154,28 16,28 C17.4153846,28 18.6560096,27.2559238 19.3673798,26.1351351 Z M16,26.1351351 C14.9156971,26.1351351 14.0276923,25.3226563 13.8769231,24.2702703 L5.84615385,24.2702703 L5.84615385,6.86486486 L13.5329327,6.86486486 L15.0769231,8.4245038 L15.0769231,18.3648649 C15.0769231,18.8795724 15.4898558,19.2972973 16,19.2972973 C16.5095433,19.2972973 16.9230769,18.8795724 16.9230769,18.3648649 L16.9230769,8.4245038 L18.4676923,6.86486486 L26.1538462,6.86486486 L26.1538462,24.2702703 L18.1224519,24.2702703 C17.9723077,25.3226563 17.0849279,26.1351351 16,26.1351351 Z" id="形状" fill="#9334EA"></path>
+        </g>
+    </g>
+</svg>

+ 10 - 0
frontend/src/assets/images/detail/mtt.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>mtt</title>
+    <g id="8.22" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="mtt" fill-rule="nonzero">
+            <rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="32" height="32"></rect>
+            <path d="M19.2,16.64 C24.8556875,16.64 29.44,21.2243125 29.44,26.88 L29.44,27.52 C29.44,28.933849 28.293849,30.08 26.88,30.08 L5.12,30.08 C3.70615104,30.08 2.56,28.933849 2.56,27.52 L2.56,26.88 C2.56,21.2243125 7.1443125,16.64 12.8,16.64 L19.2,16.64 L19.2,16.64 Z M19.2,18.56 L12.8,18.56 C8.27071875,18.56 4.586875,22.1791875 4.4825625,26.6835313 L4.48,26.88 L4.48,27.52 C4.48,27.8444699 4.72288331,28.1175708 5.045125,28.1555312 L5.12,28.16 L26.88,28.16 C27.2044699,28.16 27.4775708,27.9171167 27.5155313,27.594875 L27.52,27.52 L27.52,26.88 C27.52,22.3507188 23.9008125,18.666875 19.3964688,18.5625625 L19.2,18.56 Z M16,1.92 C19.5347187,1.92 22.4,4.78528125 22.4,8.32 C22.4,11.8547188 19.5347187,14.72 16,14.72 C12.4652813,14.72 9.6,11.8547188 9.6,8.32 C9.6,4.78528125 12.4652813,1.92 16,1.92 Z M16,3.84 C13.5257643,3.84 11.52,5.84576432 11.52,8.32 C11.52,10.7942357 13.5257643,12.8 16,12.8 C18.4742357,12.8 20.48,10.7942357 20.48,8.32 C20.48,5.84576432 18.4742357,3.84 16,3.84 Z" id="形状" fill="#2664EB"></path>
+        </g>
+    </g>
+</svg>

+ 10 - 0
frontend/src/assets/images/detail/xqmb.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>xqmb</title>
+    <g id="8.22" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="xqmb" fill-rule="nonzero">
+            <rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="32" height="32"></rect>
+            <path d="M11.1895,26.5155 L11.1895,13.6646875 L26.512125,13.6646875 L26.5178125,26.5085625 L11.1905312,26.5155 L11.1895,26.5155 Z M5.4914375,13.6646875 L8.8543125,13.6646875 L8.8543125,26.51675 L5.4914375,26.5178125 L5.4914375,13.6646875 L5.4914375,13.6646875 Z M5.510875,5.33902274 L26.5085646,5.32953125 L26.510875,11.3295313 L5.510875,11.3295313 L5.510875,5.33902274 Z M25.8268613,4 L6.17313869,4 C4.97363504,4.00183942 4.00183942,4.97363504 4,6.17313869 L4,25.8268613 C4,27.0247007 4.97529927,28 6.17313869,28 L25.8268613,28 C27.0265109,27.9988613 27.9988321,27.0265401 28,25.8268613 L28,6.17313869 C27.9988613,4.97345985 27.0265401,4.00116788 25.8268613,4 Z" id="形状" fill="#9334EA"></path>
+        </g>
+    </g>
+</svg>

+ 11 - 0
frontend/src/assets/images/detail/xqy.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>xqy</title>
+    <g id="8.22" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="xqy" fill-rule="nonzero">
+            <rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="32" height="32"></rect>
+            <path d="M22.125,30 L9.875,30 C6.55,30 3.75,27.2 3.75,23.875 L3.75,8.125 C3.75,4.8 6.55,2 9.875,2 L22.125,2 C25.45,2 28.25,4.8 28.25,8.125 L28.25,23.875 C28.25,27.2 25.45,30 22.125,30 Z M9.875,3.75 C7.425,3.75 5.5,5.675 5.5,8.125 L5.5,23.875 C5.5,26.325 7.425,28.25 9.875,28.25 L22.125,28.25 C24.575,28.25 26.5,26.325 26.5,23.875 L26.5,8.125 C26.5,5.675 24.575,3.75 22.125,3.75 L9.875,3.75 Z" id="形状" fill="#2664EB"></path>
+            <path d="M22.125,9.875 L9.875,9.875 C9.35,9.875 9,9.525 9,9 C9,8.475 9.35,8.125 9.875,8.125 L22.125,8.125 C22.65,8.125 23,8.475 23,9 C23,9.525 22.65,9.875 22.125,9.875 Z M22.125,15.125 L9.875,15.125 C9.35,15.125 9,14.775 9,14.25 C9,13.725 9.35,13.375 9.875,13.375 L22.125,13.375 C22.65,13.375 23,13.725 23,14.25 C23,14.775 22.65,15.125 22.125,15.125 Z M22.125,20.375 L9.875,20.375 C9.35,20.375 9,20.025 9,19.5 C9,18.975 9.35,18.625 9.875,18.625 L22.125,18.625 C22.65,18.625 23,18.975 23,19.5 C23,20.025 22.65,20.375 22.125,20.375 Z" id="形状" fill="#2664EB"></path>
+        </g>
+    </g>
+</svg>

+ 4 - 0
frontend/src/styles/pub.scss

@@ -127,6 +127,10 @@
   max-width: 100%;
 }
 
+.bg-F5F6F7 {
+  background: #F5F6F7;
+}
+
 .el-button__primary {
   background: #2CFFFC;
   color: #000;

+ 405 - 345
frontend/src/views/Photography/detail.vue

@@ -1,372 +1,399 @@
 <template>
   <BlueHeaderBar />
+  <div class="bg-F5F6F7 detail-page">
+    <div class="page—wrap max-w-full">
+      <!-- 服务标签页 -->
+      <div class="service-tabs">
+        <div
+          class="service-tab"
+          :class="{
+            'active': form.services.includes('is_product_scene'),
+            'disabled': false
+          }"
+          @click="toggleService('is_product_scene')"
+          v-log="{ describe: { action: '点击服务标签', service: '场景图生成' } }"
+        >
+          <el-checkbox
+            :model-value="form.services.includes('is_product_scene')"
+            @change="toggleService('is_product_scene')"
+            @click.stop
+            class="tab-checkbox"
+          />
+          <div class="tab-content">
+            <div class="tab-img flex">
+              <img src="@/assets/images/detail/cjt.svg" alt="场景图生成" class="tab-icon" />
+            </div>
+            <span class="tab-name">场景图生成</span>
+          </div>
+          <div class="tab-edit-btn" @click.stop="openScenePromptDialog" v-if="form.services.includes('is_product_scene')" v-log="{ describe: { action: '点击编辑场景图', service: '场景图生成-弹窗' } }">
+            <el-icon><EditPen /></el-icon>
+          </div>
+        </div>
 
-  <!-- 服务标签页 -->
-  <div class="service-tabs">
-    <div
-      class="service-tab"
-      :class="{
-        'active': form.services.includes('is_product_scene'),
-        'disabled': false
-      }"
-      @click="toggleService('is_product_scene')"
-      v-log="{ describe: { action: '点击服务标签', service: '场景图生成' } }"
-    >
-      <el-checkbox
-        :model-value="form.services.includes('is_product_scene')"
-        @change="toggleService('is_product_scene')"
-        @click.stop
-        class="tab-checkbox"
-      />
-      <img src="@/assets/images/Photography/cj.png" alt="场景图生成" class="tab-icon" />
-      <span class="tab-name">场景图生成</span>
-      <div class="tab-edit-btn" @click.stop="openScenePromptDialog" v-if="form.services.includes('is_product_scene')" v-log="{ describe: { action: '点击编辑场景图', service: '场景图生成-弹窗' } }">
-        <el-icon><EditPen /></el-icon>
-      </div>
-    </div>
-
-    <div
-      class="service-tab"
-      :class="{
-        'active': form.services.includes('is_upper_footer'),
-        'disabled': false
-      }"
-      @click="toggleService('is_upper_footer')"
-      v-log="{ describe: { action: '点击服务标签', service: '模特图生成' } }"
-    >
-      <el-checkbox
-        :model-value="form.services.includes('is_upper_footer')"
-        @change="toggleService('is_upper_footer')"
-        @click.stop
-        class="tab-checkbox"
-      />
-      <img src="@/assets/images/Photography/mt.png" alt="模特图生成" class="tab-icon" />
-      <span class="tab-name">模特图生成</span>
-      <div class="tab-edit-btn" @click.stop="openModelDialog" v-if="form.services.includes('is_upper_footer')" v-log="{ describe: { action: '点击编辑模特图', service: '模特图生成-弹窗' } }">
-        <el-icon><EditPen /></el-icon>
-      </div>
-    </div>
-
-    <div
-      class="service-tab"
-      :class="{
-        'active': form.services.includes('is_detail'),
-        'disabled': false
-      }"
-      @click="toggleService('is_detail')"
-      v-log="{ describe: { action: '点击服务标签', service: '详情页生成' } }"
-    >
-      <el-checkbox
-        :model-value="form.services.includes('is_detail')"
-        @change="toggleService('is_detail')"
-        @click.stop
-        class="tab-checkbox"
-      />
-      <img src="@/assets/images/Photography/xq.png" alt="详情页生成" class="tab-icon" />
-      <span class="tab-name">详情页生成</span>
-    </div>
+        <div
+          class="service-tab"
+          :class="{
+            'active': form.services.includes('is_upper_footer'),
+            'disabled': false
+          }"
+          @click="toggleService('is_upper_footer')"
+          v-log="{ describe: { action: '点击服务标签', service: '模特图生成' } }"
+        >
+          <el-checkbox
+            :model-value="form.services.includes('is_upper_footer')"
+            @change="toggleService('is_upper_footer')"
+            @click.stop
+            class="tab-checkbox"
+          />
+          <div class="tab-content">
+            <div class="tab-img flex">
+              <img src="@/assets/images/detail/mtt.svg" alt="模特图生成" class="tab-icon" />
+            </div>
+            <span class="tab-name">模特图生成</span>
+          </div>
+          <div class="tab-edit-btn" @click.stop="openModelDialog" v-if="form.services.includes('is_upper_footer')" v-log="{ describe: { action: '点击编辑模特图', service: '模特图生成-弹窗' } }">
+            <el-icon><EditPen /></el-icon>
+          </div>
+        </div>
 
-    <!-- 未开发的功能 -->
-    <div class="service-tab disabled" title="功能开发中">
-      <img src="@/assets/images/Photography/zhuangshi.png" alt="详情页模板自定义" class="tab-icon" />
-      <span class="tab-name">详情页模板自定义</span>
-    </div>
+        <div
+          class="service-tab"
+          :class="{
+            'active': form.services.includes('is_detail'),
+            'disabled': false
+          }"
+          @click="toggleService('is_detail')"
+          v-log="{ describe: { action: '点击服务标签', service: '详情页生成' } }"
+        >
+          <el-checkbox
+            :model-value="form.services.includes('is_detail')"
+            @change="toggleService('is_detail')"
+            @click.stop
+            class="tab-checkbox"
+          />
+          <div class="tab-content">
+            <div class="tab-img flex">
+              <img src="@/assets/images/detail/xqy.svg" alt="详情页生成" class="tab-icon" />
+            </div>
+            <span class="tab-name">详情页生成</span>
+          </div>
+        </div>
 
-    <div class="service-tab disabled" title="功能开发中">
-      <img src="@/assets/images/Photography/zhuangshi.png" alt="白底图批量导出" class="tab-icon" />
-      <span class="tab-name">白底图批量导出</span>
-    </div>
+        <!-- 未开发的功能 -->
+        <div class="service-tab disabled" title="功能开发中">
 
-    <div class="service-tab disabled" title="功能开发中">
-      <img src="@/assets/images/Photography/zhuangshi.png" alt="产品图册生成" class="tab-icon" />
-      <span class="tab-name">产品图册生成</span>
-    </div>
-  </div>
+          <div class="tab-content">
+            <div class="tab-img flex">
+              <img src="@/assets/images/detail/xqmb.svg" alt="详情页模板自定义" class="tab-icon" />
+            </div>
+            <span class="tab-name">详情页模板自定义</span>
+          </div>
+        </div>
 
-  <div class="detail-container">
-    <div class="detail-content">
+        <div class="service-tab disabled" title="功能开发中">
+          <div class="tab-content">
+            <div class="tab-img flex">
+              <img src="@/assets/images/detail/bdt.svg" alt="白底图批量导出" class="tab-icon" />
+            </div>
+            <span class="tab-name">白底图批量导出</span>
+          </div>
+        </div>
 
-      <!-- 主图LOGO部分 -->
-<!--
-      <div class="logo-section flex left top" >
-        <div class="section-title" style="margin-bottom: 0px;">
-          <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
-          主图LOGO 与 选择详情模板:
+        <div class="service-tab disabled" title="功能开发中">
+          <div class="tab-content">
+            <div class="tab-img flex">
+              <img src="@/assets/images/detail/cptc.svg" alt="产品图册生成" class="tab-icon" />
+            </div>
+            <span class="tab-name">产品图册生成</span>
+          </div>
         </div>
       </div>
-      <div class="logo-section flex left top multi-line">
-        <upload v-for="item,index in logoList"   :value="item" :key="item"
-                v-show="item"
-                @input="onRemove(index)"
-                class="mar-right-10 upload-item"
-                :class="{
-                    active: item === form.logo_path
-                }"
-                @click.native="form.logo_path = item"
-        ></upload>
-        <upload @input="onInput"></upload>
-      </div>
--->
-
-      <el-divider />
-<!--      &lt;!&ndash; 图片抠图与货号图生成 &ndash;&gt;
-      <div class="section">
-        <div class="section-title">
-          <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
-          图片抠图与货号图生成
-        </div>
-        <div class="section-content">
-          <div v-if="showTips" class="instruction-out flex top left">
-            <img style="fill: #000" src="@/assets/images/xinxi.svg" />
-            <ol class="instruction-list">
-              <li>请在下方确认图片拍摄过程中的顺序,确保所有拍摄的图片的顺序一致。</li>
-              <li>使用中英文语号分隔。</li>
-              <li>图片的名称不能随意修改,否则无法正常生成详情页。</li>
-              <li>现有图片名称有:俯视、侧视、后视、鞋底、内里</li>
-            </ol>
-            <el-icon @click="showTips = false" class="close-icon">
-              <Close />
-            </el-icon>
+
+      <div class="detail-container">
+        <div class="detail-content">
+
+          <!-- 主图LOGO部分 -->
+    <!--
+          <div class="logo-section flex left top" >
+            <div class="section-title" style="margin-bottom: 0px;">
+              <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
+              主图LOGO 与 选择详情模板:
+            </div>
+          </div>
+          <div class="logo-section flex left top multi-line">
+            <upload v-for="item,index in logoList"   :value="item" :key="item"
+                    v-show="item"
+                    @input="onRemove(index)"
+                    class="mar-right-10 upload-item"
+                    :class="{
+                        active: item === form.logo_path
+                    }"
+                    @click.native="form.logo_path = item"
+            ></upload>
+            <upload @input="onInput"></upload>
           </div>
+    -->
 
-          &lt;!&ndash; 货号文件夹 &ndash;&gt;
-          &lt;!&ndash;    <div class="form-item">
-            <div class="label">货号文件夹:</div>
-            <div class="folder-warp">
-              <div class="folder-input">
-                <el-input style="width: 60%;" v-model="folderPath" type="textarea" :rows="2" readonly
-                  placeholder="请选择货号文件夹" />
-                <el-button class="check-button" type="primary" @click="selectFolder">
-                  <img src="@/assets/images/Photography/wenjian.png" style="width: 14px; " />
-                  选择目标文件夹</el-button>
+    <!--      &lt;!&ndash; 图片抠图与货号图生成 &ndash;&gt;
+          <div class="section">
+            <div class="section-title">
+              <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
+              图片抠图与货号图生成
+            </div>
+            <div class="section-content">
+              <div v-if="showTips" class="instruction-out flex top left">
+                <img style="fill: #000" src="@/assets/images/xinxi.svg" />
+                <ol class="instruction-list">
+                  <li>请在下方确认图片拍摄过程中的顺序,确保所有拍摄的图片的顺序一致。</li>
+                  <li>使用中英文语号分隔。</li>
+                  <li>图片的名称不能随意修改,否则无法正常生成详情页。</li>
+                  <li>现有图片名称有:俯视、侧视、后视、鞋底、内里</li>
+                </ol>
+                <el-icon @click="showTips = false" class="close-icon">
+                  <Close />
+                </el-icon>
               </div>
-              <div class="hint">
-                <el-icon>
-                  <Warning />
-                </el-icon> <text>选择货号的上级文件夹</text>
+
+              &lt;!&ndash; 货号文件夹 &ndash;&gt;
+              &lt;!&ndash;    <div class="form-item">
+                <div class="label">货号文件夹:</div>
+                <div class="folder-warp">
+                  <div class="folder-input">
+                    <el-input style="width: 60%;" v-model="folderPath" type="textarea" :rows="2" readonly
+                      placeholder="请选择货号文件夹" />
+                    <el-button class="check-button" type="primary" @click="selectFolder">
+                      <img src="@/assets/images/Photography/wenjian.png" style="width: 14px; " />
+                      选择目标文件夹</el-button>
+                  </div>
+                  <div class="hint">
+                    <el-icon>
+                      <Warning />
+                    </el-icon> <text>选择货号的上级文件夹</text>
+                  </div>
+                </div>
               </div>
+             &ndash;&gt;
+
             </div>
           </div>
-         &ndash;&gt;
+          <el-divider />-->
+
+          <!-- 左右布局 -->
+          <div class="main-layout">
+            <!-- 左侧:选择详情模板 -->
+            <div class="left-panel">
+              <div :class="['template-section', { 'template-section--disabled': !isDetailServiceSelected }]">
+                <div class="section-header">
+                  <div class="section-title">
+                    选择详情模版
+                  </div>
+                  <div class="template-pagination">
+                    <el-pagination
+                      background
+                      layout="prev, pager, next"
+                      v-model:current-page="queryParams.current"
+                      v-model:page-size.sync="queryParams.size"
+                      :total="totalPage"
+                      @current-change="onCurrentChange"
+                      @size-change="onSizeChange"
+                    />
+                  </div>
+                </div>
 
-        </div>
-      </div>
-      <el-divider />-->
-
-      <!-- 左右布局 -->
-      <div class="main-layout">
-        <!-- 左侧:选择详情模板 -->
-        <div class="left-panel">
-          <div :class="['template-section', { 'template-section--disabled': !isDetailServiceSelected }]">
-            <div class="section-header">
-              <div class="section-title">
-                <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
-                选择详情模版
-              </div>
-              <div class="template-pagination">
-                <el-pagination
-                  background
-                  layout="prev, pager, next"
-                  v-model:current-page="queryParams.current"
-                  v-model:page-size.sync="queryParams.size"
-                  :total="totalPage"
-                  @current-change="onCurrentChange"
-                  @size-change="onSizeChange"
-                />
+                <div class="template-list">
+                  <div
+                    v-for="(template, index) in visibleTemplates"
+                    :key="index"
+                    class="template-item"
+                    @click="handleTemplateItemClick(template)"
+                    v-log="{ describe: { action: '点击选择详情模板', template_name: template.template_name } }"
+                  >
+                    <el-image :src="template.template_preview_image" fit="contain" class="cur-p" style="width: 100%; display: block;" />
+                    <div class="select-warp" :class="form.selectTemplate?.id == template.id ? 'active' : ''">
+                      <el-icon color="#FFFFFF">
+                        <Select />
+                      </el-icon>
+                    </div>
+                    <div class="template-info">
+                      <span class="mar-left-10 chaochu_1">{{ template.template_name }}</span>
+                      <div class="template-view" @click.stop="viewTemplate(template)" v-log="{ describe: { action: '点击查看模板详情', template_name: template.template_name } }">查看</div>
+                    </div>
+                  </div>
+                </div>
+
+                <div class="template-tips c-333 fs-14 line-20 te-l mar-top-20 flex left">
+                  <el-icon><WarningFilled /></el-icon>
+                  <span class="mar-left-10">该模版需提供{{form.selectTemplate?.template_image_order?.split(',').length || 5}}张标准视角的商品图:{{form.selectTemplate?.template_image_order || '俯视、侧视、后跟、鞋底、内里'}}。请确保图片清晰度高,背景干净。</span>
+                </div>
               </div>
             </div>
 
-            <div class="template-list">
-              <div
-                v-for="(template, index) in visibleTemplates"
-                :key="index"
-                class="template-item"
-                @click="handleTemplateItemClick(template)"
-                v-log="{ describe: { action: '点击选择详情模板', template_name: template.template_name } }"
-              >
-                <el-image :src="template.template_cover_image" fit="contain" class="cur-p" style="width: 100%; display: block;" />
-                <div class="select-warp" :class="form.selectTemplate?.id == template.id ? 'active' : ''">
-                  <el-icon color="#FFFFFF">
-                    <Select />
-                  </el-icon>
+            <!-- 右侧:LOGO、详情资料准备、一键上架 -->
+            <div class="right-panel">
+              <!-- 主图LOGO -->
+              <div class="right-section">
+                <div class="section-title">
+                  <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
+                  主图LOGO
                 </div>
-                <div class="template-info">
-                  <span class="mar-left-10 chaochu_1">{{ template.template_name }}</span>
-                  <div class="template-view" @click.stop="viewTemplate(template)" v-log="{ describe: { action: '点击查看模板详情', template_name: template.template_name } }">查看</div>
+                <div class="logo-section flex left top multi-line">
+                  <upload
+                    v-for="item,index in logoList"
+                    :value="item"
+                    :key="item"
+                    v-show="item"
+                    @input="onRemove(index)"
+                    class="mar-right-10 upload-item"
+                    :class="{ active: item === form.logo_path }"
+                    @click.native="selectLogo(item)"
+                  ></upload>
+                  <upload @input="onInput"></upload>
                 </div>
               </div>
-            </div>
 
-            <div class="template-tips c-333 fs-14 line-20 te-l mar-top-20 flex left">
-              <el-icon><WarningFilled /></el-icon>
-              <span class="mar-left-10">该模版需提供{{form.selectTemplate?.template_image_order?.split(',').length || 5}}张标准视角的商品图:{{form.selectTemplate?.template_image_order || '俯视、侧视、后跟、鞋底、内里'}}。请确保图片清晰度高,背景干净。</span>
-            </div>
-          </div>
-        </div>
+              <!-- 详情资料准备 -->
+              <div class="right-section">
+                <div class="section-title">
+                  <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
+                  详情资料准备
+                </div>
+                <div class="data-prep-content">
+                  <el-radio-group v-model="form.dataType" class="ml-4">
+                    <el-radio label="1" size="large">Excel上传</el-radio>
+                    <el-radio label="2" size="large">系统对接</el-radio>
+                  </el-radio-group>
+
+                  <div v-if="form.dataType == '1'" class="excel-upload-section">
+                    <el-button
+                      type="primary"
+                      class="select-file-btn"
+                      @click="selectExcel"
+                      v-log="{ describe: { action: '点击选择Excel文件' } }"
+                    >
+                      <img src="@/assets/images/Photography/wenjian.png" style="width: 16px; margin-right: 4px;" />
+                      点击选择文件
+                    </el-button>
+                    <el-button
+                      type="text"
+                      class="download-link"
+                      @click="downloadExcel"
+                      v-log="{ describe: { action: '点击下载Excel模板' } }"
+                    >
+                      下载商品基础资料模版
+                    </el-button>
+                  </div>
+                </div>
+              </div>
 
-        <!-- 右侧:LOGO、详情资料准备、一键上架 -->
-        <div class="right-panel">
-          <!-- 主图LOGO -->
-          <div class="right-section">
-            <div class="section-title">
-              <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
-              主图LOGO
-            </div>
-            <div class="logo-section flex left top multi-line">
-              <upload
-                v-for="item,index in logoList"
-                :value="item"
-                :key="item"
-                v-show="item"
-                @input="onRemove(index)"
-                class="mar-right-10 upload-item"
-                :class="{ active: item === form.logo_path }"
-                @click.native="selectLogo(item)"
-              ></upload>
-              <upload @input="onInput"></upload>
-            </div>
-          </div>
+              <!-- 一键上架平台 -->
+              <div
+                class="right-section"
+                :class="{ 'publish-section--disabled': !canUsePublishSection }"
+                v-if="onlineStoreTempList.length || onlineStoreTempListForeign.length"
+              >
+                <div class="section-title">
+                  <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
+                  一键上架平台
+                </div>
+                <div class="publish-content">
+                  <div class="form-item" v-if="onlineStoreTempList.length">
+                    <div class="label">国内电商平台:</div>
+                    <el-select
+                      v-model="domesticPlatforms"
+                      multiple
+                      placeholder="请选择"
+                      style="width: 100%;"
+                      :disabled="!canUsePublishSection"
+                    >
+                      <el-option
+                        v-for="store in onlineStoreTempList"
+                        :key="store.show_name"
+                        :label="store.show_name"
+                        :value="store.online_store_name"
+                        :disabled="!store.channel_status"
+                      />
+                    </el-select>
+                  </div>
+                  <div class="form-item" v-if="onlineStoreTempListForeign.length">
+                    <div class="label">跨境电商平台:</div>
+                    <el-select
+                      v-model="foreignPlatforms"
+                      multiple
+                      placeholder="请选择"
+                      style="width: 100%;"
+                      :disabled="!canUsePublishSection"
+                    >
+                      <el-option
+                        v-for="store in onlineStoreTempListForeign"
+                        :key="store.show_name"
+                        :label="store.show_name"
+                        :value="store.online_store_name"
+                        :disabled="!store.channel_status"
+                      />
+                    </el-select>
+                  </div>
+                </div>
+              </div>
 
-          <!-- 详情资料准备 -->
-          <div class="right-section">
-            <div class="section-title">
-              <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
-              详情资料准备
-            </div>
-            <div class="data-prep-content">
-              <el-radio-group v-model="form.dataType" class="ml-4">
-                <el-radio label="1" size="large">Excel上传</el-radio>
-                <el-radio label="2" size="large">系统对接</el-radio>
-              </el-radio-group>
 
-              <div v-if="form.dataType == '1'" class="excel-upload-section">
+              <!-- 底部按钮 -->
+              <div class="footer">
                 <el-button
-                  type="primary"
-                  class="select-file-btn"
-                  @click="selectExcel"
-                  v-log="{ describe: { action: '点击选择Excel文件' } }"
+                    v-loading="requesting"
+                    class="button--primary1 footer-button"
+                    type="primary"
+                    @click="generate"
+                    v-log="{ describe: { action: '点击开始生成详情页' } }"
                 >
-                  <img src="@/assets/images/Photography/wenjian.png" style="width: 16px; margin-right: 4px;" />
-                  点击选择文件
-                </el-button>
-                <el-button
-                  type="text"
-                  class="download-link"
-                  @click="downloadExcel"
-                  v-log="{ describe: { action: '点击下载Excel模板' } }"
-                >
-                  下载商品基础资料模版
+                  开始生成→
                 </el-button>
               </div>
             </div>
           </div>
 
-          <!-- 一键上架平台 -->
-          <div
-            class="right-section"
-            :class="{ 'publish-section--disabled': !canUsePublishSection }"
-            v-if="onlineStoreTempList.length || onlineStoreTempListForeign.length"
-          >
+          <!-- 详情高级配置 -->
+    <!--      <div class="section">
             <div class="section-title">
               <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
-              一键上架平台
+              详情高级配置
             </div>
-            <div class="publish-content">
-              <div class="form-item" v-if="onlineStoreTempList.length">
-                <div class="label">国内电商平台:</div>
-                <el-select
-                  v-model="domesticPlatforms"
-                  multiple
-                  placeholder="请选择"
-                  style="width: 100%;"
-                  :disabled="!canUsePublishSection"
-                >
-                  <el-option
-                    v-for="store in onlineStoreTempList"
-                    :key="store.show_name"
-                    :label="store.show_name"
-                    :value="store.online_store_name"
-                    :disabled="!store.channel_status"
-                  />
-                </el-select>
+            <div class="section-content">
+              &lt;!&ndash; 图片顺序 &ndash;&gt;
+              <div class="form-item">
+                <div class="label">图片顺序:</div>
+                <el-input v-model="imageOrder" placeholder="请输入图片顺序" class="specific-page-input">
+                  <template #append>
+                    <el-button class="explain-btn" link type="primary">说明</el-button>
+                  </template>
+                </el-input>
               </div>
-              <div class="form-item" v-if="onlineStoreTempListForeign.length">
-                <div class="label">跨境电商平台:</div>
-                <el-select
-                  v-model="foreignPlatforms"
-                  multiple
-                  placeholder="请选择"
-                  style="width: 100%;"
-                  :disabled="!canUsePublishSection"
-                >
-                  <el-option
-                    v-for="store in onlineStoreTempListForeign"
-                    :key="store.show_name"
-                    :label="store.show_name"
-                    :value="store.online_store_name"
-                    :disabled="!store.channel_status"
-                  />
-                </el-select>
+
+              &lt;!&ndash; 同款检验 &ndash;&gt;
+              &lt;!&ndash;   <div class="form-item">
+                <div class="label">同款检验:</div>
+                <el-checkbox v-model="checkSimilar">同款下货号必须齐全</el-checkbox>
+              </div>
+    &ndash;&gt;
+              &lt;!&ndash; 可指定页面独修改 &ndash;&gt;
+              &lt;!&ndash;      <div class="form-item">
+                <div class="label">可指定页面独修改:</div>
+                <el-input v-model="specificPage" placeholder="请输入入需要单独修改的页面,示例:4:1 (需修改模版的编号:第一张)"
+                  class="specific-page-input">
+                  <template #append>
+                    <el-button class="explain-btn" link type="primary">说明</el-button>
+                  </template>
+                </el-input>
               </div>
+              &ndash;&gt;
             </div>
           </div>
+          <el-divider />-->
         </div>
-      </div>
-
-      <!-- 详情高级配置 -->
-<!--      <div class="section">
-        <div class="section-title">
-          <img src="@/assets/images/Photography/zhuangshi.png" style="width: 32px; height: 32px;" />
-          详情高级配置
-        </div>
-        <div class="section-content">
-          &lt;!&ndash; 图片顺序 &ndash;&gt;
-          <div class="form-item">
-            <div class="label">图片顺序:</div>
-            <el-input v-model="imageOrder" placeholder="请输入图片顺序" class="specific-page-input">
-              <template #append>
-                <el-button class="explain-btn" link type="primary">说明</el-button>
-              </template>
-            </el-input>
-          </div>
 
-          &lt;!&ndash; 同款检验 &ndash;&gt;
-          &lt;!&ndash;   <div class="form-item">
-            <div class="label">同款检验:</div>
-            <el-checkbox v-model="checkSimilar">同款下货号必须齐全</el-checkbox>
-          </div>
-&ndash;&gt;
-          &lt;!&ndash; 可指定页面独修改 &ndash;&gt;
-          &lt;!&ndash;      <div class="form-item">
-            <div class="label">可指定页面独修改:</div>
-            <el-input v-model="specificPage" placeholder="请输入入需要单独修改的页面,示例:4:1 (需修改模版的编号:第一张)"
-              class="specific-page-input">
-              <template #append>
-                <el-button class="explain-btn" link type="primary">说明</el-button>
-              </template>
-            </el-input>
-          </div>
-          &ndash;&gt;
-        </div>
       </div>
-      <el-divider />-->
-    </div>
-
-    <!-- 底部按钮 -->
-    <div class="footer">
-      <el-button
-        v-loading="requesting"
-        class="button--primary1 footer-button"
-        type="primary"
-        @click="generate"
-        v-log="{ describe: { action: '点击开始生成详情页' } }"
-      >
-        开始生成→
-      </el-button>
     </div>
   </div>
 
-
   <loading-dialog v-if="loadingDialogVisible" v-model="loadingDialogVisible" :requesting="requesting" :progress="progress" :message="message"
     :disabled-button="disabledButton" :use-new-progress="useNewProgress" :progress-steps="progressSteps" @button-click="handleComplete" :on-open-folder="openOutputDir">
     <template v-if="partErrList && partErrList.length > 0" #errList>
@@ -587,7 +614,7 @@ const INTERVAL = ref<number | NodeJS.Timeout | null>(null);
 
 // 状态变量
 const totalPage = ref(0);
-const itemsPerPage = 4; // 每页显示的模板数量
+const itemsPerPage = 3; // 每页显示的模板数量
 const dialogVisible = ref(false);
 const dialogImageUrl = ref('');
 const queryParams = reactive({ // 分页查询参数
@@ -1598,30 +1625,44 @@ const selectFolder = () => {
 
 <style lang="scss" scoped>
 // 服务标签页样式
+.detail-page {
+  height: calc(100vh - 50px);
+}
 .service-tabs {
   display: flex;
   gap: 10px;
   padding: 20px;
-  background: #fff;
-  border-bottom: 1px solid #e8e8e8;
-  margin-top: 50px;
 
   .service-tab {
     display: flex;
+    flex: 1;
     align-items: center;
-    gap: 8px;
+    justify-content: center;
+    gap: 10px;
     padding: 10px 20px;
-    border: 2px solid #e8e8e8;
+    border: 1px solid #e8e8e8;
     border-radius: 8px;
     cursor: pointer;
     transition: all 0.3s;
     position: relative;
     background: #fff;
+    height: 140px;
 
     .tab-checkbox {
       margin-right: 0;
+      position: absolute;
+      left: 10px;
+      top:10px;
     }
 
+    .tab-img {
+      width: 48px;
+      height: 48px;
+      background: #EFF6FF;
+      border-radius: 10px;
+      margin:  0 auto 5px;
+
+    }
     .tab-icon {
       width: 24px;
       height: 24px;
@@ -1630,13 +1671,13 @@ const selectFolder = () => {
     .tab-name {
       font-size: 14px;
       color: #333;
+      font-weight: 500;
     }
 
     .tab-edit-btn {
       position: absolute;
-      right: 8px;
-      top: 50%;
-      transform: translateY(-50%);
+      right: 10px;
+      top:10px;
       width: 24px;
       height: 24px;
       display: flex;
@@ -1664,11 +1705,11 @@ const selectFolder = () => {
 
     &.active {
       border-color: #2957FF;
-      background: #F0F5FF;
+      border-bottom: 4px solid #2957FF;
     }
 
     &.disabled {
-      opacity: 0.5;
+      opacity: 0.8;
       cursor: not-allowed;
       background: #f5f5f5;
     }
@@ -1677,8 +1718,7 @@ const selectFolder = () => {
 
 .detail-container {
   background: #F5F6F7;
-  min-height: calc(100vh - 130px);
-  padding: 20px;
+  padding: 0 20px 20px 20px;
 
   .detail-content {
     max-width: 100%;
@@ -1686,7 +1726,6 @@ const selectFolder = () => {
   width: 100%;
   min-width: 600px;
   overflow: hidden;
-  padding-bottom: 100px; // 为底部按钮留出空间
 
 }
 
@@ -1804,7 +1843,7 @@ const selectFolder = () => {
 
 .template-section {
   background: #fff;
-  padding: 20px;
+  padding: 10px 20px 20px;
   border-radius: 8px;
   box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
 
@@ -1812,7 +1851,6 @@ const selectFolder = () => {
     display: flex;
     justify-content: space-between;
     align-items: center;
-    margin-bottom: 20px;
   }
 }
 
@@ -1856,7 +1894,9 @@ const selectFolder = () => {
   box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
 
   .section-title {
-    margin-bottom: 16px;
+    font-weight: 600;
+    font-size: 16px;
+    color: #333333;
   }
 
   .data-prep-content {
@@ -1939,7 +1979,30 @@ const selectFolder = () => {
   text-align: center;
   cursor: pointer;
 }
+.template-pagination {
+  background: #EFF3F6;
+  padding:2px 0;
+  border-radius:5px;
+  ::v-deep {
+    .is-active {
+      background: #fff !important;
+      color: #2957FF !important;
+      font-size: 14px !important;
+      font-weight: normal !important;
+      border-radius: 2px !important;
+    }
+    .number {
+      margin: 0px !important;
+    }
 
+    .btn-prev {
+      display: none;
+    }
+    .btn-next {
+      display: none;
+    }
+  }
+}
 .template-pagination button {
   margin-right: 5px;
 }
@@ -1965,14 +2028,16 @@ const selectFolder = () => {
 
 
   .template-item {
-    width: calc(25% - 18px);
+    flex:1;
     border: 1px solid #ccc;
     border-radius: 10px;
     cursor: pointer;
     background: #f0f0f0;
     position: relative;
+    height: 700px;
     overflow: hidden;
 
+
     .template-info {
       position: absolute;
       bottom: 0;
@@ -2055,7 +2120,6 @@ const selectFolder = () => {
   align-items: center;
   gap: 8px;
   font-weight: bold;
-  margin-bottom: 16px;
   color: #474747;
 }
 
@@ -2166,10 +2230,6 @@ const selectFolder = () => {
   padding: 20px;
   background: #fff;
   border-top: 1px solid #e8e8e8;
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  right: 0;
   z-index: 100;
 
   .footer-button {

+ 1 - 2
frontend/src/views/Photography/processImage.vue

@@ -7,7 +7,7 @@
 
   <hardware-check/>
 
-  <div class="photography-page flex-col ">
+  <div class="photography-page flex-col bg-F5F6F7 ">
     <div class="main-container page—wrap max-w-full">
       <div class="history-section flex-col koutu-section">
 
@@ -282,7 +282,6 @@ onBeforeUnmount(() => {
 
 <style scoped lang="scss">
 .photography-page {
-  background-color:#F5F6F7;
   position: relative;
   .main-container {
     position: relative;