Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/views/template/budget/create.vue
xuzuoyun 5 rokov pred
rodič
commit
74855c2d06

+ 5 - 0
src/config/router.config.js

@@ -50,6 +50,11 @@ export const constantRouterMap = [
         name: 'alteration',
         component: () => import(/* webpackChunkName: "user" */ '@/views/user/Alteration')
       },
+      {
+        path: 'layer',
+        name: 'layer',
+        component: () => import(/* webpackChunkName: "user" */ '@/views/user/layer')
+      }
     ]
   },
 

+ 1 - 0
src/main.js

@@ -1,4 +1,5 @@
 import Vue from 'vue'
+import layer from 'vue-layer'
 import App from './App.vue'
 import Storage from 'vue-ls'
 import router from './router'

+ 23 - 1
src/views/modules/advertiser/AdvertiserList.vue

@@ -167,11 +167,22 @@
 
               <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">
+                <a-radio-group buttonStyle="outline" v-model="authorizationType" @change="changeShowAuthName">
                   <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>
@@ -229,6 +240,8 @@
         visible: false,
         accountName: '',
         password: '',
+        showAuthName: true,
+        authName: '',
         mode: 'login',
         showLogin: true,
         showAuthorization: false,
@@ -302,6 +315,14 @@
     methods: {
       ...mapGetters(["nickname", "avatar", "userInfo"]),
 
+      changeShowAuthName() {
+        if (this.authorizationType == 'bytedance') {
+          this.showAuthName = false;
+        } else {
+          this.showAuthName = true;
+        }
+      },
+
       handleSubmit() {
         /*postAction(this.url.getLoginInfo).then((res) => {
           if (res.success) {
@@ -349,6 +370,7 @@
               params.authorizationType = this.authorizationType;
               if (this.authorizationType == 'kuaishou') {
                 params.mediaId = 2;
+                params.authName = this.authName;
               } else if (this.authorizationType == 'bytedance') {
                 params.mediaId = 1;
               }

+ 211 - 0
src/views/modules/advertiser/UserAllocationList.vue

@@ -0,0 +1,211 @@
+<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.userId"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="账户id --授权">
+              <a-input placeholder="请输入账户id --授权" v-model="queryParam.accountId"></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :md="6" :sm="8">
+              <a-form-item label="广告主ID">
+                <a-input placeholder="请输入广告主ID" v-model="queryParam.advertiserId"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="8">
+              <a-form-item label="指定分配人">
+                <a-input placeholder="请输入指定分配人" v-model="queryParam.distributionName"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="8">
+              <a-form-item label="部门id">
+                <a-input placeholder="请输入部门id" v-model="queryParam.departmentId"></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 -->
+
+    <!-- 表单区域 -->
+    <userAllocation-modal ref="modalForm" @ok="modalFormOk"></userAllocation-modal>
+  </a-card>
+</template>
+
+<script>
+  import UserAllocationModal from './modules/UserAllocationModal'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "UserAllocationList",
+    mixins: [JeecgListMixin],
+    components: {
+      UserAllocationModal
+    },
+    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: '指定分配人',
+            align: "center",
+            dataIndex: 'distributionName'
+          },
+
+          {
+            title: '管理员名称',
+            align: "center",
+            dataIndex: 'adminName'
+          },
+          {
+            title: '广告主名称',
+            align: "center",
+            dataIndex: 'advertiserName'
+          },
+          {
+            title: '输入账号',
+            align: "center",
+            dataIndex: 'accountName'
+          },
+          {
+            title: '操作人姓名',
+            align: "center",
+            dataIndex: 'operationName'
+          },
+          {
+            title: '授权名称',
+            align: "center",
+            dataIndex: 'authName'
+          },
+          {
+            title: '平台类型',
+            align: "center",
+            dataIndex: 'mediaId'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align: "center",
+            scopedSlots: {customRender: 'action'},
+          }
+        ],
+        url: {
+          list: "/ctop/userAllocation/list",
+          delete: "/ctop/userAllocation/delete",
+          deleteBatch: "/ctop/userAllocation/deleteBatch",
+          exportXlsUrl: "ctop/userAllocation/exportXls",
+          importExcelUrl: "ctop/userAllocation/importExcel",
+        },
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {}
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 184 - 0
src/views/modules/advertiser/modules/UserAllocationModal.vue

@@ -0,0 +1,184 @@
+<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="登陆人id">
+          <a-input placeholder="请输入登陆人id" v-decorator="['userId', {}]" />
+        </a-form-item>
+        <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="指定分配人">
+          <a-input placeholder="请输入指定分配人" v-decorator="['distributionName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="部门id">
+          <a-input placeholder="请输入部门id" v-decorator="['departmentId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="管理员名称">
+          <a-input placeholder="请输入管理员名称" v-decorator="['adminName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告主名称">
+          <a-input placeholder="请输入广告主名称" v-decorator="['advertiserName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="输入账号  --登陆">
+          <a-input placeholder="请输入输入账号  --登陆" v-decorator="['accountName', {}]" />
+        </a-form-item>
+        <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="操作人姓名">
+            <a-input placeholder="请输入操作人姓名" v-decorator="['operationName', {}]"/>
+        </a-form-item>
+        <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="授权名称">
+            <a-input placeholder="请输入授权名称" v-decorator="['authName', {}]"/>
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="平台类型 1 头条 2快手">
+          <a-input placeholder="请输入平台类型 1 头条 2快手" v-decorator="['mediaId', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "UserAllocationModal",
+    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/userAllocation/add",
+          edit: "/ctop/userAllocation/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, 'userId', 'accountId', 'advertiserId', 'distributionName', 'departmentId', 'adminName', 'advertiserName', 'accountName', 'operationName', 'authName', 'mediaId'))
+		  //时间格式化
+        });
+
+      },
+      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>
+
+</style>

+ 191 - 0
src/views/modules/advertiser/modules/UserAllocationModal__Style#Drawer.vue

@@ -0,0 +1,191 @@
+<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="['userId', {}]" />
+        </a-form-item>
+        <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="指定分配人">
+          <a-input placeholder="请输入指定分配人" v-decorator="['distributionName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="部门id">
+          <a-input placeholder="请输入部门id" v-decorator="['departmentId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="管理员名称">
+          <a-input placeholder="请输入管理员名称" v-decorator="['adminName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告主名称">
+          <a-input placeholder="请输入广告主名称" v-decorator="['advertiserName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="输入账号  --登陆">
+          <a-input placeholder="请输入输入账号  --登陆" v-decorator="['accountName', {}]" />
+        </a-form-item>
+        <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="操作人姓名">
+            <a-input placeholder="请输入操作人姓名" v-decorator="['operationName', {}]"/>
+        </a-form-item>
+        <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="授权名称">
+            <a-input placeholder="请输入授权名称" v-decorator="['authName', {}]"/>
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="平台类型 1 头条 2快手">
+          <a-input placeholder="请输入平台类型 1 头条 2快手" v-decorator="['mediaId', {}]" />
+        </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: "UserAllocationModal",
+    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/userAllocation/add",
+          edit: "/ctop/userAllocation/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, 'userId', 'accountId', 'advertiserId', 'distributionName', 'departmentId', 'adminName', 'advertiserName', 'accountName', 'operationName', 'authName', 'mediaId'))
+		  //时间格式化
+        });
+
+      },
+      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>

+ 198 - 0
src/views/modules/kuaishouapp/KuaiShouCampaignTemplateList.vue

@@ -0,0 +1,198 @@
+<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="2:提升应用安装 3:获取电商下单 4:推广品牌活动 5:收集销售线索">
+              <a-input placeholder="请输入2:提升应用安装 3:获取电商下单 4:推广品牌活动 5:收集销售线索" v-model="queryParam.type"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="应用创建主键id">
+              <a-input placeholder="请输入应用创建主键id" v-model="queryParam.appId"></a-input>
+            </a-form-item>
+          </a-col>
+        <template v-if="toggleSearchStatus">
+        <a-col :md="6" :sm="8">
+            <a-form-item label="url类型 当计划类型为 3(获取电商下单)时必填:1 - 淘宝商品短链2 - 淘宝商品 itemID">
+              <a-input placeholder="请输入url类型 当计划类型为 3(获取电商下单)时必填:1 - 淘宝商品短链2 - 淘宝商品 itemID" v-model="queryParam.urlType"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="广告计划名称">
+              <a-input placeholder="请输入广告计划名称" v-model="queryParam.campaignName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="当前登录人id">
+              <a-input placeholder="请输入当前登录人id" v-model="queryParam.loginId"></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 -->
+
+    <!-- 表单区域 -->
+    <kuaiShouCampaignTemplate-modal ref="modalForm" @ok="modalFormOk"></kuaiShouCampaignTemplate-modal>
+  </a-card>
+</template>
+
+<script>
+  import KuaiShouCampaignTemplateModal from './modules/KuaiShouCampaignTemplateModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "KuaiShouCampaignTemplateList",
+    mixins:[JeecgListMixin],
+    components: {
+      KuaiShouCampaignTemplateModal
+    },
+    data () {
+      return {
+        description: '快手-创建广告计划模板管理页面',
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+           },
+		   {
+            title: '2:提升应用安装 3:获取电商下单 4:推广品牌活动 5:收集销售线索',
+            align:"center",
+            dataIndex: 'type'
+           },
+		   {
+            title: '应用创建主键id',
+            align:"center",
+            dataIndex: 'appId'
+           },
+		   {
+            title: 'url类型 当计划类型为 3(获取电商下单)时必填:1 - 淘宝商品短链2 - 淘宝商品 itemID',
+            align:"center",
+            dataIndex: 'urlType'
+           },
+		   {
+            title: '广告计划名称',
+            align:"center",
+            dataIndex: 'campaignName'
+           },
+		   {
+            title: '当前登录人id',
+            align:"center",
+            dataIndex: 'loginId'
+           },
+		   {
+            title: '当计划类型是 3/4/5 时必填',
+            align:"center",
+            dataIndex: 'url'
+           },
+		   {
+            title: '计划单日预算金额 单位:厘 0表示预算不限,不小于500元,不超过100000000',
+            align:"center",
+            dataIndex: 'dayBudget'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/kuaishou/kuaiShouCampaignTemplate/list",
+          delete: "/kuaishou/kuaiShouCampaignTemplate/delete",
+          deleteBatch: "/kuaishou/kuaiShouCampaignTemplate/deleteBatch",
+          exportXlsUrl: "kuaishou/kuaiShouCampaignTemplate/exportXls",
+          importExcelUrl: "kuaishou/kuaiShouCampaignTemplate/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 208 - 0
src/views/modules/kuaishouapp/KuaiShouCreateAppTemplateList.vue

@@ -0,0 +1,208 @@
+<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="app类型 安卓 ios">
+              <a-input placeholder="请输入app类型 安卓 ios" v-model="queryParam.appType"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="应用类型   : 1 Android 应用下载,2: Android 网页游戏,3: iOS 应用下载, 4:iOS 网页游戏">
+              <a-input placeholder="请输入应用类型   : 1 Android 应用下载,2: Android 网页游戏,3: iOS 应用下载, 4:iOS 网页游戏" v-model="queryParam.platform"></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.appVersion"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="应用名称">
+              <a-input placeholder="请输入应用名称" v-model="queryParam.appName"></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>
+          </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 -->
+
+    <!-- 表单区域 -->
+    <kuaiShouCreateAppTemplate-modal ref="modalForm" @ok="modalFormOk"></kuaiShouCreateAppTemplate-modal>
+  </a-card>
+</template>
+
+<script>
+  import KuaiShouCreateAppTemplateModal from './modules/KuaiShouCreateAppTemplateModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "KuaiShouCreateAppTemplateList",
+    mixins:[JeecgListMixin],
+    components: {
+      KuaiShouCreateAppTemplateModal
+    },
+    data () {
+      return {
+        description: '创建应用管理页面',
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+           },
+		   {
+            title: 'app类型 安卓 ios',
+            align:"center",
+            dataIndex: 'appType'
+           },
+		   {
+            title: '应用类型   : 1 Android 应用下载,2: Android 网页游戏,3: iOS 应用下载, 4:iOS 网页游戏',
+            align:"center",
+            dataIndex: 'platform'
+           },
+		   {
+            title: '应用标记',
+            align:"center",
+            dataIndex: 'appVersion'
+           },
+		   {
+            title: '应用名称',
+            align:"center",
+            dataIndex: 'appName'
+           },
+		   {
+            title: '应用包名',
+            align:"center",
+            dataIndex: 'packageName'
+           },
+		   {
+            title: '上传文件到服务器返回地址',
+            align:"center",
+            dataIndex: 'file'
+           },
+		   {
+            title: '上传图片到服务器返回地址',
+            align:"center",
+            dataIndex: 'imageUrl'
+           },
+		   {
+            title: '输入应用下载地址',
+            align:"center",
+            dataIndex: 'url'
+           },
+		   {
+            title: '登录人id',
+            align:"center",
+            dataIndex: 'loginId'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/kuaishou/kuaiShouCreateAppTemplate/list",
+          delete: "/kuaishou/kuaiShouCreateAppTemplate/delete",
+          deleteBatch: "/kuaishou/kuaiShouCreateAppTemplate/deleteBatch",
+          exportXlsUrl: "kuaishou/kuaiShouCreateAppTemplate/exportXls",
+          importExcelUrl: "kuaishou/kuaiShouCreateAppTemplate/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 268 - 0
src/views/modules/kuaishouapp/KuaiShouGroupCreateLogList.vue

@@ -0,0 +1,268 @@
+<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.campaignTemplateId"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="账户ID">
+              <a-input placeholder="请输入账户ID" v-model="queryParam.accountId"></a-input>
+            </a-form-item>
+          </a-col>
+        <template v-if="toggleSearchStatus">
+        <a-col :md="6" :sm="8">
+            <a-form-item label="广告活动ID">
+              <a-input placeholder="请输入广告活动ID" v-model="queryParam.campaignId"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="广告组名称">
+              <a-input placeholder="请输入广告组名称" v-model="queryParam.unitName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="出价类型">
+              <a-input placeholder="请输入出价类型" v-model="queryParam.bidType"></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 -->
+
+    <!-- 表单区域 -->
+    <kuaiShouGroupCreateLog-modal ref="modalForm" @ok="modalFormOk"></kuaiShouGroupCreateLog-modal>
+  </a-card>
+</template>
+
+<script>
+  import KuaiShouGroupCreateLogModal from './modules/KuaiShouGroupCreateLogModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "KuaiShouGroupCreateLogList",
+    mixins:[JeecgListMixin],
+    components: {
+      KuaiShouGroupCreateLogModal
+    },
+    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: 'campaignTemplateId'
+           },
+		   {
+            title: '账户ID',
+            align:"center",
+            dataIndex: 'accountId'
+           },
+		   {
+            title: '广告活动ID',
+            align:"center",
+            dataIndex: 'campaignId'
+           },
+		   {
+            title: '广告组名称',
+            align:"center",
+            dataIndex: 'unitName'
+           },
+		   {
+            title: '出价类型',
+            align:"center",
+            dataIndex: 'bidType'
+           },
+		   {
+            title: '出价',
+            align:"center",
+            dataIndex: 'bid'
+           },
+		   {
+            title: 'OCPC出价',
+            align:"center",
+            dataIndex: 'cpaBid'
+           },
+		   {
+            title: '优化目标',
+            align:"center",
+            dataIndex: 'ocpxActionType'
+           },
+		   {
+            title: '深度转化目标 null',
+            align:"center",
+            dataIndex: 'deepConversionType'
+           },
+		   {
+            title: '资源位置',
+            align:"center",
+            dataIndex: 'page'
+           },
+		   {
+            title: '投放开始时间',
+            align:"center",
+            dataIndex: 'beginTime'
+           },
+		   {
+            title: '投放结束时间',
+            align:"center",
+            dataIndex: 'endTime'
+           },
+		   {
+            title: '投放时段',
+            align:"center",
+            dataIndex: 'scheduleTime'
+           },
+		   {
+            title: '单日预算',
+            align:"center",
+            dataIndex: 'dayBudget'
+           },
+		   {
+            title: 'url类型 1:淘宝商品短链 2:淘宝商品 itemID',
+            align:"center",
+            dataIndex: 'urlType'
+           },
+		   {
+            title: '投放链接',
+            align:"center",
+            dataIndex: 'url'
+           },
+		   {
+            title: 'APP ID',
+            align:"center",
+            dataIndex: 'appId'
+           },
+		   {
+            title: '创意展现方式  1:轮播 2:优选',
+            align:"center",
+            dataIndex: 'showModel'
+           },
+		   {
+            title: '投放方式 1:快速投放 2:平滑投放',
+            align:"center",
+            dataIndex: 'speed'
+           },
+		   {
+            title: '广告组ID',
+            align:"center",
+            dataIndex: 'unitId'
+           },
+		   {
+            title: '当前登录人id',
+            align:"center",
+            dataIndex: 'loginId'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/kuaishou/kuaiShouGroupCreateLog/list",
+          delete: "/kuaishou/kuaiShouGroupCreateLog/delete",
+          deleteBatch: "/kuaishou/kuaiShouGroupCreateLog/deleteBatch",
+          exportXlsUrl: "kuaishou/kuaiShouGroupCreateLog/exportXls",
+          importExcelUrl: "kuaishou/kuaiShouGroupCreateLog/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 188 - 0
src/views/modules/kuaishouapp/KuaiShouImageList.vue

@@ -0,0 +1,188 @@
+<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.localUrl"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="videoName">
+              <a-input placeholder="请输入videoName" v-model="queryParam.videoName"></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.imageType"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="登录人id">
+              <a-input placeholder="请输入登录人id" v-model="queryParam.loginId"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="图片类型 1-竖版图片 2-横版图片">
+              <a-input placeholder="请输入图片类型 1-竖版图片 2-横版图片" v-model="queryParam.materialType"></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 -->
+
+    <!-- 表单区域 -->
+    <kuaiShouImage-modal ref="modalForm" @ok="modalFormOk"></kuaiShouImage-modal>
+  </a-card>
+</template>
+
+<script>
+  import KuaiShouImageModal from './modules/KuaiShouImageModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "KuaiShouImageList",
+    mixins:[JeecgListMixin],
+    components: {
+      KuaiShouImageModal
+    },
+    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: 'localUrl'
+           },
+		   {
+            title: 'imageName',
+            align:"center",
+            dataIndex: 'imageName'
+           },
+		   {
+            title: '视频类别',
+            align:"center",
+            dataIndex: 'imageType'
+           },
+		   {
+            title: '登录人id',
+            align:"center",
+            dataIndex: 'loginId'
+           },
+		   {
+            title: '图片类型 1-竖版图片 2-横版图片',
+            align:"center",
+            dataIndex: 'materialType'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/kuaishou/kuaiShouImage/list",
+          delete: "/kuaishou/kuaiShouImage/delete",
+          deleteBatch: "/kuaishou/kuaiShouImage/deleteBatch",
+          exportXlsUrl: "kuaishou/kuaiShouImage/exportXls",
+          importExcelUrl: "kuaishou/kuaiShouImage/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 594 - 0
src/views/modules/kuaishouapp/creativeCreate.vue

@@ -0,0 +1,594 @@
+<template>
+  <a-card :body-style="{padding: '24px 32px'}" :bordered="false">
+    <a-form @submit="handleSubmit" :form="form">
+
+
+      <a-form-item
+        label="选择快手账户"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-select
+          v-model="accountId"
+          @change="actionGroups"
+          showSearch
+          showArrow
+          allowClear
+          placeholder="选择需创建的快手账户"
+          optionFilterProp="children"
+          style="width: 650px"
+          :filterOption="filterOption"
+        >
+          <a-select-option v-for="userAccount in accountList" :key="userAccount.accountId"
+                           :value="userAccount.accountId">{{userAccount.authName}}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+
+
+      <a-form-item
+        label="选择广告组"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-cascader style="width: 650px" v-model="ids" :options="options" @change="onChangeActionBarText"
+                    :loadData="loadData"
+                    placeholder="Please select" :changeOnSelect="changeOnSelectValue"/>
+      </a-form-item>
+
+
+      <a-form-item
+        label="广告投放位置"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-radio-group v-model="placementPosition" @change="changePlacementPosition">
+          <a-radio-button value='1'>优选广告位</a-radio-button>
+          <a-radio-button value='2'>按场景选择广告位</a-radio-button>
+        </a-radio-group>
+      </a-form-item>
+
+
+      <a-form-item
+        label="位置类型"
+        v-if="showDeliveryType"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-radio-group v-model="deliveryType" @change="showSinglePicture">
+          <a-radio-button value='1'>信息流广告</a-radio-button>
+          <a-radio-button value='2'>视频后贴片广告</a-radio-button>
+        </a-radio-group>
+      </a-form-item>
+
+      <a-form-item
+
+        label="视频类型"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-radio-group v-model="videoType" @change="changeVideoList">
+          <a-radio-button value='1'>竖版视频</a-radio-button>
+          <a-radio-button value='2'>横版视频</a-radio-button>
+          <a-radio-button value='3' v-if="singlePicture">单张图片</a-radio-button>
+        </a-radio-group>
+      </a-form-item>
+
+      <a-form-item
+        label="视频上传方式"
+        v-if="showUploadType"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-radio-group v-model="videoUploadType" @change="changeUploadVideo">
+          <a-radio-button value='1'>选择作品</a-radio-button>
+          <a-radio-button value='2'>本地上传</a-radio-button>
+        </a-radio-group>
+      </a-form-item>
+
+
+      <a-form-item
+        label="选择本地文件进行上传"
+        v-if="localUpload"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <upload-to-ali v-model="localUrl"
+                       :customDomain="customDomain"
+                       preview
+                       :region="region"
+                       :bucket="bucket"
+                       :accept="acceptVideo"
+                       :max="10"
+                       :size="1024000"
+                       :accessKeyId="accessKeyId"
+                       :accessKeySecret="accessKeySecret"></upload-to-ali>
+      </a-form-item>
+
+      <a-form-item
+        label="选择作品进行上传"
+        v-if="selectVideoUpload"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-select
+          v-model="videoUrl"
+          @change="getDescription"
+          showSearch
+          allowClear
+          optionFilterProp="children"
+          style="width: 650px"
+          @focus="handleFocus"
+          @blur="handleBlur"
+          :filterOption="filterOption">
+          <a-select-option v-for="video in videoList" :key="video.localUrl" :value="video.localUrl">
+            {{video.videoName}}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+
+
+      <a-form-item
+        v-if="showImageUpload"
+        label="图片上传"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <upload-to-ali v-model="localImageUrl"
+                       :customDomain="customDomain"
+                       multiple
+                       preview
+                       :region="region"
+                       :bucket="bucket"
+                       :accept="acceptImage"
+                       :max="10"
+                       :size="1024000"
+                       :accessKeyId="accessKeyId"
+                       :accessKeySecret="accessKeySecret"></upload-to-ali>
+      </a-form-item>
+
+
+      <a-form-item
+
+        label="上传封面"
+        v-if="showUploadImageRadio"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-radio-group v-model="imageType" @change="changeImageType">
+          <a-radio-button value='1'>选择封面</a-radio-button>
+          <a-radio-button value='2'>本地上传</a-radio-button>
+        </a-radio-group>
+      </a-form-item>
+
+      <a-form-item
+        v-if="showCover"
+        label="选择封面"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-select
+          v-model="imageUrl"
+          showSearch
+          allowClear
+          mode="multiple"
+          placeholder="选择视频封面"
+          optionFilterProp="children"
+          style="width: 650px"
+          @focus="handleFocus"
+          @blur="handleBlur"
+          :filterOption="filterOption">
+          <a-select-option v-for="image in imageList" :key="image.localUrl" :value="image.localUrl">
+            {{image.imageName}}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+
+
+      <a-form-item
+        v-if="showLocalImageUpload"
+        label="本地封面上传"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <upload-to-ali v-model="imageUrl"
+                       :customDomain="customDomain"
+                       multiple
+                       preview
+                       :region="region"
+                       :bucket="bucket"
+                       :accept="acceptImage"
+                       :max="10"
+                       :size="1024000"
+                       :accessKeyId="accessKeyId"
+                       :accessKeySecret="accessKeySecret"></upload-to-ali>
+      </a-form-item>
+
+
+      <a-form-item
+        label="行动号召按钮"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-select
+          v-model="actionBarTextDesc"
+          showSearch
+          allowClear
+          placeholder="选择应用目标"
+          optionFilterProp="children"
+          style="width: 650px"
+          @focus="handleFocus"
+          @blur="handleBlur"
+          :filterOption="filterOption">
+          <a-select-option v-for="actionBar in actionBarTextList" :key="actionBar.id" :value="actionBar.actionBarText">
+            {{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-form-item>
+
+
+      <a-form-item
+        label="创意名称"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-input v-model="creativeName" placeholder="请填写广告创意名称" style="width: 650px"></a-input>
+      </a-form-item>
+
+      <a-form-item
+        label="第三方点击监测链接"
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol">
+        <a-input v-model="clickTrackUrl" placeholder="请第三方点击监测链接" style="width: 650px"></a-input>
+      </a-form-item>
+
+
+      <a-form-item
+        :wrapperCol="{ span: 24 }"
+        style="text-align: center">
+        <a-button htmlType="submit" type="primary">提交</a-button>
+        <a-button style="margin-left: 8px">保存</a-button>
+      </a-form-item>
+    </a-form>
+  </a-card>
+</template>
+
+<script>
+  import {getAction, postAction} from '@/api/manage'
+  import {mapGetters} from 'vuex'
+  import UploadToAli from '@femessage/upload-to-ali'
+  import moment from "moment"
+
+
+  export default {
+    name: 'BaseForm',
+    components: {
+      UploadToAli
+    },
+    data() {
+      return {
+        accountId: '',// 快手 accountId
+        accountList: {},
+
+        campaignId: '', //广告计划id
+        targetPopulation: '',
+        changeOnSelectValue: true,
+        ids: [],
+        placementPosition: '1',// 广告投放位置
+        showDeliveryType: false,
+        deliveryType: '1',
+        videoType: '1',
+        singlePicture: true,// 展示单张图片
+        videoUploadType: '1',
+        localUpload: false,
+        localUrl: '', // 本地上传地址
+        selectVideoUpload: true,
+        videoUrl: '',// 视频id
+        videoList: [],
+        showUploadType: true,
+        localImageUrl: '',//图片地址
+        showImageUpload: false,
+        imageList: [],
+        imageUrl: [],
+        showCover: true,
+        imageType: '1',
+        actionBarTextList: [],
+        actionBarTextDesc: '',
+        description: '',// 作品广告语
+        creativeName: '',//创意名称
+        clickTrackUrl: '',// 第三方检测链接
+        showLocalImageUpload: false,
+        showUploadImageRadio: true,
+
+
+        customDomain: '',
+        acceptVideo: 'video/mpeg,video/mp4',
+        acceptImage: 'image/jpeg,image,jpg/png',
+        accessKeyId: 'LTAIbNbqWzSOklQV',
+        accessKeySecret: '1rkPz7JNoXk8sJevPaeYHWqfkQXBGh',
+        region: 'oss-cn-beijing',
+        bucket: 'ctop-media',
+        options: [],
+        labelCol: {
+          xs: {
+            span: 7
+          }
+          ,
+          sm: {
+            span: 7
+          }
+          ,
+        }
+        ,
+        wrapperCol: {
+          xs: {
+            span: 10
+          }
+          ,
+          sm: {
+            span: 17
+          }
+          ,
+        }
+        ,
+
+        form: this.$form.createForm(this),
+        url:
+          {
+            userAllocationList: '/ctop/userAllocation/list',
+            getOptionsUrl: '/kuaishou/create/getOptions',
+            getChildrenUrl: '/kuaishou/create/getChildren',
+            videoListUrl: '/kuaishou/kuaiShouVideo/list',
+            imageListUrl: '/kuaishou/kuaiShouImage/list',
+            actionBarTextListUrl: '/kuaishou/kuaiShouActionBarText/list',
+            getDescriptionUrl: '/kuaishou/kuaiShouVideo/queryShouVideo',
+
+            creativeUrl: '/kuaishou/create/createCreative',
+
+          }
+      }
+    },
+    methods: {
+      ...mapGetters(["nickname", "avatar", "userInfo"]),
+
+      changeImageType() {
+        if (this.imageType == '2') {
+          this.showLocalImageUpload = true;
+          this.showCover = false;
+        } else {
+          this.showLocalImageUpload = false;
+          this.showCover = true;
+        }
+      },
+
+      handleChange(value) {
+        console.log(`selected ${value}`);
+      },
+      handleBlur() {
+        console.log('blur');
+      },
+      handleFocus() {
+        console.log('focus');
+      },
+      filterOption(input, option) {
+        return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      },
+      changeUploadVideo() {
+        if (this.videoUploadType == 2) {
+          this.localUpload = true;
+          this.selectVideoUpload = false;
+          this.showImageUpload = false;
+        } else {
+          this.localUpload = false;
+          this.selectVideoUpload = true;
+          this.showImageUpload = false;
+        }
+      },
+      getDescription() {
+        let params = {};
+        params.localUrl = this.videoUrl;
+        params.loginId = this.userInfo().id;
+        postAction(this.url.getDescriptionUrl, params).then((res) => {
+          console.log(res)
+          if (res.success) {
+            this.description = res.result.videoDesc;
+            this.creativeName = res.result.videoName + "_" + moment().format('YYYY-MM-DD_HH:mm');
+          }
+        });
+      },
+
+      changeVideoList() {
+        if (this.videoType == '2' || this.videoType == '1') {
+          this.showImageUpload = false;
+          this.showUploadType = true;
+          this.selectVideoUpload = true;
+          this.localUpload = false;
+          this.showCover = false;
+          this.showLocalImageUpload = false;
+          this.videoUrl = '';
+          this.showLocalImageUpload = false;
+          this.showUploadImageRadio = true;
+          this.showCover = true;
+          let params = {};
+          params.pageSize = '1000';
+          params.loginId = this.userInfo().id;
+          if (this.videoType == '2') {
+            params.materialType = '2';
+          }
+          if (this.videoType == '1') {
+            params.materialType = '1';
+          }
+          getAction(this.url.videoListUrl, params).then((res) => {
+            if (res.success) {
+              this.videoList = res.result.records
+            }
+          });
+          getAction(this.url.imageListUrl, params).then((res) => {
+            if (res.success) {
+              this.imageList = res.result.records
+            }
+          });
+        } else {
+          this.showImageUpload = true;
+          this.showUploadType = false;
+          this.selectVideoUpload = false;
+          this.localUpload = false;
+          this.showCover = false;
+          this.showUploadImageRadio = false;
+          this.showLocalImageUpload = false;
+          this.showCover = false;
+        }
+      },
+
+      changePlacementPosition() {
+        this.singlePicture = false;
+        if (this.placementPosition == '1') {
+          this.showDeliveryType = false;
+          this.singlePicture = true;
+        } else if (this.placementPosition == '2' && this.deliveryType == '1') {
+          this.showDeliveryType = true;
+          this.singlePicture = false;
+        } else if (this.placementPosition == '2' && this.deliveryType == '2') {
+          this.showDeliveryType = false;
+          this.singlePicture = true;
+        }
+
+
+      },
+      showSinglePicture() {
+        this.singlePicture = false
+
+        if (this.deliveryType == '2') {
+          this.singlePicture = true;
+          this.showImageUpload = false;
+          this.selectVideoUpload = false;
+          this.localUpload = false;
+        } else {
+          this.singlePicture = false;
+          this.showImageUpload = false;
+          this.selectVideoUpload = true;
+          this.localUpload = true;
+        }
+
+
+      },
+
+
+      handleSubmit(e) {
+        e.preventDefault()
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            console.log('Received values of form: ', values);
+            console.log('快手账号: ', this.accountId);
+            console.log('  ---: ', this.ids);
+            let params = {};
+            params.accountId = this.accountId;
+            if (this.ids.length == 2) {
+              params.unitId = this.ids[1];
+            }
+            params.videoUploadType = this.videoUploadType;
+            if (this.videoUploadType == '1') {
+              params.videoUrl = this.videoUrl;
+            } else if (this.videoUploadType == '2') {
+              params.videoUrl = this.localUrl;
+            }
+            params.imageUrl = this.imageUrl;
+            console.log(this.imageUrl)
+            params.actionBarText = this.actionBarTextDesc;
+            params.description = this.description;
+            params.clickTrackUrl = this.clickTrackUrl;
+            params.creativeName = this.creativeName;
+            params.imageType = this.imageType;
+            params.videoType = this.videoType;
+            params.loginId = this.userInfo().id;
+            postAction(this.url.creativeUrl, params).then((res) => {
+              console.log(res)
+              if (res.success) {
+                alert("广告创意创建成功");
+              }
+            });
+          }
+        })
+      },
+      onChange(value) {
+        console.log(value);
+      },
+
+      onChangeActionBarText() {
+        if (this.ids.length == 2) {
+          let id = this.ids[0];
+          let params = {};
+          params.campaignId = id;
+          getAction(this.url.actionBarTextListUrl, params).then((res) => {
+            if (res.success) {
+              this.actionBarTextList = res.result.records
+            }
+          });
+
+        }
+
+      },
+
+      filterOption(input, option) {
+        return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      },
+
+      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) => {
+          targetOption.children = res
+        });
+        this.options = [...this.options]
+      },
+
+      actionGroups() {
+        let params = {};
+        params.loginId = this.userInfo().id;
+        params.accountId = this.accountId;
+        postAction(this.url.getOptionsUrl, params).then((res) => {
+          this.options = res
+          console.log(res)
+        });
+      }
+    },
+
+    created: function () {
+      let params = {};
+      params.pageSize = '1000';
+      params.mediaId = '2';
+      params.userId = this.userInfo().id;
+      getAction(this.url.userAllocationList, params).then((res) => {
+        if (res.success) {
+          this.accountList = res.result.records
+        }
+      });
+
+
+      // 页面初始化 查询竖版视频
+      params = {};
+      params.pageSize = '1000';
+      params.materialType = '1';
+      params.loginId = this.userInfo().id;
+      getAction(this.url.videoListUrl, params).then((res) => {
+        if (res.success) {
+          this.videoList = res.result.records
+          console.log("......")
+          console.log(this.videoList)
+        }
+      });
+
+      // 图片列表
+      getAction(this.url.imageListUrl, params).then((res) => {
+        if (res.success) {
+          this.imageList = res.result.records
+        }
+      });
+
+
+    }
+  }
+
+</script>

+ 148 - 5
src/views/modules/kuaishouapp/groupCreate.vue

@@ -4,6 +4,67 @@
 
 
       <a-form-item
+        label="选择快手账户"
+        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
+        :wrapperCol="{lg: {span: 10}, sm: {span: 17} }">
+        <a-select
+          @change="deepConversion"
+          v-model="accountId"
+          showSearch
+          showArrow
+          allowClear
+          placeholder="选择需创建的快手账户"
+          optionFilterProp="children"
+          style="width: 500px"
+          :filterOption="filterOption"
+        >
+          <a-select-option v-for="userAccount in accountList" :key="userAccount.accountId"
+                           :value="userAccount.accountId">{{userAccount.authName}}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+
+
+      <a-form-item
+        label="选择广告计划模板"
+        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
+        :wrapperCol="{lg: {span: 10}, sm: {span: 17} }">
+        <a-select
+          v-model="campaignTemplateId"
+          showSearch
+          showArrow
+          placeholder="请选择广告计划模板"
+          optionFilterProp="children"
+          style="width: 500px"
+          :filterOption="filterOption"
+        >
+          <a-select-option v-for="campaign in campaignList" :key="campaign.id"
+                           :value="campaign.id">{{campaign.campaignName}}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+
+
+      <a-form-item
+        label="请选择目标人群"
+        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
+        :wrapperCol="{lg: {span: 10}, sm: {span: 17} }">
+        <a-select
+          v-model="targetPopulation"
+          showSearch
+          showArrow
+          disabled
+          placeholder="请选择目标人群"
+          optionFilterProp="children"
+          style="width: 500px"
+          :filterOption="filterOption"
+        >
+          <a-select-option value="default">请期待</a-select-option>
+        </a-select>
+      </a-form-item>
+
+
+      <a-form-item
         label="单日预算"
         :labelCol="{lg: {span: 7}, sm: {span: 7}}"
         :wrapperCol="{lg: {span: 10}, sm: {span: 17} }">
@@ -131,7 +192,7 @@
         :wrapperCol="{lg: {span: 10}, sm: {span: 17} }">
         <a-radio-group v-model="ocpxActionType" @change="showBidType">
           <a-radio-button value="2">行为数</a-radio-button>
-          <a-radio-button value="180">激活数</a-radio-button>
+          <a-radio-button value="180" :disabled="isDisabled">激活数</a-radio-button>
         </a-radio-group>
       </a-form-item>
 
@@ -162,6 +223,15 @@
 
 
       <a-form-item
+        label="迭代次数"
+        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
+        :wrapperCol="{lg: {span: 10}, sm: {span: 17} }">
+        <a-input
+          v-model="createCount"
+          placeholder="不小于0,不高于10,仅支持输入自然数" type="number" style="width: 70%"></a-input>
+      </a-form-item>
+
+      <a-form-item
         :wrapperCol="{ span: 20 }"
         style="text-align: center">
         <a-button htmlType="submit" type="primary">提交</a-button>
@@ -172,7 +242,7 @@
 </template>
 
 <script>
-  import {postAction} from '@/api/manage'
+  import {deleteAction, postAction, getAction} from '@/api/manage'
   import moment from "moment"
   import {mapGetters} from 'vuex'
   import jq from 'jquery'
@@ -183,12 +253,18 @@
     name: 'BaseForm',
     data() {
       return {
+        accountId: '',// 账号id
+        accountList: {},
+        campaignTemplateId: '',// 广告计划模板id
+        campaignList: {},
+        targetPopulation: '',
         campaignBudget: 'UNLIMITED',
         dayBudget: 0,
         showBudgetDaily: false,
         speed: '1', // 1 快速投放 2平滑投放
         schedulingType: '1',// 1 从今天开始长期投放 2 设置开始和结束日期
         showTime: false,
+        createCount: 0,
         time: [],
         scheduleTimeType: '1',
         showScheduleTime: false,
@@ -202,18 +278,45 @@
         showCpaBid: false,
         cpaBid: 0,// bid_type 是 OCPC 时该字段必填
         page: 2,// 资源位置
-        unitName: "_" + moment().format('YYYY-MM-DD HH:mm'),//广告组名称
+        unitName: "_" + moment().format('YYYY-MM-DD_HH:mm'),//广告组名称
+        isDisabled: true,
 
 
         form: this.$form.createForm(this),
         url: {
-          insertTemplateUrl: '/kuaishou/kuaiShouGroupCreateTemplate/insert'
+          insertTemplateUrl: '/kuaishou/create/createGroups',
+          userAllocationList: '/ctop/userAllocation/list',
+          campaignList: '/kuaishou/kuaiShouCampaignTemplate/list',
+          getDeepConversionUrl: '/kuaishou/kuaiShouConversionTypes/getIsActivate',
+
+
         }
       }
     },
     methods: {
       ...mapGetters(["nickname", "avatar", "userInfo"]),
 
+      deepConversion() {
+        if (this.accountId != '') {
+          let params = {};
+          params.accountId = this.accountId;
+          getAction(this.url.getDeepConversionUrl, params).then((res) => {
+            if (res.success) {
+
+              if (res.result) {
+                this.isDisabled = false;
+              } else {
+                this.isDisabled = true;
+              }
+
+              console.log(res.result)
+            }
+          });
+
+        }
+
+      },
+
       showBidType() {
         if (this.bidType == '6') {
           this.showBid = false;
@@ -247,6 +350,7 @@
 
       },
 
+
       handleConfirmValue(rule, value, callback) {
         if (this.dayBudget == '' || this.dayBudget <= 500 || this.dayBudget >= 100000000) {
           callback('请输入正确预算金额')
@@ -310,7 +414,7 @@
             console.log('资源位置: ', this.page);
             console.log('广告组名称: ', this.unitName);
             let params = {};
-            params.dayBudget = this.dayBudget;
+            params.dayBudget = this.dayBudget * 1000;
             params.speed = this.speed;
             if (this.schedulingType == '1') {
               params.beginTime = moment().format('YYYY-MM-DD');
@@ -335,11 +439,17 @@
             params.showModel = this.showMode;
             params.unitName = this.unitName;
             params.loginId = this.userInfo().id;
+            params.accountId = this.accountId;
+            params.campaignTemplateId = this.campaignTemplateId;
+            params.createCount = this.createCount;
+
             console.log(params)
             postAction(this.url.insertTemplateUrl, params).then((res) => {
               console.log(res)
               if (res.success) {
                 alert("广告组模板创建成功");
+              } else {
+                alert(res.message);
               }
             });
           }
@@ -348,7 +458,40 @@
       onChange(value) {
         console.log(value);
       },
+      handleChange(value) {
+        console.log(`selected ${value}`);
+      },
+      handleBlur() {
+        console.log('blur');
+      },
+      handleFocus() {
+        console.log('focus');
+      },
+      filterOption(input, option) {
+        return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      },
 
+    },
+    created: function () {
+      let params = {};
+      params.pageSize = '1000';
+      params.mediaId = '2';
+      params.userId = this.userInfo().id;
+      getAction(this.url.userAllocationList, params).then((res) => {
+        if (res.success) {
+          this.accountList = res.result.records
+        }
+      });
+
+      params = {};
+      params.loginId = this.userInfo().id;
+      params.pageSize = '1000';
+      getAction(this.url.campaignList, params).then((res) => {
+        if (res.success) {
+          this.campaignList = res.result.records
+          console.log("-----" + this.campaignList)
+        }
+      });
     }
   }
 

+ 161 - 0
src/views/modules/kuaishouapp/modules/KuaiShouCampaignTemplateModal.vue

@@ -0,0 +1,161 @@
+<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="2:提升应用安装 3:获取电商下单 4:推广品牌活动 5:收集销售线索">
+          <a-input-number v-decorator="[ 'type', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="应用创建主键id">
+          <a-input placeholder="请输入应用创建主键id" v-decorator="['appId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="url类型 当计划类型为 3(获取电商下单)时必填:1 - 淘宝商品短链2 - 淘宝商品 itemID">
+          <a-input placeholder="请输入url类型 当计划类型为 3(获取电商下单)时必填:1 - 淘宝商品短链2 - 淘宝商品 itemID" v-decorator="['urlType', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告计划名称">
+          <a-input placeholder="请输入广告计划名称" v-decorator="['campaignName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="当前登录人id">
+          <a-input placeholder="请输入当前登录人id" v-decorator="['loginId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="当计划类型是 3/4/5 时必填">
+          <a-input placeholder="请输入当计划类型是 3/4/5 时必填" v-decorator="['url', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="计划单日预算金额 单位:厘 0表示预算不限,不小于500元,不超过100000000">
+          <a-input placeholder="请输入计划单日预算金额 单位:厘 0表示预算不限,不小于500元,不超过100000000" v-decorator="['dayBudget', validatorRules.dayBudget ]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "KuaiShouCampaignTemplateModal",
+    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:{
+        dayBudget:{rules: [{ required: true, message: '请输入计划单日预算金额 单位:厘 0表示预算不限,不小于500元,不超过100000000!' }]},
+        },
+        url: {
+          add: "/kuaishou/kuaiShouCampaignTemplate/add",
+          edit: "/kuaishou/kuaiShouCampaignTemplate/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,'type','appId','urlType','campaignName','loginId','url','dayBudget'))
+		  //时间格式化
+        });
+
+      },
+      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>
+
+</style>

+ 172 - 0
src/views/modules/kuaishouapp/modules/KuaiShouCreateAppTemplateModal.vue

@@ -0,0 +1,172 @@
+<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="app类型 安卓 ios">
+          <a-input placeholder="请输入app类型 安卓 ios" v-decorator="['appType', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="应用类型   : 1 Android 应用下载,2: Android 网页游戏,3: iOS 应用下载, 4:iOS 网页游戏">
+          <a-input placeholder="请输入应用类型   : 1 Android 应用下载,2: Android 网页游戏,3: iOS 应用下载, 4:iOS 网页游戏" v-decorator="['platform', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="应用标记">
+          <a-input placeholder="请输入应用标记" v-decorator="['appVersion', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="应用名称">
+          <a-input placeholder="请输入应用名称" v-decorator="['appName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="应用包名">
+          <a-input placeholder="请输入应用包名" v-decorator="['packageName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="上传文件到服务器返回地址">
+          <a-input placeholder="请输入上传文件到服务器返回地址" v-decorator="['file', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="上传图片到服务器返回地址">
+          <a-input placeholder="请输入上传图片到服务器返回地址" v-decorator="['imageUrl', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="输入应用下载地址">
+          <a-input placeholder="请输入输入应用下载地址" v-decorator="['url', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="登录人id">
+          <a-input placeholder="请输入登录人id" v-decorator="['loginId', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "KuaiShouCreateAppTemplateModal",
+    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: "/kuaishou/kuaiShouCreateAppTemplate/add",
+          edit: "/kuaishou/kuaiShouCreateAppTemplate/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,'appType','platform','appVersion','appName','packageName','file','imageUrl','url','loginId'))
+		  //时间格式化
+        });
+
+      },
+      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>
+
+</style>

+ 244 - 0
src/views/modules/kuaishouapp/modules/KuaiShouGroupCreateLogModal.vue

@@ -0,0 +1,244 @@
+<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="广告计划模板ID">
+          <a-input placeholder="请输入广告计划模板ID" v-decorator="['campaignTemplateId', {}]" />
+        </a-form-item>
+        <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="['campaignId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告组名称">
+          <a-input placeholder="请输入广告组名称" v-decorator="['unitName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="出价类型">
+          <a-input-number v-decorator="[ 'bidType', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="出价">
+          <a-input placeholder="请输入出价" v-decorator="['bid', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="OCPC出价">
+          <a-input placeholder="请输入OCPC出价" v-decorator="['cpaBid', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="优化目标">
+          <a-input-number v-decorator="[ 'ocpxActionType', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="深度转化目标 null">
+          <a-input-number v-decorator="[ 'deepConversionType', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="资源位置">
+          <a-input-number v-decorator="[ 'page', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="投放开始时间">
+          <a-input placeholder="请输入投放开始时间" v-decorator="['beginTime', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="投放结束时间">
+          <a-input placeholder="请输入投放结束时间" v-decorator="['endTime', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="投放时段">
+          <a-input placeholder="请输入投放时段" v-decorator="['scheduleTime', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="单日预算">
+          <a-input placeholder="请输入单日预算" v-decorator="['dayBudget', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="url类型 1:淘宝商品短链 2:淘宝商品 itemID">
+          <a-input-number v-decorator="[ 'urlType', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="投放链接">
+          <a-input placeholder="请输入投放链接" v-decorator="['url', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="APP ID">
+          <a-input placeholder="请输入APP ID" v-decorator="['appId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="创意展现方式  1:轮播 2:优选">
+          <a-input-number v-decorator="[ 'showModel', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="投放方式 1:快速投放 2:平滑投放">
+          <a-input-number v-decorator="[ 'speed', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告组ID">
+          <a-input placeholder="请输入广告组ID" v-decorator="['unitId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="当前登录人id">
+          <a-input placeholder="请输入当前登录人id" v-decorator="['loginId', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "KuaiShouGroupCreateLogModal",
+    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: "/kuaishou/kuaiShouGroupCreateLog/add",
+          edit: "/kuaishou/kuaiShouGroupCreateLog/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,'campaignTemplateId','accountId','campaignId','unitName','bidType','bid','cpaBid','ocpxActionType','deepConversionType','page','beginTime','endTime','scheduleTime','dayBudget','urlType','url','appId','showModel','speed','unitId','loginId'))
+		  //时间格式化
+        });
+
+      },
+      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>
+
+</style>

+ 148 - 0
src/views/modules/kuaishouapp/modules/KuaiShouImageModal.vue

@@ -0,0 +1,148 @@
+<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-decorator="['localUrl', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="imageName">
+          <a-input placeholder="请输入imageName" v-decorator="['videoName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="视频类别">
+          <a-input placeholder="请输入视频类别" v-decorator="['imageType', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="登录人id">
+          <a-input placeholder="请输入登录人id" v-decorator="['loginId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="图片类型 1-竖版图片 2-横版图片">
+          <a-input placeholder="请输入图片类型 1-竖版图片 2-横版图片" v-decorator="['materialType', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "KuaiShouImageModal",
+    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: "/kuaishou/kuaiShouImage/add",
+          edit: "/kuaishou/kuaiShouImage/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,'localUrl','videoName','imageType','loginId','materialType'))
+		  //时间格式化
+        });
+
+      },
+      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>
+
+</style>

+ 1 - 1
src/views/modules/kuaishouapp/uploadApp.vue

@@ -182,7 +182,7 @@
         showAndroid: true,
         showIOS: false,
         customDomain: '',
-        acceptVideo: '/*.apk,/*.png,/*.jpg,/*.jpeg',
+        acceptVideo: '/*.apk,/*.png,/*.jpg,/*.jpeg,/*.mp4',
         accessKeyId: 'LTAIbNbqWzSOklQV',
         accessKeySecret: '1rkPz7JNoXk8sJevPaeYHWqfkQXBGh',
         region: 'oss-cn-beijing',

+ 43 - 7
src/views/modules/kuaishouapp/uploadVideo.vue

@@ -11,6 +11,18 @@
         <a-input v-model="videoName" placeholder="(必填) 区分视频的标识"></a-input>
       </a-form-item>-->
 
+
+      <a-form-item
+        label="素材格式"
+        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
+        :wrapperCol="{lg: {span: 8}, sm: {span: 8} }">
+        <a-radio-group buttonStyle="solid" v-model="materialType">
+          <a-radio-button value="1">竖版</a-radio-button>
+          <a-radio-button value="2">横版</a-radio-button>
+        </a-radio-group>
+      </a-form-item>
+
+
       <a-form-item
         label="视频素材上传"
         :labelCol="{lg: {span: 7}, sm: {span: 7}}"
@@ -28,19 +40,38 @@
                        :accessKeySecret="accessKeySecret"></upload-to-ali>
       </a-form-item>
 
+
+      <a-form-item
+        label="封面图素材上传"
+        :labelCol="{lg: {span: 7}, sm: {span: 7}}"
+        :wrapperCol="{lg: {span: 12}, sm: {span: 12} }">
+        <upload-to-ali v-model="localImageUrl"
+                       :customDomain="customDomain"
+                       multiple
+                       preview
+                       :region="region"
+                       :bucket="bucket"
+                       :accept="acceptImage"
+                       :max="10"
+                       :size="1024000"
+                       :accessKeyId="accessKeyId"
+                       :accessKeySecret="accessKeySecret"></upload-to-ali>
+      </a-form-item>
+
+
       <a-form-item
         label="描述"
         :labelCol="{lg: {span: 7}, sm: {span: 7}}"
         :wrapperCol="{lg: {span: 8}, sm: {span: 8} }">
         <a-textarea
-          v-decorator="[
-                  'confirm_videoDesc',
-                  {rules: [{ required: true, message: 'error:' },
-                  {validator: handleConfirmValue}]}
-                ]"
           v-model="videoDesc" placeholder="(必填) 说点什么..." :rows="4"/>
       </a-form-item>
 
+     <!-- v-decorator="[
+      'confirm_videoDesc',
+      {rules: [{ required: true, message: 'error:' },
+      {validator: handleConfirmValue}]}
+      ]"-->
       <a-form-item
         label="格式"
         :labelCol="{lg: {span: 7}, sm: {span: 7}}"
@@ -80,9 +111,12 @@
     data() {
       return {
         localUrl: '',
+        localImageUrl: '',
+        materialType: '1',
         videoDesc: '',
         customDomain: '',
         acceptVideo: 'video/mpeg,video/mp4',
+        acceptImage: 'image/jpeg,image,jpg/png',
         accessKeyId: 'LTAIbNbqWzSOklQV',
         accessKeySecret: '1rkPz7JNoXk8sJevPaeYHWqfkQXBGh',
         region: 'oss-cn-beijing',
@@ -96,13 +130,13 @@
 
     methods: {
       ...mapGetters(["nickname", "avatar", "userInfo"]),
-      handleConfirmValue(rule, value, callback) {
+      /*handleConfirmValue(rule, value, callback) {
         value = this.videoDesc;
         if (value == '') {
           callback('请输入视频描述')
         }
         callback()
-      },
+      },*/
       handleSubmit(e) {
         console.log("测试提交");
         console.log(this.localUrl);
@@ -113,7 +147,9 @@
             console.log('Received values of form: ', values);
             let params = {};
             params.localUrl = this.localUrl;
+            params.materialType = this.materialType;
             params.videoDesc = this.videoDesc;
+            params.localImageUrl = this.localImageUrl;
             params.loginId = this.userInfo().id;
             console.log(params)
             postAction(this.url.addUrl, params).then((res) => {

+ 30 - 17
src/views/template/creative/create.vue

@@ -2,20 +2,20 @@
   <a-card :body-style="{padding: '24px 32px'}" :bordered="false">
     <a-form @submit="handleSubmit" :form="form">
       <a-form-item
-        label="选择头条账户"
-        :labelCol="labelCol"
-        :wrapperCol="wrapperCol">
-        <a-select
-          v-model="accountId"
-          showSearch
-          placeholder="选择头条账户"
-          optionFilterProp="children"
-          style="width: 200px"
-          :filterOption="filterOption"
-        >
-          <a-select-option v-for="user in userList" :key="user.accountId" :value="user.accountId">{{user.advertiserName}}</a-select-option>
-        </a-select>
-      </a-form-item>
+      label="选择头条账户"
+      :labelCol="labelCol"
+      :wrapperCol="wrapperCol">
+      <a-select
+        v-model="accountId"
+        showSearch
+        placeholder="选择头条账户"
+        optionFilterProp="children"
+        style="width: 200px"
+        :filterOption="filterOption"
+      >
+        <a-select-option v-for="user in userList" :key="user.accountId" :value="user.accountId">{{user.advertiserName}}</a-select-option>
+      </a-select>
+    </a-form-item>
 
       <a-form-item
         label="选择广告组模板"
@@ -33,7 +33,7 @@
         </a-select>
       </a-form-item>
 
-      <a-form-item
+      <!--<a-form-item
         label="选择用户定向模板"
         :labelCol="labelCol"
         :wrapperCol="wrapperCol">
@@ -47,7 +47,7 @@
         >
           <a-select-option value="0">默认</a-select-option>
         </a-select>
-      </a-form-item>
+      </a-form-item>-->
 
       <a-form-item
         label="选择预算与出价模板"
@@ -428,7 +428,7 @@
         label="创意标签"
         :labelCol="labelCol"
         :wrapperCol="wrapperCol">
-        <a-select mode="tags" style="width: 100%" :tokenSeparators="[',']" v-model="adKeywords">
+        <a-select mode="tags" style="width: 100%" :tokenSeparators="[' ']" v-model="adKeywords">
         </a-select>
       </a-form-item>
 
@@ -460,6 +460,8 @@
     name: 'BaseForm',
     data() {
       return {
+        previewVisible: false,
+        previewImage: '',
         labelCol: {
           xs: { span: 24 },
           sm: { span: 5 },
@@ -468,6 +470,7 @@
           xs: { span: 24 },
           sm: { span: 16 },
         },
+        fileList:[],
         activeConvertList:[],
         showConvertTarget:false,
         convertType:'',
@@ -556,6 +559,16 @@
       UploadToAli
     },
     methods: {
+      handleCancel () {
+        this.previewVisible = false
+      },
+      handlePreview (file) {
+        this.previewImage = file.url || file.thumbUrl
+        this.previewVisible = true
+      },
+      handleChange ({ fileList }) {
+        this.fileList = fileList
+      },
       filterOption(input, option) {
         return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       },

+ 163 - 0
src/views/template/namemodel/list.vue

@@ -0,0 +1,163 @@
+<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.name"></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.status"></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 -->
+
+    <!-- 表单区域 -->
+    <bytedanceNameModelRule-modal ref="modalForm" @ok="modalFormOk"></bytedanceNameModelRule-modal>
+  </a-card>
+</template>
+
+<script>
+  import BytedanceNameModelRuleModal from './modules/BytedanceNameModelRuleModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "BytedanceNameModelRuleList",
+    mixins:[JeecgListMixin],
+    components: {
+      BytedanceNameModelRuleModal
+    },
+    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: 'rule'
+           },
+		   {
+            title: '模板状态信息',
+            align:"center",
+            dataIndex: 'status'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/ctop/bytedanceNameModelRule/list",
+          delete: "/ctop/bytedanceNameModelRule/delete",
+          deleteBatch: "/ctop/bytedanceNameModelRule/deleteBatch",
+          exportXlsUrl: "ctop/bytedanceNameModelRule/exportXls",
+          importExcelUrl: "ctop/bytedanceNameModelRule/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 146 - 0
src/views/template/namemodel/modules/BytedanceNameModelRuleModal.vue

@@ -0,0 +1,146 @@
+<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-decorator="['name', validatorRules.name ]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="生成规则">
+          <a-input placeholder="请输入生成规则" v-decorator="['rule', validatorRules.rule ]" />
+          <br>
+
+          <a-button :size="size">渠道</a-button>
+          <a-button :size="size">素材类型</a-button>
+          <a-button :size="size">素材名称</a-button>
+          <a-button :size="size">日期</a-button>
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="模板状态信息">
+          <a-input-number v-decorator="[ 'status', validatorRules.status ]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "BytedanceNameModelRuleModal",
+    data () {
+      return {
+        size: 'large',
+        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:{
+        name:{rules: [{ required: true, message: '请输入模板名称!' }]},
+        rule:{rules: [{ required: true, message: '请输入生成规格!' }]},
+        status:{rules: [{ required: true, message: '请输入模板状态信息!' }]},
+        },
+        url: {
+          add: "/ctop/bytedanceNameModelRule/add",
+          edit: "/ctop/bytedanceNameModelRule/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,'name','rule','status'))
+		  //时间格式化
+        });
+
+      },
+      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>
+
+</style>

+ 516 - 0
src/views/user/layer.vue

@@ -0,0 +1,516 @@
+<!--<template>-->
+<!--  <div class="main">-->
+<!--    <a-form :form="form" class="user-layout-login" ref="formLogin" id="formLogin">-->
+<!--      <a-tabs-->
+<!--        :activeKey="customActiveKey"-->
+<!--        :tabBarStyle="{ textAlign: 'center', borderBottom: 'unset' }"-->
+<!--        @change="handleTabClick">-->
+<!--        <a-tab-pane key="tab1" tab="账号密码登陆">-->
+<!--          <a-form-item>-->
+<!--            <a-input-->
+<!--              size="large"-->
+<!--              v-decorator="['username',validatorRules.username,{ validator: this.handleUsernameOrEmail }]"-->
+<!--              type="text"-->
+<!--              placeholder="请输入帐户名">-->
+<!--              <a-icon slot="prefix" type="user" :style="{ color: 'rgba(0,0,0,.25)' }"/>-->
+<!--            </a-input>-->
+<!--          </a-form-item>-->
+
+<!--          <a-form-item>-->
+<!--            <a-input-->
+<!--              v-decorator="['password',validatorRules.password]"-->
+<!--              size="large"-->
+<!--              type="password"-->
+<!--              autocomplete="false"-->
+<!--              placeholder="密码">-->
+<!--              <a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }"/>-->
+<!--            </a-input>-->
+<!--          </a-form-item>-->
+
+<!--          <a-row :gutter="0">-->
+<!--            <a-col :span="14">-->
+<!--              <a-form-item>-->
+<!--                <a-input-->
+<!--                  v-decorator="['inputCode',validatorRules.inputCode]"-->
+<!--                  size="large"-->
+<!--                  type="text"-->
+<!--                  @change="inputCodeChange"-->
+<!--                  placeholder="请输入验证码">-->
+<!--                  <a-icon slot="prefix" v-if=" inputCodeContent==verifiedCode " type="smile"-->
+<!--                          :style="{ color: 'rgba(0,0,0,.25)' }"/>-->
+<!--                  <a-icon slot="prefix" v-else type="frown" :style="{ color: 'rgba(0,0,0,.25)' }"/>-->
+<!--                </a-input>-->
+<!--              </a-form-item>-->
+<!--            </a-col>-->
+<!--            <a-col :span="10">-->
+<!--              <j-graphic-code @success="generateCode" style="float: right"></j-graphic-code>-->
+<!--            </a-col>-->
+<!--          </a-row>-->
+
+
+<!--        </a-tab-pane>-->
+<!--        <a-tab-pane key="tab2" tab="手机号登陆">-->
+<!--          <a-form-item>-->
+<!--            <a-input-->
+<!--              v-decorator="['mobile',validatorRules.mobile]"-->
+<!--              size="large"-->
+<!--              type="text"-->
+<!--              placeholder="手机号">-->
+<!--              <a-icon slot="prefix" type="mobile" :style="{ color: 'rgba(0,0,0,.25)' }"/>-->
+<!--            </a-input>-->
+<!--          </a-form-item>-->
+
+<!--          <a-row :gutter="16">-->
+<!--            <a-col class="gutter-row" :span="16">-->
+<!--              <a-form-item>-->
+<!--                <a-input-->
+<!--                  v-decorator="['captcha',validatorRules.captcha]"-->
+<!--                  size="large"-->
+<!--                  type="text"-->
+<!--                  placeholder="请输入验证码">-->
+<!--                  <a-icon slot="prefix" type="mail" :style="{ color: 'rgba(0,0,0,.25)' }"/>-->
+<!--                </a-input>-->
+<!--              </a-form-item>-->
+<!--            </a-col>-->
+<!--            <a-col class="gutter-row" :span="8">-->
+<!--              <a-button-->
+<!--                class="getCaptcha"-->
+<!--                tabindex="-1"-->
+<!--                :disabled="state.smsSendBtn"-->
+<!--                @click.stop.prevent="getCaptcha"-->
+<!--                v-text="!state.smsSendBtn && '获取验证码' || (state.time+' s')"></a-button>-->
+<!--            </a-col>-->
+<!--          </a-row>-->
+<!--        </a-tab-pane>-->
+<!--      </a-tabs>-->
+
+<!--      <a-form-item>-->
+<!--        <a-checkbox v-model="formLogin.rememberMe">自动登陆</a-checkbox>-->
+<!--        <router-link :to="{ name: 'alteration'}" class="forge-password" style="float: right;">-->
+<!--          忘记密码-->
+<!--        </router-link>-->
+<!--        &lt;!&ndash;-->
+<!--        <router-link :to="{ name: 'register'}" class="forge-password" style="float: right;margin-right: 10px" >-->
+<!--          注册账户-->
+<!--        </router-link>-->
+<!--        &ndash;&gt;-->
+<!--      </a-form-item>-->
+
+<!--      <a-form-item style="margin-top:24px">-->
+<!--        <a-button-->
+<!--          size="large"-->
+<!--          type="primary"-->
+<!--          htmlType="submit"-->
+<!--          class="login-button"-->
+<!--          :loading="loginBtn"-->
+<!--          @click.stop.prevent="handleSubmit"-->
+<!--          :disabled="loginBtn">确定-->
+<!--        </a-button>-->
+<!--      </a-form-item>-->
+
+<!--      &lt;!&ndash; <div class="user-login-other">-->
+<!--        <span>其他登陆方式</span>-->
+<!--        <a><a-icon class="item-icon" type="alipay-circle"></a-icon></a>-->
+<!--        <a><a-icon class="item-icon" type="taobao-circle"></a-icon></a>-->
+<!--        <a><a-icon class="item-icon" type="weibo-circle"></a-icon></a>-->
+<!--        <router-link class="register" :to="{ name: 'register' }">-->
+<!--          注册账户-->
+<!--        </router-link>-->
+<!--      </div>&ndash;&gt;-->
+<!--    </a-form>-->
+
+<!--    <two-step-captcha-->
+<!--      v-if="requiredTwoStepCaptcha"-->
+<!--      :visible="stepCaptchaVisible"-->
+<!--      @success="stepCaptchaSuccess"-->
+<!--      @cancel="stepCaptchaCancel"></two-step-captcha>-->
+
+<!--    <a-modal-->
+<!--      title="登录部门选择"-->
+<!--      :width="450"-->
+<!--      :visible="departVisible"-->
+<!--      :closable="false"-->
+<!--      :maskClosable="false">-->
+
+<!--      <template slot="footer">-->
+<!--        <a-button type="primary" @click="departOk">确认</a-button>-->
+<!--      </template>-->
+
+<!--      <a-form>-->
+<!--        <a-form-item-->
+<!--          :labelCol="{span:4}"-->
+<!--          :wrapperCol="{span:20}"-->
+<!--          style="margin-bottom:10px"-->
+<!--          :validate-status="validate_status">-->
+<!--          <a-tooltip placement="topLeft">-->
+<!--            <template slot="title">-->
+<!--              <span>您隶属于多部门,请选择登录部门</span>-->
+<!--            </template>-->
+<!--            <a-avatar style="backgroundColor:#87d068" icon="gold"/>-->
+<!--          </a-tooltip>-->
+<!--          <a-select @change="departChange" :class="{'valid-error':validate_status=='error'}" placeholder="请选择登录部门"-->
+<!--                    style="margin-left:10px;width: 80%">-->
+<!--            <a-icon slot="suffixIcon" type="gold"/>-->
+<!--            <a-select-option-->
+<!--              v-for="d in departList"-->
+<!--              :key="d.id"-->
+<!--              :value="d.orgCode">-->
+<!--              {{ d.departName }}-->
+<!--            </a-select-option>-->
+<!--          </a-select>-->
+<!--        </a-form-item>-->
+<!--      </a-form>-->
+
+
+<!--    </a-modal>-->
+
+<!--  </div>-->
+<!--</template>-->
+
+<!--<script>-->
+<!--  //import md5 from "md5"-->
+<!--  import api from '@/api'-->
+<!--  import TwoStepCaptcha from '@/components/tools/TwoStepCaptcha'-->
+<!--  import {mapActions} from "vuex"-->
+<!--  import {timeFix} from "@/utils/util"-->
+<!--  import Vue from 'vue'-->
+<!--  import {ACCESS_TOKEN} from "@/store/mutation-types"-->
+<!--  import JGraphicCode from '@/components/jeecg/JGraphicCode'-->
+<!--  import {putAction} from '@/api/manage'-->
+<!--  import {postAction} from '@/api/manage'-->
+<!--  import {getAction} from '@/api/manage'-->
+<!--  import {encryption} from '@/utils/encryption/aesEncrypt'-->
+<!--  import layer from 'vue-layer'-->
+<!--  export default {-->
+<!--    components: {-->
+<!--      TwoStepCaptcha,-->
+<!--      JGraphicCode-->
+<!--    },-->
+<!--    data() {-->
+<!--      return {-->
+<!--        customActiveKey: "tab1",-->
+<!--        loginBtn: false,-->
+<!--        // login type: 0 email, 1 username, 2 telephone-->
+<!--        loginType: 0,-->
+<!--        requiredTwoStepCaptcha: false,-->
+<!--        stepCaptchaVisible: false,-->
+<!--        form: this.$form.createForm(this),-->
+<!--        state: {-->
+<!--          time: 60,-->
+<!--          smsSendBtn: false,-->
+<!--        },-->
+<!--        formLogin: {-->
+<!--          username: "",-->
+<!--          password: "",-->
+<!--          captcha: "",-->
+<!--          mobile: "",-->
+<!--          rememberMe: true-->
+<!--        },-->
+<!--        validatorRules: {-->
+<!--          username: {rules: [{required: true, message: '请输入用户名!', validator: 'click'}]},-->
+<!--          password: {rules: [{required: true, message: '请输入密码!', validator: 'click'}]},-->
+<!--          mobile: {rules: [{validator: this.validateMobile}]},-->
+<!--          captcha: {rule: [{required: true, message: '请输入验证码!'}]},-->
+<!--          inputCode: {rules: [{required: true, message: '请输入验证码!'}, {validator: this.validateInputCode}]}-->
+<!--        },-->
+<!--        verifiedCode: "",-->
+<!--        inputCodeContent: "",-->
+<!--        inputCodeNull: true,-->
+
+<!--        departList: [],-->
+<!--        departVisible: false,-->
+<!--        departSelected: "",-->
+<!--        currentUsername: "",-->
+<!--        validate_status: ""-->
+<!--      }-->
+<!--    },-->
+<!--    created() {-->
+<!--      this.layer.alert('找不到对象');-->
+<!--      Vue.ls.remove(ACCESS_TOKEN)-->
+<!--      this.getRouterData();-->
+<!--      // update-begin- -&#45;&#45; author:scott &#45;&#45;&#45;&#45;&#45;&#45; date:20190225 &#45;&#45;&#45;&#45; for:暂时注释,未实现登录验证码功能-->
+<!--//      this.$http.get('/auth/2step-code')-->
+<!--//        .then(res => {-->
+<!--//          this.requiredTwoStepCaptcha = res.result.stepCode-->
+<!--//        }).catch(err => {-->
+<!--//          console.log('2step-code:', err)-->
+<!--//        })-->
+<!--      // update-end- -&#45;&#45; author:scott &#45;&#45;&#45;&#45;&#45;&#45; date:20190225 &#45;&#45;&#45;&#45; for:暂时注释,未实现登录验证码功能-->
+<!--      // this.requiredTwoStepCaptcha = true-->
+
+<!--    },-->
+<!--    methods: {-->
+<!--      ...mapActions(["Login", "Logout", "PhoneLogin"]),-->
+<!--      // handler-->
+<!--      handleUsernameOrEmail(rule, value, callback) {-->
+<!--        const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;-->
+<!--        if (regex.test(value)) {-->
+<!--          this.loginType = 0-->
+<!--        } else {-->
+<!--          this.loginType = 1-->
+<!--        }-->
+<!--        callback()-->
+<!--      },-->
+<!--      handleTabClick(key) {-->
+<!--        this.customActiveKey = key-->
+<!--        // this.form.resetFields()-->
+<!--      },-->
+<!--      handleSubmit() {-->
+<!--        let that = this-->
+<!--        let loginParams = {-->
+<!--          remember_me: that.formLogin.rememberMe-->
+<!--        };-->
+
+<!--        // 使用账户密码登陆-->
+<!--        if (that.customActiveKey === 'tab1') {-->
+<!--          that.form.validateFields(['username', 'password', 'inputCode'], {force: true}, (err, values) => {-->
+<!--            if (!err) {-->
+<!--              getAction("/sys/getEncryptedString", {}).then((res) => {-->
+<!--                loginParams.username = values.username-->
+<!--                //loginParams.password = md5(values.password)-->
+<!--                loginParams.password = encryption(values.password, res.result.key, res.result.iv)-->
+<!--                that.Login(loginParams).then((res) => {-->
+<!--                  this.departConfirm(res)-->
+<!--                }).catch((err) => {-->
+<!--                  that.requestFailed(err);-->
+<!--                })-->
+<!--              }).catch((err) => {-->
+<!--                that.requestFailed(err);-->
+<!--              });-->
+<!--            }-->
+<!--          })-->
+<!--          // 使用手机号登陆-->
+<!--        } else {-->
+<!--          that.form.validateFields(['mobile', 'captcha'], {force: true}, (err, values) => {-->
+<!--            if (!err) {-->
+<!--              loginParams.mobile = values.mobile-->
+<!--              loginParams.captcha = values.captcha-->
+<!--              that.PhoneLogin(loginParams).then((res) => {-->
+<!--                console.log(res.result);-->
+<!--                this.departConfirm(res)-->
+<!--              }).catch((err) => {-->
+<!--                that.requestFailed(err);-->
+<!--              })-->
+<!--            }-->
+<!--          })-->
+<!--        }-->
+<!--      },-->
+<!--      getCaptcha(e) {-->
+<!--        e.preventDefault();-->
+<!--        let that = this;-->
+<!--        this.form.validateFields(['mobile'], {force: true}, (err, values) => {-->
+<!--            if (!values.mobile) {-->
+<!--              that.cmsFailed("请输入手机号");-->
+<!--            } else if (!err) {-->
+<!--              this.state.smsSendBtn = true;-->
+<!--              let interval = window.setInterval(() => {-->
+<!--                if (that.state.time&#45;&#45; <= 0) {-->
+<!--                  that.state.time = 60;-->
+<!--                  that.state.smsSendBtn = false;-->
+<!--                  window.clearInterval(interval);-->
+<!--                }-->
+<!--              }, 1000);-->
+
+<!--              const hide = this.$message.loading('验证码发送中..', 0);-->
+<!--              let smsParams = {};-->
+<!--              smsParams.mobile = values.mobile;-->
+<!--              smsParams.smsmode = "0";-->
+<!--              postAction("/sys/sms", smsParams)-->
+<!--                .then(res => {-->
+<!--                  if (!res.success) {-->
+<!--                    setTimeout(hide, 0);-->
+<!--                    this.cmsFailed(res.message);-->
+<!--                  }-->
+<!--                  console.log(res);-->
+<!--                  setTimeout(hide, 500);-->
+<!--                })-->
+<!--                .catch(err => {-->
+<!--                  setTimeout(hide, 1);-->
+<!--                  clearInterval(interval);-->
+<!--                  that.state.time = 60;-->
+<!--                  that.state.smsSendBtn = false;-->
+<!--                  this.requestFailed(err);-->
+<!--                });-->
+<!--            }-->
+<!--          }-->
+<!--        );-->
+<!--      },-->
+<!--      stepCaptchaSuccess() {-->
+<!--        this.loginSuccess()-->
+<!--      },-->
+<!--      stepCaptchaCancel() {-->
+<!--        this.Logout().then(() => {-->
+<!--          this.loginBtn = false-->
+<!--          this.stepCaptchaVisible = false-->
+<!--        })-->
+<!--      },-->
+<!--      loginSuccess() {-->
+<!--        this.loginBtn = false-->
+<!--        this.$router.push({name: "dashboard"})-->
+<!--        this.$notification.success({-->
+<!--          message: '欢迎',-->
+<!--          description: `${timeFix()},欢迎回来`,-->
+<!--        });-->
+<!--      },-->
+<!--      cmsFailed(err) {-->
+<!--        this.$notification['error']({-->
+<!--          message: "登录失败",-->
+<!--          description: err,-->
+<!--          duration: 4,-->
+<!--        });-->
+<!--      },-->
+<!--      requestFailed(err) {-->
+<!--        this.$notification['error']({-->
+<!--          message: '登录失败',-->
+<!--          description: ((err.response || {}).data || {}).message || err.message || "请求出现错误,请稍后再试",-->
+<!--          duration: 4,-->
+<!--        });-->
+<!--        this.loginBtn = false;-->
+<!--      },-->
+<!--      validateMobile(rule, value, callback) {-->
+<!--        if (!value || new RegExp(/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/).test(value)) {-->
+<!--          callback();-->
+<!--        } else {-->
+<!--          callback("您的手机号码格式不正确!");-->
+<!--        }-->
+
+<!--      },-->
+<!--      validateInputCode(rule, value, callback) {-->
+<!--        if (!value || this.verifiedCode == this.inputCodeContent) {-->
+<!--          callback();-->
+<!--        } else {-->
+<!--          callback("您输入的验证码不正确!");-->
+<!--        }-->
+<!--      },-->
+<!--      generateCode(value) {-->
+<!--        this.verifiedCode = value.toLowerCase()-->
+<!--      },-->
+<!--      inputCodeChange(e) {-->
+<!--        this.inputCodeContent = e.target.value-->
+<!--        if (!e.target.value || 0 == e.target.value) {-->
+<!--          this.inputCodeNull = true-->
+<!--        } else {-->
+<!--          this.inputCodeContent = this.inputCodeContent.toLowerCase()-->
+<!--          this.inputCodeNull = false-->
+<!--        }-->
+<!--      },-->
+<!--      departConfirm(res) {-->
+<!--        if (res.success) {-->
+<!--          let multi_depart = res.result.multi_depart-->
+<!--          //0:无部门 1:一个部门 2:多个部门-->
+<!--          if (multi_depart == 0) {-->
+<!--            this.loginSuccess()-->
+<!--            this.$notification.warn({-->
+<!--              message: '提示',-->
+<!--              description: `您尚未归属部门,请确认账号信息`,-->
+<!--              duration: 3-->
+<!--            });-->
+<!--          } else if (multi_depart == 2) {-->
+<!--            this.departVisible = true-->
+<!--            this.currentUsername = this.form.getFieldValue("username")-->
+<!--            this.departList = res.result.departs-->
+<!--          } else {-->
+<!--            this.loginSuccess()-->
+<!--          }-->
+<!--        } else {-->
+<!--          this.requestFailed(res)-->
+<!--          this.Logout();-->
+<!--        }-->
+<!--      },-->
+<!--      departOk() {-->
+<!--        if (!this.departSelected) {-->
+<!--          this.validate_status = 'error'-->
+<!--          return false-->
+<!--        }-->
+<!--        let obj = {-->
+<!--          orgCode: this.departSelected,-->
+<!--          username: this.form.getFieldValue("username")-->
+<!--        }-->
+<!--        putAction("/sys/selectDepart", obj).then(res => {-->
+<!--          if (res.success) {-->
+<!--            this.departClear()-->
+<!--            this.loginSuccess()-->
+<!--          } else {-->
+<!--            this.requestFailed(res)-->
+<!--            this.Logout().then(() => {-->
+<!--              this.departClear()-->
+<!--            });-->
+<!--          }-->
+<!--        })-->
+<!--      },-->
+<!--      departClear() {-->
+<!--        this.departList = []-->
+<!--        this.departSelected = ""-->
+<!--        this.currentUsername = ""-->
+<!--        this.departVisible = false-->
+<!--        this.validate_status = ''-->
+<!--      },-->
+<!--      departChange(value) {-->
+<!--        this.validate_status = 'success'-->
+<!--        this.departSelected = value-->
+<!--      },-->
+<!--      getRouterData() {-->
+<!--        this.$nextTick(() => {-->
+<!--          this.form.setFieldsValue({-->
+<!--            'username': this.$route.params.username-->
+<!--          });-->
+<!--        })-->
+<!--      },-->
+<!--    }-->
+<!--  }-->
+<!--</script>-->
+
+<!--<style lang="scss" scoped>-->
+
+<!--  .user-layout-login {-->
+<!--    label {-->
+<!--      font-size: 14px;-->
+<!--    }-->
+
+<!--    .getCaptcha {-->
+<!--      display: block;-->
+<!--      width: 100%;-->
+<!--      height: 40px;-->
+<!--    }-->
+
+<!--    .forge-password {-->
+<!--      font-size: 14px;-->
+<!--    }-->
+
+<!--    button.login-button {-->
+<!--      padding: 0 15px;-->
+<!--      font-size: 16px;-->
+<!--      height: 40px;-->
+<!--      width: 100%;-->
+<!--    }-->
+
+<!--    .user-login-other {-->
+<!--      text-align: left;-->
+<!--      margin-top: 24px;-->
+<!--      line-height: 22px;-->
+
+<!--      .item-icon {-->
+<!--        font-size: 24px;-->
+<!--        color: rgba(0, 0, 0, .2);-->
+<!--        margin-left: 16px;-->
+<!--        vertical-align: middle;-->
+<!--        cursor: pointer;-->
+<!--        transition: color .3s;-->
+
+<!--        &:hover {-->
+<!--          color: #1890ff;-->
+<!--        }-->
+<!--      }-->
+
+<!--      .register {-->
+<!--        float: right;-->
+<!--      }-->
+<!--    }-->
+<!--  }-->
+
+<!--</style>-->
+<!--<style>-->
+<!--  .valid-error .ant-select-selection__placeholder {-->
+<!--    color: #f5222d;-->
+<!--  }-->
+<!--</style>-->