頁面多查詢條件必選的統(tǒng)一處理思路

背景

開發(fā)中我們可能會(huì)遇到會(huì)頁面對(duì)應(yīng)的數(shù)據(jù)表量級(jí)較大澡罚、頁面查詢條件過多的情況顶瞒,那么有時(shí)候我們可能會(huì)限制做查詢操作是必須選擇至少一個(gè)查詢條件跷叉。

頁面效果:

直接查詢會(huì)提示:

正文

思路

我們考慮使用注解+切面的形式來實(shí)現(xiàn)左敌,用來確定哪些方法瘾蛋、哪些參數(shù)是需要做篩選和判斷的俐镐。

注解類:用來標(biāo)識(shí)某個(gè)參數(shù)和某個(gè)類的切入點(diǎn)

/**
 * 用來標(biāo)識(shí)某個(gè)參數(shù)和某個(gè)類的切入點(diǎn)
 * @author zhouli
 * @Classname ConditionLimitAspect
 * @Date 2022/4/6 19:39
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD})
public @interface ConditionLimit {
    /**
     * 限制條件最少個(gè)數(shù)
     *
     * @return
     */
    int conditionNumberLimit() default 1;
}

/**
 * 用來標(biāo)識(shí)哪些字段用來統(tǒng)計(jì)查詢列
 * @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++) {
            //多個(gè)參數(shù)時(shí)循環(huán)
            ConditionLimit annotation = parameters[i].getAnnotation(ConditionLimit.class);
            if (annotation == null) {
                continue;
            }
            //設(shè)定的最小查詢列數(shù)量
            int numberLimit = annotation.conditionNumberLimit();
            Object[] args = point.getArgs();
            Class<?> aClass =args[i].getClass();
            Field[] declaredFields = aClass.getDeclaredFields();
            //查詢條件計(jì)數(shù)
            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("查詢條件不足,請(qǐng)至少選擇或輸入" + numberLimit + "個(gè)查詢條件");
                throw new BusinessException("查詢條件不足佩抹,請(qǐng)至少選擇或輸入" + numberLimit + "個(gè)查詢條件");
            }
        }
        return point.proceed();
    }
}

使用

創(chuàng)建實(shí)體

@Data
public class FlowCardInfoParam {

    @ConditionField
    private String iccId;

    @ConditionField
    private String termSn;

    @ConditionField
    private String imei;
}

方法使用

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

現(xiàn)在我們使用接口請(qǐng)求

第一次不填寫參數(shù)值:{} ,查看日志結(jié)果:

第二次填寫 iccId 值重新請(qǐng)求: {"iccId":"898604B11921D0192003"}叼风,我們就能看到直接放過進(jìn)行正常的業(yè)務(wù)調(diào)用了。

尾言

以上便是實(shí)現(xiàn)多查詢條件中必選至少一種字段值的一種思路棍苹,正常情況下我們沒有必要也沒有辦法枚舉出所有頁面中出現(xiàn)的所有必要的查詢條件无宿,那么就可以考慮做找一個(gè)前置的統(tǒng)一處理方法。利用切面在進(jìn)入方法前就進(jìn)行判斷枢里,該次請(qǐng)求是否符合接口最低的要求孽鸡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市栏豺,隨后出現(xiàn)的幾起案子彬碱,更是在濱河造成了極大的恐慌,老刑警劉巖奥洼,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巷疼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡灵奖,警方通過查閱死者的電腦和手機(jī)嚼沿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓷患,“玉大人骡尽,你說我怎么就攤上這事∩帽啵” “怎么了攀细?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沙咏。 經(jīng)常有香客問我辨图,道長(zhǎng),這世上最難降的妖魔是什么肢藐? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任故河,我火速辦了婚禮,結(jié)果婚禮上吆豹,老公的妹妹穿的比我還像新娘鱼的。我一直安慰自己理盆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布凑阶。 她就那樣靜靜地躺著猿规,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宙橱。 梳的紋絲不亂的頭發(fā)上姨俩,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音师郑,去河邊找鬼环葵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宝冕,可吹牛的內(nèi)容都是我干的张遭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼地梨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼菊卷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宝剖,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤洁闰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诈闺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渴庆,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年雅镊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了襟雷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仁烹,死狀恐怖耸弄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卓缰,我是刑警寧澤计呈,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站征唬,受9級(jí)特大地震影響捌显,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜总寒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一扶歪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摄闸,春花似錦善镰、人聲如沸妹萨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乎完。三九已至,卻和暖如春品洛,著一層夾襖步出監(jiān)牢的瞬間树姨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工毫别, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娃弓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓岛宦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耍缴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砾肺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容