1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- package org.jeecg.modules.system.service.impl;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import org.apache.commons.lang.StringUtils;
- import org.jeecg.modules.system.entity.SysCheckRule;
- import org.jeecg.modules.system.mapper.SysCheckRuleMapper;
- import org.jeecg.modules.system.service.ISysCheckRuleService;
- import org.springframework.stereotype.Service;
- import java.util.regex.Pattern;
- /**
- * @Description: 编码校验规则
- * @Author: jeecg-boot
- * @Date: 2020-02-04
- * @Version: V1.0
- */
- @Service
- public class SysCheckRuleServiceImpl extends ServiceImpl<SysCheckRuleMapper, SysCheckRule> implements ISysCheckRuleService {
- /**
- * 位数特殊符号,用于检查整个值,而不是裁剪某一段
- */
- private final String CHECK_ALL_SYMBOL = "*";
- @Override
- public SysCheckRule getByCode(String ruleCode) {
- LambdaQueryWrapper<SysCheckRule> queryWrapper = new LambdaQueryWrapper<>();
- queryWrapper.eq(SysCheckRule::getRuleCode, ruleCode);
- return super.getOne(queryWrapper);
- }
- /**
- * 通过用户设定的自定义校验规则校验传入的值
- *
- * @param checkRule
- * @param value
- * @return 返回 null代表通过校验,否则就是返回的错误提示文本
- */
- @Override
- public JSONObject checkValue(SysCheckRule checkRule, String value) {
- if (checkRule != null && StringUtils.isNotBlank(value)) {
- String ruleJson = checkRule.getRuleJson();
- if (StringUtils.isNotBlank(ruleJson)) {
- // 开始截取的下标,根据规则的顺序递增,但是 * 号不计入递增范围
- int beginIndex = 0;
- JSONArray rules = JSON.parseArray(ruleJson);
- for (int i = 0; i < rules.size(); i++) {
- JSONObject result = new JSONObject();
- JSONObject rule = rules.getJSONObject(i);
- // 位数
- String digits = rule.getString("digits");
- result.put("digits", digits);
- // 验证规则
- String pattern = rule.getString("pattern");
- result.put("pattern", pattern);
- // 未通过时的提示文本
- String message = rule.getString("message");
- result.put("message", message);
- // 根据用户设定的区间,截取字符串进行验证
- String checkValue;
- // 是否检查整个值而不截取
- if (CHECK_ALL_SYMBOL.equals(digits)) {
- checkValue = value;
- } else {
- int num = Integer.parseInt(digits);
- int endIndex = beginIndex + num;
- // 如果结束下标大于给定的值的长度,则取到最后一位
- endIndex = endIndex > value.length() ? value.length() : endIndex;
- // 如果开始下标大于结束下标,则说明用户还尚未输入到该位置,直接赋空值
- if (beginIndex > endIndex) {
- checkValue = "";
- } else {
- checkValue = value.substring(beginIndex, endIndex);
- }
- result.put("beginIndex", beginIndex);
- result.put("endIndex", endIndex);
- beginIndex += num;
- }
- result.put("checkValue", checkValue);
- boolean passed = Pattern.matches(pattern, checkValue);
- result.put("passed", passed);
- // 如果没有通过校验就返回错误信息
- if (!passed) {
- return result;
- }
- }
- }
- }
- return null;
- }
- }
|