Bladeren bron

今日头条批量创建广告计划页面逻辑修改

syh 5 jaren geleden
bovenliggende
commit
728105c06e

+ 187 - 69
src/views/template/creative/create.vue

@@ -3,8 +3,8 @@
     <a-form @submit="handleSubmit" :form="form">
       <a-form-item
         label="选择头条账户"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-select
           v-model="accountId"
           showSearch
@@ -19,8 +19,8 @@
 
       <a-form-item
         label="选择广告组模板"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-select
           v-model="campaignId"
           showSearch
@@ -35,8 +35,8 @@
 
       <a-form-item
         label="选择用户定向模板"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-select
           v-model="userorentationId"
           showSearch
@@ -46,14 +46,13 @@
           :filterOption="filterOption"
         >
           <a-select-option value="0">默认</a-select-option>
-          <!--<a-select-option v-for="userorentation in userorentationList" :key="userorentation.id" :value="userorentation.id">{{userorentation.name}}</a-select-option>-->
         </a-select>
       </a-form-item>
 
       <a-form-item
         label="选择预算与出价模板"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-select
           v-model="budgetId"
           showSearch
@@ -68,8 +67,8 @@
 
       <a-form-item
         label="选择投放目标模板"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-select
           v-model="deliverytargetId"
           showSearch
@@ -77,22 +76,78 @@
           optionFilterProp="children"
           style="width: 200px"
           :filterOption="filterOption"
+          @change="changedeliveryTarget"
         >
           <a-select-option v-for="deliverytarget in deliverytargetList" :key="deliverytarget.id" :value="deliverytarget.id">{{deliverytarget.name}}</a-select-option>
         </a-select>
       </a-form-item>
+      <a-form-item
+        v-if="showConvertTarget"
+        label="选择转化跟踪方式"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-select
+          v-model="convertType"
+          showSearch
+          placeholder="选择投放目标模板"
+          optionFilterProp="children"
+          style="width: 200px"
+          :filterOption="filterOption"
+          @change="changeConvertType"
+        >
+          <a-select-option v-if="showSimple"value="SIMPLE">普通应用下载</a-select-option>
+          <a-select-option value="API">应用下载API</a-select-option>
+        </a-select>
+      </a-form-item>
+
+      <a-form-item
+        v-if="showConvertTarget&&showConvertTargetSimple"
+        label="选择转化目标"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-select
+          v-model="simpleDeliverytarget"
+          showSearch
+          placeholder="选择转化目标"
+          optionFilterProp="children"
+          style="width: 200px"
+          :filterOption="filterOption"
+        >
+          <a-select-option value="AD_CONVERT_TYPE_INSTALL_FINISH">安装完成</a-select-option>
+          <a-select-option value="AD_CONVERT_TYPE_DOWNLOAD_FINiSH">下载完成</a-select-option>
+        </a-select>
+      </a-form-item>
+
+      <a-form-item
+        v-if="showConvertTarget&&showConvertTargetApi"
+        label="选择转化目标"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-select
+          v-model="convertId"
+          showSearch
+          placeholder="选择转化目标"
+          optionFilterProp="children"
+          style="width: 800px"
+          :filterOption="filterOption"
+        >
+          <a-select-option v-for="activeConvert in activeConvertList" :key="activeConvert.id" :value="activeConvert.id">{{activeConvert.name}}</a-select-option>
+        </a-select>
+      </a-form-item>
+
+
 
       <a-form-item
         label="广告创意名称"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-input v-model="name"></a-input>
       </a-form-item>
 
       <a-form-item
         label="广告位置"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
           <a-radio-group v-model="advertiseLocation" @change="changeLoaction">
             <a-radio-button value="great">优选广告位</a-radio-button>
             <a-radio-button value="media">按媒体指定位置</a-radio-button>
@@ -103,8 +158,8 @@
       <a-form-item
         label="媒体指定"
         v-if="showMedia"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-checkbox-group v-model="inventoryType">
           <a-checkbox value="INVENTORY_FEED">今日头条</a-checkbox>
           <a-checkbox value="INVENTORY_VIDEO_FEED">西瓜视频</a-checkbox>
@@ -117,8 +172,8 @@
       <a-form-item
         label="场景选择"
         v-if="showSence"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-radio-group v-model="sceneInventory">
           <a-radio-button value="VIDEO_SCENE">沉浸式竖版视频场景广告位</a-radio-button>
           <a-radio-button value="FEED_SCENE">信息流场景广告位</a-radio-button>
@@ -128,8 +183,8 @@
 
       <a-form-item
         label="创意方式"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-radio-group v-model="creativeType">
           <a-radio-button value="customize">自定义创意</a-radio-button>
           <!--<a-radio-button value="program">程序化创意</a-radio-button>-->
@@ -137,8 +192,8 @@
       </a-form-item>
       <a-form-item
         label="素材添加方式"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-radio-group v-model="materialAddType">
           <a-radio-button value="customize">自定义上传</a-radio-button>
           <!--<a-radio-button value="program">程序化创意</a-radio-button>-->
@@ -146,8 +201,8 @@
       </a-form-item>
       <a-form-item
         label="选择素材类型"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-radio-group v-model="materialType" @change="materialTypeChange">
           <a-radio-button value="CREATIVE_IMAGE_MODE_LARGE">大图横图</a-radio-button>
           <a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO">横版视频</a-radio-button>
@@ -161,8 +216,8 @@
       <a-form-item
         v-if="showLargeImage"
         label="大图横图图片素材上传"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <upload-to-ali v-model="horizonImageUrl"
                        :customDomain="customDomain"
                        preview
@@ -176,16 +231,16 @@
       <a-form-item
         v-if="showLargeImage"
         label="大图横图创意标题"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-input v-model="horizonImageCreativeText"></a-input>
       </a-form-item>
 
       <a-form-item
         v-if="showHorizonVideo"
         label="横版视频素材上传"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <upload-to-ali v-model="horizonVideoUrl"
                        :customDomain="customDomain"
                        preview
@@ -200,8 +255,8 @@
       <a-form-item
         label="横版视频封面上传"
         v-if="showHorizonVideo"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <upload-to-ali v-model="horizonVideoCoverImageUrl"
                        :customDomain="customDomain"
                        preview
@@ -216,16 +271,16 @@
       <a-form-item
         v-if="showHorizonVideo"
         label="横版视频创意标题"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-input v-model="horizonVideoCreativeText"></a-input>
       </a-form-item>
 
       <a-form-item
         v-if="showVerticalVideo"
         label="竖版视频素材上传"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <upload-to-ali v-model="verticalVideoUrl"
                        :customDomain="customDomain"
                        preview
@@ -241,8 +296,8 @@
       <a-form-item
         v-if="showVerticalVideo"
         label="竖版视频封面上传"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <upload-to-ali v-model="verticalVideoCoverImageUrl"
                        :customDomain="customDomain"
                        preview
@@ -258,16 +313,16 @@
       <a-form-item
         v-if="showVerticalVideo"
         label="竖版视频创意标题"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-input v-model="verticalVideoCreativeText"></a-input>
       </a-form-item>
 
       <a-form-item
         v-if="showGroupImage"
         label="组图图片素材上传"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <upload-to-ali v-model="groupImageUrl" :customDomain="customDomain" :onClick="onClick"
                        preview
                        multiple
@@ -281,16 +336,16 @@
       <a-form-item
         v-if="showGroupImage"
         label="组图创意标题"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-input v-model="groupImageCreativeText"></a-input>
       </a-form-item>
 
       <a-form-item
         v-if="showSmallImage"
         label="小图图片素材上传"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <upload-to-ali v-model="smallImageUrl" :customDomain="customDomain" :onClick="onClick"
                        preview
                        :max="1"
@@ -303,16 +358,16 @@
       <a-form-item
         v-if="showSmallImage"
         label="小图创意标题"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-input v-model="smallImageCreativeText"></a-input>
       </a-form-item>
 
       <a-form-item
         v-if="showLargeVerticalImage"
         label="大图竖图图片素材上传"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <upload-to-ali v-model="verticalImageUrl" :customDomain="customDomain"
                        preview
                        :region="region"
@@ -325,27 +380,27 @@
       <a-form-item
         v-if="showLargeVerticalImage"
         label="大图竖图创意标题"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-input v-model="verticalImageCreativeText"></a-input>
       </a-form-item>
 
       <a-form-item
         label="应用下载详情页"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
           <a-input v-model="webUrl"></a-input>
       </a-form-item>
       <a-form-item
         label="应用名"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-input v-model="appName"></a-input>
       </a-form-item>
       <a-form-item
         label="广告评论"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-radio-group v-model="isCommentDisable ">
           <a-radio-button value="0">关闭</a-radio-button>
           <a-radio-button value="1">开启</a-radio-button>
@@ -353,8 +408,8 @@
       </a-form-item>
       <a-form-item
         label="创意展现"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-radio-group v-model="creativeDisplayMode">
           <a-radio-button value="CREATIVE_DISPLAY_MODE_CTR">优选模式</a-radio-button>
           <a-radio-button value="CREATIVE_DISPLAY_MODE_RANDOM">轮播模式</a-radio-button>
@@ -364,23 +419,23 @@
 
       <a-form-item
         label="创意分类"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-cascader :options="options" width="200px" v-model="adCategory" @change="onChange" placeholder="请选择分类" />
       </a-form-item>
 
       <a-form-item
         label="创意标签"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-select mode="tags" style="width: 100%" :tokenSeparators="[',']" v-model="adKeywords">
         </a-select>
       </a-form-item>
 
       <a-form-item
         label="迭代数量"
-        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
-        :wrapperCol="{lg: {span: 15}, sm: {span: 17} }">
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
         <a-input-number :min="0" :max="10" v-model="iteratorNum"/>
       </a-form-item>
 
@@ -405,6 +460,22 @@
     name: 'BaseForm',
     data() {
       return {
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        activeConvertList:[],
+        showConvertTarget:false,
+        convertType:'',
+        simpleDeliverytarget:'',
+        convertId:'',
+        showSimple:true,
+        showConvertTargetSimple:false,
+        showConvertTargetApi:false,
         campaignList: {},
         deliverytargetList:{},
         userList:{},
@@ -469,13 +540,14 @@
         form: this.$form.createForm(this),
         url: {
           userAllocationList:'/template/allocation/list',
-          planListUrl:'template/plan/data/list',
           insertUrl:'/template/creative/insert',
           industryListUrl:'/template/bytedance/industry/list',
           campaignListUrl:'/template/campaign/list',
           budgetTemplateListUrl:'/template/budget/list',
           deliverytargetTemplateListUrl:'/template/deliverytarget/list',
           userorentationTemplateListUrl:'/template/userorentation/list',
+          deliverytargetTemplateGetUrl:'/template/deliveryTarget/get',
+          convertList:'template/convert/list'
         }
       }
     },
@@ -487,6 +559,51 @@
       filterOption(input, option) {
         return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       },
+      refreshConvertApiId(){
+        let params = {};
+        getAction(this.url.convertList+'?accountId='+this.accountId+'&targetId='+this.deliverytargetId ,params).then((res)=>{
+          console.log(res);
+          if(res.code == 0){
+            this.activeConvertList = res.data.active_convert_list;
+          }else{
+            this.$message.error(res.message);
+          }
+        });
+      },
+      changedeliveryTarget(){
+        //切换投放目标模板
+        this.convertType = null;
+        this.simpleDeliverytarget = null;
+        this.activeConvertList = [];
+        let param = {};
+        var targetId = this.deliverytargetId;
+        getAction(this.url.deliverytargetTemplateGetUrl+"?targetId="+targetId, param).then((res) => {
+          if (res.success) {
+            console.log(res.data);
+            if(res.data.deliveryTarget == 'CONVERSION'){
+              this.showConvertTarget = true;
+            }else{
+              this.showConvertTarget = false;
+            }
+            //下载链接
+            if(res.data.downloadType == 'DOWNLOAD_URL'){
+              this.showSimple = true;
+            }else{//落地页
+              this.showSimple = false;
+            }
+          }
+        });
+      },
+      changeConvertType(){
+        if(this.convertType == 'SIMPLE'){
+          this.showConvertTargetSimple = true;
+          this.showConvertTargetApi = false;
+        }else{
+          this.refreshConvertApiId();
+          this.showConvertTargetSimple = false;
+          this.showConvertTargetApi = true;
+        }
+      },
       materialTypeChange(){
         let type = this.materialType;
         if(type === 'CREATIVE_IMAGE_MODE_SMALL'){
@@ -597,13 +714,14 @@
             params.adCategory=this.adCategory;
             params.adKeywords=this.adKeywords;
             params.name = this.name;
+            params.convertId = this.convertId;
             params.iteratorNum = this.iteratorNum;
 
             console.log(params)
             postAction(this.url.insertUrl,params).then((res)=>{
               console.log(res)
               if(res.success){
-                alert("预算模板创建成功");
+                alert("广告创意批量创建成功");
               }else{
                 alert(res.message);
               }

+ 0 - 189
src/views/template/creative/modules/BytedanceAdvertisePlanTemplateModal__Style#Drawer.vue

@@ -1,189 +0,0 @@
-<template>
-    <a-drawer
-            :title="title"
-            :width="800"
-            placement="right"
-            :closable="false"
-            @close="close"
-            :visible="visible"
-    >
-
-        <a-spin :spinning="confirmLoading">
-            <a-form :form="form">
-
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="头条账号id">
-                    <a-input placeholder="请输入头条账号id" v-decorator="['accountId', {}]"/>
-                </a-form-item>
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="广告主id">
-                    <a-input placeholder="请输入广告主id" v-decorator="['advertiserId', {}]"/>
-                </a-form-item>
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="广告组模板id">
-                    <a-input placeholder="请输入广告组模板id" v-decorator="['campaignTemplateId', {}]"/>
-                </a-form-item>
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="投放范围">
-                    <a-input placeholder="请输入投放范围" v-decorator="['deliveryRange', {}]"/>
-                </a-form-item>
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="用户定向模板id">
-                    <a-input placeholder="请输入用户定向模板id" v-decorator="['userOrentationTemplateId', {}]"/>
-                </a-form-item>
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="预算与出价模板id">
-                    <a-input placeholder="请输入预算与出价模板id" v-decorator="['budgetTemplateId', {}]"/>
-                </a-form-item>
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="投放目标模板id">
-                    <a-input placeholder="请输入投放目标模板id" v-decorator="['deliveryTargetTemplateId', {}]"/>
-                </a-form-item>
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="指定视频id">
-                    <a-input placeholder="请输入指定视频id" v-decorator="['videoId', {}]"/>
-                </a-form-item>
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="指定封面图id">
-                    <a-input placeholder="请输入指定封面图id" v-decorator="['imageId', {}]"/>
-                </a-form-item>
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="创意文案信息">
-                    <a-input placeholder="请输入创意文案信息" v-decorator="['creativeText', {}]"/>
-                </a-form-item>
-                <a-form-item
-                        :labelCol="labelCol"
-                        :wrapperCol="wrapperCol"
-                        label="迭代数量">
-                    <a-input-number v-decorator="[ 'iteratorNum', {}]"/>
-                </a-form-item>
-
-            </a-form>
-        </a-spin>
-        <a-button type="primary" @click="handleOk">确定</a-button>
-        <a-button type="primary" @click="handleCancel">取消</a-button>
-    </a-drawer>
-</template>
-
-<script>
-    import {httpAction} from '@/api/manage'
-    import pick from 'lodash.pick'
-    import moment from "moment"
-
-    export default {
-        name: "BytedanceAdvertisePlanTemplateModal",
-        data() {
-            return {
-                title: "操作",
-                visible: false,
-                model: {},
-                labelCol: {
-                    xs: {span: 24},
-                    sm: {span: 5},
-                },
-                wrapperCol: {
-                    xs: {span: 24},
-                    sm: {span: 16},
-                },
-
-                confirmLoading: false,
-                form: this.$form.createForm(this),
-                validatorRules: {},
-                url: {
-                    add: "/ctop/bytedanceAdvertisePlanTemplate/add",
-                    edit: "/ctop/bytedanceAdvertisePlanTemplate/edit",
-                },
-            }
-        },
-        created() {
-        },
-        methods: {
-            add() {
-                this.edit({});
-            },
-            edit(record) {
-                this.form.resetFields();
-                this.model = Object.assign({}, record);
-                this.visible = true;
-                this.$nextTick(() => {
-                    this.form.setFieldsValue(pick(this.model, 'accountId', 'advertiserId', 'campaignTemplateId', 'deliveryRange', 'userOrentationTemplateId', 'budgetTemplateId', 'deliveryTargetTemplateId', 'videoId', 'imageId', 'creativeText', 'iteratorNum'))
-                    //时间格式化
-                });
-
-            },
-            close() {
-                this.$emit('close');
-                this.visible = false;
-            },
-            handleOk() {
-                const that = this;
-                // 触发表单验证
-                this.form.validateFields((err, values) => {
-                    if (!err) {
-                        that.confirmLoading = true;
-                        let httpurl = '';
-                        let method = '';
-                        if (!this.model.id) {
-                            httpurl += this.url.add;
-                            method = 'post';
-                        } else {
-                            httpurl += this.url.edit;
-                            method = 'put';
-                        }
-                        let formData = Object.assign(this.model, values);
-                        //时间格式化
-
-                        console.log(formData)
-                        httpAction(httpurl, formData, method).then((res) => {
-                            if (res.success) {
-                                that.$message.success(res.message);
-                                that.$emit('ok');
-                            } else {
-                                that.$message.warning(res.message);
-                            }
-                        }).finally(() => {
-                            that.confirmLoading = false;
-                            that.close();
-                        })
-
-
-                    }
-                })
-            },
-            handleCancel() {
-                this.close()
-            },
-
-
-        }
-    }
-</script>
-
-<style lang="less" scoped>
-    /** Button按钮间距 */
-    .ant-btn {
-        margin-left: 30px;
-        margin-bottom: 30px;
-        float: right;
-    }
-</style>

+ 56 - 15
src/views/template/deliverytarget/modules/BytedanceDeliveryTargetTemplateModal.vue

@@ -43,19 +43,31 @@
         </a-form-item>
 
         <a-form-item
-          label="下载链接"
-          v-if="showDownloadUrl"
+          v-if="showDownloadMode"
+          label="下载类型"
           :labelCol="labelCol"
           :wrapperCol="wrapperCol">
-          <a-input placeholder="请输入网址或从之前网站选择" v-model="downloadUrl"/>
+          <a-radio-group @change="onChangeDownloadMode" v-model="downloadMode">
+            <a-radio-button value="android">安卓下载</a-radio-button>
+            <a-radio-button value="IOS">IOS下载</a-radio-button>
+          </a-radio-group>
         </a-form-item>
-
-        <a-form-item
+        <!--<a-form-item
           v-if="showExternalUrl"
           label="链接地址"
           :labelCol="labelCol"
           :wrapperCol="wrapperCol">
           <a-input placeholder="请输入网址或从之前网站选择" v-model="externalUrl"/>
+        </a-form-item>-->
+        <a-form-item
+          label="下载链接"
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol">
+          <a-select
+            v-model="urlId"
+            style="width: 300px">
+            <a-select-option v-for="url in urlList" :key="url.id" :value="url.id">{{url.name}}</a-select-option>
+          </a-select>
         </a-form-item>
 
         <a-form-item
@@ -66,13 +78,6 @@
           <a-input placeholder="请输入网址或从之前网站选择" v-model="convertTarget"/>
         </a-form-item>
 
-        <a-form-item
-          label="应用包名"
-          v-if="showPackageName"
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol">
-          <a-input v-model="packageName"></a-input>
-        </a-form-item>
 
         <a-form-item
           label="直达链接"
@@ -123,6 +128,7 @@
       return {
         title:"操作",
         visible: false,
+        urlList:[],
         model: {},
         labelCol: {
           xs: { span: 24 },
@@ -135,7 +141,11 @@
         form: this.$form.createForm(this),
         id:null,
         name:'',
+        urlId:null,
+        convertApiIdList:{},
+        downloadMode:'android',
         confirmLoading: false,
+        showDownloadMode:true,
         deliveryRange:'DEFAULT',
         deliveryTarget:'CONVERSION',
         packageName:'',
@@ -155,19 +165,41 @@
         openUrlCreateMode:'hand_create',
         url: {
           dictListUrl: 'toutiao/dictitem/list',
-          insertUrl:'template/deliverytarget/insert'
+          insertUrl:'template/deliverytarget/insert',
+          urllist: '/ctop/bytedanceUrlInfo/list'
         }
       }
     },
+    created: function () {
+      this.refreshUrl("android");
+    },
     methods: {
+      refreshUrl(value){
+        let params = {};
+        params.pageSize = '1000';
+        params.type = value;
+        getAction(this.url.urllist, params).then((res) => {
+          if (res.success) {
+            this.urlList = res.result.records
+          }
+        });
+      },
       // handler
       handleCancel () {
         this.close()
       },
+      onChangeDownloadMode(){
+        this.urlId = null;
+        this.refreshUrl(this.downloadMode);
+      },
       add () {
         this.edit({
           id:null,
+          urlId:null,
+          downloadMode:'android',
+          showDownloadMode:true,
           name:'',
+          urlList:[],
           confirmLoading: false,
           deliveryRange:'DEFAULT',
           deliveryTarget:'CONVERSION',
@@ -241,6 +273,7 @@
             params.id = this.id;
             params.deliveryTarget = this.deliveryTarget;
             params.downloadType = this.downloadType;
+            params.downloadMode = this.downloadMode;
             params.downloadUrl = this.downloadUrl;
             params.externalUrl = this.externalUrl;
             params.convertTarget = this.convertTarget;
@@ -250,9 +283,10 @@
             params.redirectUrl = this.redirectUrl;
             params.name = this.name;
             params.deliveryRange = this.deliveryRange;
-            console.log(params)
+            params.urlId = this.urlId;
+            console.log(params);
             postAction(this.url.insertUrl,params).then((res)=>{
-              console.log(res)
+              console.log(res);
               if(res.success){
                 if(null == this.id){
                   this.$message.success("投放目标模板创建成功");
@@ -273,16 +307,23 @@
       },
       onChangeDownloadType(value){
         console.log(value);
+        this.urlId = null;
         if(this.downloadType == 'DOWNLOAD_URL'){
+          this.downloadMode = 'android';
           this.showDownloadUrl = true;
           this.showExternalUrl = false;
           this.showPackageName=true;
           this.showOpenUrlStatus=false;
+          this.showDownloadMode=true;
+          this.refreshUrl(this.downloadMode);
         }else{
+
           this.showDownloadUrl = false;
           this.showExternalUrl = true;
           this.showPackageName=false;
           this.showOpenUrlStatus=true;
+          this.showDownloadMode=false;
+          this.refreshUrl("page");
         }
       },
       onChangeDeliveryTarget(value){

+ 177 - 0
src/views/template/url/list.vue

@@ -0,0 +1,177 @@
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+          <a-col :md="6" :sm="8">
+            <a-form-item label="描述信息">
+              <a-input placeholder="请输入描述信息" v-model="queryParam.desc"></a-input>
+            </a-form-item>
+          </a-col>
+        <template v-if="toggleSearchStatus">
+        <a-col :md="6" :sm="8">
+            <a-form-item label="链接地址">
+              <a-input placeholder="请输入链接地址" v-model="queryParam.url"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="应用包名">
+              <a-input placeholder="请输入应用包名" v-model="queryParam.packageName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="链接类型">
+              <a-input placeholder="请输入链接类型" v-model="queryParam.type"></a-input>
+            </a-form-item>
+          </a-col>
+          </template>
+          <a-col :md="6" :sm="8" >
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('今日头条链接信息')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <bytedanceUrlInfo-modal ref="modalForm" @ok="modalFormOk"></bytedanceUrlInfo-modal>
+  </a-card>
+</template>
+
+<script>
+  import BytedanceUrlInfoModal from './modules/BytedanceUrlInfoModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "BytedanceUrlInfoList",
+    mixins:[JeecgListMixin],
+    components: {
+      BytedanceUrlInfoModal
+    },
+    data () {
+      return {
+        description: '今日头条链接信息管理页面',
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+           },
+		   {
+            title: '描述信息',
+            align:"center",
+            dataIndex: 'name'
+           },
+		   {
+            title: '链接地址',
+            align:"center",
+            dataIndex: 'url'
+           },
+		   {
+            title: '应用包名',
+            align:"center",
+            dataIndex: 'packageName'
+           },
+		   {
+            title: '链接类型',
+            align:"center",
+            dataIndex: 'type'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/ctop/bytedanceUrlInfo/list",
+          delete: "/ctop/bytedanceUrlInfo/delete",
+          deleteBatch: "/ctop/bytedanceUrlInfo/deleteBatch",
+          exportXlsUrl: "ctop/bytedanceUrlInfo/exportXls",
+          importExcelUrl: "ctop/bytedanceUrlInfo/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 159 - 0
src/views/template/url/modules/BytedanceUrlInfoModal.vue

@@ -0,0 +1,159 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="名称">
+          <a-input placeholder="请输入链接名称信息" v-model="name" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="链接类型">
+          <a-radio-group v-model="urlType" @change="typeChange">
+            <a-radio-button value="android">安卓下载</a-radio-button>
+            <a-radio-button value="IOS">IOS下载</a-radio-button>
+            <a-radio-button value="page">落地页</a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="链接地址">
+          <a-input placeholder="请输入链接地址" v-model="setUrl" />
+        </a-form-item>
+        <a-form-item
+          v-if="showPackageName"
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="应用包名">
+          <a-input placeholder="请输入应用包名" v-model="packageName" />
+        </a-form-item>
+
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import {deleteAction, postAction, getAction,httpAction} from '@/api/manage'
+  export default {
+    name: "BytedanceUrlInfoModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        name:'',
+        urlType:'android',
+        setUrl:'',
+        packageName:'',
+        showPackageName:true,
+        id:null,
+        url: {
+          add: "/ctop/bytedanceUrlInfo/add",
+          edit: "/ctop/bytedanceUrlInfo/edit",
+          insertOrUpdate: 'template/link/insert',
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({
+          name:'',
+          urlType:'android',
+          setUrl:'',
+          packageName:'',
+          showPackageName:true
+        });
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.id = record.id;
+        this.name = record.name;
+        this.setUrl = record.url;
+        this.urlType = record.type;
+        this.packageName = record.packageName;
+        if(this.urlType == 'page'){
+          this.showPackageName = false;
+        }else{
+          this.showPackageName = true;
+        }
+      },
+      typeChange(){
+        if(this.urlType == 'page'){
+          this.showPackageName = false;
+        }else{
+          this.showPackageName = true;
+        }
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk (e) {
+        e.preventDefault()
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            console.log('Received values of form: ', values);
+            let params = {};
+            params.id = this.id;
+            params.name = this.name;
+            params.url = this.setUrl;
+            params.type = this.urlType;
+            params.packageName = this.packageName;
+            console.log(params);
+            postAction(this.url.insertOrUpdate,params).then((res)=>{
+              console.log(res);
+              if(res.success){
+                if(null!=this.id){
+                  this.$message.success("链接信息修改成功");
+                }else{
+                  this.$message.success("链接信息创建成功");
+                }
+                this.$emit('ok');
+                this.close();
+              }else{
+                this.$message.error(res.message);
+              }
+            });
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+
+</style>