import { PluginObject } from 'vue' export interface IOptions { keys: string[] } export const defaultOptions : IOptions = { keys: ['message', 'msg', 'errorMsg'], } // 过滤信息 export function filterMessage (v: any) : string { if (v === null) return '' if (typeof v !== 'object') return `${v}` const { keys } = defaultOptions for (let i = 0, len = keys.length; i < len; i++) { const key = keys[i] if (v[key] !== undefined) return v[key] } return JSON.stringify(v) } // 过滤日期 export function filterDate (v: string | Date | number = new Date(), fmt: string = 'yyyy-MM-dd hh:mm:ss') : string { if (typeof v === 'string') v = v.replace(/-/g, '/') const date = new Date(v); const o = { "M+": date.getMonth() + 1, "d+": date.getDate(), "h+": date.getHours(), "m+": date.getMinutes(), "s+": date.getSeconds(), "q+": Math.floor((date.getMonth() + 3) / 3), "S": date.getMilliseconds() }; if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length)); } for (let k in o) { if (new RegExp("(" + k + ")").test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); } } return fmt; } // 剪切字符串 export function filterCutOut (v: string, max: number = 0): string { return v ? v.length > max ? `${v.substring(0, max)}...` : v : '' } // 过滤身份证号码 export function filterIDCard (v: string) : string { return v ? `${v.substring(0, 6)}********${v.substring(14)}` : '' } // 过滤银行卡号 export function filterBankCard (v: string) : string { return v ? `${new Array(v.length - 3).join('*')}${v.substring(v.length - 4)}`.replace(/(.{4})/g, '$1 ') : '' } // 过滤手机号 export function filterPhone (v: string) : string { return v ? `${v.substring(0, 3)} **** ${v.substring(7)}` : '' } // 过滤姓名 export function filterName (v: string) : string { if (!v) return '' const length = v.length if (length === 1) return v if (length === 2) return `${v.substring(0, 1)}*` return `${v.substring(0, 1)}${new Array(length - 1).join('*')}${v.substr(-1)}` } // 只能是汉字和字母 export function filterLetter (v: string) : string { if (!v) return '' return v.replace(/[^A-Za-z\u4e00-\u9fa5]*/g, ''); } // 只能是数字和字母 export function filterNumberLetter (v: string) : string { if (!v) return '' return v.replace(/[^A-Za-z\d]*/g, ''); } // 过滤emoji export function filterEmoji (v: string) : string { if (!v) return '' const ranges = [ '\uD83C[\uDF00-\uDFFF]', '\uD83D[\uDC00-\uDE4F]', '\ud83d[\ude80-\udeff]', '[\uD800-\uDBFF]', '[\uDC00-\uDFFF]', '[^\u0020-\u007E\u00A0-\u00BE\u2E80-\uA4CF\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFFEF\u0080-\u009F\u2000-\u201f\u2026\u2022\u20ac\r\n]', ] return v.replace(new RegExp(ranges.join('|'), 'g'), '') } // 替换字符串里面的回车换行 export function filterCRLF (v: string) : string { return v ? v.replace(/\r|\n/ig, '
') : '' } // 过滤金额 按元 export function filterAmount (s, divisor = 1) { const money = parseFloat(s) if (money) { s = (money / divisor).toFixed(2) + "" let l = s.split(".")[0].split("").reverse() let r = s.split(".")[1] let t = "" l.forEach((ll, key) => { t += l[key] + ((key + 1) % 3 == 0 && (key + 1) != l.length ? "," : "") }) return t.split("").reverse().join("") + "." + r } else if (s == 0) { return '0.00' } else { return '---' } } // 过滤金额 按分 export function filterAmountCent (v) { return filterAmount(v, 100) } export const filters = { filterMessage, filterCutOut, filterIDCard, filterBankCard, filterPhone, filterName, filterLetter, filterEmoji, filterDate, filterCRLF, filterAmount, filterAmountCent, } const Filters: PluginObject = { install (Vue, options ) { this.setDefaultOptions(options) Object.keys(filters).forEach(id => Vue.filter(id, filters[id])) Vue.prototype.$filters = filters }, // 设置默认配置 setDefaultOptions (options?: IOptions) { Object.assign(defaultOptions, options) }, } export default Filters