ソースを参照

提交代码-新增公用筛选、公用自定义指令

朱鑫波 4 年 前
コミット
fa8dfdd1ac

+ 2 - 1
src/components/ctop/propModal.vue

@@ -117,8 +117,9 @@
         that.form.resetFields();
         that.model = Object.assign({}, record);
         that.visible = true;
-        that.imageUrl = record.coverUrl?[record.coverUrl]:[]
+        
         that.$nextTick(() => {
+          that.imageUrl = record.coverUrl?[record.coverUrl]:[]
           that.form.setFieldsValue(pick(this.model, 'name', 'desc'))
           //时间格式化
         });

+ 27 - 25
src/components/uploadFile.vue

@@ -141,35 +141,37 @@ export default {
     value: {
       immediate: true,
       handler(n, o) {
-        if (this.fileList&&this.fileList.length == 0) {
-          if (typeof n == 'object') {
-            this.fileList = n.map((item, index) => {
-              return {
-                uid: index + 1,
-                name: index + 1,
-                status: 'done',
-                url: item,
+        this.$nextTick(() => {
+          if (this.fileList && this.fileList.length == 0) {
+            if (typeof n == 'object') {
+              this.fileList = n.map((item, index) => {
+                return {
+                  uid: index + 1,
+                  name: index + 1,
+                  status: 'done',
+                  url: item,
+                }
+              })
+            } else {
+              if (n == '') {
+                this.fileList = []
+              } else {
+                this.fileList = [
+                  {
+                    uid: 1,
+                    name: 1,
+                    status: 'done',
+                    url: n,
+                  },
+                ]
               }
-            })
+            }
           } else {
-            if (n == '') {
-              this.fileList = []
-            } else {
-              this.fileList = [
-                {
-                  uid: 1,
-                  name: 1,
-                  status: 'done',
-                  url: n,
-                },
-              ]
+            if (n.length == 0 || n == '') {
+              this.clearAll()
             }
           }
-        } else {
-          if (n.length == 0 || n == '') {
-            this.clearAll()
-          }
-        }
+        })
       },
       deep: true,
     },

+ 98 - 0
src/directive.js

@@ -0,0 +1,98 @@
+const directives = {
+    'card': {
+        inserted(el, binding, vnode, oldVnode) {
+            el.classList.add('page-card');
+            el.style.height = window.innerHeight - 125 + 'px';
+
+            function heightHandler(e) {
+                el.style.height = window.innerHeight - 125 + 'px';
+            }
+            // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
+            el.__page_card__ = heightHandler;
+            window.addEventListener('resize', heightHandler);
+        },
+        unbind(el, binding) {
+            // 解除事件监听
+            window.removeEventListener('resize', el.__page_card__);
+            delete el.__page_card__;
+        }
+    },
+    'dialog-drag': { // 弹窗拖拽
+        bind(el, binding, vnode, oldVnode) {
+            const dialogHeaderEl = el.querySelector('.ant-modal-header');
+            const dragDom = el.querySelector('.ant-modal-content');
+            dialogHeaderEl.style.cursor = 'move';
+    
+            // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
+            const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);
+            
+            dialogHeaderEl.onmousedown = (e) => {
+                // 鼠标按下,计算当前元素距离可视区的距离
+                const disX = e.clientX - dialogHeaderEl.offsetLeft;
+                const disY = e.clientY - dialogHeaderEl.offsetTop;
+                
+                // 获取到的值带px 正则匹配替换
+                let styL, styT;
+    
+                // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
+                if(sty.left.includes('%')) {
+                    styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100);
+                    styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100);
+                }else {
+                    styL = +sty.left.replace(/\px/g, '');
+                    styT = +sty.top.replace(/\px/g, '');
+                };
+                
+                document.onmousemove = function (e) {
+                    // 通过事件委托,计算移动的距离 
+                    const l = e.clientX - disX;
+                    const t = e.clientY - disY;
+                    // 移动当前元素  
+                    dragDom.style.left = `${l + styL}px`;
+                    dragDom.style.top = `${t + styT}px`;
+    
+                    //将此时的位置传出去
+                    //binding.value({x:e.pageX,y:e.pageY})
+                };
+    
+                document.onmouseup = function (e) {
+                    document.onmousemove = null;
+                    document.onmouseup = null;
+                };
+            }  
+        }
+    },
+    'clickoutside': {
+        // 初始化指令
+        bind(el, binding, vnode) {
+            function documentHandler(e) {
+                // 这里判断点击的元素是否是本身,是本身,则返回
+                if (el.contains(e.target)) {
+                    return false;
+                }
+                // 判断指令中是否绑定了函数
+                if (binding.expression) {
+                    // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法
+                    binding.value(e);
+                }
+            }
+            // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
+            el.__vueClickOutside__ = documentHandler;
+            document.addEventListener('click', documentHandler);
+        },
+        update() {},
+        unbind(el, binding) {
+            // 解除事件监听
+            document.removeEventListener('click', el.__vueClickOutside__);
+            delete el.__vueClickOutside__;
+        },
+    }
+}
+
+export default {
+    install: function(Vue) {
+        Object.keys(directives).forEach(key => {
+            Vue.directive(key, directives[key]);
+        })
+    }
+}

+ 288 - 0
src/filters.js

@@ -0,0 +1,288 @@
+
+import moment from 'moment';
+function fixedZero(val) {
+    return val * 1 < 10 ? `0${val}` : val;
+}
+const filters = {
+    // 格式化时间展示多长时间之前
+    formatTime(time) {
+        let formatTime
+        const date = new Date(time)
+        const dateObj = {
+            year: date.getFullYear(),
+            month: date.getMonth(),
+            date: date.getDate(),
+            hours: date.getHours(),
+            minutes: date.getMinutes()
+        }
+        const newTime = new Date()
+        const diff = newTime.getTime() - time
+        if (newTime.getDate() === dateObj.date && diff < 60000) {
+            formatTime = '刚刚'
+        } else if (
+            newTime.getDate() === dateObj.date &&
+            diff > 60000 &&
+            diff < 3600000
+        ) {
+            formatTime = `${Math.floor(diff / 60000)}分钟前`
+        } else if (
+            newTime.getDate() === dateObj.date &&
+            diff > 3600000 &&
+            diff < 86400000
+        ) {
+            formatTime = `${addZero(dateObj.hours)}:${addZero(dateObj.minutes)}`
+        } else if (newTime.getDate() !== dateObj.date && diff < 86400000) {
+            formatTime = `昨天${addZero(dateObj.hours)}:${addZero(dateObj.minutes)}`
+        } else if (newTime.getFullYear() === dateObj.year) {
+            formatTime = `${dateObj.month + 1}月${dateObj.date}日`
+        } else {
+            formatTime = `${dateObj.year}年${dateObj.month + 1}月${dateObj.date}日`
+        }
+        return formatTime
+    },
+    //时间日期格式化
+    format(time) {
+        const hours = 60 * 60 * 1000;
+        const minutes = 60 * 1000;
+
+        const h = Math.floor(time / hours);
+        const m = Math.floor((time - h * hours) / minutes);
+        const s = Math.floor((time - h * hours - m * minutes) / 1000);
+        return `${fixedZero(h)}:${fixedZero(m)}:${fixedZero(s)}`
+    },
+    //年月日格式化
+    getDate(value) {
+        let date = new Date(value)
+        let y = date.getFullYear()
+        let MM = date.getMonth() + 1
+        MM = MM < 10 ? '0' + MM : MM
+        let d = date.getDate()
+        d = d < 10 ? '0' + d : d
+        return y + '-' + MM + '-' + d
+    },
+    //年月日时分秒格式化
+    formatDate: function (value) {
+        let date = new Date(value)
+        let y = date.getFullYear()
+        let MM = date.getMonth() + 1
+        MM = MM < 10 ? '0' + MM : MM
+        let d = date.getDate()
+        d = d < 10 ? '0' + d : d
+        let h = date.getHours()
+        h = h < 10 ? '0' + h : h
+        let m = date.getMinutes()
+        m = m < 10 ? '0' + m : m
+        let s = date.getSeconds()
+        s = s < 10 ? '0' + s : s
+        return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s
+    },
+    //bidType类型
+    bidType(sta) {
+        var data = {
+            null: '-',
+            1: 'CPM',
+            2: 'CPC',
+            6: 'OCPC',
+            10: 'OCPM',
+        }
+        return data[sta]
+    },
+    //ocpxActionType类型
+    ocpxActionType(sta) {
+        var data = {
+            null: '-',
+            0: '封面点击',
+            2: '行为数',
+            10: '曝光',
+            11: '点击',
+            31: '下载完成',
+            53: '提交线索',
+            180: '激活',
+            190: '付费',
+            191: '首日ROI',
+            348: '有效线索',
+            383: '授信',
+            384: '完件',
+            394: '订单提交',
+        }
+        return data[sta]
+    },
+    //角色类型
+    roleCode(value) {
+        var state = {
+            clip: '剪辑',
+            shot: '拍摄',
+            plan: '策划',
+            plane: '平面',
+            admin: '管理员',
+            operator: '运营专员',
+            kuaishouOperationManager: '快手运营经理',
+            designTeamLeader: '设计组长',
+            planeLeader: '平面组长',
+            touTiaoOperationManager: '头条运营经理',
+            operationAssistant: '运营助理',
+        }
+
+        if (value) {
+            return state[value]
+        } else {
+            return '暂无'
+        }
+    },
+    //保留两位小数并且变成货币格式
+    decimalsHandle(val) {
+        if (val && typeof val != 'string') {
+            if (val >= 0) {
+                val = parseFloat(val).toFixed(2);
+                let numberStr = val.toString()
+                let str = numberStr.split('.')
+
+                let str0 = str[0].split('').reverse();
+                for (let i = 0; i < str0.length; i++) {
+                    if ((i + 1) % 4 === 0) {
+                        str0.splice(i, 0, ',')
+                    }
+                }
+                str0.reverse()
+                let handleResult = ''
+                for (let j = 0; j < str0.length; j++) {
+                    handleResult += str0[j]
+                }
+
+                return handleResult + '.' + str[1]
+            } else {
+                val = parseFloat(val).toFixed(2);
+                let numberStr = val.toString()
+                let str = numberStr.split('.')
+
+                let str0 = str[0].substr(1).split('').reverse();
+                for (let i = 0; i < str0.length; i++) {
+                    if ((i + 1) % 4 === 0) {
+                        str0.splice(i, 0, ',')
+                    }
+                }
+                str0.reverse()
+                let handleResult = ''
+                for (let j = 0; j < str0.length; j++) {
+                    handleResult += str0[j]
+                }
+
+                return '-' + handleResult + '.' + str[1]
+            }
+
+        } else if (typeof val == 'string') {
+            return val
+        }
+        else {
+            return 0
+        }
+    },
+    //变成货币格式
+    formatCurrency(val) {
+        if ((val || val == 0) && typeof val != 'string') {
+            let numberStr = val.toString()
+            let str = numberStr.split('').reverse()
+            for (let i = 0; i < str.length; i++) {
+                if ((i + 1) % 4 === 0) {
+                    str.splice(i, 0, ',')
+                }
+            }
+            str.reverse()
+            let handleResult = ''
+            for (let j = 0; j < str.length; j++) {
+                handleResult += str[j]
+            }
+            return handleResult
+        } else if (typeof val == 'string') {
+            return val
+        }
+        else {
+            return '-'
+        }
+
+    },
+    //加百分比
+    toPercentage(val) {
+        if (val) {
+            if (typeof val != 'string') {
+                return (val * 100).toFixed(2) + '%'
+            } else {
+                return val
+            }
+        } else if (typeof val == 'string') {
+            return val
+        }
+        else {
+            return 0
+        }
+    },
+    //媒体类型
+    handleMediaType(val) {
+        switch (val) {
+            case 1:
+                return '头条'
+                break
+
+            case 2:
+                return '快手'
+                break
+
+            case 3:
+                return '头条内广'
+                break
+
+            case 4:
+                return '快手内广'
+                break
+
+            default:
+                break
+        }
+    },
+    //文件大小
+    sizeShow(value) {
+        return (value / 1024).toFixed(2)
+    },
+}
+
+// 获取当前月的第一天
+function getCurrentMonthFirst() {
+    let date = new Date();
+    date.setDate(1);
+    return date;
+}
+// 获取当前月的最后一天
+function getCurrentMonthLast() {
+    let date = new Date();
+    let currentMonth = date.getMonth();
+    let nextMonth = ++currentMonth;
+    let nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1);
+    let oneDay = 1000 * 60 * 60 * 24;
+    return new Date(nextMonthFirstDay - oneDay);
+}
+// 今日日期小于15号时和今日日期大于等于15号时
+function getCurrentMonthFifty() {
+    let date = new Date();
+    if (date.getDate() < 15) {
+        let bb = date.setTime(new Date().getTime() - 3600 * 1000 * 24 * 15);
+        return bb;
+    } else if (date.getDate() >= 15) {
+        let year = date.getFullYear();
+        let month = date.getMonth();
+        let myDate = new Date(year, month, 0);
+        let lastDay = year + "-" + month + "-" + myDate.getDate();//上个月的最后一天
+        return lastDay;
+    }
+
+}
+
+export default {
+    install: function (Vue) {
+        Object.keys(filters).forEach(key => {
+            Vue.filter(key, filters[key])
+        })
+    }
+
+}
+
+

+ 4 - 1
src/main.js

@@ -28,7 +28,10 @@ import 'vue-photo-preview/dist/skin.css'
 import VuePreview from 'vue-preview';
 import promiseFinally from 'promise.prototype.finally';
 promiseFinally.shim();
-
+import directive from './directive'
+import filters from './filters'
+Vue.use(directive)
+Vue.use(filters)
 import md5 from 'blueimp-md5';
 
 // import KFormDesign from 'k-form-design'

+ 1 - 1
src/views/modules/Statistics/popularVideo.vue

@@ -270,7 +270,7 @@
     <a-row style="margin-bottom:15px;margin-top:12px">
       <a-col :span="24">
         <div class="tableBody">
-          <a-button  type='primary' class="export" style="margin-bottom:20px" @click="exportExcel" :loading="exportloading">导出报表</a-button>
+          <!-- <a-button  type='primary' class="export" style="margin-bottom:20px" @click="exportExcel" :loading="exportloading">导出报表</a-button> -->
           <a-table :columns="columns" :dataSource="dataTable" :pagination="ipagination" :loading="loading" bordered @change="tableChange">  
                 <span slot="createImg" slot-scope="text,record">  
                     <a-popover placement="right">

+ 5 - 1
src/views/modules/advertiser/ProjectList.vue

@@ -133,7 +133,7 @@
           <!-- {{ text | ocpxActionType }} -->
         </span>
         <span slot="bidType" slot-scope="text">
-          <div v-if="text&&JSON.parse(text).length>0">
+          <div v-if="text && JSON.parse(text).length > 0">
             <span v-for="(item, index) of JSON.parse(text)" :key="index"
               >{{ item | bidType }}{{ index == JSON.parse(text).length - 1 ? '' : ',' }}</span
             >
@@ -297,6 +297,10 @@ export default {
         383: '授信',
         384: '完件',
         394: '订单提交',
+        324: '唤起应用',
+        715: '微信复制优化目标',
+        716: '多转化事件',
+        396:'注册优化目标'
       }
       return data[sta]
     },

+ 8 - 1
src/views/modules/advertiser/modules/projectListModal.vue

@@ -95,6 +95,10 @@
               "
             >
               <a-select v-model="model.ocpxActionType" mode="multiple">
+
+
+
+                
                 <a-select-option :value="2">行为数</a-select-option>
                 <a-select-option :value="180">激活</a-select-option>
                 <a-select-option :value="53">表单提交</a-select-option>
@@ -107,7 +111,10 @@
                 <a-select-option :value="191">首日ROI</a-select-option>
                 <a-select-option :value="396">注册优化目标</a-select-option>
                 <a-select-option :value="717">广告观看事件</a-select-option>
-                <a-select-option :value="700">唤起应用</a-select-option>
+                <a-select-option :value="324">唤起应用</a-select-option>
+
+                 <a-select-option :value="715">微信复制优化目标</a-select-option>
+                 <a-select-option :value="716">多转化事件</a-select-option>
               </a-select>
             </a-form-item>
           </div>

+ 7 - 1
src/views/modules/kuaishouapp/batchCreation/creat/creatUnit.vue

@@ -790,7 +790,7 @@
       :width="1000"
     >
       <a-tabs type="card" @change="callback" v-model="active" class="check-video">
-        <div slot="tabBarExtraContent">
+        <div slot="tabBarExtraContent"> 
           当前选择数量
           {{ sumContent + '/' + (getData('createType')=='0'?getData('createCount'):getData('createCount')*15) }}
           <a-button  type="primary" @click="tongbu()" :loading="tongbuLoading" style="margin-left:10px">
@@ -1197,12 +1197,17 @@ export default {
       checkVideo: [],
       checkVideoAll: [],
       checkVideoWai: [],
+      checkVideoWhole:[],
       dataSource: [],
       active: 0,
       time: [],
       channelType: 0,
       creativeMaterialType: '',
       tab: [
+        // {
+        //   value: 2,
+        //   label: '全部',
+        // },
         {
           value: 0,
           label: '内部',
@@ -2268,6 +2273,7 @@ export default {
       this.checkVideo = []
       this.checkVideoAll = []
       this.checkVideoWai = []
+
       this.sumContent = 0
     },
     filterOption(input, option) {