validate.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. /**
  2. * 表单通用验证
  3. * <pre>
  4. * 作者:hugh zhuang
  5. * 邮箱:3378340995@qq.com
  6. * 日期:2018-07-02-下午3:29:34
  7. * 版权:广州流辰信息技术有限公司
  8. * </pre>
  9. */
  10. import i18n from "@/utils/i18n";
  11. import utils from "@/utils/util";
  12. /**
  13. * 字段验证
  14. * 首字符为字母,其它只允许为字母、数字或下划线,并且长度不超过18字符"
  15. * @param {*} value
  16. * @param {*} callback
  17. */
  18. export function testField(rule, value, callback) {
  19. const res = /^[A-Za-z]{1}([a-zA-Z0-9_]{1,17})$/;
  20. if (!res.test(value) && value.length < 19) {
  21. callback(new Error("首字符为字母,其它只允许为字母、数字或下划线!"));
  22. } else if ((!res.test(value) || res.test(value)) && value.length > 19) {
  23. callback(new Error("长度不超过18字符"));
  24. } else {
  25. callback();
  26. }
  27. }
  28. /**
  29. * 判断校验为空的
  30. * @param {*} value
  31. * @param {*} rule
  32. * @param {*} callback
  33. */
  34. export function validateEmpty(rule, value, callback) {
  35. const pattern = /\s/;
  36. if (rule.required) {
  37. callback(new Error(rule.message || i18n.t("validate.required")));
  38. } else {
  39. if (pattern.test(value)) {
  40. callback(new Error("字符请勿携带空格"));
  41. return;
  42. }
  43. callback();
  44. }
  45. }
  46. /**
  47. * 判断校验为必填
  48. * @param {*} rule
  49. * @param {*} value
  50. * @param {*} callback
  51. */
  52. export function validateRequired(rule, value, callback) {
  53. if (utils.isEmpty(utils.trim(value))) {
  54. callback(new Error(rule.message || i18n.t("validate.required")));
  55. return;
  56. }
  57. callback();
  58. }
  59. /**
  60. * 整数验证
  61. * @param {*} value
  62. */
  63. export function isNumber(value) {
  64. if (isNaN(value)) {
  65. return false;
  66. }
  67. return typeof value === "number";
  68. }
  69. /**
  70. * 验证整数
  71. * @param {*} rule
  72. * @param {*} value
  73. * @param {*} callback
  74. */
  75. export const validateInteger = (rule, value, callback) => {
  76. if (utils.isEmpty(value)) {
  77. return validateEmpty(rule, value, callback);
  78. }
  79. value = Number(value);
  80. if (isNumber(value) && parseInt(value, 10) === value && value <= 2147483647) {
  81. callback();
  82. } else {
  83. callback(new Error(rule.message || i18n.t("validate.integer")));
  84. }
  85. };
  86. export const validateFloat = (rule, value, callback) => {
  87. if (utils.isEmpty(value)) {
  88. return validateEmpty(rule, value, callback);
  89. }
  90. const re = /^-?\d*\.\d+$/;
  91. if (!re.test(value) || !isNumber(Number(value))) {
  92. callback(new Error("填写只能为浮点型"));
  93. } else {
  94. callback();
  95. }
  96. };
  97. /**
  98. * 验证key或者变量
  99. * 只能为字母开头,允许字母、数字和下划线
  100. * @param {*} str
  101. */
  102. export function testKey(str) {
  103. const reg = /^[a-zA-Z][a-zA-Z0-9_]*$/;
  104. return reg.test(str);
  105. }
  106. /**
  107. * 验证业务组键key
  108. * 只能为字母开头,允许字母、数字、下划线和横线
  109. * @param {*} str
  110. */
  111. export function testBizKey(str) {
  112. const reg = /^[a-zA-Z][a-zA-Z0-9_-]*$/;
  113. return reg.test(str);
  114. }
  115. /**
  116. * 验证类名key
  117. * 只能为大写字母开头,允许字母、数字
  118. * @param {*} str
  119. */
  120. export function testUpperCaseKey(str) {
  121. const reg = /^[A-Z][a-zA-Z0-9]*$/;
  122. return reg.test(str);
  123. }
  124. /**
  125. * 验证类名key
  126. * @param {*} rule
  127. * @param {*} value
  128. * @param {*} callback
  129. */
  130. export const validateUpperCaseKey = (rule, value, callback) => {
  131. if (utils.isEmpty(value)) {
  132. return validateEmpty(rule, value, callback);
  133. }
  134. if (!testUpperCaseKey(value)) {
  135. callback(new Error("规则不合法,只能以大写字母开头,允许字母、数字!"));
  136. } else {
  137. callback();
  138. }
  139. };
  140. /**
  141. * 验证key
  142. * @param {*} rule
  143. * @param {*} value
  144. * @param {*} callback
  145. */
  146. export const validateKey = (rule, value, callback) => {
  147. if (utils.isEmpty(value)) {
  148. return validateEmpty(rule, value, callback);
  149. }
  150. if (!testKey(value)) {
  151. callback(new Error(rule.message || i18n.t("validate.key")));
  152. } else {
  153. callback();
  154. }
  155. };
  156. /* 合法url */
  157. export function testURL(textval) {
  158. const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/;
  159. return urlregex.test(textval);
  160. }
  161. /**
  162. * 验证url
  163. * @param {*} rule
  164. * @param {*} value
  165. * @param {*} callback
  166. */
  167. export const validateURL = (rule, value, callback) => {
  168. if (utils.isEmpty(value)) {
  169. return validateEmpty(rule, value, callback);
  170. }
  171. if (!testURL(value)) {
  172. callback(new Error(rule.message || i18n.t("validate.url")));
  173. } else {
  174. callback();
  175. }
  176. };
  177. /* 小写字母 */
  178. export function testLowerCase(str) {
  179. const reg = /^[a-z]+$/;
  180. return reg.test(str);
  181. }
  182. /**
  183. * 验证小写字母
  184. * @param {*} rule
  185. * @param {*} value
  186. * @param {*} callback
  187. */
  188. export const validateLowerCase = (rule, value, callback) => {
  189. if (utils.isEmpty(value)) {
  190. return validateEmpty(rule, value, callback);
  191. }
  192. if (!testLowerCase(value)) {
  193. callback(new Error(rule.message || i18n.t("validate.lowerCase")));
  194. } else {
  195. callback();
  196. }
  197. };
  198. /* 大写字母 */
  199. export function testUpperCase(str) {
  200. const reg = /^[A-Z]+$/;
  201. return reg.test(str);
  202. }
  203. /**
  204. * 验证大写字母
  205. * @param {*} rule
  206. * @param {*} value
  207. * @param {*} callback
  208. */
  209. export const validateUpperCase = (rule, value, callback) => {
  210. if (utils.isEmpty(value)) {
  211. return validateEmpty(rule, value, callback);
  212. }
  213. if (!testUpperCase(value)) {
  214. callback(new Error(rule.message || i18n.t("validate.upperCase")));
  215. } else {
  216. callback();
  217. }
  218. };
  219. /* 大小写字母 */
  220. export function testAlphabets(str) {
  221. const reg = /^[A-Za-z]+$/;
  222. return reg.test(str);
  223. }
  224. /**
  225. * 验证大小写字母
  226. * @param {*} rule
  227. * @param {*} value
  228. * @param {*} callback
  229. */
  230. export const validatAlphabets = (rule, value, callback) => {
  231. if (utils.isEmpty(value)) {
  232. return validateEmpty(rule, value, callback);
  233. }
  234. if (!testAlphabets(value)) {
  235. callback(new Error(rule.message || i18n.t("validate.alphabets")));
  236. } else {
  237. callback();
  238. }
  239. };
  240. /**
  241. * 多少选项
  242. * @param {*} rule
  243. * @param {*} value
  244. * @param {*} callback
  245. */
  246. export const validateOptions = (rule, value, callback) => {
  247. if (utils.isEmpty(value)) {
  248. return validateEmpty(rule, value, callback);
  249. }
  250. let arrayValue = [];
  251. if (utils.isArray(value)) {
  252. arrayValue = value;
  253. } else {
  254. arrayValue = value.split(",") || [];
  255. }
  256. const item = arrayValue.length;
  257. const min = rule.min;
  258. const max = rule.max;
  259. if (min && !max && item < min) {
  260. callback(new Error(rule.message || `至少选择 ${min}项`));
  261. } else if (max && !min && item > max) {
  262. callback(new Error(rule.message || `最多选择 ${max}项`));
  263. } else if (min && max && (item < min || item > max)) {
  264. callback(new Error(rule.message || `选择的选项在${min}至${max}项`));
  265. } else {
  266. callback();
  267. }
  268. };
  269. /**
  270. * 验证长度
  271. * @param {*} rule
  272. * @param {*} value
  273. * @param {*} callback
  274. */
  275. export const validateLengthRange = (rule, value, callback) => {
  276. const min = typeof rule.min === "number";
  277. const max = typeof rule.max === "number";
  278. if (utils.isEmpty(value)) {
  279. callback();
  280. return;
  281. }
  282. let val = value;
  283. if (rule.format) {
  284. val = rule.format(val);
  285. }
  286. const length = val.length;
  287. if (min && !max && length < rule.min) {
  288. callback(new Error(rule.message || `最少填写${rule.min}个字符`));
  289. } else if (max && !min && length > rule.max) {
  290. callback(new Error(rule.message || `最多填写${rule.max}个字符`));
  291. } else if (min && max && (length < rule.min || length > rule.max)) {
  292. if (rule.min === rule.max) {
  293. callback(new Error(rule.message || `必须填写${rule.min}个字符`));
  294. } else {
  295. callback(
  296. new Error(
  297. rule.message || `填写字符个数在 ${rule.min} - ${rule.max}之间`
  298. )
  299. );
  300. }
  301. } else {
  302. callback();
  303. }
  304. };
  305. export const validateNumberRange = (rule, value, callback) => {
  306. const min = typeof rule.min === "number";
  307. const max = typeof rule.max === "number";
  308. if (utils.isEmpty(value)) {
  309. callback();
  310. return;
  311. }
  312. if (utils.isNumber(value)) {
  313. callback(new Error("无效数字"));
  314. return;
  315. }
  316. const val = Number(value);
  317. if (min && !max && val < rule.min) {
  318. callback(new Error(rule.message || `必须大于或等于${rule.min}`));
  319. } else if (max && !min && val > rule.max) {
  320. callback(new Error(rule.message || `必须小于或等于${rule.max}`));
  321. } else if (min && max && (val < rule.min || val > rule.max)) {
  322. if (rule.min === rule.max) {
  323. callback(new Error(rule.message || `必须填写为${rule.min}`));
  324. } else {
  325. callback(
  326. new Error(rule.message || `必须在 ${rule.min} 到 ${rule.max}之间`)
  327. );
  328. }
  329. } else {
  330. callback();
  331. }
  332. };
  333. /**
  334. * 验证小数位
  335. * @param {*} rule
  336. * @param {*} value
  337. * @param {*} callback
  338. */
  339. export const validateDecimal = (rule, value, callback) => {
  340. if (utils.isEmpty(value)) {
  341. return validateEmpty(rule, value, callback);
  342. }
  343. const len = (value + "").replace(/^[^.]*[.]*/, "").length;
  344. if (len > rule.decimal) {
  345. callback(new Error(rule.message || `小数位不能超过${rule.decimal}位`));
  346. } else {
  347. callback();
  348. }
  349. };
  350. export const validateDateBetween = (rule, value, callback) => {
  351. if (utils.isEmpty(value)) {
  352. return validateEmpty(rule, value, callback);
  353. }
  354. callback();
  355. };
  356. export const validatePattern = (rule, value, callback) => {
  357. if (utils.isEmpty(value)) {
  358. return validateEmpty(rule, value, callback);
  359. }
  360. if (rule.dataFormat && !new RegExp(rule.dataFormat).test(value)) {
  361. callback(new Error(rule.message || `请按正确格式输入`));
  362. } else {
  363. callback();
  364. }
  365. };