vue项目实战:directives filters mixins util 内容的封装

1.directives 做页面按钮权限

/*
 * @Description: 页面按钮权限  directives/permission.js
 * @Version: 2.0
 * @Autor: lhl
 * @Date: 2020-08-12 14:17:46
 * @LastEditors: lhl
 * @LastEditTime: 2020-08-20 17:16:23
 */
import Vue from 'vue';
import store from '@/store';

// 指令 有角色时候
// Vue.directive('permission', {
//   // inserted函数:当被绑定的元素插入到 DOM 中时……
//   inserted(el, binding, vnode) {
//     const { value } = binding // 获取指令绑定的值;
//     const roles = store.getters && store.getters.roles //用户本身的roles信息,arr;

//     if (value && value instanceof Array && value.length > 0) {
//       const permissionRoles = value

//       const hasPermission = roles.some(role => { // 只要有一个满足即返回true
//         return permissionRoles.includes(role)
//       })
//       // 没有该指令,直接删除掉该指令元素;即页面不显示没有指令权限的按钮;
//       if (!hasPermission) {
//         el.parentNode && el.parentNode.removeChild(el)
//         // 因项目需要,本指令remove其父元素;一般情况下,只隐藏其本身;
//       }
//     } else {
//       throw new Error(`need roles! Like v-permission="['admin','editor']"`)
//     }
//   }
// });

// 只有code码对应时候  使用时候  v-permission="['100000801']"
Vue.directive('permission', {
  // inserted函数:当被绑定的元素插入到 DOM 中时……
  inserted(el, binding, vnode) {
    // console.log(el, binding, vnode)
    const { value } = binding // 获取指令绑定的值;
    const btncodeList = store.getters && store.getters.getBtnCodeList.map(e => {return e.buttonCode}); // 权限code码 后端数据返回的数据
    // console.log(value, 'value', btncodeList,'btncodeList--指令')
    if (value && value instanceof Array && value.length > 0) {
      const permissionCode = value;
      
      const hasPermission = btncodeList.some(btncode => { // 只要有一个满足即返回true
        return permissionCode.includes(btncode)
      })

      // 没有该指令,直接删除掉该指令元素;即页面不显示没有指令权限的按钮;
      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
        // 因项目需要,本指令remove其父元素;一般情况下,只隐藏其本身;
      }
    } else {
      throw new Error(`need roles! Like v-permission="['100000801','100000802']"`)
    }
  }
});

2.filters  数据一些处理

/*
 * @Description: 常用过滤器方法  可用于数据处理 枚举等操作  filters/index.js 管道符隔开即可 传参即为 | xx(参数一,参数二)
 * @Version: 2.0
 * @Autor: lhl
 * @Date: 2020-08-14 15:36:23
 * @LastEditors: lhl
 * @LastEditTime: 2020-08-20 17:17:55
 */
// 官方指南 https://cn.vuejs.org/v2/api/#Vue-filter
// 注册
// Vue.filter('my-filter', function (value) {
//   // 返回处理后的值
// })

// 过滤器解析原理:在vue内部专门有这么一个函数用来解析过滤器语法:parseFilters 它的原理就是解析过滤器列表,然后循环过滤器列表并拼接字符串

// // getter,返回已注册的过滤器
// var myFilter = Vue.filter('my-filter')

// input去除空格 type 1-所有空格 2-前后空格 3-前空格 4-后空格
export function trim(value, trim) {
  switch (trim) {
    case 1:
      return value.replace(/\s+/g, "");
    case 2:
      return value.replace(/(^\s*)|(\s*$)/g, "");
    case 3:
      return value.replace(/(^\s*)/g, "");
    case 4:
      return value.replace(/(\s*$)/g, "");
    default:
      return value;
  }
}

//字母大小写切换
/*type
 1:首字母大写
 2:首字母小写
 3:大小写转换
 4:全部大写
 5:全部小写
 * */
export function changeCase(str, type) {
  function ToggleCase(str) {
    var itemText = ""
    str.split("").forEach(
      function (item) {
        if (/^([a-z]+)/.test(item)) {
          itemText += item.toUpperCase();
        } else if (/^([A-Z]+)/.test(item)) {
          itemText += item.toLowerCase();
        } else {
          itemText += item;
        }
      });
    return itemText;
  }
  switch (type) {
    case 1:
      return str.replace(/\b\w+\b/g, function (word) {
        return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase();
      });
    case 2:
      return str.replace(/\b\w+\b/g, function (word) {
        return word.substring(0, 1).toLowerCase() + word.substring(1).toUpperCase();
      });
    case 3:
      return ToggleCase(str);
    case 4:
      return str.toUpperCase();
    case 5:
      return str.toLowerCase();
    default:
      return str;
  }
}

//现金额大写转换函数
//ecDo.upDigit(1682)
//result:"人民币壹仟陆佰捌拾贰元整"
//ecDo.upDigit(-1693)
//result:"欠人民币壹仟陆佰玖拾叁元整"
export function capitalAmountChange(n) {
  var fraction = ['角', '分', '厘'];
  var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
  var unit = [
    ['元', '万', '亿'],
    ['', '拾', '佰', '仟']
  ];
  var head = n < 0 ? '欠人民币' : '人民币';
  n = Math.abs(n);
  var s = '';
  for (var i = 0; i < fraction.length; i++) {
    s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
  }
  s = s || '整';
  n = Math.floor(n);
  for (var i = 0; i < unit[0].length && n > 0; i++) {
    var p = '';
    for (var j = 0; j < unit[1].length && n > 0; j++) {
      p = digit[n % 10] + unit[1][j] + p;
      n = Math.floor(n / 10);
    }
    s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
    //s = p + unit[0][i] + s;
  }
  return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
}

//保留2位小数 四舍五入方法
export function toFiexed2(x) {
  var f = parseFloat(x);
  if (isNaN(f)) {
    return false;
  }
  var f = Math.round(x * 100) / 100;
  var s = f.toString();
  var rs = s.indexOf('.');
  if (rs < 0) {
    rs = s.length;
    s += '.';
  }
  while (s.length <= rs + 2) {
    s += '0';
  }
  return s;
}

// 千分符
export function thousandMarkFis(num) {
  if (isNaN(num) || !num || Number(num) < 1000) {
    return num
  }
  return num.toString().replace(/\d+/, function (s) {
    return s.replace(/(\d)(?=(\d{3})+$)/g, '$1,')
  })
}

3.mixins  页面公共逻辑封装

/*
 * @Description: vue混入 复用的公共js  mixins/common.js可单独引入 可以当插件(main.js)注册
 * @Version: 2.0 
 * @Autor: lhl
 * @Date: 2020-08-18 16:12:18
 * @LastEditors: lhl
 * @LastEditTime: 2020-08-20 17:16:08
 */
export const Mixins = {
  data() {
    return {}
  },
  mounted() {
    console.log('Mixinsl里面的钩子前')
  },
  methods: {
    // 上移
    moveUp(index, list) {
      let that = this;
      if (index == 0) {
        that.$message({
          message: "到顶了,不能继续上移",
          type: "warning"
        });
      } else {
        let upDate = list[index - 1];
        list.splice(index - 1, 1);
        list.splice(index, 0, upDate);
      }
    },
    // 下移
    moveDown(index, list) {
      let that = this;
      if (index + 1 === list.length) {
        that.$message({
          message: "到底了,不能继续下移",
          type: "warning"
        });
      } else {
        let downDate = list[index + 1];
        list.splice(index + 1, 1);
        list.splice(index, 0, downDate);
      }
    },
  }
}

4.util 工具类方法

/*
 * @Description: 空vue实例 vue组件通讯方式的一种  util/eventBus.js
 * @Version: 2.0
 * @Autor: lhl
 * @Date: 2020-07-10 14:35:29
 * @LastEditors: lhl
 * @LastEditTime: 2020-08-20 17:18:18
 */ 
import Vue from 'vue';

export default new Vue()

// 使用 import eventBus from '@/util/eventBus'

// 方法二在main.js 使用 Vue.prototype.$EventBus = new Vue() ====> 组件this.$EventBus.$emit/this.$EventBus.$on即可
/* 
 * @Description: 项目工具类方法  util/public.js  也可以结合lodash库有很多方便快捷的工具类方法  https://www.lodashjs.com/  main.js 导入公用方法 或者组件单独导入 import {xx} from '@/util/public'
 * @Version: 2.0
 * @Autor: lhl
 * @Date: 2020-08-19 10:03:17
 * @LastEditors: lhl
 * @LastEditTime: 2020-08-20 17:18:46
 */

// 如需项目使用到cookie 安装 npm/cnpm i js-cookie -S 看项目情况是否需要
// import Cookie from 'js-cookie';

// export function getToken() {
//   return Cookie.get('token');
// }

// export function setToken(token) {
//   Cookie.set('token', token);
// }

// export function removeToken() {
//   Cookie.remove('token');
// }

// 防抖
export function debounce(fn, delay) {
  var delay = delay || 200;
  var timer;
  return function () {
    var th = this;
    var args = arguments;
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(function () {
      timer = null;
      fn.apply(th, args);
    }, delay);
  };
}
// 节流
export function throttle(fn, interval) {
  var last;
  var timer;
  var interval = interval || 200;
  return function () {
    var th = this;
    var args = arguments;
    var now = +new Date();
    if (last && now - last < interval) {
      clearTimeout(timer);
      timer = setTimeout(function () {
        last = now;
        fn.apply(th, args);
      }, interval);
    } else {
      last = now;
      fn.apply(th, args);
    }
  }
}

//校验手机号码
export function isSpecialPhone(num) {
  return /^1[2,3,4,5,7,8]\d{9}$/.test(num)
}

// 拼接参数 比如给 https://www.baidu.com/aa=1&bb=2&cc=3
export function param(data) {
  let url = ''
  for (let k in data) {
    let value = data[k] !== undefined ? data[k] : ''
    url += '&' + k + '=' + value
  }
  return url ? url.substring(1) : ''
}

//遍历参数?后面的
export function formatParam(obj) {
  let str = ''
  for (let i in obj) {
    str += `${i}=${obj[i]}&`
  }
  return str.slice(0, -1)
  // console.log(str)  比如{a:111,b:222,c:333}变为a=111&b=222&c=333
}

//获取地址栏url参数方式一 hash 返回"#"之后的内容   第一个"#"之后的内容
export function getQueryString(name) {
  var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
  var r = window.location.hash.split("?")[1].match(reg);
  if (r != null) {
    return unescape(r[2]);
  }
  return null;
}

//获取地址栏url参数方式一 区别 search "?"后的部分,又称为查询字符串   第一个"?"之后 (经测试应该是:第一个"?"之后 , #之前)
export function getQueryString2(name) {
  var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
  var r = window.location.search.substr(1).match(reg);
  if (r != null) {
    return unescape(r[2]);
  }
  return null;
}

//url参数处理(获取参数)方式二(个人喜好这种)
export var URL = {
  set(key, value, url) {
    var reg = new RegExp('(' + key + ')=([^&]*)', 'ig');
    var url = url ? url : location.href;
    var result = reg.exec(url);
    if (result) {
      return url.replace(result[0], key + '=' + value);
    } else {
      var reg = /\?(.*)#?(.*)/gi;
      var search = reg.exec(url);
      if (search !== null) {
        return url.replace(search[1], search[1] + '&' + key + '=' + value);;
      } else {
        return '';
      }
    }
  },
  get(key, url) {
    var reg = new RegExp('(' + key + ')=([^&]*)', 'ig');
    var url = url ? url : location.href;
    var result = reg.exec(url);
    if (result) {
      return result[2];
    } else {
      return '';
    }
  }
}

// 判断浏览器类型
export function browserType() {
  var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
  // 判断是否Opera浏览器
  if (userAgent.indexOf("Opera") > -1) {
    return "Opera"
  };
  // 判断是否Firefox浏览器
  if (userAgent.indexOf("Firefox") > -1) {
    return "FF";
  }
  // 判断是否Chrome浏览器
  if (userAgent.indexOf("Chrome") > -1) {
    return "Chrome";
  }
  //判断是否Safari浏览器
  if (userAgent.indexOf("Safari") > -1) {
    return "Safari";
  }
  //判断是否IE浏览器
  if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) {
    return "IE";
  };
  // IE11  
  var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;
  if (isIE11) {
    return "IE11";
  }
}

/* 判断当前浏览是否为IE */
export function isIEBrowser() {
  var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
  var isIE = (userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1) || (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1); //判断是否IE浏览器
  var isEdge = userAgent.indexOf("Edge") > -1; //判断是否IE的Edge浏览器
  if (isIE) {
    return "IE";
  }
  if (isEdge) {
    return "Edge";
  }
  return ""
}

// 将base64转换为blob
export function convertBase64UrlToBlob(urlData) {
  var arr = urlData.split(',')
  var mime = arr[0].match(/:(.*?);/)[1]
  var bstr = atob(arr[1])
  var n = bstr.length
  var u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new Blob([u8arr], {
    type: mime
  })
}

// 压缩图片
export function compressImage(path, config) {
  return new Promise((resolve, reject) => {
    var img = new Image()
    img.src = path
    img.onload = function () {
      var that = this
      var w = that.width
      var h = that.height
      var scale = w / h
      w = config.width || config.height * scale
      h = config.height || config.width / scale
      var quality = 0.7 // 默认图片质量为0.7
      // 生成canvas
      var canvas = document.createElement('canvas')
      var ctx = canvas.getContext('2d')
      // 创建属性节点
      var anw = document.createAttribute('width')
      anw.nodeValue = w
      var anh = document.createAttribute('height')
      anh.nodeValue = h
      canvas.setAttributeNode(anw)
      canvas.setAttributeNode(anh)
      ctx.drawImage(that, 0, 0, w, h)
      if (config.quality && config.quality <= 1 && config.quality > 0) {
        quality = config.quality
      }
      var base64 = canvas.toDataURL('image/*', quality)
      // var blob = convertBase64UrlToBlob(base64)
      // 回调函数返回base64的值,也可根据自己的需求返回blob的值
      resolve(base64)
    }
  })
}

/**
 * 将秒数转为时间格式
 * @format
 * @param data {number} 时间戳
 * @param format {string} 时间格式[完整格式:yyyy-MM-dd HH:mm:ss,默认yyyy-MM-dd]
 * @param text {string} 缺省文字
 */

export function timeFormat(data, format, text) {
  if (data === null || data === '' || data === undefined) {
    return text || '';
  }
  format = format || 'yyyy-MM-dd';
  let week = [
    '星期日',
    '星期一',
    '星期二',
    '星期三',
    '星期四',
    '星期五',
    '星期六'
  ];
  let date = new Date(data);
  let o = {
    'M+': date.getMonth() + 1,
    'd+': date.getDate(),
    'h+': date.getHours() % 12,
    'H+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds(),
    'q+': Math.floor((date.getMonth() + 3) / 3),
    'S+': date.getMilliseconds(),
    'W+': week[date.getDay()]
  };
  if (/(y+)/.test(format))
    format = format.replace(
      RegExp.$1,
      (date.getFullYear() + '').substr(4 - RegExp.$1.length)
    );
  for (let k in o)
    if (new RegExp('(' + k + ')').test(format))
      format = format.replace(
        RegExp.$1,
        RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
      );
  return format;
}

/**
 * 将字符串时间转换为时间戳
 * @param {string} date
 */

export function getDateTime(date) {
  let timestamp = '';
  if (date) {
    date = date.substring(0, 19);
    date = date.replace(/-/g, '/'); // 必须把日期'-'转为'/'
    timestamp = new Date(date).getTime();
  }
  return timestamp;
}

/**
 * @function deepCopy 浅/深拷贝
 * @param  {type} obj {description}
 * @return {type} {description}
 */

export function deepCopy(obj) {
  return JSON.parse(JSON.stringify(obj));
}

//  验证中国大陆身份证号码 
export function isIDCard(str) {
  var reg = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/;
  return reg.test(str);
}

/* 
 *验证邮箱格式是否正确 
 *参数 email,需要验证的邮箱 
 */
export function chkEmail(email) {
  var reg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
  return reg.test(email);
}

/**
 * 指定字符串 溢出显示省略号
 * @param {String} str
 * @param {Number} num
 */
export function getSubStringSum(str = "", num = 1) {
  let newStr;
  if (str) {
    str = str + '';
    if (str.trim().length > num) {
      newStr = str.trim().substring(0, num) + "...";
    } else {
      newStr = str.trim();
    }
  } else {
    newStr = ''
  }
  return newStr;
}

// 去除html标签
export function htmlSafeStr(str){
  return str.replace(/<[^>]+>/g, "")
}

  以上代码本人项目实测!!!真实可靠,请勿随意转载~转载请注明出处~~~谢谢合作!

posted @ 2020-08-20 17:21  鱼樱前端  阅读(367)  评论(0编辑  收藏  举报