您好,欢迎来到爱够旅游网。
搜索
您的当前位置:首页Vue动态查询条件-Vue动态查询规则-Vue多条件分组组合查询-递归组件(二):后端

Vue动态查询条件-Vue动态查询规则-Vue多条件分组组合查询-递归组件(二):后端

来源:爱够旅游网

接着给大家奉献后端的处理哈

前端效果:

补一个线上的真实场景:

第一讲里面可以获取到查询的数据集 conditionList,另外还需要传 tableName 给后端

前端需要通过ajax请求后端,那么参数就是 conditionList和tableName,至于vue怎么想后端发起请求,这里就不讲了

这一讲主要讲怎么写一个后端,来处理前端的这个请求:

一、controller

这个controller提供一个通用的接口给前端:   

        url为:        xxxxxx/queryList

        method:        POST

        参数形式:        requestBody(json)

    @RequestMapping(value = "/queryList", method = RequestMethod.POST)
    @ResponseBody
    public List queryList(@RequestBody ExecutionParams executionParams) {
        List<ExecutionParams.ConditionItem> conditionQuery = executionParams.getConditionQuery();
        String sqlPattern = parseWhereSql(conditionQuery);
        String orderBy = "id desc";
        String sql = "select * from " + executionParams.getTableName();
        if (!StringUtils.isEmpty(sqlPattern)) {
            sql += " where " + sqlPattern;
        }
        try {
            List<LinkedHashMap<String, Object>> linkedHashMaps = executeSqlDao.queryBySql(sql);
            return linkedHashMaps;
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

其中比较重要也稍微有点难的就是parseWhereSql的实现了,很多小伙伴私信我,也是问后端怎么实现,怎么将前端传过来的tableName和conditionList,解析成sql语句

        parseWhereSql方法:

    public String parseWhereSql(List<ExecutionParams.ConditionItem> conditionQuery) {
        StringBuffer sb = new StringBuffer();
        parseCondition(sb, conditionQuery);
        return sb.toString().trim().replaceAll("  ", " ");
    }

    public void parseCondition(StringBuffer sb, List<ExecutionParams.ConditionItem> conditionQuery) {
        if (null == conditionQuery || conditionQuery.size() == 0) {
            return;
        }
        for (int i = 0; i < conditionQuery.size(); i++) {
            ExecutionParams.ConditionItem conditionItem = conditionQuery.get(i);
            List<ExecutionParams.ConditionItem> groups = conditionItem.getGroups();
            if (null != groups) {
                if (sb.indexOf("#X#") == -1) {
                    sb.append(" #X# (");
                } else {
                    sb.append(" (");
                }
                parseCondition(sb, groups);
                sb.append(") ");
            } else {
                String condition = "";
                Object val = conditionItem.getValue();
                if (conditionItem.getValue().matches("[0-9]+")) {
                    val = Long.parseLong(conditionItem.getValue());
                } else {
                    if (conditionItem.getCondition().indexOf("like") == -1) {
                        val = "'" + val + "'";
                    }
                }
                if ("gt".equals(conditionItem.getCondition())) {
                    condition = ">";
                } else if ("eq".equals(conditionItem.getCondition())) {
                    condition = "=";
                } else if ("lt".equals(conditionItem.getCondition())) {
                    condition = "<";
                } else if ("gtq".equals(conditionItem.getCondition())) {
                    condition = ">=";
                } else if ("ltq".equals(conditionItem.getCondition())) {
                    condition = "<=";
                } else if ("like".equals(conditionItem.getCondition())) {
                    condition = "like";
                    val = "'%" + val + "%'";
                } else if ("not like".equals(conditionItem.getCondition())) {
                    condition = "not like";
                    val = "'%" + val + "%'";
                } else {
                    throw new RuntimeException("解析sql出错,条件超出范围");
                }

                if (i == 0) {
                    int n = sb.lastIndexOf("#X#");
                    if (n == 1) {
                        sb.replace(n, n + 3, "");
                    } else if (n != -1) {
                        sb.replace(n, n + 3, conditionItem.getOperate());
                    }
                    sb.append(" " + conditionItem.getField() + " ").append(condition + " ").append(val).append(" ");
                } else {
                    sb.append(" " + conditionItem.getOperate() + " ").append(conditionItem.getField() + " ").append(condition + " ").append(val).append(" ");
                }
            }
        }
    }

二、参数 ExecutionParams:

@Data
public class ExecutionParams {

    String tableName;

    List<ConditionItem> conditionQuery;

    @Data
    public static class ConditionItem {
        List<ConditionItem> groups;
        String condition;
        String field;
        String operate;
        String value;
    }

}

讲到这里,基本上后端就做好了,controller的queryList方法接收了conditionList和tableName参数之后,返回了查询结果list给前端了,前端只需要将list展示出来就可以了。

这个后端是通用的哦,

前端只需要 在不同的页面,访问同一个后端的时候,tableName 给对应的表名就可以了。

这样就可以实现后端通用,只需要做不同的前端页面处理就行了

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务