数据导出逻辑优化,统一使用一个接口,为下载其他格式做准备
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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";
|
||||
;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user