validator.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  1. /*
  2. * @Description: In User Settings Edit
  3. * @Author: your name
  4. * @Date: 2019-03-30 12:32:39
  5. * @LastEditTime: 2019-08-14 11:23:06
  6. * @LastEditors: Please set LastEditors
  7. */
  8. /*
  9. * rule
  10. * {"trigger":"change","max":10,"min":20,"field":"telegrpNo","fullField":"telegrpNo","type":"string", ...}
  11. * 可自定义属性
  12. */
  13. // 定义默认中文所占字符长度,由个项目使用的数据库决定
  14. // 正常 utf-8以三个字节存储中文;gbk以二个字节存储中文。
  15. const _chineseLength = 3;
  16. // number校验
  17. /*
  18. 处理属性:
  19. length tip isPositive: 是否为正数
  20. */
  21. export const checkNumber = (rule, value, callback) => {
  22. if (typeof value === 'number') {
  23. value = value.toString().trim()
  24. }
  25. if (value) {
  26. if (isNaN(value) || value.toString().trim() === '') {
  27. return callback(new Error('请输入数字'));
  28. }
  29. if (typeof rule.length === 'undefined') {
  30. if (typeof rule.isPositive !== 'undefined') {
  31. if (value < 0) {
  32. return callback(new Error('请输入正数'))
  33. }
  34. }
  35. return callback()
  36. }
  37. let arry = rule.length.toString().split('.')
  38. let integer = arry[0]
  39. let decimal = arry[1]
  40. let str = null, reg = null
  41. if (typeof decimal === 'undefined') {
  42. str = '\\d{0,' + integer + '}'
  43. if (rule.negative) {
  44. str = '-?\\d{0,' + integer + '}'
  45. }
  46. reg = new RegExp('^' + str + '$', 'g');
  47. if (!reg.test(value)) {
  48. return callback(new Error(integer + ' 位整数'));
  49. }
  50. } else {
  51. integer = integer - decimal;
  52. str = '(([1-9]{1}\\d{0,' + (integer - 1) + '}(\\.\\d{1,' + decimal + '})?)|(0(\\.\\d{1,' + decimal + '})?))'
  53. if (rule.negative) {
  54. str = '-?(([1-9]{1}\\d{0,' + (integer - 1) + '}(\\.\\d{1,' + decimal + '})?)|(0(\\.\\d{1,' + decimal + '})?))'
  55. }
  56. reg = new RegExp('^' + str + '$', 'g');
  57. if (!reg.test(value)) {
  58. return callback(new Error(integer + ' 位整数,小数点后' + decimal + '位'));
  59. }
  60. }
  61. } else {
  62. if (rule.required) {
  63. return callback(new Error('不能为空'));
  64. }
  65. }
  66. callback();
  67. };
  68. export const checkcntNumber = (rule, value, callback) => {
  69. if (typeof value === 'number') {
  70. value = value.toString().trim()
  71. }
  72. if (value) {
  73. if (isNaN(value) || value.toString().trim() === '') {
  74. return callback(new Error('请输入数字'));
  75. }
  76. if (typeof rule.length === 'undefined') {
  77. if (typeof rule.isPositive !== 'undefined') {
  78. if (value < 0) {
  79. return callback(new Error('请输入正数'))
  80. }
  81. }
  82. return callback()
  83. }
  84. let arry = rule.length.toString().split('.')
  85. let integer = arry[0]
  86. let decimal = arry[1]
  87. let str = null, reg = null
  88. if (typeof decimal === 'undefined') {
  89. str = '\\d{0,' + integer + '}'
  90. if (rule.negative) {
  91. str = '-?\\d{0,' + integer + '}'
  92. }
  93. reg = new RegExp('^' + str + '$', 'g');
  94. if (!reg.test(value)) {
  95. return callback(new Error(integer + ' 位整数'));
  96. }
  97. } else {
  98. integer = integer - decimal;
  99. str = '(([1-9]{1}\\d{0,' + (integer - 1) + '}(\\.\\d{1,' + decimal + '})?)|(0(\\.\\d{1,' + decimal + '})?))'
  100. if (rule.negative) {
  101. str = '-?(([1-9]{1}\\d{0,' + (integer - 1) + '}(\\.\\d{1,' + decimal + '})?)|(0(\\.\\d{1,' + decimal + '})?))'
  102. }
  103. reg = new RegExp('^' + str + '$', 'g');
  104. if (!reg.test(value)) {
  105. return callback(new Error(integer + ' 位整数,小数点后' + decimal + '位'));
  106. }
  107. }
  108. } else {
  109. if (rule.required) {
  110. return callback(new Error('请输入件数'));
  111. }
  112. }
  113. callback();
  114. };
  115. export const checkPercent = (rule, value, callback) => {
  116. if (value) {
  117. if (value) {
  118. if (isNaN(value)) {
  119. return callback(new Error('请输入数字'));
  120. }
  121. let exact = rule.exact
  122. let item = '100'
  123. let max = '100|'
  124. if (exact) {
  125. item += '.'
  126. }
  127. for (let i = 0; i < exact; i++) {
  128. item += '0'
  129. max += item + '|'
  130. }
  131. let str = '((100(\\.0{1,' + exact + '})?)|(0(\\.\\d{1,' + exact + '})?)|([1-9]?\\d{0,1}(\\.\\d{1,' + exact + '})?))'
  132. let reg = new RegExp('^' + str + '$', 'g');
  133. if (!reg.test(value)) {
  134. return callback(new Error('0~100,可保留' + exact + '位小数'))
  135. }
  136. }
  137. } else {
  138. if (rule.required) {
  139. return callback(new Error('请输入'));
  140. }
  141. }
  142. callback();
  143. }
  144. export const checkPercent2 = (rule, value, callback) => {
  145. if (value) {
  146. if (value) {
  147. if (isNaN(value)) {
  148. return callback(new Error('请输入数字'));
  149. }
  150. let exact = rule.exact
  151. let item = '1000'
  152. let max = '1000|'
  153. if (exact) {
  154. item += '.'
  155. }
  156. for (let i = 0; i < exact; i++) {
  157. item += '0'
  158. max += item + '|'
  159. }
  160. let str = '((1000(\\.0{1,' + exact + '})?)|(0(\\.\\d{1,' + exact + '})?)|([1-9]?\\d{0,2}(\\.\\d{1,' + exact + '})?))'
  161. let reg = new RegExp('^' + str + '$', 'g');
  162. if (!reg.test(value)) {
  163. return callback(new Error('0~1000,可保留' + exact + '位小数'))
  164. }
  165. }
  166. } else {
  167. if (rule.required) {
  168. return callback(new Error('请输入'));
  169. }
  170. }
  171. callback();
  172. }
  173. // 是否为整数包含0
  174. export const checkInteger = (rule, value, callback) => {
  175. if (value) {
  176. if (isNaN(value)) {
  177. return callback(new Error('请输入数字'));
  178. }
  179. let str = /^([1-9][0-9]*)$|^0$/
  180. if (!str.test(value)) {
  181. return callback(new Error('请输入自然数'))
  182. }
  183. }
  184. callback();
  185. }
  186. // 电话手机号码验证
  187. export const checkTel = (rule, value, callback) => {
  188. if (value) {
  189. let reg = /^1[3|7|8]\d{9}$|^19[8-9]\d{8}$|^166\d{8}|^15[0-3|5-9]\d{8}|^14[5|7]\d{8}$/
  190. let reg1 = /^[0][1-9]{2,3}-[0-9]{5,10}$/
  191. let result = false, result1 = false
  192. if (reg.test(value)) {
  193. result = true
  194. }
  195. if (reg1.test(value)) {
  196. result1 = true
  197. }
  198. if (result || result1) {
  199. callback()
  200. } else {
  201. return callback(new Error('手机(固定电话)格式有误...'))
  202. }
  203. } else {
  204. if (rule.required) {
  205. return callback(new Error('请输入'));
  206. }
  207. }
  208. callback()
  209. }
  210. // 传真验证
  211. export const checkFax = (rule, value, callback) => {
  212. if (value) {
  213. let reg1 = /^(\d{3,4}|\d{3,4}-)?\d{7,8}$/
  214. let result1 = false
  215. if (reg1.test(value)) {
  216. result1 = true
  217. }
  218. if (result1) {
  219. return callback()
  220. } else {
  221. return callback(new Error('格式验证有误...'))
  222. }
  223. }
  224. callback()
  225. }
  226. // 校验身份证号
  227. export const checkCardNo = (rule, value, callback) => {
  228. if (value) {
  229. let str = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/
  230. if (!str.test(value)) {
  231. return callback(new Error('请输入正确的身份证格式'))
  232. }
  233. if (value.length !== 18) {
  234. callback(new Error('请输入18位'));
  235. }
  236. }
  237. callback();
  238. };
  239. export const chekPercent = (rule, value, callback) => {
  240. if (value) {
  241. let reg = new RegExp('^(\\d|[1-9]\\d|100)$');
  242. if (!reg.test(value)) {
  243. return callback(new Error('数值在0~100之间'))
  244. }
  245. }
  246. callback()
  247. }
  248. // 校验只能输入英文 和 数字
  249. export const checkEnglish = (rule, value, callback) => {
  250. if (value) {
  251. let reg = /^[A-Za-z0-9\s]+$/
  252. if (!reg.test(value)) {
  253. return callback(new Error('请输入英文和数字'));
  254. }
  255. if (rule.max < value.length) {
  256. return callback(new Error('最多输入' + rule.max + '个字符'));
  257. }
  258. } else {
  259. if (rule.required) {
  260. return callback(new Error('请输入'));
  261. }
  262. }
  263. callback();
  264. };
  265. // 以英文字母开头,只能包含英文字母、数字、下划线
  266. export const checkStart = (rule, value, callback) => {
  267. if (value) {
  268. let reg = /^[a-zA-Z][a-zA-Z0-9_]*$/
  269. if (!reg.test(value)) {
  270. return callback(new Error('以英文字母开头,只能包含英文字母、数字、下划线'));
  271. }
  272. } else {
  273. if (rule.required) {
  274. return callback(new Error('请输入'));
  275. }
  276. }
  277. callback();
  278. };
  279. // 价格校验(大于0)
  280. export const checkPositiveNumber = (rule, value, callback) => {
  281. if (value) {
  282. if (isNaN(value)) {
  283. return callback(new Error('请输入数字'));
  284. } else if (!(value > 0)) {
  285. return callback(new Error('请输入正数'));
  286. }
  287. }
  288. callback();
  289. };
  290. // 文本校验(综合)
  291. /*
  292. * 处理属性:
  293. * required max min fieldName chineseLength
  294. */
  295. export const checkText = (rule, value, callback) => {
  296. if (value) {
  297. let reg = /^[-_a-zA-Z0-9\u4e00-\u9fa5]+$/;
  298. if (!reg.test(value)) {
  299. return callback(new Error('请输入中文、英文字母、数字、下划线(_)或横线(-)的组合'));
  300. }
  301. let chineseLen = _chineseLength;
  302. if (rule.chineseLength && rule.chineseLength > 0) {
  303. chineseLen = rule.chineseLength;
  304. }
  305. let iLen = chineseLen > 1 ? _charLength(value, chineseLen) : value.length;
  306. if (rule.min && rule.min > 0 && iLen < rule.min) {
  307. return callback(new Error('最少输入' + rule.min + '个字符(一个中文占' + chineseLen + '个字符)'));
  308. }
  309. if (rule.max && rule.max > 0 && iLen > rule.max) {
  310. return callback(new Error('最多输入' + rule.max + '个字符(一个中文占' + chineseLen + '个字符)'));
  311. }
  312. } else {
  313. if (rule.required) {
  314. let sfield = rule.fieldName ? rule.fieldName : '';
  315. return callback(new Error('请输入' + sfield));
  316. }
  317. }
  318. callback();
  319. };
  320. /*
  321. * 处理属性:
  322. * required max min fieldName chineseLength
  323. */
  324. export const checkComplexText = (rule, value, callback) => {
  325. if (value) {
  326. let chineseLen = _chineseLength;
  327. if (rule.chineseLength && rule.chineseLength > 0) {
  328. chineseLen = rule.chineseLength;
  329. }
  330. let iLen = chineseLen > 1 ? _charLength(value, chineseLen) : value.length;
  331. if (rule.min && rule.min > 0 && iLen < rule.min) {
  332. return callback(new Error('最少输入' + rule.min + '个字符(一个中文占' + chineseLen + '个字符)'));
  333. }
  334. if (rule.max && rule.max > 0 && iLen > rule.max) {
  335. return callback(new Error('最多输入' + rule.max + '个字符(一个中文占' + chineseLen + '个字符)'));
  336. }
  337. } else {
  338. if (rule.required) {
  339. let sfield = rule.fieldName ? rule.fieldName : '';
  340. return callback(new Error('请输入' + sfield));
  341. }
  342. }
  343. callback();
  344. };
  345. // 中文校验
  346. export const checkChinese = (rule, value, callback) => {
  347. let reg = /^[\u4e00-\u9fa5./?#:'"_=+-]+$/;
  348. if (!reg.test(value)) {
  349. return callback(new Error('请输入中文'));
  350. }
  351. callback();
  352. };
  353. // 字符校验(含中文)
  354. export const checkChar = (rule, value, callback) => {
  355. let reg = /^[-_a-zA-Z0-9\u4e00-\u9fa5 ]+$/;
  356. if (!reg.test(value) && value) {
  357. return callback(new Error('请输入中文、英文字母、数字、下划线(_)或横线(-)的组合'));
  358. }
  359. callback();
  360. };
  361. // 字符校验(不含中文)
  362. export const checkCharNoChinese = (rule, value, callback) => {
  363. let reg = /^[-_a-zA-Z0-9]+$/;
  364. if (value && !reg.test(value)) {
  365. return callback(new Error('请输入英文字母、数字、下划线(_)或横线(-)的组合'));
  366. }
  367. callback();
  368. };
  369. export const checkCharNoChinese2 = (rule, value, callback) => {
  370. let reg = /^[\w-./#:]+$/;
  371. if (value && !reg.test(value)) {
  372. return callback(new Error('请输入英文字母、数字、下划线(_)或横线(-)的组合'));
  373. }
  374. callback();
  375. };
  376. export const checkCharNoChinese3 = (rule, value, callback) => {
  377. let reg = /^[-a-zA-Z0-9]+$/;
  378. if (value && !reg.test(value)) {
  379. return callback(new Error('请输入英文字母、数字、- 的组合'));
  380. }
  381. callback();
  382. };
  383. export const checkCharNoChinese4 = (rule, value, callback) => {
  384. let reg = /^[-_a-z0-9]+$/;
  385. if (value && !reg.test(value)) {
  386. return callback(new Error('请输入小写英文字母、数字、- 、_ 的组合'));
  387. }
  388. callback();
  389. };
  390. export const checkCharNoChinese5 = (rule, value, callback) => {
  391. let reg = /^[-_a-z0-9${}.]+$/;
  392. if (value && !reg.test(value)) {
  393. return callback(new Error('请输入英文字母、数字、- 、_ 、$、{}、. 的组合'));
  394. }
  395. callback();
  396. };
  397. export const checkCode = (rule, value, callback) => {
  398. let reg = /^[-a-z0-9]+$/;
  399. if (value && !reg.test(value)) {
  400. return callback(new Error('请输入英文字母、数字 - 的组合'));
  401. }
  402. callback();
  403. };
  404. export const checkVersion = (rule, value, callback) => {
  405. let reg = /^[-_0-9.]+$/;
  406. if (value && !reg.test(value)) {
  407. return callback(new Error('请输入数字、- _的组合'));
  408. }
  409. callback();
  410. };
  411. // 字符长度校验(包含对中文的处理)rule需至少有 min 或 max
  412. export const checkCharLength = (rule, value, callback) => {
  413. if (value) {
  414. let chineseLen = _chineseLength;
  415. if (rule.chineseLength && rule.chineseLength > 0) {
  416. chineseLen = rule.chineseLength;
  417. }
  418. let iLen = chineseLen > 1 ? _charLength(value, chineseLen) : value.length;
  419. if (rule.min && rule.min > 0 && iLen < rule.min) {
  420. return callback(new Error('最少输入' + rule.min + '个字符(一个中文占' + chineseLen + '个字符)'));
  421. }
  422. if (rule.max && rule.max > 0 && iLen > rule.max) {
  423. return callback(new Error('最多输入' + rule.max + '个字符(一个中文占' + chineseLen + '个字符)'));
  424. }
  425. } else {
  426. if (rule.required) {
  427. return callback(new Error('请输入'));
  428. }
  429. }
  430. callback();
  431. };
  432. export const checkCharLength2 = (rule, value, callback) => {
  433. if (value) {
  434. let chineseLen = _chineseLength;
  435. if (rule.chineseLength && rule.chineseLength > 0) {
  436. chineseLen = rule.chineseLength;
  437. }
  438. let iLen = chineseLen > 1 ? _charLength(value, chineseLen) : value.length;
  439. if (rule.min && rule.min > 0 && iLen < rule.min) {
  440. return callback(new Error('最少输入' + rule.min + '个字符'));
  441. }
  442. if (rule.max && rule.max > 0 && iLen > rule.max) {
  443. return callback(new Error('最多输入' + rule.max + '个字符'));
  444. }
  445. } else {
  446. if (rule.required) {
  447. return callback(new Error('请输入'));
  448. }
  449. }
  450. callback();
  451. };
  452. // 校验邮编
  453. export const checkZIP = (rule, value, callback) => {
  454. if (value) {
  455. let reg = /^\d{6}$/;
  456. if (reg.test(value)) {
  457. callback();
  458. } else {
  459. return callback(new Error('请输入邮编(6位数字)'));
  460. }
  461. }
  462. callback();
  463. }
  464. // 校验internet URL
  465. export const checkURL = (rule, value, callback) => {
  466. if (value) {
  467. let reg = /(((^https?:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)$/g
  468. if (reg.test(value)) {
  469. callback();
  470. } else {
  471. return callback(new Error('请输入网址'));
  472. }
  473. }
  474. callback()
  475. }
  476. // 校验邮箱
  477. export const checkEmail = (rule, value, callback) => {
  478. var re = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/;
  479. if (value) {
  480. if (re.test(value)) {
  481. callback();
  482. } else {
  483. return callback(new Error('请输入正确的邮箱'));
  484. }
  485. } else {
  486. if (rule.required) {
  487. return callback(new Error('请输入'));
  488. }
  489. }
  490. callback();
  491. }
  492. /**
  493. * 字符长度,处理中文
  494. * utf-8以三个字节存储中文;gbk以二个字节存储中文。
  495. */
  496. export function _charLength (str, chineseLen) {
  497. if (!str || str.length <= 0) { return 0; };
  498. // str = mytrim(str);
  499. let chineseLength = 3; // utf-8编码,中文长度
  500. if (chineseLen && chineseLen > 0) {
  501. chineseLength = chineseLen
  502. }
  503. let objValue = str;
  504. let objLength = 0;
  505. let compareChar = '';
  506. let regExp = new RegExp("^[A-Za-z0-9 -_`~!@#$%^&*()-+=|,<.>/?;:'\\\"]$");
  507. for (let count = 0; count < objValue.length; count++) {
  508. compareChar = objValue.substring(count, count + 1);
  509. if (regExp.test(compareChar)) {
  510. objLength += 1;
  511. } else if (compareChar === '\\') {
  512. objLength += 1;
  513. } else {
  514. objLength += chineseLength;
  515. }
  516. }
  517. return objLength;
  518. }
  519. // 外部引用
  520. export const checkCNLen = (str, chineseLen) => {
  521. if (!str || str.length <= 0) { return 0; };
  522. // str = mytrim(str);
  523. let chineseLength = 3; // utf-8编码,中文长度
  524. if (chineseLen && chineseLen > 0) {
  525. chineseLength = chineseLen
  526. }
  527. let objValue = str;
  528. let objLength = 0;
  529. let compareChar = '';
  530. let regExp = new RegExp("^[A-Za-z0-9 -_`~!@#$%^&*()-+=|,<.>/?;:'\\\"]$");
  531. for (let count = 0; count < objValue.length; count++) {
  532. compareChar = objValue.substring(count, count + 1);
  533. if (regExp.test(compareChar)) {
  534. objLength += 1;
  535. } else if (compareChar === '\\') {
  536. objLength += 1;
  537. } else {
  538. objLength += chineseLength;
  539. }
  540. }
  541. return objLength;
  542. }
  543. /**
  544. * 判断不能为数字
  545. */
  546. export const checkDigital = (rule, value, callback) => {
  547. var re = /^[0-9]+.?[0-9]*/; // 判断字符串是否为数字//判断正整数/[1−9]+[0−9]∗]∗/
  548. if (re.test(value)) {
  549. return callback(new Error('不能全部输入数字'));
  550. }
  551. callback();
  552. }
  553. // 检验数据
  554. export const checkNumber1 = (rule, value, callback) => {
  555. if (typeof value === 'number') {
  556. value = value.toString().trim()
  557. }
  558. if (value) {
  559. if (isNaN(value) || value.toString().trim() === '') {
  560. return callback(new Error('请输入数字'));
  561. }
  562. if (typeof rule.length === 'undefined') {
  563. if (typeof rule.isPositive !== 'undefined') {
  564. if (value < 0) {
  565. return callback(new Error('请输入正数'))
  566. }
  567. }
  568. return callback()
  569. }
  570. let arry = rule.length.toString().split('.')
  571. let integer = arry[0]
  572. let decimal = arry[1]
  573. let str = null, reg = null
  574. if (typeof decimal === 'undefined') {
  575. str = '\\d{0,' + integer + '}'
  576. if (rule.negative) {
  577. str = '-?\\d{0,' + integer + '}'
  578. }
  579. reg = new RegExp('^' + str + '$', 'g');
  580. if (!reg.test(value)) {
  581. return callback(new Error('最多 ' + integer + ' 位整数'));
  582. }
  583. } else {
  584. integer = integer - decimal;
  585. str = '(([1-9]{1}\\d{0,' + (integer - 1) + '}(\\.\\d{1,' + decimal + '})?)|(0(\\.\\d{1,' + decimal + '})?))'
  586. if (rule.negative) {
  587. str = '-?(([1-9]{1}\\d{0,' + (integer - 1) + '}(\\.\\d{1,' + decimal + '})?)|(0(\\.\\d{1,' + decimal + '})?))'
  588. }
  589. reg = new RegExp('^' + str + '$', 'g');
  590. if (!reg.test(value)) {
  591. return callback(new Error('最多' + integer + '位整数,' + decimal + '位小数'));
  592. }
  593. }
  594. } else {
  595. if (rule.required) {
  596. return callback(new Error('不能为空'));
  597. }
  598. }
  599. callback();
  600. };
  601. /**
  602. * @summary 设置cookie
  603. * @param {string} name cookie名称
  604. * @param {string} value cookie值
  605. * @param {int} expires 保存时间(单位:小时)
  606. * @param {string} path
  607. * @param {string} domain
  608. * @param {string} secure
  609. */
  610. export const setCookie = (name, value, expires, path, domain, secure) => {
  611. let str = name + '=' + encodeURIComponent(value);
  612. if (expires > 0) {
  613. let date = new Date();
  614. date.setTime(date.getTime() + expires * 3600 * 1000);
  615. str += ';expires=' + date.toGMTString();
  616. }
  617. if (path) { str += ';path=' + path; }
  618. if (domain) { str += ';domain=' + domain; }
  619. if (secure) { str += ';secure=' + secure; }
  620. document.cookie = str;
  621. };
  622. /**
  623. * @summary 读取cookie
  624. * @param {string} name cookie名称
  625. * @retrun {string} value cookie值
  626. * @example
  627. */
  628. export const getCookie = (name) => {
  629. let start = document.cookie.indexOf(name + '=');
  630. if ((!start) && (name !== document.cookie.substring(0, name.length))) { return ''; }
  631. if (start === -1) { return ''; }
  632. let len = start + name.length + 1;
  633. let end = document.cookie.indexOf(';', len);
  634. if (end === -1) { end = document.cookie.length; }
  635. return decodeURIComponent(document.cookie.substring(len, end));
  636. };
  637. /**
  638. * 存储localStorage
  639. * @param {string} sName
  640. * @param {string} sCntent
  641. * @example setLocalStore('name', '测试');
  642. */
  643. export const setLocalStore = (sName, sCntent) => {
  644. if (!sName) return;
  645. window.top.localStorage.setItem(sName, sCntent);
  646. };
  647. /**
  648. * @summary 根据时间及格式获取时间的字符串
  649. * @param {int} iDate 时间
  650. * @param {string} sFormat 格式,默认:yyyy-MM-dd HH:mm:ss
  651. * @return {string} 格式化后的日期字符串
  652. * @example
  653. * formatDate(new Date(),'yyyy-MM-dd HH:mm:ss SSS');// 2017-6-6 11:11:11
  654. */
  655. export const formatDate = (iDate, sFormat = 'yyyy-MM-dd HH:mm:ss') => {
  656. if (!iDate) { return ''; }
  657. let dDate = new Date(iDate);
  658. let year = dDate.getFullYear();// 年
  659. let month = dDate.getMonth() + 1;// 月
  660. if (month < 10) { month = '0' + month; }
  661. let date = dDate.getDate();// 日
  662. if (date < 10) { date = '0' + date; }
  663. let hour = dDate.getHours();// 时
  664. if (hour < 10) { hour = '0' + hour; }
  665. let minute = dDate.getMinutes();// 分
  666. if (minute < 10) { minute = '0' + minute; }
  667. let second = dDate.getSeconds();// 秒
  668. if (second < 10) { second = '0' + second; }
  669. let millisecond = dDate.getMilliseconds();// 毫秒
  670. if (sFormat.indexOf('yyyy') >= 0) { sFormat = sFormat.replace('yyyy', year + ''); }
  671. if (sFormat.indexOf('MM') >= 0) { sFormat = sFormat.replace('MM', month + ''); }
  672. if (sFormat.indexOf('dd') >= 0) { sFormat = sFormat.replace('dd', date + ''); }
  673. if (sFormat.indexOf('HH') >= 0) { sFormat = sFormat.replace('HH', hour + ''); }
  674. if (sFormat.indexOf('mm') >= 0) { sFormat = sFormat.replace('mm', minute + ''); }
  675. if (sFormat.indexOf('ss') >= 0) { sFormat = sFormat.replace('ss', second + ''); }
  676. if (sFormat.indexOf('SSS') >= 0) { sFormat = sFormat.replace('SSS', millisecond + ''); }
  677. return sFormat;
  678. };
  679. /**
  680. * 格式化时间
  681. * @param {String} str
  682. * @returns 格式化后的时间
  683. */
  684. export const formatDate1 = (iDate = new Date().getTime(), sFormat = 'yyyy-MM-dd HH:mm:ss') => {
  685. let dDate = new Date(iDate);
  686. let year = dDate.getFullYear();// 年
  687. let month = dDate.getMonth() + 1;// 月
  688. if (month < 10) { month = '0' + month; }
  689. let date = dDate.getDate();// 日
  690. if (date < 10) { date = '0' + date; }
  691. let hour = dDate.getHours();// 时
  692. if (hour < 10) { hour = '0' + hour; }
  693. let minute = dDate.getMinutes();// 分
  694. if (minute < 10) { minute = '0' + minute; }
  695. let second = dDate.getSeconds();// 秒
  696. if (second < 10) { second = '0' + second; }
  697. let millisecond = dDate.getMilliseconds();// 毫秒
  698. if (sFormat.indexOf('yyyy') >= 0) {
  699. sFormat = sFormat.replace('yyyy', year + '');
  700. }
  701. if (sFormat.indexOf('MM') >= 0) {
  702. sFormat = sFormat.replace('MM', month + '');
  703. }
  704. if (sFormat.indexOf('dd') >= 0) {
  705. sFormat = sFormat.replace('dd', date + '');
  706. }
  707. if (sFormat.indexOf('HH') >= 0) {
  708. sFormat = sFormat.replace('HH', hour + '');
  709. }
  710. if (sFormat.indexOf('mm') >= 0) {
  711. sFormat = sFormat.replace('mm', minute + '');
  712. }
  713. if (sFormat.indexOf('ss') >= 0) {
  714. sFormat = sFormat.replace('ss', second + '');
  715. }
  716. if (sFormat.indexOf('SSS') >= 0) {
  717. sFormat = sFormat.replace('SSS', millisecond + '');
  718. }
  719. return sFormat;
  720. };
  721. export const formatTime = (data) => {
  722. let {H, M, S} = 0;
  723. let second = parseInt(data / 1000);
  724. S = second % 60;
  725. if (second / 60 > 60) {
  726. M = parseInt(second / 60) % 60;
  727. H = parseInt(M / 60);
  728. } else {
  729. M = parseInt(second / 60);
  730. }
  731. let str = '';
  732. if (H || M) {
  733. str = H ? M + '小时' + M + '分钟' + S + '秒' : M + '分钟' + S + '秒';
  734. } else {
  735. if (S === 0) {
  736. str = '-'
  737. } else {
  738. str = S + '秒'
  739. }
  740. }
  741. return str
  742. }
  743. /**
  744. * @summary 删除数组对象的某个成员(或添加成员)
  745. * @param {array} arrayObj 数组对象
  746. * @param {object} obj 需要删除的对象
  747. * @param {string} attrName 比对的参数名(如ID)
  748. * @return {array} 新的数组对象
  749. */
  750. export const removeOrAddEleFormArrayObj = (arrayObj = [], obj, attrName) => {
  751. let iIndex = -1;
  752. for (let i = 0; i < arrayObj.length; i++) {
  753. if (arrayObj[i][attrName] && arrayObj[i][attrName] === obj[attrName]) {
  754. iIndex = i;
  755. break;
  756. }
  757. }
  758. if (iIndex >= 0) {
  759. arrayObj.splice(iIndex, 1);
  760. } else {
  761. // arrayObj.splice(0, 0, obj);
  762. arrayObj.push(obj);
  763. }
  764. return arrayObj;
  765. };
  766. /**
  767. * @summary 获取B数组中存在A数组值的自身索引
  768. * @param {array} A 已存在数组对象
  769. * @param {array} B 待比较数组对象
  770. * @param {array} str 待比较数组的id
  771. * **/
  772. export const compareArray = (A, B, str) => {
  773. let indexs = []; // 获取比较后的索引数组
  774. for (let i = 0; i < A.length; i++) {
  775. for (let j = 0; j < B.length; j++) {
  776. // console.log(A[i][str], B[j][str], A[i][str] === B[j][str]);
  777. if (A[i][str] === B[j][str]) {
  778. indexs.push(j);
  779. break;
  780. }
  781. }
  782. }
  783. return indexs
  784. };
  785. /**
  786. * @summary 内控模块使用,校验上、下限值的正确性
  787. * @param: min: 下限值
  788. * @param: max: 上限值
  789. * @param: len: 字符限制长度
  790. * @param: decimal: 小数位数
  791. * @return: Object 0:不弹出错误信息,1:只能填写正实数,最多保留四位小数!,2:数字的长度不能大于' + len + '位,3:下限值不能大于上限值
  792. * 如果只传了min没有传max,则为单个数字的校验
  793. * */
  794. export const validOrder = (len, min, max, decimal) => {
  795. let obj = {
  796. state: '',
  797. msg: ''
  798. };
  799. let reg = /^(0|[1-9][0-9]*)(\.[0-9]{1,4})?$/;
  800. if (decimal) {
  801. let str = '^(0|[1-9][0-9]*)(\\.[0-9]{1,' + decimal + '})?$';
  802. reg = new RegExp(str);
  803. }
  804. if (len && min) {
  805. if (reg.test(min)) {
  806. // 判断数字的长度
  807. if (min.length > len) {
  808. obj.state = '2';
  809. obj.msg = '数字的长度不能大于' + len + '位';
  810. return obj;
  811. } else {
  812. if (max) {
  813. if (reg.test(max)) {
  814. // 上下限都有值,则比较大小
  815. if (max.length <= len) {
  816. // 长度符合要求,比较大小
  817. if (parseFloat(min) > parseFloat(max)) {
  818. // 下限值大于上限值,报错
  819. obj.state = '3';
  820. obj.msg = '下限值不能大于上限值';
  821. return obj;
  822. } else {
  823. // 两个数字都校验通过
  824. obj.state = '0';
  825. obj.msg = '';
  826. return obj;
  827. }
  828. } else {
  829. obj.state = '2';
  830. obj.msg = '数字的长度不能大于' + len + '位';
  831. return obj;
  832. }
  833. } else {
  834. obj.state = '1';
  835. obj.msg = '只能填写正实数,最多保留四位小数!';
  836. return obj;
  837. }
  838. } else {
  839. // 没有传第二个数字,则为单个数字的校验,这个时候已经证明参数min是一个正实数且长度不大于len,校验通过
  840. obj.state = '0';
  841. obj.msg = '';
  842. return obj;
  843. }
  844. }
  845. } else {
  846. obj.state = '1';
  847. obj.msg = '只能填写正实数,最多保留四位小数!';
  848. return obj;
  849. }
  850. }
  851. };
  852. export const isStartEndDate = (startDate, endDate) => {
  853. let start = new Date(startDate);
  854. let end = new Date(endDate);
  855. if (start > end) {
  856. return true;
  857. }
  858. return false;
  859. };
  860. /*
  861. *解析cookie值
  862. */
  863. export const getUserName = function (str) {
  864. let arr = str.split(';');
  865. let arr1 = [];
  866. let obj = {};
  867. for (let item of arr) {
  868. arr1 = item.split('=');
  869. obj[arr1[0].trim()] = arr1[1].trim();
  870. }
  871. return obj;
  872. };
  873. /**
  874. * @summary 比较一个对象前后的属性值是否相同
  875. * @param: before: 未改变的对象(备份)
  876. * @param: after: 可能改变了的对象
  877. * @return: Boolean true: 相同(未改变),false: 对象的属性值已经改变了
  878. * */
  879. export const compareObj = (before, after) => {
  880. let flag = true;
  881. // 首先获取对象的所有属性
  882. let propList = Object.keys(before);
  883. for (let item of propList) {
  884. if (before[item] !== after[item]) {
  885. flag = false;
  886. break;
  887. }
  888. }
  889. return flag;
  890. };
  891. /*
  892. * 千分表达式转换
  893. * num 要格式化的数字 n 保留小数位
  894. */
  895. export const formatNum = function (num, n) {
  896. if (!n) {
  897. n = 2;
  898. }
  899. if (num === null || num === 'null' || num === undefined || num === 'undefined') { return ''; }
  900. if (isNaN(num)) { return num; }
  901. let data = (num + '').split('.');
  902. num = data[0];
  903. if (n) {
  904. num = Number(num);
  905. num.toFixed(n);
  906. }
  907. num = String(num);
  908. var re = /(-?\d+)(\d{3})/;
  909. while (re.test(num)) {
  910. num = num.replace(re, '$1,$2');
  911. console.log('num: ', num);
  912. }
  913. if (data[1] !== '' && data[1] !== null && data[1] !== undefined) {
  914. num = num + '.' + data[1];
  915. }
  916. return num;
  917. };
  918. // 正整数校验 max:最大值 min: 最小值
  919. export const checkPositiveInteger = (rule, value, callback) => {
  920. if (value) {
  921. console.log(rule)
  922. let st = /^[1-9][0-9]*$/;
  923. if (!st.test(value)) {
  924. return callback(new Error('请输入正整数'));
  925. }
  926. if (rule.max && value > rule.max) {
  927. return callback(new Error('最大值' + rule.max));
  928. }
  929. if (rule.min && value < rule.min) {
  930. return callback(new Error('最小值' + rule.min));
  931. }
  932. }
  933. callback();
  934. };
  935. export const checkObjectNo = (rule, value, callback) => {
  936. let str = /^([A-Z][0-9]{2})-([0-9a-zA-Z]{5})\.([1-9][0-9]{0,5})\.([1-9][0-9]{0,2})$/;
  937. if (!str.test(value)) {
  938. callback(new Error('块序号格式错误'));
  939. }
  940. callback();
  941. };
  942. // ip地址校验
  943. export const checkIpAddress = (rule, value, callback) => {
  944. let reg = /^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$/;
  945. if (!reg.test(value) && value) {
  946. callback(new Error('IP地址格式错误'))
  947. }
  948. callback()
  949. }
  950. // 端口校验
  951. export const checkProt = (rule, value, callback) => {
  952. let reg = /^([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{4}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
  953. if ((!reg.test(value) && value) || value === 0) {
  954. callback(new Error('端口号格式错误'));
  955. }
  956. callback()
  957. }