数据导出逻辑优化,统一使用一个接口,为下载其他格式做准备
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.repository.support.consts.DocAuthConst;
|
||||||
import com.zyplayer.doc.data.service.manage.DbDatasourceService;
|
import com.zyplayer.doc.data.service.manage.DbDatasourceService;
|
||||||
import com.zyplayer.doc.data.service.manage.UserAuthService;
|
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.DatabaseExportVo;
|
||||||
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
|
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
|
||||||
import com.zyplayer.doc.db.controller.vo.TableColumnVo.TableInfoVo;
|
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.db.enums.DatabaseProductEnum;
|
||||||
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
|
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
|
||||||
import com.zyplayer.doc.db.framework.utils.PoiUtil;
|
import com.zyplayer.doc.db.framework.utils.PoiUtil;
|
||||||
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
|
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
|
||||||
import com.zyplayer.doc.db.service.DbBaseService;
|
import com.zyplayer.doc.db.service.database.DbBaseService;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.commons.lang.math.NumberUtils;
|
import org.apache.commons.lang.math.NumberUtils;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.zyplayer.doc.db.controller;
|
package com.zyplayer.doc.db.controller;
|
||||||
|
|
||||||
import cn.hutool.core.date.DateTime;
|
|
||||||
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.io.FileUtil;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.RandomUtil;
|
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.exception.ConfirmException;
|
||||||
import com.zyplayer.doc.core.json.ResponseJson;
|
import com.zyplayer.doc.core.json.ResponseJson;
|
||||||
import com.zyplayer.doc.core.util.StringUtil;
|
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.config.security.DocUserUtil;
|
||||||
import com.zyplayer.doc.data.repository.support.consts.DocAuthConst;
|
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.param.DataViewParam;
|
||||||
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
|
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
|
||||||
import com.zyplayer.doc.db.framework.consts.DbAuthType;
|
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.db.mapper.base.SqlExecutor;
|
||||||
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
|
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
|
||||||
import com.zyplayer.doc.db.framework.utils.JSONUtil;
|
import com.zyplayer.doc.db.framework.utils.JSONUtil;
|
||||||
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
|
import com.zyplayer.doc.db.service.common.ExecuteAuthService;
|
||||||
import com.zyplayer.doc.db.service.DbBaseService;
|
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
|
||||||
import com.zyplayer.doc.db.service.download.BaseDownloadService;
|
import com.zyplayer.doc.db.service.database.DbBaseService;
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.collections.MapUtils;
|
import org.apache.commons.collections.MapUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
@@ -40,7 +40,6 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.File;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@@ -57,20 +56,28 @@ import java.util.stream.Stream;
|
|||||||
public class DbDataViewController {
|
public class DbDataViewController {
|
||||||
private static Logger logger = LoggerFactory.getLogger(DbDataViewController.class);
|
private static Logger logger = LoggerFactory.getLogger(DbDataViewController.class);
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
ExecuteAuthService executeAuthService;
|
||||||
@Resource
|
@Resource
|
||||||
SqlExecutor sqlExecutor;
|
SqlExecutor sqlExecutor;
|
||||||
@Resource
|
@Resource
|
||||||
DatabaseServiceFactory databaseServiceFactory;
|
DatabaseServiceFactory databaseServiceFactory;
|
||||||
@Resource
|
@Resource
|
||||||
BaseDownloadService baseDownloadService;
|
Map<String, FormatDownloadService> formatDownloadServiceMap;
|
||||||
// 最大允许导出的行数,设置的过大有可能会导致内存溢出,默认10W条
|
// 最大允许导出的行数,设置的过大有可能会导致内存溢出,默认10W条
|
||||||
@Value("${zyplayer.doc.db.download-max-row:100000}")
|
@Value("${zyplayer.doc.db.download-max-row:100000}")
|
||||||
Integer downloadMaxRow;
|
Integer downloadMaxRow;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据查询接口
|
||||||
|
*
|
||||||
|
* @author 暮光:城中城
|
||||||
|
* @since 2021-08-14
|
||||||
|
*/
|
||||||
@PostMapping(value = "/query")
|
@PostMapping(value = "/query")
|
||||||
public ResponseJson query(DataViewParam param) {
|
public ResponseJson query(DataViewParam param) {
|
||||||
// 数据查询
|
// 数据查询
|
||||||
ExecuteType executeType = this.getExecuteType(param.getSourceId());
|
ExecuteType executeType = executeAuthService.getExecuteType(param.getSourceId());
|
||||||
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
|
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
|
||||||
String queryPageSql = dbBaseService.getQueryPageSql(param);
|
String queryPageSql = dbBaseService.getQueryPageSql(param);
|
||||||
ExecuteResult executeResult = this.query(param.getSourceId(), param.getExecuteId(), executeType, queryPageSql);
|
ExecuteResult executeResult = this.query(param.getSourceId(), param.getExecuteId(), executeType, queryPageSql);
|
||||||
@@ -91,8 +98,7 @@ public class DbDataViewController {
|
|||||||
/**
|
/**
|
||||||
* 删除表数据
|
* 删除表数据
|
||||||
*
|
*
|
||||||
* @param lineJson
|
* @author 暮光:城中城
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
@PostMapping(value = "/deleteTableLineData")
|
@PostMapping(value = "/deleteTableLineData")
|
||||||
public ResponseJson deleteTableLineData(Long sourceId, String dbName, String tableName, String lineJson) {
|
public ResponseJson deleteTableLineData(Long sourceId, String dbName, String tableName, String lineJson) {
|
||||||
@@ -103,120 +109,44 @@ public class DbDataViewController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 单表数据下载
|
* 多表下载
|
||||||
*
|
*
|
||||||
* @param response
|
* @param response
|
||||||
* @param param
|
* @param param
|
||||||
* @return
|
* @return
|
||||||
|
* @author 暮光:城中城
|
||||||
*/
|
*/
|
||||||
@PostMapping(value = "/download")
|
@PostMapping(value = "/downloadMultiple")
|
||||||
public ResponseJson download(HttpServletResponse response, DataViewParam param) {
|
public ResponseJson downloadMultiple(HttpServletResponse response, DataViewParam param) {
|
||||||
param.setExecuteId(RandomUtil.simpleUUID());
|
if (StringUtils.isBlank(param.getTableNames())) {
|
||||||
ExecuteType executeType = this.getExecuteType(param.getSourceId());
|
return DocDbResponseJson.warn("请选择导出的表");
|
||||||
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
|
|
||||||
if (this.getDataCount(param, executeType) > downloadMaxRow) {
|
|
||||||
return DocDbResponseJson.error(String.format("导出失败,表:%s 数据行数超过最大导出配置 %s,请联系管理员修改", param.getTableName(), downloadMaxRow));
|
|
||||||
}
|
}
|
||||||
// 获取列信息等
|
param.setExecuteId(IdUtil.simpleUUID());
|
||||||
TableColumnVo tableColumnVo = dbBaseService.getTableColumnList(param.getSourceId(), param.getDbName(), param.getTableName());
|
String[] tableNameArr = param.getTableNames().split(",");
|
||||||
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);
|
|
||||||
try {
|
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) {
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
return DocDbResponseJson.error("导出失败:" + e.getMessage());
|
return DocDbResponseJson.error("导出失败:" + e.getMessage());
|
||||||
}
|
}
|
||||||
return DocDbResponseJson.ok();
|
return DocDbResponseJson.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 多表下载
|
* 获取数据总条数
|
||||||
*
|
*
|
||||||
* @param response
|
* @author 暮光:城中城
|
||||||
* @param param
|
* @since 2021-08-14
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
@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) {
|
private Long getDataCount(DataViewParam param, ExecuteType executeType) {
|
||||||
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
|
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
|
||||||
String queryCountSql = dbBaseService.getQueryCountSql(param);
|
String queryCountSql = dbBaseService.getQueryCountSql(param);
|
||||||
@@ -237,6 +167,7 @@ public class DbDataViewController {
|
|||||||
* @param executeType
|
* @param executeType
|
||||||
* @param executeSql
|
* @param executeSql
|
||||||
* @return
|
* @return
|
||||||
|
* @author 暮光:城中城
|
||||||
*/
|
*/
|
||||||
private ExecuteResult query(Long sourceId, String executeId, ExecuteType executeType, String executeSql) {
|
private ExecuteResult query(Long sourceId, String executeId, ExecuteType executeType, String executeSql) {
|
||||||
try {
|
try {
|
||||||
@@ -252,15 +183,5 @@ public class DbDataViewController {
|
|||||||
return ExecuteResult.error(StringUtil.getException(e), executeSql);
|
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.dto.ProcedureDto;
|
||||||
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteResult;
|
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteResult;
|
||||||
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
|
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
|
||||||
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
|
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
|
||||||
import com.zyplayer.doc.db.service.DbBaseService;
|
import com.zyplayer.doc.db.service.database.DbBaseService;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
package com.zyplayer.doc.db.controller;
|
package com.zyplayer.doc.db.controller;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
|
||||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.zyplayer.doc.core.annotation.AuthMan;
|
import com.zyplayer.doc.core.annotation.AuthMan;
|
||||||
import com.zyplayer.doc.core.json.ResponseJson;
|
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.DocUserDetails;
|
||||||
import com.zyplayer.doc.data.config.security.DocUserUtil;
|
import com.zyplayer.doc.data.config.security.DocUserUtil;
|
||||||
import com.zyplayer.doc.data.repository.manage.entity.DbFavorite;
|
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.json.DocDbResponseJson;
|
||||||
import com.zyplayer.doc.db.framework.utils.JSONUtil;
|
import com.zyplayer.doc.db.framework.utils.JSONUtil;
|
||||||
import com.zyplayer.doc.db.framework.utils.SqlLogUtil;
|
import com.zyplayer.doc.db.framework.utils.SqlLogUtil;
|
||||||
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
|
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
|
||||||
import com.zyplayer.doc.db.service.DbBaseService;
|
import com.zyplayer.doc.db.service.database.DbBaseService;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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.consts.DbAuthType;
|
||||||
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
|
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
|
||||||
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
|
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
|
||||||
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
|
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
|
||||||
import com.zyplayer.doc.db.service.DbBaseService;
|
import com.zyplayer.doc.db.service.database.DbBaseService;
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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;
|
package com.zyplayer.doc.db.controller.param;
|
||||||
|
|
||||||
public class DataViewParam {
|
public class DataViewParam {
|
||||||
private Long sourceId;
|
// 基本信息
|
||||||
private String executeId;
|
private String executeId;
|
||||||
|
private Long sourceId;
|
||||||
private Integer pageSize;
|
private Integer pageSize;
|
||||||
private Integer pageNum;
|
private Integer pageNum;
|
||||||
private String dbName;
|
private String dbName;
|
||||||
private String tableName;
|
private String tableName;
|
||||||
// 下载多张数据表
|
// 保留的列json,多个使用英文逗号分隔,{"user_info": "id,name,age"}
|
||||||
private String tableNames;
|
private String retainColumnJson;
|
||||||
private String orderColumn;
|
// 查询的条件json,{"user_info": "id > 0"}
|
||||||
private String orderType;
|
private String conditionJson;
|
||||||
|
// 哪些列作为update语句的更新条件json,{"user_info": "id,name"},用于update语句拼where条件使用
|
||||||
|
private String conditionColumnJson;
|
||||||
|
// 解析之后设置的,待使用
|
||||||
private String condition;
|
private String condition;
|
||||||
private String downloadType;
|
|
||||||
private String retainColumn;
|
private String retainColumn;
|
||||||
private String conditionColumn;
|
private String conditionColumn;
|
||||||
|
// 下载多张数据表
|
||||||
|
private String tableNames;
|
||||||
|
private String downloadType;
|
||||||
private Integer dropTableFlag;
|
private Integer dropTableFlag;
|
||||||
private Integer createTableFlag;
|
private Integer createTableFlag;
|
||||||
private Integer downloadFileType;
|
private Integer downloadFileType;
|
||||||
|
// 数据查询时使用,导出暂不支持排序
|
||||||
|
private String orderColumn;
|
||||||
|
private String orderType;
|
||||||
|
|
||||||
public Integer getOffset() {
|
public Integer getOffset() {
|
||||||
return ((this.pageNum - 1) * this.pageSize);
|
return ((this.pageNum - 1) * this.pageSize);
|
||||||
@@ -150,4 +159,28 @@ public class DataViewParam {
|
|||||||
public void setDownloadFileType(Integer downloadFileType) {
|
public void setDownloadFileType(Integer downloadFileType) {
|
||||||
this.downloadFileType = 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.core.exception.ConfirmException;
|
||||||
import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean;
|
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.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
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.core.exception.ConfirmException;
|
||||||
import com.zyplayer.doc.db.controller.vo.TableDdlVo;
|
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.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.TableDescDto;
|
||||||
import com.zyplayer.doc.db.framework.db.dto.TableInfoDto;
|
import com.zyplayer.doc.db.framework.db.dto.TableInfoDto;
|
||||||
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
|
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 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.controller.vo.TableDdlVo;
|
||||||
import com.zyplayer.doc.db.framework.db.dto.ColumnInfoDto;
|
import com.zyplayer.doc.db.framework.db.dto.ColumnInfoDto;
|
||||||
import com.zyplayer.doc.db.framework.db.dto.ProcedureDto;
|
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 com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
|
||||||
import org.springframework.stereotype.Service;
|
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 com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
|
||||||
import org.springframework.stereotype.Service;
|
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.param.DataViewParam;
|
||||||
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
|
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
|
||||||
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
|
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.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.framework.db.mapper.sqlserver.SqlServerMapper;
|
||||||
import com.zyplayer.doc.db.service.download.BaseDownloadService;
|
|
||||||
import com.zyplayer.doc.db.service.download.SqlserverDownloadService;
|
import com.zyplayer.doc.db.service.download.SqlserverDownloadService;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@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.enums.DatabaseProductEnum;
|
||||||
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteParam;
|
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.framework.db.mapper.base.SqlExecutor;
|
||||||
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
|
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
|
||||||
import com.zyplayer.doc.db.service.DbBaseService;
|
import com.zyplayer.doc.db.service.database.DbBaseService;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
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.enums.DatabaseProductEnum;
|
||||||
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteParam;
|
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.framework.db.mapper.base.SqlExecutor;
|
||||||
import com.zyplayer.doc.db.service.DatabaseServiceFactory;
|
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
|
||||||
import com.zyplayer.doc.db.service.DbBaseService;
|
import com.zyplayer.doc.db.service.database.DbBaseService;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=favicon-db.png><title>数据库文档管理</title><link href=css/chunk-vendors.8924efc6.css rel=preload as=style><link href=css/index.2a7107f3.css rel=preload as=style><link href=js/chunk-vendors.333ced1f.js rel=preload as=script><link href=js/index.dab72f94.js rel=preload as=script><link href=css/chunk-vendors.8924efc6.css rel=stylesheet><link href=css/index.2a7107f3.css rel=stylesheet></head><body><noscript><strong>We're sorry but zyplayer-db-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=js/chunk-vendors.333ced1f.js></script><script src=js/index.dab72f94.js></script></body></html>
|
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=favicon-db.png><title>数据库文档管理</title><link href=css/chunk-vendors.8924efc6.css rel=preload as=style><link href=css/index.2a7107f3.css rel=preload as=style><link href=js/chunk-vendors.333ced1f.js rel=preload as=script><link href=js/index.ea0404ed.js rel=preload as=script><link href=css/chunk-vendors.8924efc6.css rel=stylesheet><link href=css/index.2a7107f3.css rel=stylesheet></head><body><noscript><strong>We're sorry but zyplayer-db-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=js/chunk-vendors.333ced1f.js></script><script src=js/index.ea0404ed.js></script></body></html>
|
||||||
File diff suppressed because one or more lines are too long
1
zyplayer-doc-db/src/main/resources/dist/js/index.ea0404ed.js
vendored
Normal file
1
zyplayer-doc-db/src/main/resources/dist/js/index.ea0404ed.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1,6 +1,7 @@
|
|||||||
package com.zyplayer.doc.manage.web.manage;
|
package com.zyplayer.doc.manage.web.manage;
|
||||||
|
|
||||||
import com.zyplayer.doc.core.annotation.AuthMan;
|
import com.zyplayer.doc.core.annotation.AuthMan;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
@@ -13,35 +14,47 @@ public class DocSystemController {
|
|||||||
|
|
||||||
@GetMapping("/")
|
@GetMapping("/")
|
||||||
public ModelAndView home() {
|
public ModelAndView home() {
|
||||||
return new ModelAndView("/doc-console.html");
|
ModelAndView modelAndView = new ModelAndView("/doc-console.html");
|
||||||
|
modelAndView.setStatus(HttpStatus.OK);
|
||||||
|
return modelAndView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/doc-wiki")
|
@GetMapping("/doc-wiki")
|
||||||
public ModelAndView wiki() {
|
public ModelAndView wiki() {
|
||||||
return new ModelAndView("/doc-wiki.html");
|
ModelAndView modelAndView = new ModelAndView("/doc-wiki.html");
|
||||||
|
modelAndView.setStatus(HttpStatus.OK);
|
||||||
|
return modelAndView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AuthMan
|
@AuthMan
|
||||||
@GetMapping("/doc-db")
|
@GetMapping("/doc-db")
|
||||||
public ModelAndView db() {
|
public ModelAndView db() {
|
||||||
return new ModelAndView("/doc-db.html");
|
ModelAndView modelAndView = new ModelAndView("/doc-db.html");
|
||||||
|
modelAndView.setStatus(HttpStatus.OK);
|
||||||
|
return modelAndView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AuthMan
|
@AuthMan
|
||||||
@GetMapping("/doc-swagger")
|
@GetMapping("/doc-swagger")
|
||||||
public ModelAndView swagger() {
|
public ModelAndView swagger() {
|
||||||
return new ModelAndView("/document.html");
|
ModelAndView modelAndView = new ModelAndView("/document.html");
|
||||||
|
modelAndView.setStatus(HttpStatus.OK);
|
||||||
|
return modelAndView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AuthMan
|
@AuthMan
|
||||||
@GetMapping("/doc-dubbo")
|
@GetMapping("/doc-dubbo")
|
||||||
public ModelAndView dubbo() {
|
public ModelAndView dubbo() {
|
||||||
return new ModelAndView("/doc-dubbo.html");
|
ModelAndView modelAndView = new ModelAndView("/doc-dubbo.html");
|
||||||
|
modelAndView.setStatus(HttpStatus.OK);
|
||||||
|
return modelAndView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@AuthMan
|
@AuthMan
|
||||||
@GetMapping("/doc-es")
|
@GetMapping("/doc-es")
|
||||||
public ModelAndView es() {
|
public ModelAndView es() {
|
||||||
return new ModelAndView("/doc-es.html");
|
ModelAndView modelAndView = new ModelAndView("/doc-es.html");
|
||||||
|
modelAndView.setStatus(HttpStatus.OK);
|
||||||
|
return modelAndView;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="更新条件列:" v-if="downloadDataParam.downloadType === 'update'">
|
<el-form-item label="更新条件列:" v-if="downloadDataParam.downloadType === 'update'">
|
||||||
<el-select v-model="downloadDataParam.conditionArr" multiple placeholder="不选则是没有条件的更新" style="width: 370px;">
|
<el-select v-model="downloadDataParam.conditionColumnArr" multiple placeholder="不选则是没有条件的更新" style="width: 370px;">
|
||||||
<el-option v-for="item in conditionDataCols" :key="item.prop" :label="item.prop" :value="item.prop"></el-option>
|
<el-option v-for="item in conditionDataCols" :key="item.prop" :label="item.prop" :value="item.prop"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -160,11 +160,11 @@
|
|||||||
downloadType: 'insert',
|
downloadType: 'insert',
|
||||||
dropTableFlag: 0,
|
dropTableFlag: 0,
|
||||||
createTableFlag: 0,
|
createTableFlag: 0,
|
||||||
conditionArr: [],
|
conditionColumnArr: [],
|
||||||
retainColumnArr: [],
|
retainColumnArr: [],
|
||||||
},
|
},
|
||||||
downloadFormParam: {
|
downloadFormParam: {
|
||||||
url: 'zyplayer-doc-db/data-view/download',
|
url: 'zyplayer-doc-db/data-view/downloadMultiple',
|
||||||
param: {}
|
param: {}
|
||||||
},
|
},
|
||||||
// 编辑器
|
// 编辑器
|
||||||
@@ -438,17 +438,21 @@
|
|||||||
conditionSql = conditionSql || this.sqlExecutorEditor.getValue();
|
conditionSql = conditionSql || this.sqlExecutorEditor.getValue();
|
||||||
conditionSql = conditionSql || "";
|
conditionSql = conditionSql || "";
|
||||||
this.nowExecutorId = (new Date()).getTime() + Math.ceil(Math.random() * 1000);
|
this.nowExecutorId = (new Date()).getTime() + Math.ceil(Math.random() * 1000);
|
||||||
|
let condition = {}, conditionColumn = {}, retainColumn = {};
|
||||||
|
condition[this.pageParam.tableName] = conditionSql;
|
||||||
|
conditionColumn[this.pageParam.tableName] = this.downloadDataParam.conditionColumnArr.join(",");
|
||||||
|
retainColumn[this.pageParam.tableName] = this.downloadDataParam.retainColumnArr.join(",");
|
||||||
this.downloadFormParam.param = {
|
this.downloadFormParam.param = {
|
||||||
|
executeId: this.nowExecutorId,
|
||||||
sourceId: this.pageParam.sourceId,
|
sourceId: this.pageParam.sourceId,
|
||||||
dbName: this.pageParam.dbName,
|
dbName: this.pageParam.dbName,
|
||||||
tableName: this.pageParam.tableName,
|
tableNames: this.pageParam.tableName,
|
||||||
downloadType: this.downloadDataParam.downloadType,
|
downloadType: this.downloadDataParam.downloadType,
|
||||||
conditionColumn: this.downloadDataParam.conditionArr.join(","),
|
|
||||||
retainColumn: this.downloadDataParam.retainColumnArr.join(","),
|
|
||||||
dropTableFlag: this.downloadDataParam.dropTableFlag,
|
dropTableFlag: this.downloadDataParam.dropTableFlag,
|
||||||
createTableFlag: this.downloadDataParam.createTableFlag,
|
createTableFlag: this.downloadDataParam.createTableFlag,
|
||||||
condition: conditionSql,
|
conditionJson: JSON.stringify(condition),
|
||||||
executeId: this.nowExecutorId,
|
conditionColumnJson: JSON.stringify(conditionColumn),
|
||||||
|
retainColumnJson: JSON.stringify(retainColumn),
|
||||||
};
|
};
|
||||||
setTimeout(() => this.$refs.downloadForm.submit(), 0);
|
setTimeout(() => this.$refs.downloadForm.submit(), 0);
|
||||||
this.downloadDataVisible = false;
|
this.downloadDataVisible = false;
|
||||||
@@ -459,7 +463,10 @@
|
|||||||
this.$message.warning("当前筛选条件下无数据,请重新筛选后再操作导出");
|
this.$message.warning("当前筛选条件下无数据,请重新筛选后再操作导出");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.downloadDataParam.conditionArr = [];
|
let primaryKey = this.primaryKeyColumn.name;
|
||||||
|
if (this.downloadDataParam.conditionColumnArr.length <= 0 && !!primaryKey) {
|
||||||
|
this.downloadDataParam.conditionColumnArr = [primaryKey];
|
||||||
|
}
|
||||||
this.conditionDataCols = dataRes.dataCols;
|
this.conditionDataCols = dataRes.dataCols;
|
||||||
this.downloadDataVisible = true;
|
this.downloadDataVisible = true;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user