You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
283 lines
7.9 KiB
283 lines
7.9 KiB
import { i18n } from '../i18n'; |
|
const t = i18n.t; |
|
|
|
export class SimpleRequired { |
|
required = true; |
|
trigger = 'blur'; |
|
name?: string; |
|
selection?: boolean; |
|
validator = (rule: any, value: any, callback: any) => { |
|
if (value == null || value === '') { |
|
const k = this.selection ? 'rule.pleaseSelect' : 'rule.pleaseEnter'; |
|
const msg = this.name ? t(k) + t(this.name).toLowerCase() : t('rule.notNull'); |
|
callback(new Error(msg)); |
|
} |
|
callback(); |
|
}; |
|
|
|
constructor(name?: string, selection?: boolean) { |
|
this.name = name; |
|
this.selection = selection; |
|
selection && (this.trigger = 'change'); |
|
} |
|
} |
|
|
|
export class SimpleCharacter { |
|
max: number; |
|
min?: number; |
|
trigger: string = 'blur'; |
|
|
|
validator = (rule: any, value: any, callback: any) => { |
|
if (value == null || value === '') { |
|
callback(); |
|
} else if (value.length > this.max) { |
|
callback(new Error(t('rule.maxLen', [this.max]))); |
|
} else if (this.min && value.length < this.min) { |
|
callback(new Error(t('rule.minLen', [this.min]))); |
|
} |
|
callback(); |
|
}; |
|
constructor(max?: number, min?: number) { |
|
this.max = max || 255; |
|
this.min = min; |
|
} |
|
} |
|
|
|
export class Character { |
|
pattern: RegExp; |
|
trigger = 'blur'; |
|
validator = (rule: any, value: any, callback: any) => { |
|
if (value == null || value === '') { |
|
callback(); |
|
} else if (!this.pattern.test(value)) { |
|
callback(new Error(t('rule.formatErr'))); |
|
} |
|
callback(); |
|
}; |
|
constructor(pattern: RegExp) { |
|
this.pattern = pattern; |
|
} |
|
} |
|
|
|
export class SimpleNumber { |
|
trigger: string = 'blur'; |
|
min?: number; |
|
max?: number; |
|
validator = (rule: any, value: any, callback: any) => { |
|
if (value == null || value === '') { |
|
callback(); |
|
} |
|
if (!new RegExp(/^(0|-?[1-9]\d*)$/).test(value)) { |
|
const msg = t('rule.pleaseEnter') + t('rule.int').toLowerCase(); |
|
callback(new Error(msg)); |
|
} |
|
const num = parseInt(value); |
|
if (rule.min != null && num < rule.min) { |
|
callback(new Error(t('rule.min', [this.min]))); |
|
} |
|
if (this.max != null && num > this.max) { |
|
callback(new Error(t('rule.max', [this.max]))); |
|
} |
|
callback(); |
|
}; |
|
|
|
constructor(min?: number, max?: number) { |
|
this.min = min; |
|
this.max = max; |
|
} |
|
} |
|
|
|
export class Hexadecimal { |
|
trigger = 'blur'; |
|
min?: Number; |
|
max?: Number; |
|
validator = (rule: any, value: any, callback: any) => { |
|
if (value == null) { |
|
callback(); |
|
} else if (value.trim().length == 0 || !new RegExp(/^[0-9a-fA-F\s]+$/).test(value)) { |
|
callback(new Error(t('rule.hexadecimal'))); |
|
} else if (this.min != null && value.length < this.min) { |
|
callback(new Error(t('rule.minLen', [this.min]))); |
|
} else if (this.max != null && value.length > this.max) { |
|
callback(new Error(t('rule.maxLen', [this.max]))); |
|
} else { |
|
callback(); |
|
} |
|
}; |
|
constructor(min?: number, max?: Number) { |
|
this.min = min; |
|
this.max = max; |
|
} |
|
} |
|
|
|
export class Longitude extends Character { |
|
constructor() { |
|
super(new RegExp(/^-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,6})?)|180(([.][0]{1,6})?))$/)); |
|
} |
|
} |
|
export class Latitude extends Character { |
|
constructor() { |
|
super(new RegExp(/^[\-\+]?((0|([1-8]\d?))(\.\d{1,10})?|90(\.0{1,10})?)$/)); |
|
} |
|
} |
|
|
|
export class Email extends Character { |
|
constructor() { |
|
super(new RegExp(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)); |
|
} |
|
} |
|
export class Phone extends Character { |
|
constructor() { |
|
super(new RegExp(/^(0|86|17951)?(13[0-9]|15[012356789]|17[0135678]|18[0-9]|14[57])[0-9]{8}$/)); |
|
} |
|
} |
|
|
|
export class Ipv4 extends Character { |
|
constructor() { |
|
super(new RegExp(/^((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/)); |
|
} |
|
} |
|
|
|
export class Ipv6 extends Character { |
|
constructor() { |
|
super( |
|
new RegExp( |
|
/^([0-9a-fA-F]{1,4}:){7,7}([0-9a-fA-F]{1,4}|:)|([0-9a-fA-F]{1,4}:){1,6}(:[0-9a-fA-F]{1,4}|:)|([0-9a-fA-F]{1,4}:){1,5}((:[0-9a-fA-F]{1,4}){1,2}|:)|([0-9a-fA-F]{1,4}:){1,4}((:[0-9a-fA-F]{1,4}){1,3}|:)|([0-9a-fA-F]{1,4}:){1,3}((:[0-9a-fA-F]{1,4}){1,4}|:)|([0-9a-fA-F]{1,4}:){1,2}((:[0-9a-fA-F]{1,4}){1,5}|:)|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6}|:)|:((:[0-9a-fA-F]{1,4}){1,7}|:)/ |
|
) |
|
); |
|
} |
|
} |
|
|
|
export class IdCard { |
|
trigger = 'blur'; |
|
validator = (rule: any, value: any, callback: any) => { |
|
if (value != null && value.length != 0) { |
|
let iSum = 0; |
|
const aCity = { |
|
11: '北京', |
|
12: '天津', |
|
13: '河北', |
|
14: '山西', |
|
15: '内蒙古', |
|
21: '辽宁', |
|
22: '吉林', |
|
23: '黑龙江', |
|
31: '上海', |
|
32: '江苏', |
|
33: '浙江', |
|
34: '安徽', |
|
35: '福建', |
|
36: '江西', |
|
37: '山东', |
|
41: '河南', |
|
42: '湖北', |
|
43: '湖南', |
|
44: '广东', |
|
45: '广西', |
|
46: '海南', |
|
50: '重庆', |
|
51: '四川', |
|
52: '贵州', |
|
53: '云南', |
|
54: '西藏', |
|
61: '陕西', |
|
62: '甘肃', |
|
63: '青海', |
|
64: '宁夏', |
|
65: '新疆', |
|
71: '台湾', |
|
81: '香港', |
|
82: '澳门', |
|
91: '国外', |
|
}; |
|
if (!/^\d{17}(\d|x)$/i.test(value)) { |
|
callback(t('rule.idCard.format')); |
|
} |
|
value = value.replace(/x$/i, 'a'); |
|
if (aCity[parseInt(value.substr(0, 2))] == null) { |
|
callback(new Error(t('rule.idCard.area'))); |
|
} |
|
|
|
const sBirthday = value.substr(6, 4) + '-' + Number(value.substr(10, 2)) + '-' + Number(value.substr(12, 2)); |
|
const d = new Date(sBirthday.replace(/-/g, '/')); |
|
if (sBirthday != d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()) { |
|
callback(new Error(t('rule.idCard.birth'))); |
|
} |
|
for (let i = 17; i >= 0; i--) { |
|
iSum += (Math.pow(2, i) % 11) * parseInt(value.charAt(17 - i), 11); |
|
} |
|
if (iSum % 11 != 1) { |
|
callback(new Error(t('rule.idCard.error'))); |
|
} |
|
} |
|
callback(); |
|
}; |
|
} |
|
|
|
export class SimplePassword { |
|
required: boolean = true; |
|
trigger = 'blur'; |
|
min?: Number = 8; |
|
max?: Number = 16; |
|
validator = (rule: any, value: any, callback: any) => { |
|
if (value == null || value === '') { |
|
callback(new Error(t('rule.pleaseEnter') + t('pwd.pwd').toLowerCase())); |
|
} else if (value.length < 6 || value.length > 18) { |
|
callback(new Error(t('pwd.length', [6, 18]))); |
|
} else if (!new RegExp('^[^ ]+$').test(value)) { |
|
callback(new Error(t('pwd.noSpace'))); |
|
} |
|
callback(); |
|
}; |
|
} |
|
|
|
export class Username { |
|
required: boolean = true; |
|
trigger = 'blur'; |
|
min?: Number = 4; |
|
max?: Number = 16; |
|
validator = (rule: any, value: any, callback: any) => { |
|
if (value != null && value.length != 0) { |
|
if (!new RegExp('^[a-zA-Z0-9]{4,16}$').test(value)) { |
|
callback(new Error(t('rule.username.0'))); |
|
} |
|
if (/(^\_)|(\__)|(\_+$)/.test(value)) { |
|
callback(new Error(t('rule.username.1'))); |
|
} |
|
if (!new RegExp('^[^ ]+$').test(value)) { |
|
callback(new Error(t('rule.username.2'))); |
|
} |
|
} |
|
callback(); |
|
}; |
|
} |
|
|
|
export class Password { |
|
required: boolean = true; |
|
trigger = 'blur'; |
|
min?: Number = 8; |
|
max?: Number = 16; |
|
validator = (rule: any, value: any, callback: any) => { |
|
if (value == null || value === '') { |
|
callback(new Error(t('rule.pleaseEnter') + t('pwd.pwd').toLowerCase())); |
|
} else if (value.length < 8 || value.length > 20) { |
|
callback(new Error(t('pwd.length', [8, 20]))); |
|
} else if (!new RegExp('^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$').test(value)) { |
|
callback(new Error(t('pwd.required'))); |
|
} else if (!new RegExp('^[^ ]+$').test(value)) { |
|
callback(new Error(t('pwd.noSpace'))); |
|
} |
|
callback(); |
|
}; |
|
} |
|
|
|
export class Name { |
|
pattern: RegExp = new RegExp('^[a-zA-Z\u4e00-\u9fa5]{1,10}$'); |
|
trigger = 'blur'; |
|
validator = (rule: any, value: any, callback: any) => { |
|
if (value != null && value.length != 0 && !this.pattern.test(value)) { |
|
callback(new Error(t('rule.name'))); |
|
} |
|
callback(); |
|
}; |
|
}
|
|
|