@longhongguo/form-create-ant-design-vue 3.2.73 → 3.2.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/form-create.esm.js +2 -2
- package/dist/form-create.esm.js.map +1 -1
- package/dist/form-create.js +2 -2
- package/dist/form-create.js.map +1 -1
- package/package.json +1 -1
- package/src/core/api.js +29 -1
- package/src/core/test.js +586 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@longhongguo/form-create-ant-design-vue",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.75",
|
|
4
4
|
"description": "AntDesignVue版本低代码表单|FormCreate 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的低代码表单生成组件。支持6个UI框架,适配移动端,并且支持生成任何 Vue 组件。内置20种常用表单组件和自定义组件,再复杂的表单都可以轻松搞定。",
|
|
5
5
|
"main": "./dist/form-create.min.js",
|
|
6
6
|
"module": "./dist/form-create.esm.js",
|
package/src/core/api.js
CHANGED
|
@@ -2,6 +2,7 @@ import extend from '@form-create/utils/lib/extend'
|
|
|
2
2
|
import is from '@form-create/utils/lib/type'
|
|
3
3
|
import { invoke } from '@longhongguo/form-create-core/src/frame/util'
|
|
4
4
|
import toArray from '@form-create/utils/lib/toarray'
|
|
5
|
+
import validator from './test'
|
|
5
6
|
|
|
6
7
|
function tidyBtnProp(btn, def) {
|
|
7
8
|
if (is.Boolean(btn)) btn = { show: btn }
|
|
@@ -230,6 +231,33 @@ export default function extendApi(api, h) {
|
|
|
230
231
|
fn.call(context, ...args)
|
|
231
232
|
}, delay || 0)
|
|
232
233
|
}
|
|
233
|
-
}
|
|
234
|
+
},
|
|
235
|
+
/**
|
|
236
|
+
* 校验工具类
|
|
237
|
+
* 提供各种常用的校验方法
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* // 校验手机号
|
|
241
|
+
* if (this.api.validator.mobile('13800138000')) {
|
|
242
|
+
* console.log('手机号格式正确')
|
|
243
|
+
* }
|
|
244
|
+
*
|
|
245
|
+
* @example
|
|
246
|
+
* // 校验邮箱
|
|
247
|
+
* if (this.api.validator.email('test@example.com')) {
|
|
248
|
+
* console.log('邮箱格式正确')
|
|
249
|
+
* }
|
|
250
|
+
*
|
|
251
|
+
* @example
|
|
252
|
+
* // 在自定义校验规则中使用
|
|
253
|
+
* validator: function(value, callback) {
|
|
254
|
+
* if (!this.api.validator.mobile(value)) {
|
|
255
|
+
* callback('请输入正确的手机号')
|
|
256
|
+
* } else {
|
|
257
|
+
* callback()
|
|
258
|
+
* }
|
|
259
|
+
* }
|
|
260
|
+
*/
|
|
261
|
+
validator
|
|
234
262
|
}
|
|
235
263
|
}
|
package/src/core/test.js
ADDED
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 常用校验工具类
|
|
3
|
+
* 提供各种日常校验方法
|
|
4
|
+
*/
|
|
5
|
+
class Validator {
|
|
6
|
+
/**
|
|
7
|
+
* 校验手机号(中国大陆)
|
|
8
|
+
* @param {string} value - 要校验的值
|
|
9
|
+
* @param {boolean} strict - 是否严格模式(11位,1开头),默认 true
|
|
10
|
+
* @returns {boolean} 校验结果
|
|
11
|
+
*/
|
|
12
|
+
mobile(value, strict = false) {
|
|
13
|
+
if (!value) return false
|
|
14
|
+
const str = String(value).trim()
|
|
15
|
+
if (strict) {
|
|
16
|
+
// 严格模式:11位,1开头,第二位为3-9
|
|
17
|
+
return /^1[3-9]\d{9}$/.test(str)
|
|
18
|
+
} else {
|
|
19
|
+
// 宽松模式:1开头,10-11位数字
|
|
20
|
+
return /^1\d{10,11}$/.test(str)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 校验邮箱
|
|
26
|
+
* @param {string} value - 要校验的值
|
|
27
|
+
* @returns {boolean} 校验结果
|
|
28
|
+
*/
|
|
29
|
+
email(value) {
|
|
30
|
+
if (!value) return false
|
|
31
|
+
const str = String(value).trim()
|
|
32
|
+
// 邮箱正则:支持常见邮箱格式
|
|
33
|
+
return /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(
|
|
34
|
+
str
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 校验身份证号(中国大陆18位)
|
|
40
|
+
* @param {string} value - 要校验的值
|
|
41
|
+
* @param {boolean} checkCode - 是否校验校验码,默认 true
|
|
42
|
+
* @returns {boolean} 校验结果
|
|
43
|
+
*/
|
|
44
|
+
idCard(value, checkCode = true) {
|
|
45
|
+
if (!value) return false
|
|
46
|
+
const str = String(value).trim().toUpperCase()
|
|
47
|
+
|
|
48
|
+
// 基本格式校验:18位,前17位数字,最后一位数字或X
|
|
49
|
+
if (!/^\d{17}[\dX]$/.test(str)) {
|
|
50
|
+
return false
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!checkCode) {
|
|
54
|
+
return true
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// 校验码校验
|
|
58
|
+
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
|
|
59
|
+
const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
|
|
60
|
+
|
|
61
|
+
let sum = 0
|
|
62
|
+
for (let i = 0; i < 17; i++) {
|
|
63
|
+
sum += parseInt(str[i]) * weights[i]
|
|
64
|
+
}
|
|
65
|
+
const checkCodeIndex = sum % 11
|
|
66
|
+
return str[17] === checkCodes[checkCodeIndex]
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 校验URL
|
|
71
|
+
* @param {string} value - 要校验的值
|
|
72
|
+
* @param {object} options - 选项
|
|
73
|
+
* @param {boolean} options.requireProtocol - 是否要求协议(http/https),默认 false
|
|
74
|
+
* @returns {boolean} 校验结果
|
|
75
|
+
*/
|
|
76
|
+
url(value, options = {}) {
|
|
77
|
+
if (!value) return false
|
|
78
|
+
const str = String(value).trim()
|
|
79
|
+
const { requireProtocol = false } = options
|
|
80
|
+
|
|
81
|
+
if (requireProtocol) {
|
|
82
|
+
return /^https?:\/\/.+\..+/.test(str)
|
|
83
|
+
} else {
|
|
84
|
+
// 支持带协议或不带协议
|
|
85
|
+
return /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/.test(
|
|
86
|
+
str
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 校验IP地址(IPv4)
|
|
93
|
+
* @param {string} value - 要校验的值
|
|
94
|
+
* @returns {boolean} 校验结果
|
|
95
|
+
*/
|
|
96
|
+
ip(value) {
|
|
97
|
+
if (!value) return false
|
|
98
|
+
const str = String(value).trim()
|
|
99
|
+
const parts = str.split('.')
|
|
100
|
+
if (parts.length !== 4) return false
|
|
101
|
+
return parts.every((part) => {
|
|
102
|
+
const num = parseInt(part, 10)
|
|
103
|
+
return num >= 0 && num <= 255 && String(num) === part
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 校验数字
|
|
109
|
+
* @param {string|number} value - 要校验的值
|
|
110
|
+
* @param {object} options - 选项
|
|
111
|
+
* @param {boolean} options.integer - 是否必须为整数,默认 false
|
|
112
|
+
* @param {boolean} options.positive - 是否必须为正数,默认 false
|
|
113
|
+
* @param {boolean} options.negative - 是否必须为负数,默认 false
|
|
114
|
+
* @param {number} options.min - 最小值
|
|
115
|
+
* @param {number} options.max - 最大值
|
|
116
|
+
* @returns {boolean} 校验结果
|
|
117
|
+
*/
|
|
118
|
+
number(value, options = {}) {
|
|
119
|
+
if (value === null || value === undefined || value === '') return false
|
|
120
|
+
const num = Number(value)
|
|
121
|
+
if (isNaN(num)) return false
|
|
122
|
+
|
|
123
|
+
const {
|
|
124
|
+
integer = false,
|
|
125
|
+
positive = false,
|
|
126
|
+
negative = false,
|
|
127
|
+
min,
|
|
128
|
+
max
|
|
129
|
+
} = options
|
|
130
|
+
|
|
131
|
+
if (integer && !Number.isInteger(num)) return false
|
|
132
|
+
if (positive && num <= 0) return false
|
|
133
|
+
if (negative && num >= 0) return false
|
|
134
|
+
if (min !== undefined && num < min) return false
|
|
135
|
+
if (max !== undefined && num > max) return false
|
|
136
|
+
|
|
137
|
+
return true
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* 校验字符串长度
|
|
142
|
+
* @param {string} value - 要校验的值
|
|
143
|
+
* @param {object} options - 选项
|
|
144
|
+
* @param {number} options.min - 最小长度
|
|
145
|
+
* @param {number} options.max - 最大长度
|
|
146
|
+
* @param {number} options.len - 固定长度(优先级高于 min/max)
|
|
147
|
+
* @returns {boolean} 校验结果
|
|
148
|
+
*/
|
|
149
|
+
length(value, options = {}) {
|
|
150
|
+
if (value === null || value === undefined) return false
|
|
151
|
+
const str = String(value)
|
|
152
|
+
const { min, max, len } = options
|
|
153
|
+
|
|
154
|
+
if (len !== undefined) {
|
|
155
|
+
return str.length === len
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (min !== undefined && str.length < min) return false
|
|
159
|
+
if (max !== undefined && str.length > max) return false
|
|
160
|
+
|
|
161
|
+
return true
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 校验正则表达式
|
|
166
|
+
* @param {string} value - 要校验的值
|
|
167
|
+
* @param {RegExp|string} pattern - 正则表达式或正则字符串
|
|
168
|
+
* @returns {boolean} 校验结果
|
|
169
|
+
*/
|
|
170
|
+
pattern(value, pattern) {
|
|
171
|
+
if (!value || !pattern) return false
|
|
172
|
+
const str = String(value)
|
|
173
|
+
let regex
|
|
174
|
+
if (pattern instanceof RegExp) {
|
|
175
|
+
regex = pattern
|
|
176
|
+
} else {
|
|
177
|
+
try {
|
|
178
|
+
regex = new RegExp(pattern)
|
|
179
|
+
} catch (e) {
|
|
180
|
+
return false
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return regex.test(str)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* 校验日期
|
|
188
|
+
* @param {string|Date} value - 要校验的值
|
|
189
|
+
* @param {object} options - 选项
|
|
190
|
+
* @param {string|Date} options.min - 最小日期
|
|
191
|
+
* @param {string|Date} options.max - 最大日期
|
|
192
|
+
* @param {string} options.format - 日期格式,如 'YYYY-MM-DD',默认自动识别
|
|
193
|
+
* @returns {boolean} 校验结果
|
|
194
|
+
*/
|
|
195
|
+
date(value, options = {}) {
|
|
196
|
+
if (!value) return false
|
|
197
|
+
let date
|
|
198
|
+
if (value instanceof Date) {
|
|
199
|
+
date = value
|
|
200
|
+
} else {
|
|
201
|
+
date = new Date(value)
|
|
202
|
+
if (isNaN(date.getTime())) return false
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const { min, max } = options
|
|
206
|
+
if (min) {
|
|
207
|
+
const minDate = min instanceof Date ? min : new Date(min)
|
|
208
|
+
if (date < minDate) return false
|
|
209
|
+
}
|
|
210
|
+
if (max) {
|
|
211
|
+
const maxDate = max instanceof Date ? max : new Date(max)
|
|
212
|
+
if (date > maxDate) return false
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return true
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* 校验是否为空
|
|
220
|
+
* @param {*} value - 要校验的值
|
|
221
|
+
* @param {boolean} trim - 是否去除空格,默认 true
|
|
222
|
+
* @returns {boolean} 是否为空
|
|
223
|
+
*/
|
|
224
|
+
empty(value, trim = true) {
|
|
225
|
+
if (value === null || value === undefined) return true
|
|
226
|
+
if (typeof value === 'string') {
|
|
227
|
+
return trim ? value.trim() === '' : value === ''
|
|
228
|
+
}
|
|
229
|
+
if (Array.isArray(value)) {
|
|
230
|
+
return value.length === 0
|
|
231
|
+
}
|
|
232
|
+
if (typeof value === 'object') {
|
|
233
|
+
return Object.keys(value).length === 0
|
|
234
|
+
}
|
|
235
|
+
return false
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* 校验是否不为空(empty 的反向)
|
|
240
|
+
* @param {*} value - 要校验的值
|
|
241
|
+
* @param {boolean} trim - 是否去除空格,默认 true
|
|
242
|
+
* @returns {boolean} 是否不为空
|
|
243
|
+
*/
|
|
244
|
+
notEmpty(value, trim = true) {
|
|
245
|
+
return !this.empty(value, trim)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* 校验中文
|
|
250
|
+
* @param {string} value - 要校验的值
|
|
251
|
+
* @returns {boolean} 校验结果
|
|
252
|
+
*/
|
|
253
|
+
chinese(value) {
|
|
254
|
+
if (!value) return false
|
|
255
|
+
return /^[\u4e00-\u9fa5]+$/.test(String(value))
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* 校验字母
|
|
260
|
+
* @param {string} value - 要校验的值
|
|
261
|
+
* @param {boolean} caseSensitive - 是否区分大小写,默认 false(不区分)
|
|
262
|
+
* @returns {boolean} 校验结果
|
|
263
|
+
*/
|
|
264
|
+
alpha(value, caseSensitive = false) {
|
|
265
|
+
if (!value) return false
|
|
266
|
+
const str = String(value)
|
|
267
|
+
if (caseSensitive) {
|
|
268
|
+
return /^[a-zA-Z]+$/.test(str)
|
|
269
|
+
} else {
|
|
270
|
+
return /^[a-z]+$/i.test(str)
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* 校验字母和数字
|
|
276
|
+
* @param {string} value - 要校验的值
|
|
277
|
+
* @returns {boolean} 校验结果
|
|
278
|
+
*/
|
|
279
|
+
alphanumeric(value) {
|
|
280
|
+
if (!value) return false
|
|
281
|
+
return /^[a-zA-Z0-9]+$/.test(String(value))
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* 校验整数
|
|
286
|
+
* @param {string|number} value - 要校验的值
|
|
287
|
+
* @returns {boolean} 校验结果
|
|
288
|
+
*/
|
|
289
|
+
integer(value) {
|
|
290
|
+
return this.number(value, { integer: true })
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* 校验正数
|
|
295
|
+
* @param {string|number} value - 要校验的值
|
|
296
|
+
* @returns {boolean} 校验结果
|
|
297
|
+
*/
|
|
298
|
+
positive(value) {
|
|
299
|
+
return this.number(value, { positive: true })
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* 校验负数
|
|
304
|
+
* @param {string|number} value - 要校验的值
|
|
305
|
+
* @returns {boolean} 校验结果
|
|
306
|
+
*/
|
|
307
|
+
negative(value) {
|
|
308
|
+
return this.number(value, { negative: true })
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* 校验银行卡号(中国大陆,16-19位)
|
|
313
|
+
* @param {string} value - 要校验的值
|
|
314
|
+
* @returns {boolean} 校验结果
|
|
315
|
+
*/
|
|
316
|
+
bankCard(value) {
|
|
317
|
+
if (!value) return false
|
|
318
|
+
const str = String(value).replace(/\s/g, '')
|
|
319
|
+
// 银行卡号通常是16-19位数字
|
|
320
|
+
return /^\d{16,19}$/.test(str)
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* 校验邮政编码(中国大陆,6位数字)
|
|
325
|
+
* @param {string} value - 要校验的值
|
|
326
|
+
* @returns {boolean} 校验结果
|
|
327
|
+
*/
|
|
328
|
+
postcode(value) {
|
|
329
|
+
if (!value) return false
|
|
330
|
+
return /^\d{6}$/.test(String(value).trim())
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* 校验车牌号(中国大陆)
|
|
335
|
+
* @param {string} value - 要校验的值
|
|
336
|
+
* @returns {boolean} 校验结果
|
|
337
|
+
*/
|
|
338
|
+
licensePlate(value) {
|
|
339
|
+
if (!value) return false
|
|
340
|
+
const str = String(value).trim().toUpperCase()
|
|
341
|
+
// 支持普通车牌和新能源车牌
|
|
342
|
+
return (
|
|
343
|
+
/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$/.test(
|
|
344
|
+
str
|
|
345
|
+
) ||
|
|
346
|
+
/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z]((\d{5}[DF])|([DF][A-Z0-9]\d{4}))$/.test(
|
|
347
|
+
str
|
|
348
|
+
)
|
|
349
|
+
)
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* 校验统一社会信用代码(18位)
|
|
354
|
+
* @param {string} value - 要校验的值
|
|
355
|
+
* @returns {boolean} 校验结果
|
|
356
|
+
*/
|
|
357
|
+
creditCode(value) {
|
|
358
|
+
if (!value) return false
|
|
359
|
+
const str = String(value).trim().toUpperCase()
|
|
360
|
+
// 统一社会信用代码:18位,字母数字组合
|
|
361
|
+
return /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/.test(str)
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* 校验值是否在指定范围内
|
|
366
|
+
* @param {*} value - 要校验的值
|
|
367
|
+
* @param {Array} enumList - 允许的值列表
|
|
368
|
+
* @returns {boolean} 校验结果
|
|
369
|
+
*/
|
|
370
|
+
enum(value, enumList) {
|
|
371
|
+
if (!Array.isArray(enumList) || enumList.length === 0) return false
|
|
372
|
+
return enumList.includes(value)
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* 校验值是否相等
|
|
377
|
+
* @param {*} value1 - 第一个值
|
|
378
|
+
* @param {*} value2 - 第二个值
|
|
379
|
+
* @param {boolean} strict - 是否严格相等(===),默认 true
|
|
380
|
+
* @returns {boolean} 校验结果
|
|
381
|
+
*/
|
|
382
|
+
equal(value1, value2, strict = false) {
|
|
383
|
+
if (strict) {
|
|
384
|
+
return value1 === value2
|
|
385
|
+
} else {
|
|
386
|
+
return value1 == value2 // eslint-disable-line eqeqeq
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* 校验值是否不相等
|
|
392
|
+
* @param {*} value1 - 第一个值
|
|
393
|
+
* @param {*} value2 - 第二个值
|
|
394
|
+
* @param {boolean} strict - 是否严格相等(===),默认 true
|
|
395
|
+
* @returns {boolean} 校验结果
|
|
396
|
+
*/
|
|
397
|
+
notEqual(value1, value2, strict = true) {
|
|
398
|
+
return !this.equal(value1, value2, strict)
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* 校验是否全为大写
|
|
403
|
+
* @param {string} value - 要校验的值
|
|
404
|
+
* @returns {boolean} 校验结果
|
|
405
|
+
*/
|
|
406
|
+
uppercase(value) {
|
|
407
|
+
if (!value) return false
|
|
408
|
+
const str = String(value)
|
|
409
|
+
return str === str.toUpperCase() && /[A-Z]/.test(str)
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* 校验是否全为小写
|
|
414
|
+
* @param {string} value - 要校验的值
|
|
415
|
+
* @returns {boolean} 校验结果
|
|
416
|
+
*/
|
|
417
|
+
lowercase(value) {
|
|
418
|
+
if (!value) return false
|
|
419
|
+
const str = String(value)
|
|
420
|
+
return str === str.toLowerCase() && /[a-z]/.test(str)
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* 校验用户名(字母、数字、下划线,3-20位)
|
|
425
|
+
* @param {string} value - 要校验的值
|
|
426
|
+
* @param {object} options - 选项
|
|
427
|
+
* @param {number} options.min - 最小长度,默认 3
|
|
428
|
+
* @param {number} options.max - 最大长度,默认 20
|
|
429
|
+
* @returns {boolean} 校验结果
|
|
430
|
+
*/
|
|
431
|
+
username(value, options = {}) {
|
|
432
|
+
if (!value) return false
|
|
433
|
+
const str = String(value).trim()
|
|
434
|
+
const { min = 3, max = 20 } = options
|
|
435
|
+
if (str.length < min || str.length > max) return false
|
|
436
|
+
return /^[a-zA-Z0-9_]+$/.test(str)
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* 校验密码强度
|
|
441
|
+
* @param {string} value - 要校验的值
|
|
442
|
+
* @param {object} options - 选项
|
|
443
|
+
* @param {number} options.min - 最小长度,默认 6
|
|
444
|
+
* @param {number} options.max - 最大长度,默认 20
|
|
445
|
+
* @param {boolean} options.requireNumber - 是否必须包含数字,默认 false
|
|
446
|
+
* @param {boolean} options.requireLetter - 是否必须包含字母,默认 false
|
|
447
|
+
* @param {boolean} options.requireSpecial - 是否必须包含特殊字符,默认 false
|
|
448
|
+
* @returns {boolean} 校验结果
|
|
449
|
+
*/
|
|
450
|
+
password(value, options = {}) {
|
|
451
|
+
if (!value) return false
|
|
452
|
+
const str = String(value)
|
|
453
|
+
const {
|
|
454
|
+
min = 6,
|
|
455
|
+
max = 20,
|
|
456
|
+
requireNumber = false,
|
|
457
|
+
requireLetter = false,
|
|
458
|
+
requireSpecial = false
|
|
459
|
+
} = options
|
|
460
|
+
|
|
461
|
+
if (str.length < min || str.length > max) return false
|
|
462
|
+
if (requireNumber && !/\d/.test(str)) return false
|
|
463
|
+
if (requireLetter && !/[a-zA-Z]/.test(str)) return false
|
|
464
|
+
if (requireSpecial && !/[!@#$%^&*(),.?":{}|<>]/.test(str)) return false
|
|
465
|
+
|
|
466
|
+
return true
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* 校验十六进制颜色值
|
|
471
|
+
* @param {string} value - 要校验的值(如 #fff 或 #ffffff)
|
|
472
|
+
* @returns {boolean} 校验结果
|
|
473
|
+
*/
|
|
474
|
+
hexColor(value) {
|
|
475
|
+
if (!value) return false
|
|
476
|
+
return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(String(value).trim())
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* 校验QQ号(5-11位数字)
|
|
481
|
+
* @param {string} value - 要校验的值
|
|
482
|
+
* @returns {boolean} 校验结果
|
|
483
|
+
*/
|
|
484
|
+
qq(value) {
|
|
485
|
+
if (!value) return false
|
|
486
|
+
return /^[1-9]\d{4,10}$/.test(String(value).trim())
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* 校验微信号(6-20位,字母、数字、下划线、减号)
|
|
491
|
+
* @param {string} value - 要校验的值
|
|
492
|
+
* @returns {boolean} 校验结果
|
|
493
|
+
*/
|
|
494
|
+
wechat(value) {
|
|
495
|
+
if (!value) return false
|
|
496
|
+
return /^[a-zA-Z0-9_-]{6,20}$/.test(String(value).trim())
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* 校验固定电话(中国大陆)
|
|
501
|
+
* @param {string} value - 要校验的值
|
|
502
|
+
* @returns {boolean} 校验结果
|
|
503
|
+
*/
|
|
504
|
+
tel(value) {
|
|
505
|
+
if (!value) return false
|
|
506
|
+
const str = String(value).trim()
|
|
507
|
+
// 支持带区号的固定电话:010-12345678 或 01012345678
|
|
508
|
+
return /^(0\d{2,3}-?)?\d{7,8}$/.test(str)
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* 校验MAC地址
|
|
513
|
+
* @param {string} value - 要校验的值
|
|
514
|
+
* @returns {boolean} 校验结果
|
|
515
|
+
*/
|
|
516
|
+
mac(value) {
|
|
517
|
+
if (!value) return false
|
|
518
|
+
const str = String(value).trim().toUpperCase()
|
|
519
|
+
return /^([0-9A-F]{2}:){5}[0-9A-F]{2}$/.test(str)
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* 校验Base64编码
|
|
524
|
+
* @param {string} value - 要校验的值
|
|
525
|
+
* @returns {boolean} 校验结果
|
|
526
|
+
*/
|
|
527
|
+
base64(value) {
|
|
528
|
+
if (!value) return false
|
|
529
|
+
const str = String(value).trim()
|
|
530
|
+
if (str.length % 4 !== 0) return false
|
|
531
|
+
try {
|
|
532
|
+
return btoa(atob(str)) === str
|
|
533
|
+
} catch (e) {
|
|
534
|
+
return false
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* 校验JSON字符串
|
|
540
|
+
* @param {string} value - 要校验的值
|
|
541
|
+
* @returns {boolean} 校验结果
|
|
542
|
+
*/
|
|
543
|
+
json(value) {
|
|
544
|
+
if (!value) return false
|
|
545
|
+
try {
|
|
546
|
+
JSON.parse(String(value))
|
|
547
|
+
return true
|
|
548
|
+
} catch (e) {
|
|
549
|
+
return false
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/**
|
|
554
|
+
* 校验数字字符串(纯数字组成)
|
|
555
|
+
* @param {string} value - 要校验的值
|
|
556
|
+
* @returns {boolean} 校验结果
|
|
557
|
+
*/
|
|
558
|
+
numeric(value) {
|
|
559
|
+
if (value === null || value === undefined) return false
|
|
560
|
+
return /^\d+$/.test(String(value))
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* 校验URL路径(不含协议和域名)
|
|
565
|
+
* @param {string} value - 要校验的值
|
|
566
|
+
* @returns {boolean} 校验结果
|
|
567
|
+
*/
|
|
568
|
+
path(value) {
|
|
569
|
+
if (!value) return false
|
|
570
|
+
return /^\/[^\s]*$/.test(String(value).trim())
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* 校验端口号(1-65535)
|
|
575
|
+
* @param {string|number} value - 要校验的值
|
|
576
|
+
* @returns {boolean} 校验结果
|
|
577
|
+
*/
|
|
578
|
+
port(value) {
|
|
579
|
+
return this.number(value, { integer: true, min: 1, max: 65535 })
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
// 创建单例实例
|
|
584
|
+
const validator = new Validator()
|
|
585
|
+
|
|
586
|
+
export default validator
|