瀏覽代碼

Merge branch 'test'

yumeng 5 年之前
父節點
當前提交
be703d87cc

+ 8 - 0
src/api/manage.js

@@ -112,3 +112,11 @@ export function downFile(url, parameter) {
   })
 }
 
+export function getProvince(url, parameter) {
+    return axios({
+      url: url,
+      method: 'get',
+      params: parameter
+    })
+  }
+

+ 2 - 21
src/views/modules/advertiser/AdvertiserList.vue

@@ -167,22 +167,12 @@
 
               <a-form-item label="媒体:" :labelCol="{xs: {span: 24},sm: {span: 5}}"
                            :wrapperCol="{xs: {span: 24},sm: {span: 16}}">
-                <a-radio-group buttonStyle="outline" v-model="authorizationType" @change="changeShowAuthName">
+                <a-radio-group buttonStyle="outline" v-model="authorizationType">
                   <a-radio-button value="kuaishou">快手</a-radio-button>
                   <a-radio-button value="bytedance">头条</a-radio-button>
                 </a-radio-group>
               </a-form-item>
 
-
-              <a-form-item
-                label="账号名称:"
-                v-if="showAuthName"
-                :label-col="{xs: {span: 24},sm: {span: 5}}"
-                :wrapper-col="{xs: {span: 24},sm: {span: 16}}">
-                <a-input v-model="authName" placeholder="请输入快手标识名称,便于区分用户"/>
-              </a-form-item>
-
-
               <a-form-item label="部门分配" :labelCol="{xs: {span: 24},sm: {span: 5}}"
                            :wrapperCol="{xs: {span: 24},sm: {span: 16}}" v-show="!departDisabled">
                 <j-select-depart v-model="departmentId" :multi="false"></j-select-depart>
@@ -240,8 +230,6 @@
         visible: false,
         accountName: '',
         password: '',
-        showAuthName: true,
-        authName: '',
         mode: 'login',
         showLogin: true,
         showAuthorization: false,
@@ -315,13 +303,7 @@
     methods: {
       ...mapGetters(["nickname", "avatar", "userInfo"]),
 
-      changeShowAuthName() {
-        if (this.authorizationType == 'bytedance') {
-          this.showAuthName = false;
-        } else {
-          this.showAuthName = true;
-        }
-      },
+
 
       handleSubmit() {
         /*postAction(this.url.getLoginInfo).then((res) => {
@@ -370,7 +352,6 @@
               params.authorizationType = this.authorizationType;
               if (this.authorizationType == 'kuaishou') {
                 params.mediaId = 2;
-                params.authName = this.authName;
               } else if (this.authorizationType == 'bytedance') {
                 params.mediaId = 1;
               }

+ 98 - 27
src/views/modules/kuaishouapp/creativeCreate.vue

@@ -17,8 +17,7 @@
             v-for="userAccount in accountList"
             :key="userAccount.accountId"
             :value="userAccount.accountId"
-          >{{userAccount.authName}}
-          </a-select-option>
+          >{{userAccount.authName}}</a-select-option>
         </a-select>
       </a-form-item>
 
@@ -30,7 +29,7 @@
           @change="onChangeActionBarText"
           :loadData="loadData"
           placeholder="Please select"
-          :changeOnSelect="changeOnSelectValue"
+          changeOnSelect
         />
       </a-form-item>
 
@@ -107,7 +106,8 @@
       >
         <div>
           <a type="primary" @click="showModalVideo">点击选中已上传作品</a>
-          <a-modal class="ant_modal_body_container"
+          <a-modal
+            class="ant_modal_body_container"
             title="选择作品"
             v-model="visibleVideo"
             @ok="handleOkVideo"
@@ -129,7 +129,7 @@
               </a-radio-group>
             </template>
           </a-modal>
-          <div class="checkbox_item_container" v-if="videoUrl">
+          <div class="checkbox_item_container checkbox_item_container_size" v-if="videoUrl">
             <div class="item_ul">
               <div class="item_li" style="width:130px;height:180px;">
                 <a-col class="item">
@@ -143,7 +143,8 @@
                     :src="videoUrl"
                     controls="controls"
                     style="min-height:160px"
-                  >您的浏览器不支持 video 标签。</video>
+                  >您的浏览器不支持 video 标签。
+                  </video>
                 </a-col>
               </div>
             </div>
@@ -160,7 +161,8 @@
       >
         <div>
           <a type="primary" @click="showSinglePicModalVideo">点击选中已上传作品</a>
-          <a-modal class="ant_modal_body_container"
+          <a-modal
+            class="ant_modal_body_container"
             title="选择作品"
             v-model="visibleSinglePicVideo"
             @ok="handleOkSinglePicVideo"
@@ -189,7 +191,7 @@
               </div>
             </template>
           </a-modal>
-          <div class="checkbox_item_container">
+          <div class="checkbox_item_container checkbox_item_container_size">
             <div class="item_ul">
               <div
                 class="item_li"
@@ -208,7 +210,8 @@
                     :src="item"
                     controls="controls"
                     style="min-height:160px"
-                  >您的浏览器不支持 video 标签。</video>
+                  >您的浏览器不支持 video 标签。
+                  </video>
                 </a-col>
               </div>
             </div>
@@ -247,7 +250,8 @@
       >
         <div>
           <a type="primary" @click="showSinglePicCoverModal">点击选中已上传封面</a>
-          <a-modal class="ant_modal_body_container"
+          <a-modal
+            class="ant_modal_body_container"
             title="选择封面"
             v-model="visibleSinglePicCover"
             @ok="handleOkSinglePicCover"
@@ -284,6 +288,26 @@
               </div>
             </template>
           </a-modal>
+          <div class="checkbox_item_container checkbox_item_container_size">
+            <div class="item_ul">
+              <div
+                class="item_li"
+                v-for="(item,index) of imageList"
+                :key="index"
+                style="width:100px;height:150px;margin:15px 0;"
+                v-if="checkeds.indexOf( item.id )!=-1"
+              >
+                <a-col class="item">
+                  <a-icon
+                    type="close-circle"
+                    style="position:absolute;top:-5px;right:-5px;color:red"
+                    @click="deteleImg(item.id)"
+                  />
+                  <img :src="item.src" alt style="width:100%"/>
+                </a-col>
+              </div>
+            </div>
+          </div>
         </div>
       </a-form-item>
 
@@ -359,12 +383,12 @@
                 @click="checkAll($event)"
                 class="select_all"
               /> 全选
-              <br />
-              <br />
+              <br/>
+              <br/>
               <div class="image_item_container">
                 <div v-for="(item ,index) in imageList" class="image_item" :key="index">
                   <label :for="item.id" class="label_item">
-                    <img :src="item.src" alt class="item_img" />
+                    <img :src="item.src" alt class="item_img"/>
                     <p class="item_text">{{item.name}}</p>
                     <p class="item_checkbox">
                       <input
@@ -382,7 +406,7 @@
               </div>
             </template>
           </a-modal>
-          <div class="checkbox_item_container">
+          <div class="checkbox_item_container checkbox_item_container_size">
             <div class="item_ul">
               <div
                 class="item_li"
@@ -397,7 +421,7 @@
                     style="position:absolute;top:-5px;right:-5px;color:red"
                     @click="deteleImg(item.id)"
                   />
-                  <img :src="item.src" alt style="width:100%" />
+                  <img :src="item.src" alt style="width:100%"/>
                 </a-col>
               </div>
             </div>
@@ -442,12 +466,13 @@
             v-for="actionBar in actionBarTextList"
             :key="actionBar.id"
             :value="actionBar.actionBarText"
-          >{{actionBar.actionBarText}}</a-select-option>
+          >{{actionBar.actionBarText}}
+          </a-select-option>
         </a-select>
       </a-form-item>
 
       <a-form-item label="作品广告语" :labelCol="labelCol" :wrapperCol="wrapperCol">
-        <a-textarea style="width: 650px" v-model="description" :rows="2" />
+        <a-textarea style="width: 650px" v-model="description" :rows="2"/>
       </a-form-item>
 
       <a-form-item label="创意名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
@@ -481,13 +506,13 @@
 </template>
 
 <script>
-  import { getAction, postAction } from '@/api/manage'
-  import { mapGetters } from 'vuex'
+  import {getAction, postAction} from '@/api/manage'
+  import {mapGetters} from 'vuex'
   import UploadToAli from '@femessage/upload-to-ali'
   import moment from 'moment'
   import VuePreview from 'vue-preview'
   import jq from 'jquery'
-  import { stopOtherVideo, closeAllVideoFun } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
+  import {stopOtherVideo, closeAllVideoFun} from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
 
   export default {
     name: 'BaseForm',
@@ -686,7 +711,7 @@
         this.haveSinglePicimagesList = []
       },
 
-      checkeda: function(id) {
+      checkeda: function (id) {
         let indexOf = this.checkeds.indexOf(id)
         if (indexOf >= 0) {
           this.$delete(this.checkeds, id)
@@ -704,7 +729,7 @@
           for (let i = 0; i < this.imageList.length; i++) {
             if (!checkObj[i].checked) {
               // 将未勾选的checkbox选项push到绑定数组中
-              this.checkeds.push(checkObj[i].value)
+              this.checkeds.push(parseFloat(checkObj[i].value))
               console.log(this.checkeds)
             }
           }
@@ -741,6 +766,7 @@
       changeVideoList() {
         if ((this.creativeMaterialType == '1' || this.creativeMaterialType == '2') && this.sceneId == '2') {
           // 横版竖版并且无单张图片
+          this.imageUrl = []
           this.showImageUpload = false
           this.showUploadType = true
           this.selectVideoUpload = true
@@ -797,6 +823,10 @@
             this.showUploadImageRadio = false
             this.showUploadSinglePicType = false
             this.tiepianImageLocalUpload = false
+
+            this.haveSinglePicimagesList = []
+            this.haveSinglePicVideoUrl = []
+
             let params = {}
             params.accountId = this.accountId
             params.pageSize = '1000'
@@ -1058,16 +1088,19 @@
       loadData(selectedOptions) {
         const targetOption = selectedOptions[selectedOptions.length - 1]
         targetOption.loading = true
-        targetOption.loading = false
+
         this.campaignId = `${targetOption.value}`
         let params = {}
         params.campaignId = this.campaignId
         params.loginId = this.userInfo().id
         params.accountId = this.accountId
         postAction(this.url.getChildrenUrl, params).then(res => {
+          console.log(res, 10000000)
           targetOption.children = res
+          this.options = [...this.options]
+          targetOption.loading = false
         })
-        this.options = [...this.options]
+
       },
 
       actionGroups() {
@@ -1147,10 +1180,11 @@
         var index = this.checkeds.findIndex(v => v === item)
         this.checkeds.splice(index, 1)
         this.imageUrl.splice(index, 1)
+        this.haveSinglePicimagesList.splice(index, 1)
       }
     },
 
-    created: function() {
+    created: function () {
       let params = {}
       params.pageSize = '1000'
       params.mediaId = '2'
@@ -1163,8 +1197,6 @@
     }
   }
 </script>
-
-
 <style lang="scss">
   .select_all {
     margin-bottom: 10px;
@@ -1222,6 +1254,7 @@
 
   //   多选框
   .checkbox_item_container {
+
     .item_ul {
       margin: 0 -10px;
 
@@ -1230,15 +1263,19 @@
         float: left;
         padding: 0 10px;
         box-sizing: border-box;
+
         .item:hover i {
           display: block;
           cursor: pointer;
         }
+
         .item {
           position: relative;
+
           i {
             display: none;
           }
+
           video {
             width: 100%;
             min-height: 255px;
@@ -1266,4 +1303,38 @@
       }
     }
   }
+
+  // @media (min-width: 1024px){
+  //     .checkbox_item_container {
+  //         width:70%
+  //     }
+  // } /*>=1024的设备*/
+
+  // @media (min-width: 1100px) {
+  //     .checkbox_item_container {
+  //         width:70%
+  //     }
+  // } /*>=1100的设备*/
+  @media (min-width: 1280px) {
+    .checkbox_item_container_size {
+      width: 70%
+    }
+  }
+
+  /*>=1280的设备*/
+
+  // @media (min-width: 1366px) {
+  // }
+
+  // @media (min-width: 1440px) {
+  // }
+
+  // @media (min-width: 1680px) {
+
+  // }
+  @media (min-width: 1920px) {
+    .checkbox_item_container_size {
+      width: 50%
+    }
+  }
 </style>

File diff suppressed because it is too large
+ 707 - 543
src/views/template/creative/create.vue


+ 243 - 237
src/views/template/userorientation/list.vue

@@ -1,11 +1,9 @@
 <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="头条账号id">
               <a-input placeholder="请输入头条账号id" v-model="queryParam.accountId"></a-input>
@@ -17,30 +15,33 @@
             </a-form-item>
           </a-col>
 
-            <a-col :md="6" :sm="8">
-              <a-form-item label="定向人群包列表">
-                <a-input placeholder="请输入定向人群包列表" v-model="queryParam.retargetingTagsInclude"></a-input>
-              </a-form-item>
-            </a-col>
-            <a-col :md="6" :sm="8">
-              <a-form-item label="排除人群包列表">
-                <a-input placeholder="请输入排除人群包列表" v-model="queryParam.retargetingTagsExclude"></a-input>
-              </a-form-item>
-            </a-col>
-            <a-col :md="6" :sm="8">
-              <a-form-item label="受众性别">
-                <a-input placeholder="请输入受众性别" v-model="queryParam.gender"></a-input>
-              </a-form-item>
-            </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="定向人群包列表">
+              <a-input placeholder="请输入定向人群包列表" v-model="queryParam.retargetingTagsInclude"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="排除人群包列表">
+              <a-input placeholder="请输入排除人群包列表" v-model="queryParam.retargetingTagsExclude"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="受众性别">
+              <a-input placeholder="请输入受众性别" v-model="queryParam.gender"></a-input>
+            </a-form-item>
+          </a-col>
 
-          <a-col :md="6" :sm="8" >
+          <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-button
+                type="primary"
+                @click="searchReset"
+                icon="reload"
+                style="margin-left: 8px"
+              >重置</a-button>
             </span>
           </a-col>
-
         </a-row>
       </a-form>
     </div>
@@ -49,10 +50,9 @@
     <div class="table-operator">
       <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
     </div>
-
+    <!-- <transfer :checkData.sync="dataBox" /> -->
     <!-- table区域-begin -->
     <div>
-
       <a-table
         ref="table"
         size="middle"
@@ -63,12 +63,11 @@
         :pagination="ipagination"
         :loading="loading"
         :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        @change="handleTableChange">
-
+        @change="handleTableChange"
+      >
         <span slot="action" slot-scope="text, record">
           <a @click="handleEdit(record)">编辑</a>
         </span>
-
       </a-table>
     </div>
     <!-- table区域-end -->
@@ -79,221 +78,228 @@
 </template>
 
 <script>
-  import ByteDanceUserOrientationTemplateModal from './modules/ByteDanceUserOrientationTemplateModal'
-  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import ByteDanceUserOrientationTemplateModal from './modules/ByteDanceUserOrientationTemplateModal'
+import transfer from './modules/transferCity'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
 
-  export default {
-    name: "ByteDanceUserOrientationTemplateList",
-    mixins:[JeecgListMixin],
-    components: {
-      ByteDanceUserOrientationTemplateModal
-    },
-    data () {
-      return {
-        description: '今日头条受众模板信息管理页面',
-        // 表头
-        columns: [
-          {
-            title: '#',
-            dataIndex: '',
-            key:'rowIndex',
-            width:60,
-            align:"center",
-            customRender:function (t,r,index) {
-              return parseInt(index)+1;
-            }
-          },
-          {
-            title: '头条账号id',
-            align:"center",
-            dataIndex: 'accountId'
-          },
-          {
-            title: '广告主id',
-            align:"center",
-            dataIndex: 'advertiserId'
-          },
-          {
-            title: '定向人群包列表',
-            align:"center",
-            dataIndex: 'retargetingTagsInclude'
-          },
-          {
-            title: '排除人群包列表',
-            align:"center",
-            dataIndex: 'retargetingTagsExclude'
-          },
-          {
-            title: '受众性别',
-            align:"center",
-            dataIndex: 'gender'
-          },
-          {
-            title: '年龄',
-            align:"center",
-            dataIndex: 'age'
-          },
-          {
-            title: '受众最低android版本',
-            align:"center",
-            dataIndex: 'androidOsv'
-          },
-          {
-            title: '受众最低ios版本',
-            align:"center",
-            dataIndex: 'iosOsv'
-          },
-          {
-            title: '运营商类型',
-            align:"center",
-            dataIndex: 'carrier'
-          },
-          {
-            title: '受众网络类型',
-            align:"center",
-            dataIndex: 'ac'
-          },
-          {
-            title: '手机品牌',
-            align:"center",
-            dataIndex: 'deviceBrand'
-          },
-          {
-            title: '受众文章分类',
-            align:"center",
-            dataIndex: 'articleCategory'
-          },
-          {
-            title: '用户首次激活时间',
-            align:"center",
-            dataIndex: 'activateType'
-          },
-          {
-            title: '受众平台',
-            align:"center",
-            dataIndex: 'platform'
-          },
-          {
-            title: '地域定向城市或者区县列表',
-            align:"center",
-            dataIndex: 'city'
-          },
-          {
-            title: '商圈ID数组',
-            align:"center",
-            dataIndex: 'businessIds'
-          },
-          {
-            title: '地域类型',
-            align:"center",
-            dataIndex: 'district'
-          },
-          {
-            title: '受众位置类型',
-            align:"center",
-            dataIndex: 'locationType'
-          },
-          {
-            title: '兴趣分类',
-            align:"center",
-            dataIndex: 'adTag'
-          },
-          {
-            title: '兴趣关键词, 传入具体的词id,非兴趣词包id',
-            align:"center",
-            dataIndex: 'interestTags'
-          },
-          {
-            title: '行为定向',
-            align:"center",
-            dataIndex: 'appBehaviorTarget'
-          },
-          {
-            title: 'APP行为定向,分类集合',
-            align:"center",
-            dataIndex: 'appCategory'
-          },
-          {
-            title: 'APP行为定向,APP集合',
-            align:"center",
-            dataIndex: 'appIds'
-          },
-          {
-            title: '产品目录ID(ID由查询产品目录接口得到)',
-            align:"center",
-            dataIndex: 'productPlatformId'
-          },
-          {
-            title: 'H5地址参数',
-            align:"center",
-            dataIndex: 'externalUrlParams'
-          },
-          {
-            title: '直达链接参数',
-            align:"center",
-            dataIndex: 'openUrlParams'
-          },
-          {
-            title: '是否自定义商品定向',
-            align:"center",
-            dataIndex: 'dpaLocalAudience'
-          },
-          {
-            title: '排除人群包',
-            align:"center",
-            dataIndex: 'excludeCustomActions'
-          },
-          {
-            title: '包含人群包',
-            align:"center",
-            dataIndex: 'includeCustomActions'
-          },
-          {
-            title: '精选流量包',
-            align:"center",
-            dataIndex: 'superiorPopularityType'
-          },
-          {
-            title: '定向流量包ID数组',
-            align:"center",
-            dataIndex: 'flowPackage'
-          },
-          {
-            title: '排除流量包ID数组',
-            align:"center",
-            dataIndex: 'excludeFlowPackage'
-          },
-          {
-            title: 'status',
-            align:"center",
-            dataIndex: 'status'
-          },
-          {
-            title: '操作',
-            dataIndex: 'action',
-            align:"center",
-            scopedSlots: { customRender: 'action' },
+export default {
+  name: 'ByteDanceUserOrientationTemplateList',
+  mixins: [JeecgListMixin],
+  components: {
+    ByteDanceUserOrientationTemplateModal,
+    transfer
+  },
+  data() {
+    return {
+      description: '今日头条受众模板信息管理页面',
+      // 表头
+      columns: [
+        {
+          title: '#',
+          dataIndex: '',
+          key: 'rowIndex',
+          width: 60,
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
           }
-        ],
-        url: {
-          list: "/ctop/byteDanceUserOrientationTemplate/list",
-          delete: "/ctop/byteDanceUserOrientationTemplate/delete",
-          deleteBatch: "/ctop/byteDanceUserOrientationTemplate/deleteBatch",
-          exportXlsUrl: "ctop/byteDanceUserOrientationTemplate/exportXls",
-          importExcelUrl: "ctop/byteDanceUserOrientationTemplate/importExcel",
-        },
-      }
-    },
-    computed: {
-      importExcelUrl: function(){
-        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
-      }
-    },
-    methods: {
-
+        },
+        {
+          title: '头条账号id',
+          align: 'center',
+          dataIndex: 'accountId'
+        },
+        {
+          title: '广告主id',
+          align: 'center',
+          dataIndex: 'advertiserId'
+        },
+        {
+          title: '定向人群包列表',
+          align: 'center',
+          dataIndex: 'retargetingTagsInclude'
+        },
+        {
+          title: '排除人群包列表',
+          align: 'center',
+          dataIndex: 'retargetingTagsExclude'
+        },
+        {
+          title: '受众性别',
+          align: 'center',
+          dataIndex: 'gender'
+        },
+        {
+          title: '年龄',
+          align: 'center',
+          dataIndex: 'age'
+        },
+        {
+          title: '受众最低android版本',
+          align: 'center',
+          dataIndex: 'androidOsv'
+        },
+        {
+          title: '受众最低ios版本',
+          align: 'center',
+          dataIndex: 'iosOsv'
+        },
+        {
+          title: '运营商类型',
+          align: 'center',
+          dataIndex: 'carrier'
+        },
+        {
+          title: '受众网络类型',
+          align: 'center',
+          dataIndex: 'ac'
+        },
+        {
+          title: '手机品牌',
+          align: 'center',
+          dataIndex: 'deviceBrand'
+        },
+        {
+          title: '受众文章分类',
+          align: 'center',
+          dataIndex: 'articleCategory'
+        },
+        {
+          title: '用户首次激活时间',
+          align: 'center',
+          dataIndex: 'activateType'
+        },
+        {
+          title: '受众平台',
+          align: 'center',
+          dataIndex: 'platform'
+        },
+        {
+          title: '地域定向城市或者区县列表',
+          align: 'center',
+          dataIndex: 'city'
+        },
+        {
+          title: '商圈ID数组',
+          align: 'center',
+          dataIndex: 'businessIds'
+        },
+        {
+          title: '地域类型',
+          align: 'center',
+          dataIndex: 'district'
+        },
+        {
+          title: '受众位置类型',
+          align: 'center',
+          dataIndex: 'locationType'
+        },
+        {
+          title: '兴趣分类',
+          align: 'center',
+          dataIndex: 'adTag'
+        },
+        {
+          title: '兴趣关键词, 传入具体的词id,非兴趣词包id',
+          align: 'center',
+          dataIndex: 'interestTags'
+        },
+        {
+          title: '行为定向',
+          align: 'center',
+          dataIndex: 'appBehaviorTarget'
+        },
+        {
+          title: 'APP行为定向,分类集合',
+          align: 'center',
+          dataIndex: 'appCategory'
+        },
+        {
+          title: 'APP行为定向,APP集合',
+          align: 'center',
+          dataIndex: 'appIds'
+        },
+        {
+          title: '产品目录ID(ID由查询产品目录接口得到)',
+          align: 'center',
+          dataIndex: 'productPlatformId'
+        },
+        {
+          title: 'H5地址参数',
+          align: 'center',
+          dataIndex: 'externalUrlParams'
+        },
+        {
+          title: '直达链接参数',
+          align: 'center',
+          dataIndex: 'openUrlParams'
+        },
+        {
+          title: '是否自定义商品定向',
+          align: 'center',
+          dataIndex: 'dpaLocalAudience'
+        },
+        {
+          title: '排除人群包',
+          align: 'center',
+          dataIndex: 'excludeCustomActions'
+        },
+        {
+          title: '包含人群包',
+          align: 'center',
+          dataIndex: 'includeCustomActions'
+        },
+        {
+          title: '精选流量包',
+          align: 'center',
+          dataIndex: 'superiorPopularityType'
+        },
+        {
+          title: '定向流量包ID数组',
+          align: 'center',
+          dataIndex: 'flowPackage'
+        },
+        {
+          title: '排除流量包ID数组',
+          align: 'center',
+          dataIndex: 'excludeFlowPackage'
+        },
+        {
+          title: 'status',
+          align: 'center',
+          dataIndex: 'status'
+        },
+        {
+          title: '操作',
+          dataIndex: 'action',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      url: {
+        list: '/ctop/byteDanceUserOrientationTemplate/list',
+        delete: '/ctop/byteDanceUserOrientationTemplate/delete',
+        deleteBatch: '/ctop/byteDanceUserOrientationTemplate/deleteBatch',
+        exportXlsUrl: 'ctop/byteDanceUserOrientationTemplate/exportXls',
+        importExcelUrl: 'ctop/byteDanceUserOrientationTemplate/importExcel'
+      },
+      widthCount: '100%',
+      showClass: false,
+      dataBox: []
+    }
+  },
+  computed: {
+    importExcelUrl: function() {
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
+    }
+  },
+  methods: {
+    a() {
+      this.showClass = true
     }
   }
+}
 </script>
 <style scoped>
-  @import '~@assets/less/common.less'
+@import '~@assets/less/common.less';
 </style>

+ 6 - 0
src/views/template/userorientation/modules/README.md

@@ -0,0 +1,6 @@
+# transfer 区域选择组件 使用文档
+  
+###### 说明: 
+## 参数配置
+| 参数           | 类型      | 必填 |说明|
+

+ 224 - 0
src/views/template/userorientation/modules/transfer.vue

@@ -0,0 +1,224 @@
+<style scoped>
+.transfer {
+  display: flex;
+}
+.transfer .transfer-box {
+  /* width: 350px; */
+  height: 250px;
+  border: 1px solid #dadfe3;
+  display: flex;
+  overflow-x: auto;
+  overflow-y: hidden;
+  box-sizing: border-box;
+  margin-right: 25px;
+}
+.content-box {
+  min-width: 174px;
+  width: 100%;
+  height: 100%;
+  border-right: 1px solid #dadfe3;
+}
+.content-box .content-title {
+  width: 100%;
+  background: #f8f9fa;
+  border-bottom: 1px solid #dadfe3;
+  padding: 5px 15px;
+  font-size: 16px;
+  font-weight: 700;
+  line-height: 30px;
+}
+.content-box .content {
+  width: 100%;
+  height: 85%;
+  overflow: auto;
+}
+.content-box .content p:hover {
+  background: #edf1f5;
+  cursor: pointer;
+}
+.content-box .content p:hover span {
+  display: inline-block;
+}
+.content-box .content p span {
+  display: none;
+}
+p {
+  padding: 5px;
+  margin-bottom: 0;
+  border-bottom: 1px solid #f2f2f2;
+}
+.backgroundOnly {
+  background: #edf1f5;
+}
+</style>
+
+<template>
+  <div class="transfer">
+    <div class="transfer-box">
+      <div class="content-box">
+        <p class="content-title">省份</p>
+        <div class="content">
+          <p
+            v-for="(item,index) of province"
+            :key="item.id"
+            @click="showCity(item,index)"
+            :class="{backgroundOnly:provinceIndex == index}"
+          >{{item.name}}</p>
+        </div>
+      </div>
+      <div
+        class="content-box"
+        :style="{borderRight:!showClass?'0px':'1px solid #dadfe3'}"
+        v-show="showCityData"
+      >
+        <p class="content-title">城市</p>
+        <div class="content">
+          <p
+            v-for="(item,index) of city"
+            :key="item.id"
+            @click="showRegion(item.code,index)"
+            :class="{backgroundOnly:cityIndex == index}"
+          >{{item.name}}</p>
+        </div>
+      </div>
+      <div class="content-box" v-show="showClass" style="border-right:0px">
+        <p class="content-title">区域</p>
+        <div class="content">
+          <!-- <p @click="allCheck">{{checkAll?"√":""}}全选</p> -->
+          <p
+            v-for="item of area"
+            :key="item.id"
+            @click="add(item)"
+            :class="{backgroundOnly:checkMatched.indexOf( item.id )!=-1}"
+          >{{item.name}}</p>
+        </div>
+      </div>
+    </div>
+    <div class="transfer-box" style="width:176px">
+      <div class="content-box">
+        <p class="content-title">
+          已选
+          <span
+            style="float:right;font-weight:normal;color:blue;cursor: pointer;font-size:14px"
+            @click="clear"
+          >清空</span>
+        </p>
+        <div class="content">
+          <p v-for="(item,index) of checkData" :key="index">
+            {{item.name}}
+            <span
+              style="float:right;font-weight:normal;color:blue;cursor: pointer;font-size:14px"
+              @click="detele(index)"
+            >删除</span>
+          </p>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import { getProvince } from '@/api/manage'
+export default {
+  name: 'ByteDanceUserOrientationTemplateList',
+  components: {},
+  data() {
+    return {
+      showClass: false,
+      showCityData: false,
+      checkData: [],
+      checkMatched: [],
+      province: [],
+      city: [],
+      area: [],
+      CityData: '/ctop/bytedanceAreaInfo/listbycode',
+      provinceIndex: null,
+      cityIndex: null,
+      checkAll: false,
+      arr: []
+    }
+  },
+  computed: {},
+  mounted() {
+    this.$nextTick(() => {
+      this.getData()
+    })
+  },
+  methods: {
+    getData() {
+      getProvince(this.CityData, { parentCode: '' }).then(res => {
+        if (res.code == '0') {
+          this.province.push(...res.result.records)
+        }
+      })
+    },
+    showCity(item, index) {
+      this.city = []
+      this.showCityData = false
+      this.showClass = false
+      this.provinceIndex = index
+      this.cityIndex = null
+    //   if (item.name == '北京') {
+    //     this.city.push(item)
+    //     this.showCityData = true
+    //   } else {
+        getProvince(this.CityData, { parentCode: item.code }).then(res => {
+          if (res.code == '0') {
+            this.city.push(...res.result.records)
+            this.showCityData = true
+          }
+        })
+    //   }
+    },
+    showRegion(item, index) {
+      this.area = []
+      this.cityIndex = index
+      getProvince(this.CityData, { parentCode: item }).then(res => {
+        if (res.code == '0') {
+          console.log(res)
+          this.area.push(...res.result.records)
+          this.arr = res.result.records
+          this.showClass = true
+        }
+      })
+    },
+    add(item) {
+      if (this.checkMatched.indexOf(item.id) != -1) {
+        var index = this.checkData.findIndex(v => v.id === item.id)
+        this.checkData.splice(index, 1)
+        this.checkMatched.splice(index, 1)
+        this.$emit('update:checkData', this.checkData)
+      } else {
+        this.checkData.push(item)
+        this.checkMatched.push(item.id)
+        this.$emit('update:checkData', this.checkData)
+      }
+    },
+    allCheck() {
+      this.checkAll = !this.checkAll
+      if (this.checkAll) {
+        this.checkData.push(...this.area)
+        var dataId = this.area.map(item => {
+          return item.id
+        })
+        this.checkMatched.push(...dataId)
+      } else {
+        this.checkData.splice(this.checkData.length - this.arr.length, this.arr.length)
+        this.checkMatched.splice(this.checkData.length - this.arr.length, this.arr.length)
+      }
+    },
+    clear() {
+      this.checkData = []
+      this.checkMatched = []
+      this.checkAll = false
+      this.$emit('update:checkData', this.checkData)
+    },
+    detele(index) {
+      this.checkData.splice(index, 1)
+      this.checkMatched.splice(index, 1)
+      this.$emit('update:checkData', this.checkData)
+    }
+  }
+}
+</script>

+ 246 - 0
src/views/template/userorientation/modules/transferCity.vue

@@ -0,0 +1,246 @@
+<style scoped>
+.transfer {
+  display: flex;
+}
+.transfer .transfer-box {
+  /* width: 350px; */
+  height: 250px;
+  border: 1px solid #dadfe3;
+  display: flex;
+  overflow-x: auto;
+  overflow-y: hidden;
+  box-sizing: border-box;
+  margin-right: 25px;
+}
+.content-box {
+  min-width: 174px;
+  width: 100%;
+  height: 100%;
+  border-right: 1px solid #dadfe3;
+}
+.content-box .content-title {
+  width: 100%;
+  background: #f8f9fa;
+  border-bottom: 1px solid #dadfe3;
+  padding: 5px 15px;
+  font-size: 16px;
+  font-weight: 700;
+  line-height: 30px;
+}
+.content-box .content {
+  width: 100%;
+  height: 85%;
+  overflow: auto;
+}
+.content-box .content p:hover {
+  background: #edf1f5;
+  cursor: pointer;
+}
+.content-box .content p:hover span {
+  display: inline-block;
+}
+.content-box .content p span {
+  display: none;
+}
+p {
+  padding: 5px;
+  margin-bottom: 0;
+  border-bottom: 1px solid #f2f2f2;
+}
+.backgroundOnly {
+  background: #edf1f5;
+}
+</style>
+<style>
+.ant-checkbox-group {
+  width: 100px;
+  overflow-x: hidden;
+}
+.ant-checkbox-group-item {
+  display: inline-block;
+  margin-right: 8px;
+  width: 100%;
+}
+</style>
+
+<template>
+  <div class="transfer">
+    <div class="transfer-box">
+      <div class="content-box">
+        <p class="content-title">省份</p>
+        <div class="content">
+          <!-- <a-checkbox-group
+            :options="province"
+          >
+            <span style="color: red" slot="label" slot-scope="{value}">{{value}}</span>
+          </a-checkbox-group>-->
+          <p>
+            <input type="checkbox" class="select_all" @change="checkAllBox" v-model="checkAll" /> 全选
+          </p>
+
+          <p
+            v-for="(item,index) of province"
+            :key="item.value"
+            :class="{backgroundOnly:provinceIndex == index}"
+          >
+            <input
+              class="checkItem"
+              type="checkbox"
+              :value="item.value"
+              :id="item.value"
+              v-model="checkMatched"
+              @change="checkOne(item,index)"
+            />
+            <span
+              @click="showCity(item,index)"
+              style="color:black;display:inline-block;margin-left:5px;width:80%"
+            >{{item.label}}</span>
+          </p>
+        </div>
+      </div>
+      <div
+        class="content-box"
+        :style="{borderRight:!showClass?'0px':'1px solid #dadfe3'}"
+        v-show="showCityData"
+      >
+        <p class="content-title">城市</p>
+        <div class="content">
+          <p
+            v-for="(item,index) of city"
+            :key="item.id"
+            :class="{backgroundOnly:cityIndex == index}"
+          >
+            <!-- <input
+              class="checkItem"
+              type="checkbox"
+              :value="item.value"
+              :id="item.value"
+              v-model="checkMatched"
+              @change="checkOne(item,index)"
+            /> -->
+            {{item.name}}
+          </p>
+        </div>
+      </div>
+    </div>
+    <div class="transfer-box" style="width:176px">
+      <div class="content-box">
+        <p class="content-title">
+          已选
+          <span
+            style="float:right;font-weight:normal;color:blue;cursor: pointer;font-size:14px"
+            @click="clear"
+          >清空</span>
+        </p>
+        <div class="content">
+          <p v-for="(item,index) of checkData" :key="index">
+            {{item.label}}
+            <span
+              style="float:right;font-weight:normal;color:blue;cursor: pointer;font-size:14px"
+              @click="detele(item,index)"
+            >删除</span>
+          </p>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import { getProvince } from '@/api/manage'
+import $ from 'jquery'
+export default {
+  name: 'ByteDanceUserOrientationTemplateList',
+  components: {},
+  data() {
+    return {
+      showClass: false,
+      showCityData: false,
+      checkData: [],
+      checkMatched: [],
+      province: [],
+      city: [],
+      area: [],
+      CityData: '/ctop/bytedanceAreaInfo/listbycode',
+      provinceIndex: null,
+      cityIndex: null,
+      checkAll: false,
+      arr: []
+    }
+  },
+  computed: {},
+  mounted() {
+    this.$nextTick(() => {
+      this.getData()
+    })
+  },
+  methods: {
+    getData() {
+      getProvince(this.CityData, { parentCode: '' }).then(res => {
+        if (res.code == '0') {
+          //   this.province.push(...res.result.records)
+          this.province = res.result.records.map(item => {
+            return {
+              label: item.name,
+              value: item.id
+            }
+          })
+        }
+      })
+    },
+    showCity(item, index) {
+      this.city = []
+      this.showCityData = false
+      this.showClass = false
+      this.provinceIndex = index
+      this.cityIndex = null
+      getProvince(this.CityData, { parentCode: item.value }).then(res => {
+        if (res.code == '0') {
+          this.city.push(...res.result.records)
+          this.showCityData = true
+        }
+      })
+    },
+    checkAllBox() {
+      this.checkMatched = []
+      this.checkData = []
+      if (this.checkAll) {
+        this.checkMatched = this.province.map(item => {
+          return item.value
+        })
+        this.checkData.push(...this.province)
+      } else {
+        this.checkMatched = []
+        this.checkData = []
+      }
+    },
+    checkOne(item, index) {
+      if (this.checkMatched.indexOf(item.value) == -1) {
+        var index = this.checkData.findIndex(v => v.value === item.value)
+        this.checkData.splice(index, 1)
+        this.checkAll = false
+      } else {
+        this.checkData.push(item)
+      }
+      if(this.checkData.length == this.province.length){
+          this.checkAll = true
+      }
+    },
+    clear() {
+      this.checkData = []
+      this.checkMatched = []
+      this.checkAll = false
+      this.$emit('update:checkData', this.checkData)
+    },
+    detele(item,index) {
+      var index1 = this.checkMatched.findIndex(v => v === item.value)
+      var index2 = this.checkData.findIndex(v => v.value === item.value)
+      this.checkData.splice(index2, 1)
+      this.checkMatched.splice(index1, 1)
+      this.checkAll = false
+      this.$emit('update:checkData', this.checkData)
+    }
+  }
+}
+</script>

+ 1 - 1
vue.config.js

@@ -63,7 +63,7 @@ module.exports = {
          }
        },*/
       '/jeecg-boot': {
-        target: 'http://localhost:8080', //请求本地 需要jeecg-boot后台项目
+        target: 'http://39.106.184.70:8080', //请求本地 需要jeecg-boot后台项目
         ws: false,
         changeOrigin: true
       },