validator.js 31 KB

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