mirror of
https://github.com/CodePhiliaX/Chat2DB.git
synced 2025-09-21 03:53:24 +08:00
Merge remote-tracking branch 'origin/developing' into developing
This commit is contained in:
@ -0,0 +1,36 @@
|
|||||||
|
package ai.chat2db.server.domain.api.enums;
|
||||||
|
|
||||||
|
import ai.chat2db.server.tools.base.enums.BaseEnum;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How much data is currently needed at the beginning
|
||||||
|
*
|
||||||
|
* @author Jiaju Zhuang
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public enum ExportSizeEnum implements BaseEnum<String> {
|
||||||
|
/**
|
||||||
|
* CURRENT_PAGE
|
||||||
|
*/
|
||||||
|
CURRENT_PAGE("CURRENT_PAGE"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ALL
|
||||||
|
*/
|
||||||
|
ALL("ALL"),
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
final String description;
|
||||||
|
|
||||||
|
ExportSizeEnum(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCode() {
|
||||||
|
return this.name();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package ai.chat2db.server.domain.api.enums;
|
||||||
|
|
||||||
|
import ai.chat2db.server.tools.base.enums.BaseEnum;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* export type
|
||||||
|
*
|
||||||
|
* @author Jiaju Zhuang
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public enum ExportTypeEnum implements BaseEnum<String> {
|
||||||
|
/**
|
||||||
|
* CSV
|
||||||
|
*/
|
||||||
|
CSV("CSV"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* INSERT
|
||||||
|
*/
|
||||||
|
INSERT("INSERT"),
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
final String description;
|
||||||
|
|
||||||
|
ExportTypeEnum(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCode() {
|
||||||
|
return this.name();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -22,6 +22,6 @@ public class ParamBusinessException extends BusinessException {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ParamBusinessException(String paramString) {
|
public ParamBusinessException(String paramString) {
|
||||||
super("common.paramDetailError");
|
super("common.paramDetailError", new Object[] {paramString});
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -52,6 +52,10 @@
|
|||||||
<groupId>com.dtflys.forest</groupId>
|
<groupId>com.dtflys.forest</groupId>
|
||||||
<artifactId>forest-spring-boot3-starter</artifactId>
|
<artifactId>forest-spring-boot3-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>easyexcel</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -4,19 +4,15 @@ import java.util.List;
|
|||||||
|
|
||||||
import ai.chat2db.server.domain.api.param.DlExecuteParam;
|
import ai.chat2db.server.domain.api.param.DlExecuteParam;
|
||||||
import ai.chat2db.server.domain.api.service.DlTemplateService;
|
import ai.chat2db.server.domain.api.service.DlTemplateService;
|
||||||
import ai.chat2db.spi.model.ExecuteResult;
|
|
||||||
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
|
|
||||||
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
|
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
|
||||||
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
|
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
|
||||||
import ai.chat2db.server.web.api.aspect.ConnectionInfoAspect;
|
import ai.chat2db.server.web.api.aspect.ConnectionInfoAspect;
|
||||||
import ai.chat2db.server.web.api.controller.rdb.converter.RdbWebConverter;
|
import ai.chat2db.server.web.api.controller.rdb.converter.RdbWebConverter;
|
||||||
import ai.chat2db.server.web.api.controller.rdb.request.DataExportRequest;
|
|
||||||
import ai.chat2db.server.web.api.controller.rdb.request.DdlCountRequest;
|
import ai.chat2db.server.web.api.controller.rdb.request.DdlCountRequest;
|
||||||
import ai.chat2db.server.web.api.controller.rdb.request.DmlRequest;
|
import ai.chat2db.server.web.api.controller.rdb.request.DmlRequest;
|
||||||
import ai.chat2db.server.web.api.controller.rdb.vo.ExecuteResultVO;
|
import ai.chat2db.server.web.api.controller.rdb.vo.ExecuteResultVO;
|
||||||
|
import ai.chat2db.spi.model.ExecuteResult;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
@ -40,39 +36,6 @@ public class RdbDmlController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private DlTemplateService dlTemplateService;
|
private DlTemplateService dlTemplateService;
|
||||||
|
|
||||||
/**
|
|
||||||
* 导出结果集Excel
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@GetMapping("/export/excel")
|
|
||||||
public ActionResult export(DataExportRequest request) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 导出结果集Insert
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@GetMapping("/export/insert")
|
|
||||||
public ActionResult exportInsert(DataExportRequest request) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 导出选中行Insert
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@GetMapping("/export/insert/selected")
|
|
||||||
public ActionResult exportInsertSelected(DataExportRequest request) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 增删改查等数据运维
|
* 增删改查等数据运维
|
||||||
*
|
*
|
||||||
|
@ -0,0 +1,134 @@
|
|||||||
|
package ai.chat2db.server.web.api.controller.rdb;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.alibaba.excel.EasyExcel;
|
||||||
|
import com.alibaba.excel.ExcelWriter;
|
||||||
|
import com.alibaba.excel.support.ExcelTypeEnum;
|
||||||
|
import com.alibaba.excel.util.BeanMapUtils;
|
||||||
|
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
|
||||||
|
import com.alibaba.excel.write.metadata.WriteSheet;
|
||||||
|
|
||||||
|
import ai.chat2db.server.domain.api.enums.ExportSizeEnum;
|
||||||
|
import ai.chat2db.server.domain.api.enums.ExportTypeEnum;
|
||||||
|
import ai.chat2db.server.domain.api.service.DlTemplateService;
|
||||||
|
import ai.chat2db.server.tools.common.exception.ParamBusinessException;
|
||||||
|
import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
|
||||||
|
import ai.chat2db.server.tools.common.util.EasyEnumUtils;
|
||||||
|
import ai.chat2db.server.web.api.aspect.ConnectionInfoAspect;
|
||||||
|
import ai.chat2db.server.web.api.controller.rdb.converter.RdbWebConverter;
|
||||||
|
import ai.chat2db.server.web.api.controller.rdb.request.DataExportRequest;
|
||||||
|
import ai.chat2db.spi.sql.Chat2DBContext;
|
||||||
|
import ai.chat2db.spi.sql.SQLExecutor;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.SuperBuilder;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.cglib.beans.BeanMap;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export Database Exclusive
|
||||||
|
*
|
||||||
|
* @author Jiaju Zhuang
|
||||||
|
*/
|
||||||
|
@ConnectionInfoAspect
|
||||||
|
@RequestMapping("/api/rdb/dml")
|
||||||
|
@Controller
|
||||||
|
@Slf4j
|
||||||
|
public class RdbDmlExportController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RdbWebConverter rdbWebConverter;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DlTemplateService dlTemplateService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* export data
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping("/export")
|
||||||
|
public void export(@Valid @RequestBody DataExportRequest request, HttpServletResponse response) throws IOException {
|
||||||
|
ExportSizeEnum exportSize = EasyEnumUtils.getEnum(ExportSizeEnum.class, request.getExportSize());
|
||||||
|
ExportTypeEnum exportType = EasyEnumUtils.getEnum(ExportTypeEnum.class, request.getExportType());
|
||||||
|
BeanMap beanMap = BeanMap.create(request);
|
||||||
|
log.info("x:{}", beanMap.get("sql"));
|
||||||
|
|
||||||
|
com.alibaba.excel.support.cglib.beans.BeanMap beanMap2 = BeanMapUtils.create(request);
|
||||||
|
log.info("te:{}", beanMap2.get("sql"));
|
||||||
|
|
||||||
|
if (exportType == ExportTypeEnum.CSV) {
|
||||||
|
doExportCsv(exportSize, request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doExportCsv(ExportSizeEnum exportSize, DataExportRequest request, HttpServletResponse response)
|
||||||
|
throws IOException {
|
||||||
|
String sql;
|
||||||
|
if (exportSize == ExportSizeEnum.CURRENT_PAGE) {
|
||||||
|
sql = request.getSql();
|
||||||
|
} else {
|
||||||
|
sql = request.getOriginalSql();
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(sql)) {
|
||||||
|
throw new ParamBusinessException("exportSize");
|
||||||
|
}
|
||||||
|
//
|
||||||
|
//ublic void download(HttpServletResponse response) throws IOException {
|
||||||
|
// // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
|
||||||
|
response.setContentType("text/csv");
|
||||||
|
response.setCharacterEncoding("utf-8");
|
||||||
|
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
|
||||||
|
String fileName = URLEncoder.encode("测试", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
|
||||||
|
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".csv");
|
||||||
|
// EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
|
||||||
|
|
||||||
|
ExcelWrapper excelWrapper = new ExcelWrapper();
|
||||||
|
try {
|
||||||
|
ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(response.getOutputStream())
|
||||||
|
.excelType(ExcelTypeEnum.CSV);
|
||||||
|
excelWrapper.setExcelWriterBuilder(excelWriterBuilder);
|
||||||
|
SQLExecutor.getInstance().executeSql(Chat2DBContext.getConnection(), sql, headerList -> {
|
||||||
|
excelWriterBuilder.head(
|
||||||
|
EasyCollectionUtils.toList(headerList, header -> Lists.newArrayList(header.getName())));
|
||||||
|
excelWrapper.setExcelWriter(excelWriterBuilder.build());
|
||||||
|
excelWrapper.setWriteSheet(EasyExcel.writerSheet(0).build());
|
||||||
|
}, dataList -> {
|
||||||
|
List<List<String>> writeDataList = Lists.newArrayList();
|
||||||
|
writeDataList.add(dataList);
|
||||||
|
excelWrapper.getExcelWriter().write(writeDataList, excelWrapper.getWriteSheet());
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
if (excelWrapper.getExcelWriter() != null) {
|
||||||
|
excelWrapper.getExcelWriter().finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@SuperBuilder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class ExcelWrapper {
|
||||||
|
private ExcelWriterBuilder excelWriterBuilder;
|
||||||
|
private ExcelWriter excelWriter;
|
||||||
|
private WriteSheet writeSheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,12 +1,9 @@
|
|||||||
package ai.chat2db.server.web.api.controller.rdb.request;
|
package ai.chat2db.server.web.api.controller.rdb.request;
|
||||||
|
|
||||||
import java.util.List;
|
import ai.chat2db.server.domain.api.enums.ExportSizeEnum;
|
||||||
|
import ai.chat2db.server.domain.api.enums.ExportTypeEnum;
|
||||||
|
import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequest;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
|
||||||
import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequest;
|
|
||||||
import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequest;
|
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -16,21 +13,29 @@ import lombok.Data;
|
|||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class DataExportRequest extends DataSourceBaseRequest {
|
public class DataExportRequest extends DataSourceBaseRequest {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出sql语句
|
* Executed SQL
|
||||||
*/
|
*/
|
||||||
@NotNull
|
|
||||||
private String sql;
|
private String sql;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 控制台id
|
* Original SQL without pagination
|
||||||
*/
|
*/
|
||||||
@NotNull
|
private String originalSql;
|
||||||
private Long consoleId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出行ID列表
|
* export type
|
||||||
|
*
|
||||||
|
* @see ExportTypeEnum
|
||||||
*/
|
*/
|
||||||
private List<Long> exportIds;
|
@NotNull
|
||||||
|
private String exportType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How much data is currently needed at the beginning
|
||||||
|
*
|
||||||
|
* @see ExportSizeEnum
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
private String exportSize;
|
||||||
}
|
}
|
||||||
|
@ -8,20 +8,26 @@ import java.sql.Statement;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
|
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
|
||||||
import ai.chat2db.server.tools.common.util.I18nUtils;
|
import ai.chat2db.server.tools.common.util.I18nUtils;
|
||||||
import ai.chat2db.spi.model.*;
|
import ai.chat2db.spi.model.ExecuteResult;
|
||||||
|
import ai.chat2db.spi.model.Header;
|
||||||
|
import ai.chat2db.spi.model.Procedure;
|
||||||
|
import ai.chat2db.spi.model.Table;
|
||||||
|
import ai.chat2db.spi.model.TableColumn;
|
||||||
|
import ai.chat2db.spi.model.TableIndex;
|
||||||
|
import ai.chat2db.spi.model.TableIndexColumn;
|
||||||
import ai.chat2db.spi.util.ResultSetUtils;
|
import ai.chat2db.spi.util.ResultSetUtils;
|
||||||
import cn.hutool.core.date.TimeInterval;
|
import cn.hutool.core.date.TimeInterval;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.jdbc.support.JdbcUtils;
|
import org.springframework.jdbc.support.JdbcUtils;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import static ai.chat2db.spi.util.ResultSetUtils.buildColumn;
|
import static ai.chat2db.spi.util.ResultSetUtils.buildColumn;
|
||||||
import static ai.chat2db.spi.util.ResultSetUtils.buildFunction;
|
import static ai.chat2db.spi.util.ResultSetUtils.buildFunction;
|
||||||
@ -67,7 +73,7 @@ public class SQLExecutor {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public <R> R executeSql(Connection connection, String sql, Function<ResultSet, R> function) {
|
public <R> R executeSql(Connection connection, String sql, Function<ResultSet, R> function) {
|
||||||
if (StringUtils.isEmpty(sql)) {
|
if (StringUtils.isBlank(sql)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
log.info("execute:{}", sql);
|
log.info("execute:{}", sql);
|
||||||
@ -85,6 +91,48 @@ public class SQLExecutor {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void executeSql(Connection connection, String sql, Consumer<List<Header>> headerConsumer,
|
||||||
|
Consumer<List<String>> rowConsumer) {
|
||||||
|
Assert.notNull(sql, "SQL must not be null");
|
||||||
|
log.info("execute:{}", sql);
|
||||||
|
try (Statement stmt = connection.createStatement();) {
|
||||||
|
boolean query = stmt.execute(sql);
|
||||||
|
// 代表是查询
|
||||||
|
if (query) {
|
||||||
|
ResultSet rs = null;
|
||||||
|
try {
|
||||||
|
rs = stmt.getResultSet();
|
||||||
|
// 获取有几列
|
||||||
|
ResultSetMetaData resultSetMetaData = rs.getMetaData();
|
||||||
|
int col = resultSetMetaData.getColumnCount();
|
||||||
|
|
||||||
|
// 获取header信息
|
||||||
|
List<Header> headerList = Lists.newArrayListWithExpectedSize(col);
|
||||||
|
for (int i = 1; i <= col; i++) {
|
||||||
|
headerList.add(Header.builder()
|
||||||
|
.dataType(ai.chat2db.spi.util.JdbcUtils.resolveDataType(
|
||||||
|
resultSetMetaData.getColumnTypeName(i), resultSetMetaData.getColumnType(i)).getCode())
|
||||||
|
.name(ResultSetUtils.getColumnName(resultSetMetaData, i))
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
headerConsumer.accept(headerList);
|
||||||
|
|
||||||
|
while (rs.next()) {
|
||||||
|
List<String> row = Lists.newArrayListWithExpectedSize(col);
|
||||||
|
for (int i = 1; i <= col; i++) {
|
||||||
|
row.add(ai.chat2db.spi.util.JdbcUtils.getResultSetValue(rs, i));
|
||||||
|
}
|
||||||
|
rowConsumer.accept(row);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
JdbcUtils.closeResultSet(rs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行sql
|
* 执行sql
|
||||||
*
|
*
|
||||||
@ -100,7 +148,7 @@ public class SQLExecutor {
|
|||||||
try (Statement stmt = connection.createStatement()) {
|
try (Statement stmt = connection.createStatement()) {
|
||||||
stmt.setFetchSize(EasyToolsConstant.MAX_PAGE_SIZE);
|
stmt.setFetchSize(EasyToolsConstant.MAX_PAGE_SIZE);
|
||||||
TimeInterval timeInterval = new TimeInterval();
|
TimeInterval timeInterval = new TimeInterval();
|
||||||
boolean query = stmt.execute(sql.replaceFirst(";", ""));
|
boolean query = stmt.execute(sql);
|
||||||
executeResult.setDescription(I18nUtils.getMessage("sqlResult.success"));
|
executeResult.setDescription(I18nUtils.getMessage("sqlResult.success"));
|
||||||
// 代表是查询
|
// 代表是查询
|
||||||
if (query) {
|
if (query) {
|
||||||
|
@ -249,6 +249,11 @@
|
|||||||
<artifactId>commons-io</artifactId>
|
<artifactId>commons-io</artifactId>
|
||||||
<version>2.7</version>
|
<version>2.7</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>easyexcel</artifactId>
|
||||||
|
<version>3.3.2</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user