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