数据导出逻辑优化,统一使用一个接口,为下载其他格式做准备

This commit is contained in:
暮光:城中城
2021-08-14 23:12:51 +08:00
parent c05bc7be80
commit fa725edd90
25 changed files with 339 additions and 172 deletions

View File

@@ -11,8 +11,6 @@ import com.zyplayer.doc.data.repository.manage.entity.UserAuth;
import com.zyplayer.doc.data.repository.support.consts.DocAuthConst;
import com.zyplayer.doc.data.service.manage.DbDatasourceService;
import com.zyplayer.doc.data.service.manage.UserAuthService;
import com.zyplayer.doc.data.utils.CachePrefix;
import com.zyplayer.doc.data.utils.CacheUtil;
import com.zyplayer.doc.db.controller.vo.DatabaseExportVo;
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
import com.zyplayer.doc.db.controller.vo.TableColumnVo.TableInfoVo;
@@ -25,8 +23,8 @@ import com.zyplayer.doc.db.framework.db.dto.*;
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
import com.zyplayer.doc.db.framework.utils.PoiUtil;
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.DbBaseService;
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.database.DbBaseService;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,6 +1,5 @@
package com.zyplayer.doc.db.controller;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
@@ -12,9 +11,10 @@ import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.core.util.StringUtil;
import com.zyplayer.doc.core.util.ZyplayerDocVersion;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.support.consts.DocAuthConst;
import com.zyplayer.doc.db.controller.download.FormatDownloadConst;
import com.zyplayer.doc.db.controller.download.FormatDownloadService;
import com.zyplayer.doc.db.controller.param.DataViewParam;
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
import com.zyplayer.doc.db.framework.consts.DbAuthType;
@@ -25,9 +25,9 @@ import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteType;
import com.zyplayer.doc.db.framework.db.mapper.base.SqlExecutor;
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
import com.zyplayer.doc.db.framework.utils.JSONUtil;
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.DbBaseService;
import com.zyplayer.doc.db.service.download.BaseDownloadService;
import com.zyplayer.doc.db.service.common.ExecuteAuthService;
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.database.DbBaseService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
@@ -40,7 +40,6 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -57,20 +56,28 @@ import java.util.stream.Stream;
public class DbDataViewController {
private static Logger logger = LoggerFactory.getLogger(DbDataViewController.class);
@Resource
ExecuteAuthService executeAuthService;
@Resource
SqlExecutor sqlExecutor;
@Resource
DatabaseServiceFactory databaseServiceFactory;
@Resource
BaseDownloadService baseDownloadService;
Map<String, FormatDownloadService> formatDownloadServiceMap;
// 最大允许导出的行数设置的过大有可能会导致内存溢出默认10W条
@Value("${zyplayer.doc.db.download-max-row:100000}")
Integer downloadMaxRow;
/**
* 数据查询接口
*
* @author 暮光:城中城
* @since 2021-08-14
*/
@PostMapping(value = "/query")
public ResponseJson query(DataViewParam param) {
// 数据查询
ExecuteType executeType = this.getExecuteType(param.getSourceId());
ExecuteType executeType = executeAuthService.getExecuteType(param.getSourceId());
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
String queryPageSql = dbBaseService.getQueryPageSql(param);
ExecuteResult executeResult = this.query(param.getSourceId(), param.getExecuteId(), executeType, queryPageSql);
@@ -91,8 +98,7 @@ public class DbDataViewController {
/**
* 删除表数据
*
* @param lineJson
* @return
* @author 暮光:城中城
*/
@PostMapping(value = "/deleteTableLineData")
public ResponseJson deleteTableLineData(Long sourceId, String dbName, String tableName, String lineJson) {
@@ -103,120 +109,44 @@ public class DbDataViewController {
}
/**
* 单表数据下载
* 多表下载
*
* @param response
* @param param
* @return
* @author 暮光:城中城
*/
@PostMapping(value = "/download")
public ResponseJson download(HttpServletResponse response, DataViewParam param) {
param.setExecuteId(RandomUtil.simpleUUID());
ExecuteType executeType = this.getExecuteType(param.getSourceId());
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
if (this.getDataCount(param, executeType) > downloadMaxRow) {
return DocDbResponseJson.error(String.format("导出失败,表:%s 数据行数超过最大导出配置 %s请联系管理员修改", param.getTableName(), downloadMaxRow));
@PostMapping(value = "/downloadMultiple")
public ResponseJson downloadMultiple(HttpServletResponse response, DataViewParam param) {
if (StringUtils.isBlank(param.getTableNames())) {
return DocDbResponseJson.warn("请选择导出的表");
}
// 获取列信息等
TableColumnVo tableColumnVo = dbBaseService.getTableColumnList(param.getSourceId(), param.getDbName(), param.getTableName());
Set<String> conditionSet = StringUtils.isBlank(param.getConditionColumn()) ? Collections.emptySet() : Stream.of(param.getConditionColumn().split(",")).collect(Collectors.toSet());
Set<String> retainColumnSet = StringUtils.isBlank(param.getRetainColumn()) ? Collections.emptySet() : Stream.of(param.getRetainColumn().split(",")).collect(Collectors.toSet());
List<TableColumnDescDto> columnList = tableColumnVo.getColumnList().stream().filter(item -> retainColumnSet.isEmpty() || retainColumnSet.contains(item.getName())).collect(Collectors.toList());
// 数据查询
String queryAllSql = dbBaseService.getQueryAllSql(param);
ExecuteParam executeParam = new ExecuteParam();
executeParam.setDatasourceId(param.getSourceId());
executeParam.setExecuteId(param.getExecuteId());
executeParam.setExecuteType(executeType);
executeParam.setSql(queryAllSql);
param.setExecuteId(IdUtil.simpleUUID());
String[] tableNameArr = param.getTableNames().split(",");
try {
dbBaseService.downloadSingleTableData(response, param, executeParam, columnList, conditionSet);
// 先校验总条数是否超过限制
for (String tableName : tableNameArr) {
param.setTableName(tableName);
ExecuteType executeType = executeAuthService.getExecuteType(param.getSourceId());
if (this.getDataCount(param, executeType) > downloadMaxRow) {
return DocDbResponseJson.error(String.format("导出失败,表:%s 数据行数超过最大导出配置 %s请联系管理员修改", tableName, downloadMaxRow));
}
}
FormatDownloadService formatDownloadService = formatDownloadServiceMap.getOrDefault(param.getDownloadType(), formatDownloadServiceMap.get(FormatDownloadConst.COMMON));
formatDownloadService.download(response, param, tableNameArr);
} catch (Exception e) {
e.printStackTrace();
return DocDbResponseJson.error("导出失败:" + e.getMessage());
}
return DocDbResponseJson.ok();
}
/**
* 多表下载
* 获取数据总条数
*
* @param response
* @param param
* @return
* @author 暮光:城中城
* @since 2021-08-14
*/
@PostMapping(value = "/downloadMultiple")
public ResponseJson downloadMultiple(HttpServletResponse response, DataViewParam param) {
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
if (StringUtils.isBlank(param.getTableNames())) {
return DocDbResponseJson.warn("请选择导出的表");
}
param.setExecuteId(IdUtil.simpleUUID());
String tempDir = System.getProperty("java.io.tmpdir");
boolean multipleFile = Objects.equals(param.getDownloadFileType(), 2);
boolean isJson = Objects.equals(param.getDownloadType(), "json");
StringBuilder resultSb = new StringBuilder("/*\n" +
" zyplayer-doc 表数据导出\n" +
"\n" +
" 数据库 : " + param.getDbName() + "\n" +
" 数据库类型 : " + dbBaseService.getDatabaseProduct().name() + "\n" +
" 导出时间 : " + DateTime.now().toString() + "\n" +
" 软件版本 : " + ZyplayerDocVersion.version + "\n" +
"*/\n\n");
String[] tableNameArr = param.getTableNames().split(",");
String tempDirName = tempDir + "zyplayer-doc-" + IdUtil.fastSimpleUUID();
try {
// 先校验总条数是否超过限制
for (String tableName : tableNameArr) {
param.setTableName(tableName);
ExecuteType executeType = this.getExecuteType(param.getSourceId());
if (this.getDataCount(param, executeType) > downloadMaxRow) {
return DocDbResponseJson.error(String.format("导出失败,表:%s 数据行数超过最大导出配置 %s请联系管理员修改", tableName, downloadMaxRow));
}
}
// 创建临时文件夹
FileUtil.mkdir(tempDirName);
// 再分表查数据
String suffix = isJson ? ".json" : ".sql";
for (String tableName : tableNameArr) {
param.setTableName(tableName);
ExecuteType executeType = this.getExecuteType(param.getSourceId());
// 获取列信息等
TableColumnVo tableColumnVo = dbBaseService.getTableColumnList(param.getSourceId(), param.getDbName(), tableName);
List<TableColumnDescDto> columnList = tableColumnVo.getColumnList();
// 找主键作为更新条件
Set<String> conditionSet = columnList.stream().filter(item -> Objects.equals(item.getPrimaryKey(), "1")).map(TableColumnDescDto::getName).collect(Collectors.toSet());
// 数据查询
String queryAllSql = dbBaseService.getQueryAllSql(param);
ExecuteParam executeParam = new ExecuteParam();
executeParam.setDatasourceId(param.getSourceId());
executeParam.setExecuteId(param.getExecuteId());
executeParam.setExecuteType(executeType);
executeParam.setSql(queryAllSql);
String downloadTableData = dbBaseService.getDownloadTableData(param, executeParam, columnList, conditionSet);
// 写入临时文件
if (multipleFile) {
File tempFile = FileUtil.file(tempDirName + "/" + tableName + suffix);
String tableDataSb = isJson ? downloadTableData : String.format("-- 导出数据表:`%s`.`%s` --\n", param.getDbName(), tableName) + downloadTableData;
FileUtil.writeUtf8String(tableDataSb, tempFile);
} else {
resultSb.append(String.format("-- 导出数据表:`%s`.`%s` --\n", param.getDbName(), tableName));
resultSb.append(downloadTableData).append("\n");
}
}
if (multipleFile) {
baseDownloadService.sendResponse(response, param.getDbName(), tempDirName);
} else {
baseDownloadService.sendResponse(response, param.getDbName(), suffix, resultSb.toString());
}
} catch (Exception e) {
e.printStackTrace();
return DocDbResponseJson.error("导出失败:" + e.getMessage());
} finally {
FileUtil.del(tempDirName);
}
return DocDbResponseJson.ok();
}
private Long getDataCount(DataViewParam param, ExecuteType executeType) {
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
String queryCountSql = dbBaseService.getQueryCountSql(param);
@@ -237,6 +167,7 @@ public class DbDataViewController {
* @param executeType
* @param executeSql
* @return
* @author 暮光:城中城
*/
private ExecuteResult query(Long sourceId, String executeId, ExecuteType executeType, String executeSql) {
try {
@@ -252,15 +183,5 @@ public class DbDataViewController {
return ExecuteResult.error(StringUtil.getException(e), executeSql);
}
}
private ExecuteType getExecuteType(Long sourceId) {
boolean manageAuth = DocUserUtil.haveAuth(DocAuthConst.DB_DATASOURCE_MANAGE);
boolean select = DocUserUtil.haveCustomAuth(DbAuthType.SELECT.getName(), DocAuthConst.DB + sourceId);
boolean update = DocUserUtil.haveCustomAuth(DbAuthType.UPDATE.getName(), DocAuthConst.DB + sourceId);
if (!manageAuth && !select && !update) {
throw new ConfirmException("没有该数据源的执行权限");
}
return (manageAuth || update) ? ExecuteType.ALL : ExecuteType.SELECT;
}
}

View File

@@ -16,8 +16,8 @@ import com.zyplayer.doc.db.framework.consts.DbAuthType;
import com.zyplayer.doc.db.framework.db.dto.ProcedureDto;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteResult;
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.DbBaseService;
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.database.DbBaseService;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -1,12 +1,10 @@
package com.zyplayer.doc.db.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.core.util.StringUtil;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.DbFavorite;
@@ -23,8 +21,8 @@ import com.zyplayer.doc.db.framework.db.transfer.SqlParseUtil;
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
import com.zyplayer.doc.db.framework.utils.JSONUtil;
import com.zyplayer.doc.db.framework.utils.SqlLogUtil;
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.DbBaseService;
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.database.DbBaseService;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -11,8 +11,8 @@ import com.zyplayer.doc.db.controller.vo.TableColumnVo;
import com.zyplayer.doc.db.framework.consts.DbAuthType;
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.DbBaseService;
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.database.DbBaseService;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -0,0 +1,121 @@
package com.zyplayer.doc.db.controller.download;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.core.util.ZyplayerDocVersion;
import com.zyplayer.doc.db.controller.param.DataViewParam;
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteParam;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteType;
import com.zyplayer.doc.db.service.common.ExecuteAuthService;
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.database.DbBaseService;
import com.zyplayer.doc.db.service.download.BaseDownloadService;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 公共的格式化数据下载服务适用于insert、update、json
*
* @author 暮光:城中城
* @since 2021-08-14
*/
@Service(FormatDownloadConst.COMMON)
public class CommonFormatDownloadService implements FormatDownloadService {
@Resource
ExecuteAuthService executeAuthService;
@Resource
DatabaseServiceFactory databaseServiceFactory;
@Resource
BaseDownloadService baseDownloadService;
@Override
public void download(HttpServletResponse response, DataViewParam param, String[] tableNameArr) throws Exception {
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
boolean multipleFile = Objects.equals(param.getDownloadFileType(), 2);
boolean isJson = Objects.equals(param.getDownloadType(), FormatDownloadConst.JSON);
boolean isUpdate = Objects.equals(param.getDownloadType(), FormatDownloadConst.UPDATE);
// 此服务支持的下载格式判断
if (!FormatDownloadConst.INSERT.equals(param.getDownloadType())
&& !FormatDownloadConst.UPDATE.equals(param.getDownloadType())
&& !FormatDownloadConst.JSON.equals(param.getDownloadType())) {
throw new ConfirmException("不支持的数据下载格式");
}
JSONObject conditionMap = StringUtils.isBlank(param.getConditionJson()) ? new JSONObject() : JSON.parseObject(param.getConditionJson());
JSONObject conditionColumnMap = StringUtils.isBlank(param.getConditionColumnJson()) ? new JSONObject() : JSON.parseObject(param.getConditionColumnJson());
JSONObject getRetainColumnMap = StringUtils.isBlank(param.getRetainColumnJson()) ? new JSONObject() : JSON.parseObject(param.getRetainColumnJson());
// 结果
StringBuilder resultSb = new StringBuilder("/*\n" +
" 数据库 : " + param.getDbName() + "\n" +
" 数据库类型 : " + dbBaseService.getDatabaseProduct().name() + "\n" +
" 导出时间 : " + DateTime.now().toString() + "\n" +
" 导出软件 : zyplayer-doc\n" +
" 软件版本 : " + ZyplayerDocVersion.version + "\n" +
"*/\n\n");
String tempDir = System.getProperty("java.io.tmpdir");
String tempDirName = tempDir + "zyplayer-doc-" + IdUtil.fastSimpleUUID();
try {
// 创建临时文件夹
FileUtil.mkdir(tempDirName);
// 再分表查数据
String suffix = isJson ? ".json" : ".sql";
for (String tableName : tableNameArr) {
param.setTableName(tableName);
param.setCondition(conditionMap.getString(tableName));
param.setConditionColumn(conditionColumnMap.getString(tableName));
param.setRetainColumn(getRetainColumnMap.getString(tableName));
ExecuteType executeType = executeAuthService.getExecuteType(param.getSourceId());
// 获取列信息等
TableColumnVo tableColumnVo = dbBaseService.getTableColumnList(param.getSourceId(), param.getDbName(), tableName);
List<TableColumnDescDto> columnList = tableColumnVo.getColumnList();
// 默认找主键作为更新条件
Set<String> primaryKeyColumnSet = columnList.stream().filter(item -> Objects.equals(item.getPrimaryKey(), "1")).map(TableColumnDescDto::getName).collect(Collectors.toSet());
// 更新条件列
Set<String> conditionColumnSet = new HashSet<>();
if (isUpdate) {
conditionColumnSet.addAll(StringUtils.isBlank(param.getConditionColumn()) ? primaryKeyColumnSet : Stream.of(param.getConditionColumn().split(",")).collect(Collectors.toSet()));
}
// 保留的列
Set<String> retainColumnSet = StringUtils.isBlank(param.getRetainColumn()) ? Collections.emptySet() : Stream.of(param.getRetainColumn().split(",")).collect(Collectors.toSet());
List<TableColumnDescDto> columnListRetain = columnList.stream().filter(item -> retainColumnSet.isEmpty() || retainColumnSet.contains(item.getName()) || conditionColumnSet.contains(item.getName())).collect(Collectors.toList());
// 数据查询
String queryAllSql = dbBaseService.getQueryAllSql(param);
ExecuteParam executeParam = new ExecuteParam();
executeParam.setDatasourceId(param.getSourceId());
executeParam.setExecuteId(param.getExecuteId());
executeParam.setExecuteType(executeType);
executeParam.setSql(queryAllSql);
String downloadTableData = dbBaseService.getDownloadTableData(param, executeParam, columnListRetain, conditionColumnSet);
// 写入临时文件
if (multipleFile) {
File tempFile = FileUtil.file(tempDirName + "/" + tableName + suffix);
String tableDataSb = isJson ? downloadTableData : resultSb + String.format("-- 导出数据表:`%s`.`%s` --\n", param.getDbName(), tableName) + downloadTableData;
FileUtil.writeUtf8String(tableDataSb, tempFile);
} else {
resultSb.append(String.format("-- 导出数据表:`%s`.`%s` --\n", param.getDbName(), tableName));
resultSb.append(downloadTableData).append("\n");
}
}
if (multipleFile) {
baseDownloadService.sendResponse(response, param.getDbName(), tempDirName);
} else {
baseDownloadService.sendResponse(response, param.getDbName(), suffix, resultSb.toString());
}
} finally {
FileUtil.del(tempDirName);
}
}
}

View File

@@ -0,0 +1,18 @@
package com.zyplayer.doc.db.controller.download;
/**
* 下载类型枚举
*/
public class FormatDownloadConst {
/**
* 公共类型,没有自己的处理类型时使用
*/
public static final String COMMON = "common";
public static final String INSERT = "insert";
public static final String UPDATE = "update";
public static final String JSON = "json";
public static final String EXCEL = "excel";
public static final String CVS = "cvs";
;
}

View File

@@ -0,0 +1,27 @@
package com.zyplayer.doc.db.controller.download;
/**
* 下载类型枚举
*/
public enum FormatDownloadEnum {
INSERT(FormatDownloadConst.INSERT),
UPDATE(FormatDownloadConst.UPDATE),
JSON(FormatDownloadConst.JSON),
EXCEL(FormatDownloadConst.EXCEL),
CVS(FormatDownloadConst.CVS),
;
private String type;
FormatDownloadEnum(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}

View File

@@ -0,0 +1,11 @@
package com.zyplayer.doc.db.controller.download;
import com.zyplayer.doc.db.controller.param.DataViewParam;
import javax.servlet.http.HttpServletResponse;
public interface FormatDownloadService {
public void download(HttpServletResponse response, DataViewParam param, String[] tableNameArr) throws Exception;
}

View File

@@ -1,23 +1,32 @@
package com.zyplayer.doc.db.controller.param;
public class DataViewParam {
private Long sourceId;
// 基本信息
private String executeId;
private Long sourceId;
private Integer pageSize;
private Integer pageNum;
private String dbName;
private String tableName;
// 下载多张数据表
private String tableNames;
private String orderColumn;
private String orderType;
// 保留的列json多个使用英文逗号分隔{"user_info": "id,name,age"}
private String retainColumnJson;
// 查询的条件json{"user_info": "id > 0"}
private String conditionJson;
// 哪些列作为update语句的更新条件json{"user_info": "id,name"}用于update语句拼where条件使用
private String conditionColumnJson;
// 解析之后设置的,待使用
private String condition;
private String downloadType;
private String retainColumn;
private String conditionColumn;
// 下载多张数据表
private String tableNames;
private String downloadType;
private Integer dropTableFlag;
private Integer createTableFlag;
private Integer downloadFileType;
// 数据查询时使用,导出暂不支持排序
private String orderColumn;
private String orderType;
public Integer getOffset() {
return ((this.pageNum - 1) * this.pageSize);
@@ -150,4 +159,28 @@ public class DataViewParam {
public void setDownloadFileType(Integer downloadFileType) {
this.downloadFileType = downloadFileType;
}
public String getRetainColumnJson() {
return retainColumnJson;
}
public void setRetainColumnJson(String retainColumnJson) {
this.retainColumnJson = retainColumnJson;
}
public String getConditionJson() {
return conditionJson;
}
public void setConditionJson(String conditionJson) {
this.conditionJson = conditionJson;
}
public String getConditionColumnJson() {
return conditionColumnJson;
}
public void setConditionColumnJson(String conditionColumnJson) {
this.conditionColumnJson = conditionColumnJson;
}
}

View File

@@ -0,0 +1,28 @@
package com.zyplayer.doc.db.service.common;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.support.consts.DocAuthConst;
import com.zyplayer.doc.db.framework.consts.DbAuthType;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteType;
import org.springframework.stereotype.Service;
@Service
public class ExecuteAuthService {
/**
* 获取数据库语句执行类型,只读或读写
*
* @author 暮光:城中城
* @since 2021-08-14
*/
public ExecuteType getExecuteType(Long sourceId) {
boolean manageAuth = DocUserUtil.haveAuth(DocAuthConst.DB_DATASOURCE_MANAGE);
boolean select = DocUserUtil.haveCustomAuth(DbAuthType.SELECT.getName(), DocAuthConst.DB + sourceId);
boolean update = DocUserUtil.haveCustomAuth(DbAuthType.UPDATE.getName(), DocAuthConst.DB + sourceId);
if (!manageAuth && !select && !update) {
throw new ConfirmException("没有该数据源的执行权限");
}
return (manageAuth || update) ? ExecuteType.ALL : ExecuteType.SELECT;
}
}

View File

@@ -1,4 +1,4 @@
package com.zyplayer.doc.db.service;
package com.zyplayer.doc.db.service.database;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean;

View File

@@ -1,4 +1,4 @@
package com.zyplayer.doc.db.service;
package com.zyplayer.doc.db.service.database;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

View File

@@ -1,10 +1,8 @@
package com.zyplayer.doc.db.service;
package com.zyplayer.doc.db.service.database;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.db.controller.vo.TableDdlVo;
import com.zyplayer.doc.db.controller.vo.TableStatusVo;
import com.zyplayer.doc.db.framework.db.dto.QueryTableColumnDescDto;
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
import com.zyplayer.doc.db.framework.db.dto.TableDescDto;
import com.zyplayer.doc.db.framework.db.dto.TableInfoDto;
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;

View File

@@ -1,7 +1,6 @@
package com.zyplayer.doc.db.service;
package com.zyplayer.doc.db.service.database;
import cn.hutool.core.util.RandomUtil;
import com.zyplayer.doc.db.controller.param.DataViewParam;
import com.zyplayer.doc.db.controller.vo.TableDdlVo;
import com.zyplayer.doc.db.framework.db.dto.ColumnInfoDto;
import com.zyplayer.doc.db.framework.db.dto.ProcedureDto;

View File

@@ -1,4 +1,4 @@
package com.zyplayer.doc.db.service;
package com.zyplayer.doc.db.service.database;
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
import org.springframework.stereotype.Service;

View File

@@ -1,4 +1,4 @@
package com.zyplayer.doc.db.service;
package com.zyplayer.doc.db.service.database;
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
import org.springframework.stereotype.Service;

View File

@@ -1,22 +1,17 @@
package com.zyplayer.doc.db.service;
package com.zyplayer.doc.db.service.database;
import com.zyplayer.doc.db.controller.param.DataViewParam;
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteParam;
import com.zyplayer.doc.db.framework.db.mapper.sqlserver.SqlServerMapper;
import com.zyplayer.doc.db.service.download.BaseDownloadService;
import com.zyplayer.doc.db.service.download.SqlserverDownloadService;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@Service

View File

@@ -13,8 +13,8 @@ import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteParam;
import com.zyplayer.doc.db.framework.db.mapper.base.SqlExecutor;
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.DbBaseService;
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.database.DbBaseService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

View File

@@ -7,8 +7,8 @@ import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteParam;
import com.zyplayer.doc.db.framework.db.mapper.base.SqlExecutor;
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.DbBaseService;
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.database.DbBaseService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;