Quellcode durchsuchen

✨ feat: 新增sb关键词定向; 修复重复调用上传错误;

WanGxC vor 1 Jahr
Ursprung
Commit
7deae2dd2b

+ 2 - 3
src/views/adManage/sb/campaigns/CreateCampaigns/component/AdCampaign.vue

@@ -127,13 +127,12 @@
 </template>
 
 <script lang="ts" setup>
-import { onMounted, reactive, ref, watch, defineEmits } from 'vue'
 import type { FormInstance, FormRules } from 'element-plus'
 import { ElMessage } from 'element-plus'
 import { storeToRefs } from 'pinia'
-import { useRouter, useRoute } from 'vue-router'
+import { defineEmits, onMounted, reactive, ref, watch } from 'vue'
+import { getAdMixSelect, getBrands, postCampaignsData } from '../api/index'
 import { useShopInfo } from '/@/stores/shopInfo'
-import { postCampaignsData, getAdMixSelect, getBrands } from '../api/index'
 import emitter from '/@/utils/emitter'
 
 const shopInfo = useShopInfo()

+ 4 - 4
src/views/adManage/sb/campaigns/CreateCampaigns/component/AdFormat.vue

@@ -131,14 +131,14 @@
 </template>
 
 <script setup lang="ts">
-import { ref, reactive, defineEmits, watch, onMounted, nextTick } from 'vue'
 import type { FormInstance, FormRules } from 'element-plus'
+import { storeToRefs } from 'pinia'
+import { defineEmits, onMounted, reactive, ref, watch } from 'vue'
+import { getBrands, getStoreurl } from '../api/index'
 import ProductSetCommodity from '../component/ProductSetCommodity.vue'
 import VideoCommodity from '../component/VideoCommodity.vue'
-import { getBrands, getStoreurl } from '../api/index'
-import emitter from '/@/utils/emitter'
-import { storeToRefs } from 'pinia'
 import { useShopInfo } from '/@/stores/shopInfo'
+import emitter from '/@/utils/emitter'
 
 const shopInfo = useShopInfo()
 const { profile } = storeToRefs(shopInfo)

+ 27 - 36
src/views/adManage/sb/campaigns/CreateCampaigns/component/KeywordTarget.vue

@@ -7,7 +7,6 @@
       <div style="width: 50%; border-right: 1px solid #e5e7eb">
         <el-tabs v-model="keyWordsTabs" class="demo-tabs">
           <div style="margin: 8px">
-            
             <div style="display: flex; align-items: center">
               <div style="min-width: 40px; margin-left: 8px; font-weight: 500; color: #616266">竞价:</div>
               <el-select v-model="bidType" class="m-2" placeholder="Select" style="width: 450px">
@@ -17,8 +16,8 @@
                 <template #prepend>$</template>
               </el-input>
             </div>
-            <div style="display: flex; align-items: center;">
-              <span style="margin: 0 10px 0 8px; font-weight: 500; color: #616266;">匹配类型: </span>
+            <div style="display: flex; align-items: center">
+              <span style="margin: 0 10px 0 8px; font-weight: 500; color: #616266">匹配类型: </span>
               <el-checkbox v-model="broadType" label="广泛" />
               <el-checkbox v-model="phraseType" label="词组" />
               <el-checkbox v-model="exactType" label="精确" />
@@ -37,8 +36,8 @@
             </el-table>
           </el-tab-pane>
           <el-tab-pane label="输入" name="second">
-            <el-input v-model="keyWordsTextarea" :rows="10" type="textarea" style="padding-left: 5px;" />
-            <div style="display: flex; flex-direction: row-reverse; margin-top: 10px;">
+            <el-input v-model="keyWordsTextarea" :rows="10" type="textarea" style="padding-left: 5px" />
+            <div style="display: flex; flex-direction: row-reverse; margin-top: 10px">
               <el-button type="primary" text bg @click="addKeyWords">添加</el-button>
             </div>
           </el-tab-pane>
@@ -67,7 +66,11 @@
                   <el-input v-model="scope.row.bid" placeholder="Please input bid" />
                 </template>
               </el-table-column>
-              <el-table-column prop="suggestBid" label="建议出价" />
+              <el-table-column prop="suggestBid" label="建议出价" align="center">
+                <template #default="{ row }">
+                  <div>{{ row.adviceBid ? row.adviceBid : '--' }}</div>
+                </template>
+              </el-table-column>
               <el-table-column prop="operate" label="操作" width="60" align="right">
                 <template #default="scope">
                   <el-button type="danger" size="small" link @click="delSingleKeyWord(scope)">删除</el-button>
@@ -85,12 +88,10 @@
 </template>
 
 <script setup lang="ts">
-import { Ref, inject, ref, watch } from 'vue'
 import { ElMessage } from 'element-plus'
-import { useShopInfo } from '/@/stores/shopInfo'
-import { usePublicData } from '/@/stores/publicData'
 import { storeToRefs } from 'pinia'
-import { useRouter } from 'vue-router'
+import { Ref, inject, ref } from 'vue'
+import { useShopInfo } from '/@/stores/shopInfo'
 import { request } from '/@/utils/service'
 
 const respCampaignId = inject<Ref>('respCampaignId')
@@ -105,7 +106,7 @@ const bidTypeOptions = [
   {
     value: 'suggestBid',
     label: '建议出价',
-    disabled: true
+    disabled: true,
   },
   {
     value: 'customBid',
@@ -114,7 +115,7 @@ const bidTypeOptions = [
   {
     value: 'defaultBid',
     label: '默认出价',
-    disabled: true
+    disabled: true,
   },
 ]
 
@@ -126,14 +127,14 @@ let broadType = ref(true)
 let phraseType = ref(true)
 let exactType = ref(true)
 const MATCH_TYPE = {
-  BROAD: '广泛',
-  PHRASE: '词组',
-  EXACT: '精确',
+  broad: '广泛',
+  phrase: '词组',
+  exact: '精确',
 }
 const MATCH_TYPE_MAP = {
-  广泛: 'BROAD',
-  词组: 'PHRASE',
-  精确: 'EXACT',
+  广泛: 'broad',
+  词组: 'phrase',
+  精确: 'exact',
 }
 const successCount = ref('')
 const errorCount = ref('')
@@ -146,13 +147,13 @@ function addKeyWords() {
     const trimmedItem = item.trim()
     if (trimmedItem) {
       if (broadType.value) {
-        addKeyWordEntry(trimmedItem, MATCH_TYPE.BROAD)
+        addKeyWordEntry(trimmedItem, MATCH_TYPE.broad)
       }
       if (phraseType.value) {
-        addKeyWordEntry(trimmedItem, MATCH_TYPE.PHRASE)
+        addKeyWordEntry(trimmedItem, MATCH_TYPE.phrase)
       }
       if (exactType.value) {
-        addKeyWordEntry(trimmedItem, MATCH_TYPE.EXACT)
+        addKeyWordEntry(trimmedItem, MATCH_TYPE.exact)
       }
     } else {
       ElMessage({
@@ -165,18 +166,6 @@ function addKeyWords() {
 }
 
 function addKeyWordEntry(keyword, matchType) {
-  // let bidValue
-  // switch (bidType.value) {
-  //   case 'customBid':
-  //     bidValue = bidInput.value
-  //     break
-  //   case 'defaultBid':
-  //     // bidValue = adGroupRuleForm.defaultBidInp
-  //     break
-  //   default:
-  //     bidValue = ''
-  // }
-
   let keyWordEntry = {
     keyword: keyword,
     matchType: matchType,
@@ -206,16 +195,18 @@ function delAllKeyWords() {
   addedKeyWordsTableData.value = []
 }
 
+// TODO: 必须要创建了商品之后才能创建关键词定向
 async function keyWordsSave() {
   keywordsLoading.value = true
   successCount.value = ''
   errorCount.value = ''
+
   const keywordList = addedKeyWordsTableData.value.map((kw) => ({
     keywordText: kw.keyword,
     bid: kw.bid,
     matchType: MATCH_TYPE_MAP[kw.matchType],
   }))
-  
+
   const requestData = {
     profile_id: profile.value.profile_id,
     campaignId: respCampaignId.value,
@@ -225,7 +216,7 @@ async function keyWordsSave() {
   const filteredRequestData = Object.fromEntries(Object.entries(requestData).filter(([_, v]) => v != null))
   try {
     const resp = await request({
-      url: '/api/ad_manage/sptargets/add/keywords/',
+      url: '/api/ad_manage/sbtargets/add/keywords/',
       method: 'POST',
       data: filteredRequestData,
     })
@@ -247,7 +238,7 @@ async function keyWordsSave() {
   }
 }
 
-const headerCellStyle = (args) => {
+function headerCellStyle(args) {
   if (args.rowIndex === 0) {
     return {
       backgroundColor: 'rgba(245, 245, 245, 0.9)',

+ 14 - 11
src/views/adManage/sb/campaigns/CreateCampaigns/component/ProductSetCreativity1.vue

@@ -98,7 +98,7 @@
                       <div>
                         <img class="el-upload-list__item-thumbnail" :src="file.url" alt="" />
                         <span class="el-upload-list__item-actions">
-                          <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
+                          <span class="el-upload-list__item-preview" @click="customPictureCardPreview(file)">
                             <el-icon><zoom-in /></el-icon>
                           </span>
                           <span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file)">
@@ -121,7 +121,7 @@
                     </template>
                   </el-upload>
                   <!-- 预览弹窗 -->
-                  <el-dialog v-model="dialogVisible">
+                  <el-dialog v-model="customDialogVisible">
                     <img w-full :src="dialogImageUrl" alt="Preview Image" />
                   </el-dialog>
                 </el-collapse-item>
@@ -277,16 +277,14 @@
 </template>
 
 <script setup lang="ts">
-import { reactive, ref, inject, Ref, watch, computed, onMounted, onUnmounted, nextTick } from 'vue'
-import type { FormInstance, FormRules, UploadProps, UploadUserFile } from 'element-plus'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus, Picture, Search, Delete, Download, ZoomIn } from '@element-plus/icons-vue'
-import type { UploadFile } from 'element-plus'
-import { getAssets, getLifeStyleAssets, getPageAsins, getCommodityCard, uploadFile, checkAsset, postProductset } from '../api/index'
-import emitter from '/@/utils/emitter'
+import { Delete, Picture, Plus, Search, ZoomIn } from '@element-plus/icons-vue'
+import type { FormInstance, FormRules, UploadFile, UploadProps } from 'element-plus'
+import { ElMessage } from 'element-plus'
 import { storeToRefs } from 'pinia'
+import { Ref, computed, inject, onMounted, onUnmounted, reactive, ref, watch } from 'vue'
+import { checkAsset, getAssets, getCommodityCard, getLifeStyleAssets, getPageAsins, postProductset, uploadFile } from '../api/index'
 import { useShopInfo } from '/@/stores/shopInfo'
-import axios from 'axios'
+import emitter from '/@/utils/emitter'
 
 const respAdGroupId = inject<Ref>('respAdGroupId')
 const shopInfo = useShopInfo()
@@ -334,6 +332,7 @@ const handleChange = (val: string[]) => {
 // 图片上传相关
 const dialogImageUrl = ref('')
 const dialogVisible = ref(false)
+const customDialogVisible = ref(false)
 const disabled = ref(false)
 const pictureList = ref([])
 const fileList = ref([])
@@ -373,11 +372,15 @@ function handleCustomRemove(file: UploadFile) {
 }
 
 function handlePictureCardPreview(file: UploadFile) {
-  handleUpload(file)
   dialogImageUrl.value = file.url!
   dialogVisible.value = true
 }
 
+function customPictureCardPreview(file: UploadFile) {
+  dialogImageUrl.value = file.url!
+  customDialogVisible.value = true
+}
+
 // 自定义文件上传
 const customFileList = ref([])
 const customUpLoading = ref(false)