6e79555384bdbbfe173749200dba83a0e2923f42.svn-base 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package org.jeecg.modules.system.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import org.apache.commons.lang.StringUtils;
  8. import org.jeecg.modules.system.entity.SysCheckRule;
  9. import org.jeecg.modules.system.mapper.SysCheckRuleMapper;
  10. import org.jeecg.modules.system.service.ISysCheckRuleService;
  11. import org.springframework.stereotype.Service;
  12. import java.util.regex.Pattern;
  13. /**
  14. * @Description: 编码校验规则
  15. * @Author: jeecg-boot
  16. * @Date: 2020-02-04
  17. * @Version: V1.0
  18. */
  19. @Service
  20. public class SysCheckRuleServiceImpl extends ServiceImpl<SysCheckRuleMapper, SysCheckRule> implements ISysCheckRuleService {
  21. /**
  22. * 位数特殊符号,用于检查整个值,而不是裁剪某一段
  23. */
  24. private final String CHECK_ALL_SYMBOL = "*";
  25. @Override
  26. public SysCheckRule getByCode(String ruleCode) {
  27. LambdaQueryWrapper<SysCheckRule> queryWrapper = new LambdaQueryWrapper<>();
  28. queryWrapper.eq(SysCheckRule::getRuleCode, ruleCode);
  29. return super.getOne(queryWrapper);
  30. }
  31. /**
  32. * 通过用户设定的自定义校验规则校验传入的值
  33. *
  34. * @param checkRule
  35. * @param value
  36. * @return 返回 null代表通过校验,否则就是返回的错误提示文本
  37. */
  38. @Override
  39. public JSONObject checkValue(SysCheckRule checkRule, String value) {
  40. if (checkRule != null && StringUtils.isNotBlank(value)) {
  41. String ruleJson = checkRule.getRuleJson();
  42. if (StringUtils.isNotBlank(ruleJson)) {
  43. // 开始截取的下标,根据规则的顺序递增,但是 * 号不计入递增范围
  44. int beginIndex = 0;
  45. JSONArray rules = JSON.parseArray(ruleJson);
  46. for (int i = 0; i < rules.size(); i++) {
  47. JSONObject result = new JSONObject();
  48. JSONObject rule = rules.getJSONObject(i);
  49. // 位数
  50. String digits = rule.getString("digits");
  51. result.put("digits", digits);
  52. // 验证规则
  53. String pattern = rule.getString("pattern");
  54. result.put("pattern", pattern);
  55. // 未通过时的提示文本
  56. String message = rule.getString("message");
  57. result.put("message", message);
  58. // 根据用户设定的区间,截取字符串进行验证
  59. String checkValue;
  60. // 是否检查整个值而不截取
  61. if (CHECK_ALL_SYMBOL.equals(digits)) {
  62. checkValue = value;
  63. } else {
  64. int num = Integer.parseInt(digits);
  65. int endIndex = beginIndex + num;
  66. // 如果结束下标大于给定的值的长度,则取到最后一位
  67. endIndex = endIndex > value.length() ? value.length() : endIndex;
  68. // 如果开始下标大于结束下标,则说明用户还尚未输入到该位置,直接赋空值
  69. if (beginIndex > endIndex) {
  70. checkValue = "";
  71. } else {
  72. checkValue = value.substring(beginIndex, endIndex);
  73. }
  74. result.put("beginIndex", beginIndex);
  75. result.put("endIndex", endIndex);
  76. beginIndex += num;
  77. }
  78. result.put("checkValue", checkValue);
  79. boolean passed = Pattern.matches(pattern, checkValue);
  80. result.put("passed", passed);
  81. // 如果没有通过校验就返回错误信息
  82. if (!passed) {
  83. return result;
  84. }
  85. }
  86. }
  87. }
  88. return null;
  89. }
  90. }