You've already forked DataMate
feat(knowledge): 添加知识条目导出功能和文件上传支持
- 在 KnowledgeItemApplicationService 中新增 exportKnowledgeItems 方法实现知识条目导出 - 添加 export 相关常量配置包括文件名格式、内容类型等 - 在 KnowledgeItemRepository 中新增 findAllBySetId 查询方法 - 在 KnowledgeItemController 中新增 export 接口端点 - 在 KnowledgeItemEditor 组件中添加文件上传功能支持 txt/md/markdown 格式 - 在 KnowledgeSetDetail 页面中添加导出按钮并集成导出 API - 更新前端 API 文件添加 exportKnowledgeItemsUsingGet 方法 - 配置文件上传验证和自动填充标题内容逻辑
This commit is contained in:
@@ -27,10 +27,13 @@ import com.datamate.datamanagement.interfaces.dto.ImportKnowledgeItemsRequest;
|
||||
import com.datamate.datamanagement.interfaces.dto.KnowledgeItemPagingQuery;
|
||||
import com.datamate.datamanagement.interfaces.dto.KnowledgeItemResponse;
|
||||
import com.datamate.datamanagement.interfaces.dto.UpdateKnowledgeItemRequest;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@@ -40,6 +43,8 @@ import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
@@ -56,6 +61,10 @@ import java.util.UUID;
|
||||
@RequiredArgsConstructor
|
||||
public class KnowledgeItemApplicationService {
|
||||
private static final Set<String> SUPPORTED_TEXT_EXTENSIONS = Set.of("txt", "md", "markdown");
|
||||
private static final DateTimeFormatter EXPORT_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
|
||||
private static final String EXPORT_FILE_PREFIX = "knowledge_set_";
|
||||
private static final String EXPORT_FILE_SUFFIX = ".json";
|
||||
private static final String EXPORT_CONTENT_TYPE = "application/json";
|
||||
|
||||
private final KnowledgeItemRepository knowledgeItemRepository;
|
||||
private final KnowledgeSetRepository knowledgeSetRepository;
|
||||
@@ -214,12 +223,37 @@ public class KnowledgeItemApplicationService {
|
||||
return items;
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public void exportKnowledgeItems(String setId, HttpServletResponse response) {
|
||||
BusinessAssert.notNull(response, CommonErrorCode.PARAM_ERROR);
|
||||
KnowledgeSet knowledgeSet = requireKnowledgeSet(setId);
|
||||
List<KnowledgeItem> items = knowledgeItemRepository.findAllBySetId(setId);
|
||||
List<KnowledgeItemResponse> responses = KnowledgeConverter.INSTANCE.convertItemResponses(items);
|
||||
|
||||
response.setContentType(EXPORT_CONTENT_TYPE);
|
||||
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
|
||||
response.setHeader(HttpHeaders.CONTENT_DISPOSITION,
|
||||
"attachment; filename=\"" + buildExportFileName(knowledgeSet.getId()) + "\"");
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
try {
|
||||
objectMapper.writeValue(response.getOutputStream(), responses);
|
||||
} catch (IOException e) {
|
||||
log.error("export knowledge items error, setId: {}", setId, e);
|
||||
throw BusinessException.of(SystemErrorCode.FILE_SYSTEM_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
private KnowledgeSet requireKnowledgeSet(String setId) {
|
||||
KnowledgeSet knowledgeSet = knowledgeSetRepository.getById(setId);
|
||||
BusinessAssert.notNull(knowledgeSet, DataManagementErrorCode.KNOWLEDGE_SET_NOT_FOUND);
|
||||
return knowledgeSet;
|
||||
}
|
||||
|
||||
private String buildExportFileName(String setId) {
|
||||
return EXPORT_FILE_PREFIX + setId + "_" + LocalDateTime.now().format(EXPORT_TIME_FORMATTER) + EXPORT_FILE_SUFFIX;
|
||||
}
|
||||
|
||||
private KnowledgeContentType resolveContentType(DatasetFile datasetFile) {
|
||||
String extension = getFileExtension(datasetFile);
|
||||
if (StringUtils.isBlank(extension)) {
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.repository.IRepository;
|
||||
import com.datamate.datamanagement.domain.model.knowledge.KnowledgeItem;
|
||||
import com.datamate.datamanagement.interfaces.dto.KnowledgeItemPagingQuery;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 知识条目仓储接口
|
||||
@@ -12,4 +13,6 @@ public interface KnowledgeItemRepository extends IRepository<KnowledgeItem> {
|
||||
IPage<KnowledgeItem> findByCriteria(IPage<KnowledgeItem> page, KnowledgeItemPagingQuery query);
|
||||
|
||||
long countBySetId(String setId);
|
||||
|
||||
List<KnowledgeItem> findAllBySetId(String setId);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ import lombok.RequiredArgsConstructor;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 知识条目仓储实现类
|
||||
*/
|
||||
@@ -59,4 +61,11 @@ public class KnowledgeItemRepositoryImpl extends CrudRepository<KnowledgeItemMap
|
||||
return knowledgeItemMapper.selectCount(new LambdaQueryWrapper<KnowledgeItem>()
|
||||
.eq(KnowledgeItem::getSetId, setId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<KnowledgeItem> findAllBySetId(String setId) {
|
||||
return knowledgeItemMapper.selectList(new LambdaQueryWrapper<KnowledgeItem>()
|
||||
.eq(KnowledgeItem::getSetId, setId)
|
||||
.orderByDesc(KnowledgeItem::getCreatedAt));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.datamate.datamanagement.interfaces.rest;
|
||||
|
||||
import com.datamate.common.infrastructure.common.IgnoreResponseWrap;
|
||||
import com.datamate.common.interfaces.PagedResponse;
|
||||
import com.datamate.datamanagement.application.KnowledgeItemApplicationService;
|
||||
import com.datamate.datamanagement.domain.model.knowledge.KnowledgeItem;
|
||||
@@ -9,6 +10,7 @@ import com.datamate.datamanagement.interfaces.dto.ImportKnowledgeItemsRequest;
|
||||
import com.datamate.datamanagement.interfaces.dto.KnowledgeItemPagingQuery;
|
||||
import com.datamate.datamanagement.interfaces.dto.KnowledgeItemResponse;
|
||||
import com.datamate.datamanagement.interfaces.dto.UpdateKnowledgeItemRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.Valid;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -46,6 +48,12 @@ public class KnowledgeItemController {
|
||||
return KnowledgeConverter.INSTANCE.convertItemResponses(items);
|
||||
}
|
||||
|
||||
@IgnoreResponseWrap
|
||||
@GetMapping("/export")
|
||||
public void exportKnowledgeItems(@PathVariable("setId") String setId, HttpServletResponse response) {
|
||||
knowledgeItemApplicationService.exportKnowledgeItems(setId, response);
|
||||
}
|
||||
|
||||
@GetMapping("/{itemId}")
|
||||
public KnowledgeItemResponse getKnowledgeItemById(@PathVariable("setId") String setId,
|
||||
@PathVariable("itemId") String itemId) {
|
||||
|
||||
Reference in New Issue
Block a user