页面多查询条件必选的统一处理思路

背景

开发中我们可能会遇到会页面对应的数据表量级较大、页面查询条件过多的情况,那么有时候我们可能会限制做查询操作是必须选择至少一个查询条件。

页面效果:

页面多查询条件必选的统一处理思路

直接查询会提示:

页面多查询条件必选的统一处理思路

正文

思路:

我们考虑使用注解+切面的形式来实现,用来确定哪些方法、哪些参数是需要做筛选和判断的。

注解类:用来标识某个参数和某个类的切入点

/**
 * 用来标识某个参数和某个类的切入点
 * @author zhouli
 * @Classname ConditionLimitAspect
 * @Date 2022/4/6 19:39
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD})
public @interface ConditionLimit {
    /**
     * 限制条件最少个数
     *
     * @return
     */
    int conditionNumberLimit() default 1;
}

/**
 * 用来标识哪些字段用来统计查询列
 * @author zhouli
 * @Classname ConditionLimitAspect
 * @Date 2022/4/6 19:39
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ConditionField {
}

切面类:

@Slf4j
@Aspect
@Component
public class ConditionLimitAspect {
    @Around("execution(* com.p4.tp.system.modules.*.rest.*.*(..,@com.p4.tp.system.config.aop.ConditionLimit (*),..))")
    public Object doCheckCondition(ProceedingJoinPoint point) throws Throwable {
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        Parameter[] parameters = method.getParameters();
        for (int i = 0; i < parameters.length; i++) {
            //多个参数时循环
            ConditionLimit annotation = parameters[i].getAnnotation(ConditionLimit.class);
            if (annotation == null) {
                continue;
            }
            //设定的最小查询列数量
            int numberLimit = annotation.conditionNumberLimit();
            Object[] args = point.getArgs();
            Class aClass =args[i].getClass();
            Field[] declaredFields = aClass.getDeclaredFields();
            //查询条件计数
            int realNum = 0;
            for (Field field : declaredFields) {
                //获取带ConditionField注解的字段
                ConditionField conditionField = field.getAnnotation(ConditionField.class);
                if (conditionField == null) {
                    continue;
                }
                field.setAccessible(true);
                //获取列值
                Object value = field.get(args[i]);
                if (value == null) {
                    continue;
                }
                try {
                    //列举三种情况
                    if (value instanceof String && StringUtils.isNotBlank((String) value)) {
                        realNum++;
                    } else if (value instanceof Collection && !CollectionUtils.isEmpty((Collection) value)) {
                            realNum++;
                    } else if (value instanceof Date) {
                            realNum++;
                    }
                } catch (Exception e) {
                    log.error("条件限定异常,", e);
                }
            }
            if (realNum < numberLimit) {
                log.info("查询条件不足,请至少选择或输入" + numberLimit + "个查询条件");
                throw new BusinessException("查询条件不足,请至少选择或输入" + numberLimit + "个查询条件");
            }
        }
        return point.proceed();
    }
}

使用

创建实体

@Data
public class FlowCardInfoParam {

    @ConditionField
    private String iccId;

    @ConditionField
    private String termSn;

    @ConditionField
    private String imei;
}

方法使用

    @PostMapping("/getPage")
    public ResponseEntity getPage(@RequestBody @ConditionLimit FlowCardInfoParam param) {
        return new ResponseEntity<>(null, HttpStatus.OK);
    }

现在我们使用接口请求

第一次不填写参数值: {} ,查看日志结果:

页面多查询条件必选的统一处理思路

第二次填写 iccId 值重新请求: {"iccid":"898604B11921D0192003"},我们就能看到直接放过进行正常的业务调用了。

尾言

以上便是实现多查询条件中必选至少一种字段值的一种思路,正常情况下我们没有必要也没有办法枚举出所有页面中出现的所有必要的查询条件,那么就可以考虑做找一个前置的统一处理方法。利用切面在进入方法前就进行判断,该次请求是否符合接口最低的要求。

Original: https://www.cnblogs.com/dearsusu/p/16873756.html
Author: 青衫染红尘
Title: 页面多查询条件必选的统一处理思路

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/715263/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Win10注册表无法保存对权限所作的更改拒绝访问

    确定后,这样就可以对上项目的权限进行修改了。应用后,再确定,即可。 14:38 18-07-24 周二 Original: https://www.cnblogs.com/zjoc…

    技术杂谈 2023年5月31日
    0120
  • 二十一、XML

    二十一、XML 21.1 XML介绍 21.1.1 一个问题引入 XML 思考:前面的反射可以加载配置文件里的信息,获取类的字节码对象从而动态创建对象和调用方法,但是如果需要创建多…

    技术杂谈 2023年7月11日
    077
  • Dell raid 硬盘格式重装系统

    这种情况大概率都是出现在dell笔记本上,因为dell 原厂默认使用的硬盘格式是raid on 硬盘模式,并非我们常用的AHCI硬盘模式。raid on 硬盘模式下,绝大部分PE也…

    技术杂谈 2023年6月21日
    0142
  • 你被离职员工投诉过吗?

    同学你好,很高兴你对团队表达的问题,面对你所提问题我觉得还是有必要作下回答。 首先我个人认为你所描述 确实是开发部 某个期间 的状态,公司其他部门或多或少都有这些现象。 但我当然不…

    技术杂谈 2023年6月1日
    086
  • 微服务组件—–SpringCloudAlibaba注册中心Nacos源码(1.4.x版本)分析

    核心功能点 【1】 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos …

    技术杂谈 2023年7月23日
    095
  • SETTLE约束算法中的坐标变换问题

    技术背景 在之前的两篇文章中,我们分别讲解了SETTLE算法的原理和基本实现和SETTLE约束算法的批量化处理。SETTLE约束算法在水分子体系中经常被用到,该约束算法具有速度快、…

    技术杂谈 2023年7月25日
    069
  • srilm的安装与使用(标贝科技)

    一、简介 简单且概括的来说,SRILM是一个构建和应用统计语言模型的开源工具包,主要用于语音识别,统计标注和切分,以及机器翻译,可运行在UNIX及Windows平台上。(具体概念都…

    技术杂谈 2023年7月25日
    066
  • SHELL编程-牛客网题目(持续更新..)

    SHELL编程题目及solution (牛客网) 描述:写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数示例:假设 nowcoder.txt 内容如下: #…

    技术杂谈 2023年7月24日
    062
  • Creating Apps With Material Design —— Creating Lists and Cards

    转载请注明http://blog.csdn.net/eclipsexys翻译自Developer Android。时间仓促,有翻译问题请留言指出,谢谢 创建Lisst和Cards …

    技术杂谈 2023年5月30日
    094
  • JSON.parse()和JSON.stringify()

    parse用于从一个字符串中解析出json对象,如 var str = ‘{“name”:”huangxiaojian”…

    技术杂谈 2023年5月30日
    069
  • Docker安装Nginx

    #1、搜索Nginx docker search nginx #2、拉取nginx镜像 docker pull nginx #3、查看nginx是否下载成功 docker imag…

    技术杂谈 2023年7月24日
    064
  • 京东联盟开发(11)——商品类目(2级)

    本文介绍如果获取京东联盟的商品类目。 由于3级类目太长,本文只展示2级。 $result0 = $jdunion->api_category_goods_get($grade…

    技术杂谈 2023年5月31日
    082
  • MySQL备份与恢复

    MySQL备份与恢复 备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低。 数据丢失的场景举例: 人…

    技术杂谈 2023年6月21日
    085
  • NTT 快速数论变换

    NTT 先学习FFT由于FFT是使用复数运算,精度并不好,而且也无法取模,所以有了NTT(快速数论变换)。 建议先完全理解FFT后再学习NTT。 原根 NTT使用与单位根性质相似的…

    技术杂谈 2023年6月21日
    099
  • javaweb学习

    ; ; 了解HTTP posted @2022-03-24 21:19 HelloHui 阅读(8 ) 评论() 编辑 Original: https://www.cnblogs….

    技术杂谈 2023年6月21日
    096
  • IDEA中单元测试

    创建存放测试文件的目录 需要在project下新建一个文件夹,用于存放自动生成的测试.java文件,比如 Factorial.java类对应的 FactorialTest.java…

    技术杂谈 2023年5月31日
    0105
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球