Просмотр исходного кода

新增自定义导出接口,仅查数据,融合值sql注入查询接口中

wy 4 месяцев назад
Родитель
Сommit
9566fab901

+ 21 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/sysdata/QueryDTO.java

@@ -1,6 +1,7 @@
 package com.lc.ibps.sysdata;
 
 import java.util.List;
+import java.util.Map;
 
 public class QueryDTO {
 
@@ -8,6 +9,10 @@ public class QueryDTO {
 
     private List<String> params;
 
+    private String type;
+
+    private List<Map<String,Object>> paramMap;
+
     public String getKey() {
         return key;
     }
@@ -23,4 +28,20 @@ public class QueryDTO {
     public void setParams(List<String> params) {
         this.params = params;
     }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public List<Map<String, Object>> getParamMap() {
+        return paramMap;
+    }
+
+    public void setParamMap(List<Map<String, Object>> paramMap) {
+        this.paramMap = paramMap;
+    }
 }

+ 12 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/sysdata/controller/UpdateDataTableController.java

@@ -64,6 +64,18 @@ public class UpdateDataTableController extends GenericProvider {
         return result;
     }
 
+    @ApiOperation("根据key和参数及type查询")
+    @PostMapping("/export")
+    APIResult export(@RequestBody QueryDTO queryDTO) {
+        APIResult result = new APIResult<>();
+        try {
+            result = updateDataTableService.export(queryDTO);
+        } catch (Exception e) {
+            setExceptionResult(result, StateEnum.ILLEGAL_REQUEST.getCode(), I18nUtil.getMessage(StateEnum.ILLEGAL_REQUEST.getCode() + ""), e);
+        }
+        return result;
+    }
+
     @ApiOperation("直接运行查询sql")
     @ApiImplicitParams({@ApiImplicitParam("传入加密的sql字符串")})
     @PostMapping("/general")

+ 2 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/sysdata/services/UpdateDataTableService.java

@@ -86,4 +86,6 @@ public interface UpdateDataTableService {
 
     APIResult queryData(QueryDTO queryDTO) throws Exception;
 
+    APIResult export(QueryDTO queryDTO) throws Exception;
+
 }

+ 79 - 2
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/sysdata/services/impl/UpdateDataTableImpl.java

@@ -78,8 +78,55 @@ public class UpdateDataTableImpl extends GenericProvider implements UpdateDataTa
         Map<String, Object> map = commonDao.queryOne(sql);
         List<Map<String, Object>> list = new ArrayList<>();
         if (BeanUtils.isNotEmpty(map) && BeanUtils.isNotEmpty(map.get("sql_"))) {
-            Object[] params = queryDTO.getParams().toArray();
-            list = (List<Map<String, Object>>) commonDao.query( map.get("sql_").toString(), params);
+            if(BeanUtils.isNotEmpty(queryDTO.getType()) && "export".equals(queryDTO.getType())){
+                String build = build(queryDTO.getParamMap());
+                list = (List<Map<String, Object>>) commonDao.query( map.get("sql_").toString() + build );
+            }else{
+                Object[] params = queryDTO.getParams().toArray();
+                list = (List<Map<String, Object>>) commonDao.query( map.get("sql_").toString(), params);
+            }
+        }
+        Map<String, Object> datas = new HashMap<>();
+        datas.put("data", list);
+        result.setVariables(datas);
+        return result;
+        //旧版先放着,有问题再回滚
+//        APIResult result = new APIResult();
+//        if (BeanUtils.isEmpty(queryDTO) || BeanUtils.isEmpty(queryDTO.getKey())) {
+//            throw new Exception("参数key不能为空!");
+//        }
+//        String sql = "select sql_ from t_sqlconfig where key_='%s'";
+//        sql = String.format(sql, queryDTO.getKey());
+//        Map<String, Object> map = commonDao.queryOne(sql);
+//        List<Map<String, Object>> list = new ArrayList<>();
+//        if (BeanUtils.isNotEmpty(map) && BeanUtils.isNotEmpty(map.get("sql_"))) {
+//            Object[] params = queryDTO.getParams().toArray();
+//            list = (List<Map<String, Object>>) commonDao.query( map.get("sql_").toString(), params);
+//        }
+//        Map<String, Object> datas = new HashMap<>();
+//        datas.put("data", list);
+//        result.setVariables(datas);
+//        return result;
+    }
+
+    @Override
+    public APIResult export(QueryDTO queryDTO) throws Exception {
+        APIResult result = new APIResult();
+        if (BeanUtils.isEmpty(queryDTO) || BeanUtils.isEmpty(queryDTO.getKey())) {
+            throw new Exception("参数key不能为空!");
+        }
+        String sql = "select sql_ from t_sqlconfig where key_='%s'";
+        sql = String.format(sql, queryDTO.getKey());
+        Map<String, Object> map = commonDao.queryOne(sql);
+        List<Map<String, Object>> list = new ArrayList<>();
+        if (BeanUtils.isNotEmpty(map) && BeanUtils.isNotEmpty(map.get("sql_"))) {
+            if(BeanUtils.isNotEmpty(queryDTO.getType()) && "export".equals(queryDTO.getType())){
+                String build = build(queryDTO.getParamMap());
+                list = (List<Map<String, Object>>) commonDao.query( map.get("sql_").toString() + build );
+            }else{
+                Object[] params = queryDTO.getParams().toArray();
+                list = (List<Map<String, Object>>) commonDao.query( map.get("sql_").toString(), params);
+            }
         }
         Map<String, Object> datas = new HashMap<>();
         datas.put("data", list);
@@ -87,6 +134,36 @@ public class UpdateDataTableImpl extends GenericProvider implements UpdateDataTa
         return result;
     }
 
+    public String build(List<Map<String,Object>> map){
+        if(BeanUtils.isEmpty(map)){
+            return "";
+        }
+        List<String> conditions = new ArrayList<>();
+            for (Map<String,Object> item : map) {
+                String key = item.keySet().iterator().next();
+                Object value = item.get(key);
+
+                if("between".equals(key) && value instanceof Map){
+                    Map<String, Object> values = (Map<String, Object>) value;
+                    String fieldName = values.keySet().iterator().next();
+                    List<String> list = (ArrayList) values.get(fieldName);
+
+                    conditions.add(fieldName + " between '" + list.get(0) + "' and '" + list.get(1) + "'");
+                }
+                else if("find_in_set".equals(key) && value instanceof Map){
+                    Map<String, Object> values = (Map<String, Object>) value;
+                    String fieldName = values.keySet().iterator().next();
+                    Object fieldValue = values.get(fieldName);
+                    conditions.add("find_in_set(" + fieldName + ", '" + fieldValue + "') > 0");
+                }
+                else {
+                    // 普通字段
+                    conditions.add(key + " like '%" + value.toString() + "%'");
+                }
+            }
+            return conditions.isEmpty() ? "" : " where " + String.join(" and ", conditions);
+    }
+
     @Override
     public APIResult<Void> upEmployee(String str){
         APIResult<Void> result = new APIResult<>();