接着给大家奉献后端的处理哈
前端效果:
补一个线上的真实场景:
第一讲里面可以获取到查询的数据集 conditionList,另外还需要传 tableName 给后端
前端需要通过ajax请求后端,那么参数就是 conditionList和tableName,至于vue怎么想后端发起请求,这里就不讲了
这一讲主要讲怎么写一个后端,来处理前端的这个请求:
这个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(" ");
}
}
}
}
@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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务