Browse Source

修改测试bug

hurx 12 hours ago
parent
commit
b389454e1b

+ 8 - 8
src/views/enterprisePurchase/index.vue

@@ -83,7 +83,7 @@
             </el-form-item>
 
             <el-form-item label="按钮图标:">
-              <UploadImage v-model="form.rightBtnIcon" :limit="1" width="32px" height="32px" />
+              <UploadImage v-model="form.rightBtnIcon" :limit="1" width="60px" height="60px" />
               <div class="field-tip">建议尺寸: 32*32, 格式: PNG/SVG</div>
             </el-form-item>
 
@@ -509,13 +509,13 @@
               </template>
             </el-table-column>
             <el-table-column prop="link" label="跳转地址" show-overflow-tooltip />
-            <el-table-column label="打开方式" width="120" align="center">
+            <!-- <el-table-column label="打开方式" width="120" align="center">
               <template #default="{ row }">
                 <el-tag :type="row.openMode === 'new' ? 'success' : 'info'" size="small">
                   {{ row.openMode === 'new' ? '新窗口' : '当前页' }}
                 </el-tag>
               </template>
-            </el-table-column>
+            </el-table-column> -->
             <el-table-column label="状态" width="100" align="center">
               <template #default="{ row }">
                 <el-switch
@@ -1072,7 +1072,7 @@
               <el-input v-model="categoryForm.name" placeholder="如:办公电脑 / 办公打印 / 电脑组件" />
             </el-form-item>
             <el-form-item label="图标:">
-              <UploadImage v-model="categoryForm.icon" :limit="1" width="48px" height="48px" />
+              <UploadImage v-model="categoryForm.icon" :limit="1" width="60px" height="60px" />
               <div class="upload-tip">推荐尺寸:16 * 16,支持上传透明背景 PNG</div>
             </el-form-item>
             <!-- <el-form-item label="同步分类:">
@@ -1254,18 +1254,18 @@
           <el-input v-model="headerForm.title" placeholder="如:公共采购" />
         </el-form-item>
         <el-form-item label="分类图标:">
-          <UploadImage v-model="headerForm.icon" :limit="1" width="48px" height="48px" />
+          <UploadImage v-model="headerForm.icon" :limit="1" width="60px" height="60px" />
           <div class="upload-tip">建议尺寸:20*20,透明背景 PNG</div>
         </el-form-item>
         <el-form-item label="跳转地址:">
           <WebLinkInput v-model="headerForm.link" placeholder="请输入跳转链接" />
         </el-form-item>
-        <el-form-item label="打开方式:">
+        <!-- <el-form-item label="打开方式:">
           <el-radio-group v-model="headerForm.openMode">
             <el-radio label="current">当前页</el-radio>
             <el-radio label="new">新窗口</el-radio>
           </el-radio-group>
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item label="启用状态:">
           <el-switch v-model="headerForm.status" :active-value="1" :inactive-value="0" active-color="#13ce66" />
         </el-form-item>
@@ -1531,7 +1531,7 @@
           <el-input v-model="quickEntryForm.name" placeholder="请输入入口名称(建议4-5个字)" maxlength="6" show-word-limit />
         </el-form-item>
         <el-form-item label="图标:">
-          <UploadImage v-model="quickEntryForm.icon" :limit="1" width="48px" height="48px" />
+          <UploadImage v-model="quickEntryForm.icon" :limit="1" width="60px" height="60px" />
           <div class="upload-tip">建议尺寸: 48*48, 格式: PNG/SVG</div>
         </el-form-item>
         <el-form-item label="标签文字:">

+ 5 - 10
src/views/platform/customerOperation/customerList/index.vue

@@ -3,8 +3,8 @@
     <!-- 搜索区域 -->
     <el-card shadow="never" class="mb-2">
       <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="80px">
-        <el-form-item label="客户ID" prop="id">
-          <el-input v-model="queryParams.id" placeholder="请输入客户ID" clearable @keyup.enter="handleQuery" />
+        <el-form-item label="客户编号" prop="customerNo">
+          <el-input v-model="queryParams.customerNo" placeholder="请输入客户编号" clearable @keyup.enter="handleQuery" />
         </el-form-item>
         <el-form-item label="行业" prop="industryCategoryId">
           <el-select v-model="queryParams.industryCategoryId" placeholder="请选择行业" clearable>
@@ -58,18 +58,11 @@
           </template>
         </el-table-column>
       </el-table>
-      <pagination
-        v-show="total > 0"
-        :total="total"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-      />
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
     </el-card>
   </div>
 </template>
 
-
 <script setup lang="ts">
 import { ref, onMounted } from 'vue';
 import { useRouter } from 'vue-router';
@@ -93,6 +86,7 @@ const queryParams = ref({
   pageNum: 1,
   pageSize: 10,
   id: undefined,
+  customerNo: '',
   industryCategoryId: undefined,
   yearSalesMin: undefined,
   yearSalesMax: undefined,
@@ -124,6 +118,7 @@ const resetQuery = () => {
     pageNum: 1,
     pageSize: 10,
     id: undefined,
+    customerNo: '',
     industryCategoryId: undefined,
     yearSalesMin: undefined,
     yearSalesMax: undefined,

+ 12 - 23
src/views/platform/decoration/floor/index.vue

@@ -45,13 +45,7 @@
           </el-table-column>
         </el-table>
 
-        <pagination
-          v-show="total > 0"
-          v-model:page="queryParams.pageNum"
-          v-model:limit="queryParams.pageSize"
-          :total="total"
-          @pagination="getList"
-        />
+        <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
       </div>
     </div>
 
@@ -91,22 +85,15 @@
               <el-color-picker v-model="form.bgColor" />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <!-- <el-col :span="12">
             <el-form-item label="字体颜色">
               <el-color-picker v-model="form.labelColor" />
             </el-form-item>
-          </el-col>
+          </el-col> -->
         </el-row>
         <el-form-item label="楼层标签">
           <div class="label-list">
-            <el-tag
-              v-for="(tag, index) in form.labels"
-              :key="index"
-              closable
-              type="info"
-              class="label-tag"
-              @close="handleRemoveLabel(index)"
-            >
+            <el-tag v-for="(tag, index) in form.labels" :key="index" closable type="info" class="label-tag" @close="handleRemoveLabel(index)">
               {{ tag.labelName }}
             </el-tag>
             <el-button size="small" @click="handleAddLabel">添加标签</el-button>
@@ -254,7 +241,7 @@ const handleEdit = async (row: any) => {
   const res = await getFloor(row.id);
   const data = res.data || res;
   currentFloorNo.value = data.floorNo;
-  
+
   // 获取该楼层的标签列表(position=1 表示楼层顶部标签)
   let labels: LabelItem[] = [];
   if (data.floorNo) {
@@ -270,7 +257,7 @@ const handleEdit = async (row: any) => {
       console.error('获取标签失败', e);
     }
   }
-  
+
   form.value = {
     id: data.id,
     floorNo: data.floorNo,
@@ -319,7 +306,7 @@ const handleRemoveLabel = async (index: number) => {
 // 确认添加标签
 const confirmAddLabel = async () => {
   await labelFormRef.value?.validate();
-  
+
   // 如果是编辑模式且有楼层编号,直接调用接口保存
   if (currentFloorNo.value) {
     try {
@@ -362,7 +349,7 @@ const submitForm = () => {
         // 新增楼层,后端会返回包含floorNo的数据
         const res = await addFloor(form.value);
         const newFloorNo = res.data?.floorNo;
-        
+
         // 如果有临时标签,用返回的floorNo保存
         if (newFloorNo && form.value.labels.length > 0) {
           for (const label of form.value.labels) {
@@ -446,10 +433,12 @@ onMounted(() => {
 .action-link {
   cursor: pointer;
   margin: 0 8px;
-  
+
   &.primary {
     color: #409eff;
-    &:hover { color: #66b1ff; }
+    &:hover {
+      color: #66b1ff;
+    }
   }
 }
 

+ 2 - 2
src/views/platform/decoration/floorAd/index.vue

@@ -96,11 +96,11 @@
                   <upload-image v-model="form.imageUrl" :limit="1" />
                 </el-form-item>
               </el-col>
-              <el-col :span="12" v-if="activeTab === 'icon'">
+              <!-- <el-col :span="12" v-if="activeTab === 'icon'">
                 <el-form-item label="背景色:">
                   <el-color-picker v-model="form.color" />
                 </el-form-item>
-              </el-col>
+              </el-col> -->
             </el-row>
             <el-form-item label="描述:">
               <el-input v-model="form.remark" type="textarea" :rows="3" placeholder="请输入描述" />

+ 40 - 13
src/views/platform/industrial/floorAd/index.vue

@@ -22,7 +22,9 @@
             >
               <el-image :src="item.imageUrl" fit="contain" class="triple-image">
                 <template #error>
-                  <div class="image-slot"><el-icon><Picture /></el-icon></div>
+                  <div class="image-slot">
+                    <el-icon><Picture /></el-icon>
+                  </div>
                 </template>
               </el-image>
             </div>
@@ -41,7 +43,9 @@
             >
               <div class="icon-img">
                 <el-image :src="item.imageUrl" fit="contain" class="icon-image">
-                  <template #error><el-icon size="32"><Picture /></el-icon></template>
+                  <template #error
+                    ><el-icon size="32"><Picture /></el-icon
+                  ></template>
                 </el-image>
               </div>
               <span class="icon-text">{{ item.title }}</span>
@@ -54,7 +58,9 @@
           <div class="logo-item" @click="selectAd(0)" :class="{ active: selectedIndex === 0 }">
             <el-image v-if="adList.length > 0" :src="adList[0]?.imageUrl" fit="contain" class="logo-image">
               <template #error>
-                <div class="image-slot"><el-icon><Picture /></el-icon></div>
+                <div class="image-slot">
+                  <el-icon><Picture /></el-icon>
+                </div>
               </template>
             </el-image>
           </div>
@@ -116,7 +122,9 @@
             </el-row>
             <el-form-item label="图片:">
               <upload-image v-model="form.imageUrl" :limit="1" />
-              <div class="upload-tip">请上传大小不超过 <span class="tip-highlight">5MB</span> 格式为 <span class="tip-highlight">png/jpg/jpeg</span> 的文件</div>
+              <div class="upload-tip">
+                请上传大小不超过 <span class="tip-highlight">5MB</span> 格式为 <span class="tip-highlight">png/jpg/jpeg</span> 的文件
+              </div>
             </el-form-item>
             <el-form-item label="描述:">
               <el-input v-model="form.remark" type="textarea" :rows="3" placeholder="请输入描述" style="max-width: 500px" />
@@ -306,7 +314,6 @@ onMounted(() => {
 });
 </script>
 
-
 <style scoped lang="scss">
 .floor-ad-page {
   min-height: 100vh;
@@ -366,9 +373,16 @@ onMounted(() => {
     flex-shrink: 0;
     cursor: pointer;
     border: 2px solid transparent;
-    &:hover { opacity: 0.9; }
-    &.active { border-color: #409eff; }
-    .triple-image { width: 100%; height: 100%; }
+    &:hover {
+      opacity: 0.9;
+    }
+    &.active {
+      border-color: #409eff;
+    }
+    .triple-image {
+      width: 100%;
+      height: 100%;
+    }
   }
 }
 
@@ -387,8 +401,13 @@ onMounted(() => {
     cursor: pointer;
     border-radius: 4px;
     border: 2px solid transparent;
-    &:hover { background: #f5f5f5; }
-    &.active { border-color: #409eff; background: #ecf5ff; }
+    &:hover {
+      background: #f5f5f5;
+    }
+    &.active {
+      border-color: #409eff;
+      background: #ecf5ff;
+    }
 
     .icon-img {
       width: 50px;
@@ -397,7 +416,10 @@ onMounted(() => {
       align-items: center;
       justify-content: center;
       margin-bottom: 6px;
-      .icon-image { width: 100%; height: 100%; }
+      .icon-image {
+        width: 100%;
+        height: 100%;
+      }
     }
 
     .icon-text {
@@ -413,8 +435,13 @@ onMounted(() => {
     height: 80px;
     cursor: pointer;
     border: 2px solid transparent;
-    &.active { border-color: #409eff; }
-    .logo-image { width: 100%; height: 100%; }
+    &.active {
+      border-color: #409eff;
+    }
+    .logo-image {
+      width: 100%;
+      height: 100%;
+    }
   }
 }
 

+ 26 - 41
src/views/platform/operation/theme/edit.vue

@@ -24,12 +24,7 @@
           <el-col :span="8">
             <el-form-item label="类别" prop="category">
               <el-select v-model="form.category" placeholder="请选择" style="width: 100%" filterable>
-                <el-option
-                  v-for="item in sceneList"
-                  :key="item.sceneCode"
-                  :label="item.sceneName"
-                  :value="item.sceneCode"
-                />
+                <el-option v-for="item in sceneList" :key="item.sceneCode" :label="item.sceneName" :value="item.sceneCode" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -39,24 +34,14 @@
           <el-col :span="8">
             <el-form-item label="适配场景" prop="adaptNo">
               <el-select v-model="form.adaptNo" placeholder="请选择" style="width: 100%" filterable>
-                <el-option
-                  v-for="item in sceneList"
-                  :key="item.sceneCode"
-                  :label="item.sceneName"
-                  :value="item.sceneCode"
-                />
+                <el-option v-for="item in sceneList" :key="item.sceneCode" :label="item.sceneName" :value="item.sceneCode" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="适配行业" prop="adaptIndustry">
               <el-select v-model="form.adaptIndustry" placeholder="请选择" style="width: 100%" filterable>
-                <el-option
-                  v-for="item in industryList"
-                  :key="item.id"
-                  :label="item.industryCategoryName"
-                  :value="String(item.id)"
-                />
+                <el-option v-for="item in industryList" :key="item.id" :label="item.industryCategoryName" :value="String(item.id)" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -71,35 +56,18 @@
           <el-col :span="8">
             <el-form-item label="标签" prop="label">
               <el-select v-model="form.label" placeholder="请选择" style="width: 100%" filterable>
-                <el-option
-                  v-for="item in tagList"
-                  :key="item.id"
-                  :label="item.tagName"
-                  :value="item.tagCode"
-                />
+                <el-option v-for="item in tagList" :key="item.id" :label="item.tagName" :value="item.tagCode" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="开始时间" prop="startTime">
-              <el-date-picker
-                v-model="form.startTime"
-                type="datetime"
-                placeholder="请选择"
-                value-format="YYYY-MM-DD HH:mm:ss"
-                style="width: 100%"
-              />
+              <el-date-picker v-model="form.startTime" type="datetime" placeholder="请选择" value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="结束时间" prop="endTime">
-              <el-date-picker
-                v-model="form.endTime"
-                type="datetime"
-                placeholder="请选择"
-                value-format="YYYY-MM-DD HH:mm:ss"
-                style="width: 100%"
-              />
+              <el-date-picker v-model="form.endTime" type="datetime" placeholder="请选择" value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -163,7 +131,7 @@
 </template>
 
 <script setup name="ThemeEdit" lang="ts">
-import { ref, computed, onMounted, getCurrentInstance } from 'vue';
+import { ref, computed, onMounted, onActivated, getCurrentInstance } from 'vue';
 import type { ComponentInternalInstance } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { useRoute, useRouter } from 'vue-router';
@@ -181,7 +149,8 @@ const themeId = computed(() => route.params.id as string);
 const isEdit = computed(() => !!themeId.value);
 
 const formRef = ref<FormInstance>();
-const form = ref({
+
+const getDefaultForm = () => ({
   id: undefined as number | undefined,
   themeNo: '',
   themeName: '',
@@ -207,11 +176,15 @@ const form = ref({
   remark: ''
 });
 
+const form = ref(getDefaultForm());
+
 const rules = {
   themeName: [{ required: true, message: '请输入主题名称', trigger: 'blur' }],
   subtitle: [{ required: true, message: '请输入副标题', trigger: 'blur' }],
   description: [{ required: true, message: '请输入描述', trigger: 'blur' }],
-  titlePage: [{ required: true, message: '请上传内页图片', trigger: 'change' }]
+  titlePage: [{ required: true, message: '请上传内页图片', trigger: 'change' }],
+  startTime: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
+  endTime: [{ required: true, message: '请选择结束时间', trigger: 'change' }]
 };
 
 // 行业列表
@@ -294,6 +267,18 @@ onMounted(() => {
   getTagList();
   if (isEdit.value) {
     getDetail();
+  } else {
+    Object.assign(form.value, getDefaultForm());
+    formRef.value?.resetFields();
+  }
+});
+
+onActivated(() => {
+  if (isEdit.value) {
+    getDetail();
+  } else {
+    Object.assign(form.value, getDefaultForm());
+    formRef.value?.resetFields();
   }
 });
 </script>

+ 8 - 15
src/views/platform/operation/theme/index.vue

@@ -12,12 +12,7 @@
           </el-form-item>
           <el-form-item label="推文类别">
             <el-select v-model="queryParams.category" placeholder="请选择" clearable style="width: 160px">
-              <el-option
-                v-for="item in sceneList"
-                :key="item.sceneCode"
-                :label="item.sceneName"
-                :value="item.sceneCode"
-              />
+              <el-option v-for="item in sceneList" :key="item.sceneCode" :label="item.sceneName" :value="item.sceneCode" />
             </el-select>
           </el-form-item>
           <el-form-item>
@@ -55,20 +50,14 @@
           </el-table-column>
         </el-table>
 
-        <pagination
-          v-show="total > 0"
-          v-model:page="queryParams.pageNum"
-          v-model:limit="queryParams.pageSize"
-          :total="total"
-          @pagination="getList"
-        />
+        <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
       </div>
     </div>
   </div>
 </template>
 
 <script setup name="OperationTheme" lang="ts">
-import { ref, reactive, onMounted, getCurrentInstance } from 'vue';
+import { ref, reactive, onMounted, onActivated, getCurrentInstance } from 'vue';
 import type { ComponentInternalInstance } from 'vue';
 import { useRouter } from 'vue-router';
 import { listTheme, delTheme } from '@/api/product/theme';
@@ -106,7 +95,7 @@ const getSceneList = async () => {
 
 // 获取类别名称
 const getCategoryLabel = (code: string) => {
-  const item = sceneList.value.find(s => s.sceneCode === code);
+  const item = sceneList.value.find((s) => s.sceneCode === code);
   return item ? item.sceneName : '-';
 };
 
@@ -166,6 +155,10 @@ onMounted(() => {
   getSceneList();
   getList();
 });
+
+onActivated(() => {
+  getList();
+});
 </script>
 
 <style scoped lang="scss">

+ 39 - 82
src/views/product/productProgram/form.vue

@@ -24,12 +24,7 @@
           <el-col :span="8">
             <el-form-item label="推文类别" prop="category">
               <el-select v-model="form.category" placeholder="请选择" clearable style="width: 100%">
-                <el-option
-                  v-for="item in purchaseCategoryOptions"
-                  :key="item.id"
-                  :label="item.categoryName"
-                  :value="String(item.id)"
-                />
+                <el-option v-for="item in purchaseCategoryOptions" :key="item.id" :label="item.categoryName" :value="String(item.id)" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -37,12 +32,7 @@
           <el-col :span="8">
             <el-form-item label="适配场景" prop="adaptNo">
               <el-select v-model="form.adaptNo" placeholder="请选择" clearable style="width: 100%">
-                <el-option
-                  v-for="item in sceneOptions"
-                  :key="item.id"
-                  :label="item.sceneName"
-                  :value="String(item.id)"
-                />
+                <el-option v-for="item in sceneOptions" :key="item.id" :label="item.sceneName" :value="String(item.id)" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -53,12 +43,7 @@
           <el-col :span="8">
             <el-form-item label="适配行业" prop="industry">
               <el-select v-model="form.industry" placeholder="请选择" clearable style="width: 100%">
-                <el-option
-                  v-for="item in industryOptions"
-                  :key="item.id"
-                  :label="item.industryCategoryName"
-                  :value="String(item.id)"
-                />
+                <el-option v-for="item in industryOptions" :key="item.id" :label="item.industryCategoryName" :value="String(item.id)" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -66,23 +51,14 @@
           <el-col :span="8">
             <el-form-item label="标签" prop="label">
               <el-select v-model="form.label" placeholder="请选择" clearable style="width: 100%" @change="handleLabelChange">
-                <el-option
-                  v-for="item in tagOptions"
-                  :key="item.id"
-                  :label="item.tagName"
-                  :value="String(item.id)"
-                />
+                <el-option v-for="item in tagOptions" :key="item.id" :label="item.tagName" :value="String(item.id)" />
               </el-select>
             </el-form-item>
           </el-col>
           <!-- 显示设置 -->
           <el-col :span="8">
             <el-form-item label="显示设置" prop="isShow">
-              <el-switch
-                v-model="form.isShow"
-                active-value="1"
-                inactive-value="0"
-              />
+              <el-switch v-model="form.isShow" active-value="1" inactive-value="0" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -97,12 +73,7 @@
                   <span class="ml-1">从图片库选择</span>
                 </el-button>
                 <div v-if="form.coverImage" class="ml-4 flex items-center">
-                  <el-image
-                    :src="coverImageUrl"
-                    style="width: 80px; height: 80px"
-                    fit="cover"
-                    :preview-src-list="[coverImageUrl]"
-                  />
+                  <el-image :src="coverImageUrl" style="width: 80px; height: 80px" fit="cover" :preview-src-list="[coverImageUrl]" />
                   <el-button v-if="!isViewMode" link type="danger" class="ml-2" @click="clearCoverImage">
                     <el-icon><Delete /></el-icon>
                   </el-button>
@@ -122,12 +93,7 @@
                   <span class="ml-1">从图片库选择</span>
                 </el-button>
                 <div v-if="form.innerAdvert" class="ml-4 flex items-center">
-                  <el-image
-                    :src="advertImageUrl"
-                    style="width: 80px; height: 80px"
-                    fit="cover"
-                    :preview-src-list="[advertImageUrl]"
-                  />
+                  <el-image :src="advertImageUrl" style="width: 80px; height: 80px" fit="cover" :preview-src-list="[advertImageUrl]" />
                   <el-button v-if="!isViewMode" link type="danger" class="ml-2" @click="clearAdvertImage">
                     <el-icon><Delete /></el-icon>
                   </el-button>
@@ -141,27 +107,17 @@
           <!-- 描述 -->
           <el-col :span="24">
             <el-form-item label="描述" prop="describe">
-              <el-input
-                v-model="form.describe"
-                type="textarea"
-                :rows="5"
-                placeholder="请输入描述内容"
-              />
+              <el-input v-model="form.describe" type="textarea" :rows="5" placeholder="请输入描述内容" />
             </el-form-item>
           </el-col>
         </el-row>
 
         <!-- 添加商品区域 -->
-        <el-row :gutter="20" >
+        <el-row :gutter="20">
           <el-col :span="24">
             <el-form-item label="添加商品">
               <div class="flex items-center gap-2">
-                <el-input
-                  v-model="productKeyword"
-                  placeholder="商品名称/商品编号"
-                  style="width: 200px"
-                  :disabled="isViewMode"
-                />
+                <el-input v-model="productKeyword" placeholder="商品名称/商品编号" style="width: 200px" :disabled="isViewMode" />
                 <!-- <el-button @click="handleAddProduct" :disabled="isViewMode">
                   <el-icon><Plus /></el-icon>
                   <span class="ml-1">加入</span>
@@ -320,12 +276,12 @@ const initFormData: ProgramForm = {
   describe: undefined,
   category: undefined,
   isShow: '1',
-  coverImage: undefined,
+  coverImage: '',
   content: undefined,
   industry: undefined,
   adaptNo: undefined,
   label: undefined,
-  innerAdvert: undefined,
+  innerAdvert: '',
   remark: undefined,
   productIds: []
 };
@@ -334,7 +290,8 @@ const form = ref<ProgramForm>({ ...initFormData });
 
 // 表单验证规则
 const rules = reactive({
-  title: [{ required: true, message: '产品标题不能为空', trigger: 'blur' }]
+  title: [{ required: true, message: '产品标题不能为空', trigger: 'blur' }],
+  describe: [{ required: true, message: '描述不能为空', trigger: 'blur' }]
 });
 
 // 封面图URL计算
@@ -396,9 +353,9 @@ const getDetail = async (id: string | number) => {
     const links: ProgramLinkVO[] = linkRes.rows || [];
     console.log('已关联商品列表', links);
     if (links.length > 0) {
-      const results = await Promise.all(links.map(link => getBase(link.productId)));
+      const results = await Promise.all(links.map((link) => getBase(link.productId)));
       productList.value = results
-        .map(r => r.data)
+        .map((r) => r.data)
         .filter(Boolean)
         .map((item: any) => ({
           id: item.id,
@@ -452,7 +409,7 @@ const handleCoverSelected = (files: any[]) => {
 
 /** 清除封面图 */
 const clearCoverImage = () => {
-  form.value.coverImage = undefined;
+  form.value.coverImage = '';
 };
 
 /** 处理广告图选择 */
@@ -464,7 +421,7 @@ const handleAdvertSelected = (files: any[]) => {
 
 /** 清除广告图 */
 const clearAdvertImage = () => {
-  form.value.innerAdvert = undefined;
+  form.value.innerAdvert = '';
 };
 
 /** 添加商品 */
@@ -505,8 +462,8 @@ const handleConfirmImport = async () => {
     const productNos = importForm.productNos
       .replace(/,/g, ',')
       .split(',')
-      .map(no => no.trim())
-      .filter(no => no);
+      .map((no) => no.trim())
+      .filter((no) => no);
 
     if (productNos.length === 0) {
       proxy?.$modal.msgWarning('请输入有效的商品编号');
@@ -548,7 +505,7 @@ const handleConfirmImport = async () => {
 const addProductsToList = (products: BaseVO[]) => {
   for (const product of products) {
     // 检查是否已存在
-    const exists = productList.value.some(item => item.productNo === product.productNo);
+    const exists = productList.value.some((item) => item.productNo === product.productNo);
     if (!exists) {
       const productAny = product as any;
       productList.value.push({
@@ -591,18 +548,15 @@ const handleSubmit = async () => {
           // 获取已有关联,进行差异同步
           const existRes = await listProgramLink({ programId, pageNum: 1, pageSize: 500 });
           const existLinks: ProgramLinkVO[] = existRes.data || [];
-          const existProductIds = existLinks.map(l => String(l.productId));
-          const newProductIds = productList.value.map(item => String(item.id)).filter(Boolean);
+          const existProductIds = existLinks.map((l) => String(l.productId));
+          const newProductIds = productList.value.map((item) => String(item.id)).filter(Boolean);
 
           // 需要删除的关联
-          const toDelete = existLinks.filter(l => !newProductIds.includes(String(l.productId)));
+          const toDelete = existLinks.filter((l) => !newProductIds.includes(String(l.productId)));
           // 需要新增的关联
-          const toAdd = newProductIds.filter(pid => !existProductIds.includes(pid));
+          const toAdd = newProductIds.filter((pid) => !existProductIds.includes(pid));
 
-          await Promise.all([
-            ...toDelete.map(l => delProgramLink(l.id)),
-            ...toAdd.map(pid => addProgramLink({ programId, productId: pid }))
-          ]);
+          await Promise.all([...toDelete.map((l) => delProgramLink(l.id)), ...toAdd.map((pid) => addProgramLink({ programId, productId: pid }))]);
         } else {
           // 新增:先创建方案
           const addRes = await addProgram(form.value);
@@ -610,11 +564,9 @@ const handleSubmit = async () => {
           programId = addData?.id || addData?.data?.id;
 
           // 新增所有关联商品
-          const newProductIds = productList.value.map(item => item.id).filter(Boolean);
+          const newProductIds = productList.value.map((item) => item.id).filter(Boolean);
           if (programId && newProductIds.length > 0) {
-            await Promise.all(
-              newProductIds.map(pid => addProgramLink({ programId, productId: pid }))
-            );
+            await Promise.all(newProductIds.map((pid) => addProgramLink({ programId, productId: pid })));
           }
         }
 
@@ -630,12 +582,7 @@ const handleSubmit = async () => {
 /** 初始化 */
 onMounted(async () => {
   // 加载下拉选项
-  await Promise.all([
-    getPurchaseCategoryList(),
-    getSceneList(),
-    getIndustryList(),
-    getTagList()
-  ]);
+  await Promise.all([getPurchaseCategoryList(), getSceneList(), getIndustryList(), getTagList()]);
 
   // 如果有id参数,加载详情
   const id = route.query.id;
@@ -643,6 +590,16 @@ onMounted(async () => {
     await getDetail(id as string);
   }
 });
+
+onActivated(async () => {
+  const id = route.query.id;
+  if (id) {
+    await getDetail(id as string);
+  } else {
+    form.value = { ...initFormData };
+    formRef.value?.resetFields();
+  }
+});
 </script>
 
 <style scoped>

+ 4 - 0
src/views/product/productProgram/index.vue

@@ -162,4 +162,8 @@ onMounted(async () => {
   await getPurchaseCategoryList();
   getList();
 });
+
+onActivated(() => {
+  getList();
+});
 </script>

+ 27 - 72
src/views/product/program/form.vue

@@ -17,35 +17,20 @@
           <!-- 推文标题 -->
           <el-col :span="8">
             <el-form-item label="推文标题" prop="tweetsTitle">
-              <el-input
-                v-model="form.tweetsTitle"
-                type="textarea"
-                :rows="3"
-                placeholder="请输入推文标题"
-              />
+              <el-input v-model="form.tweetsTitle" type="textarea" :rows="3" placeholder="请输入推文标题" />
             </el-form-item>
           </el-col>
           <!-- 副标题 -->
           <el-col :span="8">
             <el-form-item label="副标题" prop="subtitle">
-              <el-input
-                v-model="form.subtitle"
-                type="textarea"
-                :rows="3"
-                placeholder="请输入副标题"
-              />
+              <el-input v-model="form.subtitle" type="textarea" :rows="3" placeholder="请输入副标题" />
             </el-form-item>
           </el-col>
           <!-- 推文类别 -->
           <el-col :span="8">
             <el-form-item label="推文类别" prop="tweetsCategory">
               <el-select v-model="form.tweetsCategory" placeholder="选择分类" clearable style="width: 100%">
-                <el-option
-                  v-for="item in purchaseCategoryOptions"
-                  :key="item.id"
-                  :label="item.categoryName"
-                  :value="item.id"
-                />
+                <el-option v-for="item in purchaseCategoryOptions" :key="item.id" :label="item.categoryName" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -56,12 +41,7 @@
           <el-col :span="8">
             <el-form-item label="适配场景" prop="adaptNo">
               <el-select v-model="form.adaptNo" placeholder="选择分类" clearable style="width: 100%">
-                <el-option
-                  v-for="item in sceneOptions"
-                  :key="item.id"
-                  :label="item.sceneName"
-                  :value="item.id"
-                />
+                <el-option v-for="item in sceneOptions" :key="item.id" :label="item.sceneName" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -69,12 +49,7 @@
           <el-col :span="8">
             <el-form-item label="适配行业" prop="adaptIndustry">
               <el-select v-model="form.adaptIndustry" placeholder="请选择" clearable style="width: 100%">
-                <el-option
-                  v-for="item in industryOptions"
-                  :key="item.id"
-                  :label="item.industryCategoryName"
-                  :value="item.id"
-                />
+                <el-option v-for="item in industryOptions" :key="item.id" :label="item.industryCategoryName" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -91,35 +66,20 @@
           <el-col :span="8">
             <el-form-item label="标签" prop="lable">
               <el-select v-model="form.lable" placeholder="选择分类" clearable style="width: 100%">
-                <el-option
-                  v-for="item in tagOptions"
-                  :key="item.id"
-                  :label="item.tagName"
-                  :value="item.id"
-                />
+                <el-option v-for="item in tagOptions" :key="item.id" :label="item.tagName" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
           <!-- 失效时间 -->
           <el-col :span="8">
             <el-form-item label="失效时间" prop="invalidTime">
-              <el-date-picker
-                v-model="form.invalidTime"
-                type="date"
-                placeholder="请选择日期"
-                value-format="YYYY-MM-DD"
-                style="width: 100%"
-              />
+              <el-date-picker v-model="form.invalidTime" type="date" placeholder="请选择日期" value-format="YYYY-MM-DD" style="width: 100%" />
             </el-form-item>
           </el-col>
           <!-- 显示设置 -->
           <el-col :span="8">
             <el-form-item label="显示设置" prop="isShow">
-              <el-switch
-                v-model="form.isShow"
-                :active-value="1"
-                :inactive-value="0"
-              />
+              <el-switch v-model="form.isShow" :active-value="1" :inactive-value="0" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -138,12 +98,7 @@
                   <span class="ml-1">从图片库选择</span>
                 </el-button>
                 <div v-if="form.coverImage" class="ml-4 flex items-center">
-                  <el-image
-                    :src="coverImageUrl"
-                    style="width: 60px; height: 60px"
-                    fit="cover"
-                    :preview-src-list="[coverImageUrl]"
-                  />
+                  <el-image :src="coverImageUrl" style="width: 60px; height: 60px" fit="cover" :preview-src-list="[coverImageUrl]" />
                   <el-button link type="danger" class="ml-2" @click="clearCoverImage">
                     <el-icon><Delete /></el-icon>
                   </el-button>
@@ -175,12 +130,7 @@
           <!-- 描述 -->
           <el-col :span="24">
             <el-form-item label="描述" prop="programDescribe">
-              <el-input
-                v-model="form.programDescribe"
-                type="textarea"
-                :rows="5"
-                placeholder="请输入内容"
-              />
+              <el-input v-model="form.programDescribe" type="textarea" :rows="5" placeholder="请输入内容" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -286,17 +236,17 @@ const initFormData: ProgramForm = {
   programDescribe: undefined,
   tweetsCategory: undefined,
   isShow: 1,
-  coverImage: undefined,
+  coverImage: '',
   imageList: undefined,
   clicks: undefined,
   collects: undefined,
   price: undefined,
   adaptNo: undefined,
   lable: undefined,
-  uploadScheme: undefined,
+  uploadScheme: '',
   adaptIndustry: undefined,
   invalidTime: undefined,
-  filename: undefined,
+  filename: '',
   status: undefined,
   remark: undefined
 };
@@ -396,7 +346,7 @@ const handleCoverSelected = (files: any[]) => {
 
 /** 清除封面图 */
 const clearCoverImage = () => {
-  form.value.coverImage = undefined;
+  form.value.coverImage = '';
 };
 
 /** 处理方案文件选择 */
@@ -409,8 +359,8 @@ const handleSchemeSelected = (files: any[]) => {
 
 /** 清除方案文件 */
 const clearScheme = () => {
-  form.value.uploadScheme = undefined;
-  form.value.filename = undefined;
+  form.value.uploadScheme = '';
+  form.value.filename = '';
 };
 
 /** 提交表单 */
@@ -436,12 +386,7 @@ const handleSubmit = async () => {
 /** 初始化 */
 onMounted(async () => {
   // 加载下拉选项
-  await Promise.all([
-    getPurchaseCategoryList(),
-    getSceneList(),
-    getIndustryList(),
-    getTagList()
-  ]);
+  await Promise.all([getPurchaseCategoryList(), getSceneList(), getIndustryList(), getTagList()]);
 
   // 如果有id参数,加载详情
   const id = route.query.id;
@@ -449,6 +394,16 @@ onMounted(async () => {
     await getDetail(id as string);
   }
 });
+
+onActivated(async () => {
+  const id = route.query.id;
+  if (id) {
+    await getDetail(id as string);
+  } else {
+    form.value = { ...initFormData };
+    formRef.value?.resetFields();
+  }
+});
 </script>
 
 <style scoped>

+ 4 - 0
src/views/product/program/index.vue

@@ -366,4 +366,8 @@ onMounted(() => {
   getPurchaseCategoryList();
   getList();
 });
+
+onActivated(() => {
+  getList();
+});
 </script>

+ 24 - 62
src/views/product/topics/form.vue

@@ -30,12 +30,7 @@
           <el-col :span="8">
             <el-form-item label="推文类型" prop="tweetType">
               <el-select v-model="form.tweetType" placeholder="请选择" clearable style="width: 100%">
-                <el-option
-                  v-for="item in purchaseCategoryOptions"
-                  :key="item.id"
-                  :label="item.categoryName"
-                  :value="item.id"
-                />
+                <el-option v-for="item in purchaseCategoryOptions" :key="item.id" :label="item.categoryName" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -46,12 +41,7 @@
           <el-col :span="8">
             <el-form-item label="推文类别" prop="tweetCategory">
               <el-select v-model="form.tweetCategory" placeholder="请选择" clearable style="width: 100%">
-                <el-option
-                  v-for="item in purchaseCategoryOptions"
-                  :key="item.id"
-                  :label="item.categoryName"
-                  :value="item.id"
-                />
+                <el-option v-for="item in purchaseCategoryOptions" :key="item.id" :label="item.categoryName" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -59,12 +49,7 @@
           <el-col :span="8">
             <el-form-item label="适配场景" prop="adaptNo">
               <el-select v-model="form.adaptNo" placeholder="请选择" clearable style="width: 100%">
-                <el-option
-                  v-for="item in sceneOptions"
-                  :key="item.id"
-                  :label="item.sceneName"
-                  :value="item.id"
-                />
+                <el-option v-for="item in sceneOptions" :key="item.id" :label="item.sceneName" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -72,12 +57,7 @@
           <el-col :span="8">
             <el-form-item label="适配行业" prop="adaptIndustry">
               <el-select v-model="form.adaptIndustry" placeholder="请选择" clearable style="width: 100%">
-                <el-option
-                  v-for="item in industryOptions"
-                  :key="String(item.id)"
-                  :label="item.industryCategoryName"
-                  :value="String(item.id)"
-                />
+                <el-option v-for="item in industryOptions" :key="String(item.id)" :label="item.industryCategoryName" :value="String(item.id)" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -94,23 +74,14 @@
           <el-col :span="8">
             <el-form-item label="标签" prop="lable">
               <el-select v-model="form.lable" placeholder="请选择" clearable style="width: 100%">
-                <el-option
-                  v-for="item in tagOptions"
-                  :key="String(item.id)"
-                  :label="item.tagName"
-                  :value="String(item.id)"
-                />
+                <el-option v-for="item in tagOptions" :key="String(item.id)" :label="item.tagName" :value="String(item.id)" />
               </el-select>
             </el-form-item>
           </el-col>
           <!-- 是否显示 -->
           <el-col :span="8">
             <el-form-item label="是否显示" prop="isShow">
-              <el-switch
-                v-model="form.isShow"
-                :active-value="1"
-                :inactive-value="0"
-              />
+              <el-switch v-model="form.isShow" :active-value="1" :inactive-value="0" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -119,11 +90,7 @@
           <!-- 相关推荐 -->
           <el-col :span="8">
             <el-form-item label="相关推荐" prop="isRelevant">
-              <el-switch
-                v-model="form.isRelevant"
-                :active-value="1"
-                :inactive-value="0"
-              />
+              <el-switch v-model="form.isRelevant" :active-value="1" :inactive-value="0" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -142,12 +109,7 @@
                   <span class="ml-1">从图片库选择</span>
                 </el-button>
                 <div v-if="form.coverImage" class="ml-4 flex items-center">
-                  <el-image
-                    :src="coverImageUrl"
-                    style="width: 60px; height: 60px"
-                    fit="cover"
-                    :preview-src-list="[coverImageUrl]"
-                  />
+                  <el-image :src="coverImageUrl" style="width: 60px; height: 60px" fit="cover" :preview-src-list="[coverImageUrl]" />
                   <el-button v-if="!isViewMode" link type="danger" class="ml-2" @click="clearCoverImage">
                     <el-icon><Delete /></el-icon>
                   </el-button>
@@ -179,12 +141,7 @@
           <!-- 描述 -->
           <el-col :span="24">
             <el-form-item label="描述" prop="topicsDescribe">
-              <el-input
-                v-model="form.topicsDescribe"
-                type="textarea"
-                :rows="5"
-                placeholder="请输入描述内容"
-              />
+              <el-input v-model="form.topicsDescribe" type="textarea" :rows="5" placeholder="请输入描述内容" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -315,8 +272,8 @@ const initFormData: TopicsForm = {
   lable: undefined,
   isShow: 1,
   isRelevant: 0,
-  coverImage: undefined,
-  uploadScheme: undefined,
+  coverImage: '',
+  uploadScheme: '',
   topicsDescribe: undefined,
   content: undefined,
   isHome: undefined,
@@ -428,7 +385,7 @@ const handleCoverSelected = (files: any[]) => {
 
 /** 清除封面图 */
 const clearCoverImage = () => {
-  form.value.coverImage = undefined;
+  form.value.coverImage = '';
 };
 
 /** 处理方案文件选择 */
@@ -441,7 +398,7 @@ const handleSchemeSelected = (files: any[]) => {
 
 /** 清除方案文件 */
 const clearScheme = () => {
-  form.value.uploadScheme = undefined;
+  form.value.uploadScheme = '';
   schemeFileName.value = '';
 };
 
@@ -468,12 +425,7 @@ const handleSubmit = async () => {
 /** 初始化 */
 onMounted(async () => {
   // 加载下拉选项
-  await Promise.all([
-    getPurchaseCategoryList(),
-    getSceneList(),
-    getIndustryList(),
-    getTagList()
-  ]);
+  await Promise.all([getPurchaseCategoryList(), getSceneList(), getIndustryList(), getTagList()]);
 
   // 如果有id参数,加载详情
   const id = route.query.id;
@@ -481,6 +433,16 @@ onMounted(async () => {
     await getDetail(id as string);
   }
 });
+
+onActivated(async () => {
+  const id = route.query.id;
+  if (id) {
+    await getDetail(id as string);
+  } else {
+    form.value = { ...initFormData };
+    formRef.value?.resetFields();
+  }
+});
 </script>
 
 <style scoped>

+ 23 - 29
src/views/product/topics/index.vue

@@ -9,22 +9,12 @@
             </el-form-item>
             <el-form-item label="推文类型" prop="tweetType">
               <el-select v-model="queryParams.tweetType" placeholder="请选择" clearable style="width: 200px">
-                <el-option
-                  v-for="item in purchaseCategoryOptions"
-                  :key="item.id"
-                  :label="item.categoryName"
-                  :value="item.id"
-                />
+                <el-option v-for="item in purchaseCategoryOptions" :key="item.id" :label="item.categoryName" :value="item.id" />
               </el-select>
             </el-form-item>
             <el-form-item label="推文类别" prop="tweetCategory">
               <el-select v-model="queryParams.tweetCategory" placeholder="请选择" clearable style="width: 200px">
-                <el-option
-                  v-for="item in purchaseCategoryOptions"
-                  :key="item.id"
-                  :label="item.categoryName"
-                  :value="item.id"
-                />
+                <el-option v-for="item in purchaseCategoryOptions" :key="item.id" :label="item.categoryName" :value="item.id" />
               </el-select>
             </el-form-item>
             <el-form-item>
@@ -41,8 +31,8 @@
         <div class="flex justify-between items-center">
           <span class="text-lg font-medium">采购指南信息列表</span>
           <div>
-            <el-button type="primary" icon="Plus" @click="handleAdd" >新增</el-button>
-            <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" style="display: inline-block; margin-left: 8px;"></right-toolbar>
+            <el-button type="primary" icon="Plus" @click="handleAdd">新增</el-button>
+            <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" style="display: inline-block; margin-left: 8px"></right-toolbar>
           </div>
         </div>
       </template>
@@ -94,8 +84,8 @@
         <el-table-column label="操作" align="center" width="120" fixed="right">
           <template #default="scope">
             <el-button link type="primary" @click="handleView(scope.row)">查看</el-button>
-            <el-button link type="primary" @click="handleUpdate(scope.row)" >编辑</el-button>
-            <el-button link type="danger" @click="handleDelete(scope.row)" >删除</el-button>
+            <el-button link type="primary" @click="handleUpdate(scope.row)">编辑</el-button>
+            <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -142,9 +132,9 @@ const getPurchaseCategoryList = async () => {
 /** 获取分类名称 */
 const getCategoryName = (id: any) => {
   if (!id) return '';
-  const category = purchaseCategoryOptions.value.find(item => String(item.id) === String(id));
+  const category = purchaseCategoryOptions.value.find((item) => String(item.id) === String(id));
   return category ? category.categoryName : id;
-}
+};
 
 /** 查询采购主题列表 */
 const getList = async () => {
@@ -153,50 +143,54 @@ const getList = async () => {
   topicsList.value = res.rows;
   total.value = res.total;
   loading.value = false;
-}
+};
 
 /** 搜索按钮操作 */
 const handleQuery = () => {
   queryParams.value.pageNum = 1;
   getList();
-}
+};
 
 /** 重置按钮操作 */
 const resetQuery = () => {
   queryFormRef.value?.resetFields();
   handleQuery();
-}
+};
 
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: TopicsVO[]) => {
-  ids.value = selection.map(item => item.id);
-}
+  ids.value = selection.map((item) => item.id);
+};
 
 /** 新增按钮操作 */
 const handleAdd = () => {
   router.push({ path: '/product/topics/form' });
-}
+};
 
 /** 查看按钮操作 */
 const handleView = (row: TopicsVO) => {
   router.push({ path: '/product/topics/form', query: { id: row.id, mode: 'view' } });
-}
+};
 
 /** 修改按钮操作 */
 const handleUpdate = (row: TopicsVO) => {
   router.push({ path: '/product/topics/form', query: { id: row.id } });
-}
+};
 
 /** 删除按钮操作 */
 const handleDelete = async (row: TopicsVO) => {
-  await proxy?.$modal.confirm('是否确认删除该采购指南?').finally(() => loading.value = false);
+  await proxy?.$modal.confirm('是否确认删除该采购指南?').finally(() => (loading.value = false));
   await delTopics(row.id);
-  proxy?.$modal.msgSuccess("删除成功");
+  proxy?.$modal.msgSuccess('删除成功');
   await getList();
-}
+};
 
 onMounted(async () => {
   await getPurchaseCategoryList();
   getList();
 });
+
+onActivated(() => {
+  getList();
+});
 </script>