feat:新增导出功能
新增数据库文件生成
This commit is contained in:
parent
ef380035b6
commit
046e045178
@ -104,6 +104,11 @@
|
||||
<artifactId>api-permissions</artifactId>
|
||||
<version>2.0.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-jdbc</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<profiles>
|
||||
|
@ -0,0 +1,131 @@
|
||||
package io.gisbi.application.appcode.controller;
|
||||
|
||||
import io.gisbi.application.appcode.doman.TableData;
|
||||
import io.gisbi.application.appcode.service.DatabaseService;
|
||||
import io.gisbi.application.appcode.utils.ZipUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.util.FileCopyUtils;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/project")
|
||||
public class ProjectExportController {
|
||||
|
||||
// 模板 ZIP 文件路径
|
||||
private static final String FIXED_ZIP_PATH = "E:/opt/gisbi2.0/";
|
||||
|
||||
private static final String FIXED_ZIP_NAME = "a.zip";
|
||||
|
||||
private static final String FIXED_ZIP_FULL_PATH= FIXED_ZIP_PATH + FIXED_ZIP_NAME;
|
||||
|
||||
|
||||
|
||||
// 自定义数据库服务类
|
||||
@Autowired
|
||||
private DatabaseService databaseService;
|
||||
|
||||
/**
|
||||
* 接口:上传项目 ZIP 包,解压 → 导出数据库部分数据 → 插入 SQL 文件 → 重新打包并下载
|
||||
*/
|
||||
@PostMapping("/export")
|
||||
public void exportProjectWithDbData(
|
||||
@RequestParam("id") String id) throws Exception {
|
||||
|
||||
String fixedZipPath = FIXED_ZIP_FULL_PATH;
|
||||
File fixedZipFile = new File(fixedZipPath);
|
||||
if (!fixedZipFile.exists()) {
|
||||
throw new FileNotFoundException("指定的 ZIP 文件不存在: " + fixedZipPath);
|
||||
}
|
||||
|
||||
// 创建时间戳和临时目录路径
|
||||
String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
|
||||
Path tempExtractDir = Paths.get(FIXED_ZIP_PATH, "temp", "project-" + timestamp);
|
||||
|
||||
try {
|
||||
Files.createDirectories(tempExtractDir);
|
||||
|
||||
// 1. 解压模板 ZIP 到临时目录
|
||||
File uploadedZip = new File(tempExtractDir + ".zip");
|
||||
FileCopyUtils.copy(new FileInputStream(fixedZipFile), new FileOutputStream(uploadedZip));
|
||||
ZipUtils.unzip(uploadedZip, tempExtractDir.toFile());
|
||||
|
||||
// 2. 获取解压后的根目录(自动识别第一个子目录)
|
||||
File[] extractedRoots = tempExtractDir.toFile().listFiles(File::isDirectory);
|
||||
if (extractedRoots == null || extractedRoots.length == 0) {
|
||||
throw new IOException("ZIP 解压后未找到项目根目录");
|
||||
}
|
||||
File projectRoot = extractedRoots[0];
|
||||
|
||||
// 3. 获取 db 目录
|
||||
File dbDir = new File(projectRoot, "db");
|
||||
if (!dbDir.exists()) {
|
||||
boolean created = dbDir.mkdirs();
|
||||
if (!created) {
|
||||
throw new IOException("无法创建 db 目录: " + dbDir.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 查询数据库并生成 SQL 文件,保存到 db 目录中
|
||||
generateSqlFile(id, new File(dbDir, "data.sql").getAbsolutePath());
|
||||
|
||||
// 5. 重新打包整个项目根目录为新的 ZIP 文件
|
||||
String outputZipName = FIXED_ZIP_NAME.replaceFirst("\\..*$", "") +
|
||||
"-with-sql-" + timestamp + ".zip";
|
||||
File finalZip = new File(FIXED_ZIP_PATH + "export/", outputZipName);
|
||||
ZipUtils.zipFolder(projectRoot, finalZip);
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}finally {
|
||||
// 7. 清理临时文件(可选)
|
||||
deleteDirectory(tempExtractDir.toFile());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据 id 查询数据库,并生成 SQL 文件(CREATE TABLE + INSERT INTO)
|
||||
*/
|
||||
private File generateSqlFile(String id, String outputPath) throws IOException {
|
||||
// 自定义方法获取数据
|
||||
List<TableData> tableDataList = databaseService.getDataById(id);
|
||||
|
||||
try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputPath))) {
|
||||
for (TableData data : tableDataList) {
|
||||
// 写入建表语句
|
||||
writer.write(data.getTableCreateSql());
|
||||
writer.newLine();
|
||||
|
||||
// 写入插入语句
|
||||
for (String insertSql : data.getInsertSqls()) {
|
||||
writer.write(insertSql);
|
||||
writer.newLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
// return null;
|
||||
return new File(outputPath);
|
||||
}
|
||||
|
||||
private void deleteDirectory(File file) {
|
||||
if (file.isDirectory()) {
|
||||
File[] files = file.listFiles();
|
||||
if (files != null) {
|
||||
for (File f : files) {
|
||||
deleteDirectory(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
file.delete();
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package io.gisbi.application.appcode.doman;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class Condition {
|
||||
|
||||
private String field;
|
||||
private String operator; // = like
|
||||
private Object value;
|
||||
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package io.gisbi.application.appcode.doman;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class TableData {
|
||||
private String tableName;
|
||||
private String tableCreateSql;
|
||||
private List<String> insertSqls;
|
||||
|
||||
public TableData(String tableName, String tableCreateSql, List<String> insertSqls) {
|
||||
this.tableName = tableName;
|
||||
this.tableCreateSql = tableCreateSql;
|
||||
this.insertSqls = insertSqls;
|
||||
}
|
||||
|
||||
// Getters and setters
|
||||
}
|
@ -0,0 +1,369 @@
|
||||
package io.gisbi.application.appcode.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import io.gisbi.application.appcode.doman.Condition;
|
||||
import io.gisbi.application.appcode.doman.TableData;
|
||||
import io.gisbi.chart.dao.auto.mapper.CoreChartViewMapper;
|
||||
import io.gisbi.dataset.dao.auto.entity.CoreDatasetTable;
|
||||
import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableMapper;
|
||||
import io.gisbi.visualization.dao.auto.entity.DataVisualizationInfo;
|
||||
import io.gisbi.visualization.dao.auto.mapper.*;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class DatabaseService {
|
||||
|
||||
@Autowired
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
|
||||
@Autowired
|
||||
private CoreDatasetTableMapper coreDatasetTableMapper;
|
||||
@Autowired
|
||||
private DataVisualizationInfoMapper dataVisualizationInfoMapper;
|
||||
@Autowired
|
||||
private VisualizationLinkJumpInfoMapper visualizationLinkJumpInfoMapper;
|
||||
@Autowired
|
||||
private VisualizationLinkJumpMapper visualizationLinkJumpMapper;
|
||||
@Autowired
|
||||
private CoreChartViewMapper coreChartViewMapper;
|
||||
@Autowired
|
||||
private VisualizationLinkageMapper visualizationLinkageMapper;
|
||||
@Autowired
|
||||
private VisualizationOuterParamsMapper visualizationOuterParamsMapper;
|
||||
@Autowired
|
||||
private VisualizationOuterParamsInfoMapper visualizationOuterParamsInfoMapper;
|
||||
|
||||
public List<TableData> getDataById(String id) {
|
||||
List<TableData> result = new ArrayList<>();
|
||||
|
||||
// 1. 获取所有要导出的表名
|
||||
List<String> tables = Arrays.asList("app_application", "app_dictionary", "app_menu", "app_module",
|
||||
"app_organization", "app_role", "app_role_menu", "app_role_users", "app_user", "area",
|
||||
"core_chart_view", "core_dataset_group", "core_dataset_table", "core_dataset_table_field",
|
||||
"core_datasource", "core_de_engine", "core_driver", "data_visualization_info",
|
||||
"visualization_background", "visualization_background_image", "visualization_link_jump",
|
||||
"visualization_link_jump_info", "visualization_link_jump_target_view_info", "visualization_linkage",
|
||||
"visualization_linkage_field", "visualization_outer_params", "visualization_outer_params_info",
|
||||
"visualization_outer_params_target_view_info", "visualization_subject");
|
||||
|
||||
for (String table : tables) {
|
||||
|
||||
// 2. 获取建表语句
|
||||
String createSql = getCreateTableSql(table);
|
||||
if ("app_application".equals(table)) {
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
Condition condition = new Condition();
|
||||
condition.setField("id");
|
||||
condition.setOperator("=");
|
||||
condition.setValue(id);
|
||||
conditions.add(condition);
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
} else if ("area".equals(table) || "core_de_engine".equals(table) || "core_driver".equals(table) ||
|
||||
"visualization_background".equals(table) || "visualization_background_image".equals(table)) {
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, new ArrayList<>());
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
} else if ("app_dictionary".equals(table) || "app_menu".equals(table) || "app_module".equals(table) ||
|
||||
"app_organization".equals(table) || "app_role".equals(table) || "app_role_menu".equals(table) ||
|
||||
"app_role_users".equals(table) || "app_user".equals(table) || "core_dataset_group".equals(table) ||
|
||||
"core_dataset_table".equals(table) || "core_datasource".equals(table) || "data_visualization_info"
|
||||
.equals(table)) {
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
Condition condition = new Condition();
|
||||
condition.setField("app_id");
|
||||
condition.setOperator("=");
|
||||
condition.setValue(id);
|
||||
conditions.add(condition);
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
} else if ("core_dataset_table_field".equals(table)) {
|
||||
List<CoreDatasetTable> coreDatasetTables =
|
||||
coreDatasetTableMapper.selectList(new LambdaQueryWrapper<CoreDatasetTable>().eq(CoreDatasetTable::getAppId, id).select(CoreDatasetTable::getId));
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
if (!coreDatasetTables.isEmpty()) {
|
||||
List<Long> ids =
|
||||
coreDatasetTables.stream().map(CoreDatasetTable::getId).collect(Collectors.toList());
|
||||
Condition condition = new Condition();
|
||||
condition.setField("dataset_table_id");
|
||||
condition.setOperator("in");
|
||||
condition.setValue(ids);
|
||||
conditions.add(condition);
|
||||
}
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
} else if ("core_chart_view".equals(table)) {
|
||||
|
||||
List<DataVisualizationInfo> dataVisualizationInfos =
|
||||
dataVisualizationInfoMapper.selectList(new LambdaQueryWrapper<DataVisualizationInfo>().eq(DataVisualizationInfo::getAppId, id).select(DataVisualizationInfo::getId));
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
if (!dataVisualizationInfos.isEmpty()) {
|
||||
List<Long> ids =
|
||||
dataVisualizationInfos.stream().map(DataVisualizationInfo::getId).collect(Collectors.toList());
|
||||
Condition condition = new Condition();
|
||||
condition.setField("scene_id");
|
||||
condition.setOperator("in");
|
||||
condition.setValue(ids);
|
||||
conditions.add(condition);
|
||||
}
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
} else if ("visualization_link_jump".equals(table)) {
|
||||
List<DataVisualizationInfo> dataVisualizationInfos =
|
||||
dataVisualizationInfoMapper.selectList(new LambdaQueryWrapper<DataVisualizationInfo>().eq(DataVisualizationInfo::getAppId, id).select(DataVisualizationInfo::getId));
|
||||
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
if (!dataVisualizationInfos.isEmpty()) {
|
||||
List<Long> ids =
|
||||
dataVisualizationInfos.stream().map(DataVisualizationInfo::getId).collect(Collectors.toList());
|
||||
Condition condition = new Condition();
|
||||
condition.setField("source_dv_id");
|
||||
condition.setOperator("in");
|
||||
condition.setValue(ids);
|
||||
conditions.add(condition);
|
||||
}
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
|
||||
} else if ("visualization_link_jump_info".equals(table)) {
|
||||
List<Long> ids = visualizationLinkJumpMapper.selectLinkJumpIds(id);
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
if (!ids.isEmpty()) {
|
||||
Condition condition = new Condition();
|
||||
condition.setField("link_jump_id");
|
||||
condition.setOperator("in");
|
||||
condition.setValue(ids);
|
||||
conditions.add(condition);
|
||||
}
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
} else if ("visualization_link_jump_target_view_info".equals(table)) {
|
||||
List<Long> dvInfoIds = visualizationLinkJumpInfoMapper.selectInfoIds(id);
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
if (!dvInfoIds.isEmpty()) {
|
||||
Condition condition = new Condition();
|
||||
condition.setField("link_jump_info_id");
|
||||
condition.setOperator("in");
|
||||
condition.setValue(dvInfoIds);
|
||||
conditions.add(condition);
|
||||
}
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
}else if ("visualization_linkage".equals(table)) {
|
||||
List<Long> viewIds = coreChartViewMapper.selectChatViewIds(id);
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
if (!viewIds.isEmpty()) {
|
||||
Condition condition = new Condition();
|
||||
condition.setField("source_view_id");
|
||||
condition.setOperator("in");
|
||||
condition.setValue(viewIds);
|
||||
conditions.add(condition);
|
||||
}
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
}else if ("visualization_linkage_field".equals(table)) {
|
||||
List<Long> linkageIds = visualizationLinkageMapper.selectLinkageIds(id);
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
if (!linkageIds.isEmpty()) {
|
||||
Condition condition = new Condition();
|
||||
condition.setField("linkage_id");
|
||||
condition.setOperator("in");
|
||||
condition.setValue(linkageIds);
|
||||
conditions.add(condition);
|
||||
}
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
}else if ("visualization_outer_params".equals(table)) {
|
||||
List<DataVisualizationInfo> dataVisualizationInfos =
|
||||
dataVisualizationInfoMapper.selectList(new LambdaQueryWrapper<DataVisualizationInfo>().eq(DataVisualizationInfo::getAppId, id).select(DataVisualizationInfo::getId));
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
if (!dataVisualizationInfos.isEmpty()) {
|
||||
List<Long> ids =
|
||||
dataVisualizationInfos.stream().map(DataVisualizationInfo::getId).collect(Collectors.toList());
|
||||
Condition condition = new Condition();
|
||||
condition.setField("visualization_id");
|
||||
condition.setOperator("in");
|
||||
condition.setValue(ids);
|
||||
conditions.add(condition);
|
||||
}
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
}else if ("visualization_outer_params_info".equals(table)) {
|
||||
List<Long> outerParamIds = visualizationOuterParamsMapper.selectOuterParamIds(id);
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
if (!outerParamIds.isEmpty()) {
|
||||
Condition condition = new Condition();
|
||||
condition.setField("params_id");
|
||||
condition.setOperator("in");
|
||||
condition.setValue(outerParamIds);
|
||||
conditions.add(condition);
|
||||
}
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
}else if ("visualization_outer_params_target_view_info".equals(table)) {
|
||||
List<Long> paramsInfoIds = visualizationOuterParamsInfoMapper.selectParamsInfoIds(id);
|
||||
List<Condition> conditions = new ArrayList<>();
|
||||
if (!paramsInfoIds.isEmpty()) {
|
||||
Condition condition = new Condition();
|
||||
condition.setField("params_info_id");
|
||||
condition.setOperator("in");
|
||||
condition.setValue(paramsInfoIds);
|
||||
conditions.add(condition);
|
||||
}
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, conditions);
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
} else {
|
||||
// 3. 获取数据插入语句
|
||||
List<String> insertSqls = getInsertSqls(table, new ArrayList<>());
|
||||
result.add(new TableData(table, createSql, insertSqls));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private String getCreateTableSql(String table) {
|
||||
Map<String, Object> row = jdbcTemplate.queryForMap("SHOW CREATE TABLE " + table);
|
||||
String createTableSql = (String) row.get("Create Table");
|
||||
|
||||
// 在建表语句前加上 DROP TABLE IF EXISTS
|
||||
return "DROP TABLE IF EXISTS `" + table + "`;\n" + createTableSql + ";\n";
|
||||
}
|
||||
|
||||
private List<String> getInsertSqls(String table, List<Condition> conditions) {
|
||||
StringBuilder whereClause = new StringBuilder();
|
||||
List<Object> params = new ArrayList<>();
|
||||
if (conditions != null && !conditions.isEmpty()) {
|
||||
whereClause.append(" WHERE ");
|
||||
for (int i = 0; i < conditions.size(); i++) {
|
||||
Condition condition = conditions.get(i);
|
||||
if (i > 0) {
|
||||
whereClause.append(" AND ");
|
||||
}
|
||||
String operator = condition.getOperator().trim().toLowerCase();
|
||||
if ("in".equalsIgnoreCase(operator)) {
|
||||
// 处理 IN 查询,动态生成占位符
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Object> inValues = (List<Object>) condition.getValue();
|
||||
String placeholders = inValues.stream()
|
||||
.map(v -> "?")
|
||||
.collect(Collectors.joining(", "));
|
||||
whereClause.append(condition.getField()).append(" IN (").append(placeholders).append(")");
|
||||
params.addAll(inValues);
|
||||
} else {
|
||||
// 处理其他操作符
|
||||
whereClause.append(condition.getField())
|
||||
.append(" ")
|
||||
.append(condition.getOperator())
|
||||
.append(" ?");
|
||||
params.add(condition.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String sql = "SELECT * FROM " + table + whereClause;
|
||||
|
||||
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql, params.toArray());
|
||||
|
||||
List<String> inserts = new ArrayList<>();
|
||||
|
||||
// 添加 INSERT 语句
|
||||
for (Map<String, Object> row : rows) {
|
||||
StringBuilder columns = new StringBuilder();
|
||||
StringBuilder values = new StringBuilder();
|
||||
|
||||
row.forEach((key, value) -> {
|
||||
columns.append("`").append(key).append("`");
|
||||
switch (value) {
|
||||
case String s ->
|
||||
// 对字符串进行转义
|
||||
values.append(escapeSql(s));
|
||||
case null -> values.append("NULL");
|
||||
case Number ignored -> values.append(value); // 数字不需要加引号
|
||||
default ->
|
||||
// 其他类型统一转为字符串处理
|
||||
values.append(escapeSql(value.toString()));
|
||||
}
|
||||
|
||||
if (!key.equals(row.keySet().toArray()[row.size() - 1])) {
|
||||
values.append(", ");
|
||||
columns.append(", ");
|
||||
}
|
||||
});
|
||||
|
||||
inserts.add("INSERT INTO `" + table + "` (" + columns + ") VALUES (" + values + ");");
|
||||
}
|
||||
|
||||
inserts.add("\n"); // 每个表之间空一行
|
||||
return inserts;
|
||||
}
|
||||
|
||||
public String escapeSql(String value) {
|
||||
if (value == null) {
|
||||
return "NULL";
|
||||
}
|
||||
|
||||
int len = value.length();
|
||||
StringBuilder out = new StringBuilder(len + 16);
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
char c = value.charAt(i);
|
||||
switch (c) {
|
||||
case '\'':
|
||||
out.append("''");
|
||||
break;
|
||||
case '\\':
|
||||
out.append("\\\\");
|
||||
break;
|
||||
case '\0':
|
||||
out.append("\\0");
|
||||
break;
|
||||
case '\n':
|
||||
out.append("\\n");
|
||||
break;
|
||||
case '\r':
|
||||
out.append("\\r");
|
||||
break;
|
||||
case '\t':
|
||||
out.append("\\t");
|
||||
break;
|
||||
case '\b':
|
||||
out.append("\\b");
|
||||
break;
|
||||
case '\u001A': // Ctrl+Z
|
||||
out.append("\\Z");
|
||||
break;
|
||||
case '"':
|
||||
out.append("\\\"");
|
||||
break;
|
||||
case '\u001B':
|
||||
out.append("\\e");
|
||||
break;
|
||||
default:
|
||||
out.append(c);
|
||||
}
|
||||
}
|
||||
|
||||
return "'" + out.toString() + "'";
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
package io.gisbi.application.appcode.utils;
|
||||
|
||||
import org.springframework.util.FileCopyUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
public class ZipUtils {
|
||||
|
||||
public static void unzip(File zipFile, File outputFolder) throws IOException {
|
||||
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
|
||||
ZipEntry entry;
|
||||
while ((entry = zis.getNextEntry()) != null) {
|
||||
File file = new File(outputFolder, entry.getName());
|
||||
if (entry.isDirectory()) {
|
||||
Files.createDirectories(file.toPath());
|
||||
} else {
|
||||
Files.createDirectories(file.getParentFile().toPath());
|
||||
FileCopyUtils.copy(zis, new FileOutputStream(file));
|
||||
}
|
||||
zis.closeEntry();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void zipFolder(File folder, File zipFile) throws IOException {
|
||||
try (
|
||||
FileOutputStream fos = new FileOutputStream(zipFile);
|
||||
ZipOutputStream zos = new ZipOutputStream(fos)
|
||||
) {
|
||||
zipFile(folder, folder.getName(), zos);
|
||||
}
|
||||
}
|
||||
|
||||
private static void zipFile(File fileToZip, String fileName, ZipOutputStream zos) throws IOException {
|
||||
if (fileToZip.isDirectory()) {
|
||||
if (fileName.endsWith("/")) {
|
||||
zos.putNextEntry(new ZipEntry(fileName));
|
||||
zos.closeEntry();
|
||||
} else {
|
||||
zos.putNextEntry(new ZipEntry(fileName + "/"));
|
||||
zos.closeEntry();
|
||||
}
|
||||
|
||||
File[] children = fileToZip.listFiles();
|
||||
if (children != null) {
|
||||
for (File child : children) {
|
||||
zipFile(child, fileName + "/" + child.getName(), zos);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
try (FileInputStream fis = new FileInputStream(fileToZip)) {
|
||||
zos.putNextEntry(new ZipEntry(fileName));
|
||||
byte[] buffer = new byte[1024];
|
||||
int length;
|
||||
while ((length = fis.read(buffer)) > 0) {
|
||||
zos.write(buffer, 0, length);
|
||||
}
|
||||
zos.closeEntry();
|
||||
}
|
||||
}
|
||||
}
|
@ -3,6 +3,10 @@ package io.gisbi.chart.dao.auto.mapper;
|
||||
import io.gisbi.chart.dao.auto.entity.CoreChartView;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -15,4 +19,11 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
@Mapper
|
||||
public interface CoreChartViewMapper extends BaseMapper<CoreChartView> {
|
||||
|
||||
@Select("SELECT DISTINCT\n" +
|
||||
"\tccv.id \n" +
|
||||
"FROM\n" +
|
||||
"\tcore_chart_view ccv\n" +
|
||||
"\tINNER JOIN data_visualization_info dvi ON ccv.scene_id = dvi.id\n" +
|
||||
"\tWHERE dvi.app_id=#{appId}")
|
||||
List<Long> selectChatViewIds(@Param("appId")String appId);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
package io.gisbi.visualization.dao.auto.mapper;
|
||||
|
||||
import io.gisbi.visualization.dao.auto.entity.DataVisualizationInfo;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import io.gisbi.visualization.dao.auto.entity.DataVisualizationInfo;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
|
@ -3,6 +3,10 @@ package io.gisbi.visualization.dao.auto.mapper;
|
||||
import io.gisbi.visualization.dao.auto.entity.VisualizationLinkJumpInfo;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -15,4 +19,12 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
@Mapper
|
||||
public interface VisualizationLinkJumpInfoMapper extends BaseMapper<VisualizationLinkJumpInfo> {
|
||||
|
||||
@Select("SELECT\n" +
|
||||
"\tvlji.id \n" +
|
||||
"FROM\n" +
|
||||
"\tvisualization_link_jump_info vlji\n" +
|
||||
"\tINNER JOIN visualization_link_jump vlj ON vlj.id = vlji.link_jump_id\n" +
|
||||
"\tINNER JOIN data_visualization_info dvi ON dvi.id=vlj.source_dv_id\n" +
|
||||
"\tWHERE dvi.app_id =#{appId}")
|
||||
List<Long> selectInfoIds(@Param("appId")String appId);
|
||||
}
|
||||
|
@ -3,6 +3,10 @@ package io.gisbi.visualization.dao.auto.mapper;
|
||||
import io.gisbi.visualization.dao.auto.entity.VisualizationLinkJump;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -15,4 +19,12 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
@Mapper
|
||||
public interface VisualizationLinkJumpMapper extends BaseMapper<VisualizationLinkJump> {
|
||||
|
||||
@Select("SELECT\n" +
|
||||
"\tvlj.id \n" +
|
||||
"FROM\n" +
|
||||
"\tvisualization_link_jump vlj\n" +
|
||||
"\tINNER JOIN data_visualization_info dvi ON dvi.id = vlj.source_dv_id \n" +
|
||||
"WHERE\n" +
|
||||
"\tdvi.app_id = #{appId}")
|
||||
List<Long> selectLinkJumpIds(@Param("appId")String appId);
|
||||
}
|
||||
|
@ -3,6 +3,10 @@ package io.gisbi.visualization.dao.auto.mapper;
|
||||
import io.gisbi.visualization.dao.auto.entity.VisualizationLinkage;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -15,4 +19,14 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
@Mapper
|
||||
public interface VisualizationLinkageMapper extends BaseMapper<VisualizationLinkage> {
|
||||
|
||||
@Select("SELECT DISTINCT\n" +
|
||||
"\tccv.id \n" +
|
||||
"FROM\n" +
|
||||
"\tvisualization_linkage vl\n" +
|
||||
"\tINNER JOIN core_chart_view ccv ON vl.source_view_id = ccv.id\n" +
|
||||
"\tINNER JOIN data_visualization_info dvi ON ccv.scene_id = dvi.id \n" +
|
||||
"WHERE\n" +
|
||||
"\tdvi.app_id = #{appId}")
|
||||
List<Long> selectLinkageIds(@Param("appId")String appId);
|
||||
|
||||
}
|
||||
|
@ -3,6 +3,10 @@ package io.gisbi.visualization.dao.auto.mapper;
|
||||
import io.gisbi.visualization.dao.auto.entity.VisualizationOuterParamsInfo;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -15,4 +19,13 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
@Mapper
|
||||
public interface VisualizationOuterParamsInfoMapper extends BaseMapper<VisualizationOuterParamsInfo> {
|
||||
|
||||
@Select("SELECT\n" +
|
||||
"\tvopi.params_info_id \n" +
|
||||
"FROM\n" +
|
||||
"visualization_outer_params_info vopi \n" +
|
||||
"INNER JOIN visualization_outer_params vop ON vopi.params_id=vop.params_id\n" +
|
||||
"INNER JOIN data_visualization_info dvi ON vop.visualization_id = dvi.id \n" +
|
||||
"WHERE\n" +
|
||||
"\tdvi.app_id = #{appId}")
|
||||
List<Long> selectParamsInfoIds(@Param("appId")String appId);
|
||||
}
|
||||
|
@ -3,6 +3,10 @@ package io.gisbi.visualization.dao.auto.mapper;
|
||||
import io.gisbi.visualization.dao.auto.entity.VisualizationOuterParams;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -15,4 +19,12 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
@Mapper
|
||||
public interface VisualizationOuterParamsMapper extends BaseMapper<VisualizationOuterParams> {
|
||||
|
||||
@Select("SELECT\n" +
|
||||
"\tvop.params_id \n" +
|
||||
"FROM\n" +
|
||||
"\tvisualization_outer_params vop\n" +
|
||||
"\tINNER JOIN data_visualization_info dvi ON vop.visualization_id = dvi.id \n" +
|
||||
"WHERE\n" +
|
||||
"\tdvi.app_id = #{appId}")
|
||||
List<Long> selectOuterParamIds(@Param("appId")String appId);
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ import java.util.Map;
|
||||
@RequestMapping("/staticResource")
|
||||
public class StaticResourceServer implements StaticResourceApi {
|
||||
|
||||
@Value("${gisbi.path.static-resource:E:/opt/gisbi2.0/data/static-resource/}")
|
||||
@Value("${gisbi.path.static-resource:/opt/gisbi2.0/data/static-resource/}")
|
||||
private String staticDir;
|
||||
|
||||
@Override
|
||||
|
Loading…
Reference in New Issue
Block a user