From a31d6400e92ddf9d4b4e1927a42aa32ae9279084 Mon Sep 17 00:00:00 2001 From: cyc Date: Thu, 2 Apr 2026 08:56:05 +0800 Subject: [PATCH] =?UTF-8?q?skill=E6=A8=A1=E5=9D=97=E8=81=94=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/skills/SkillsController.java | 10 ++++++ .../ruoyi/platform/service/SkillService.java | 2 ++ .../service/impl/SkillServiceImpl.java | 33 ++++++++++++++++--- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/skills/SkillsController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/skills/SkillsController.java index 37c1c580..e3d16b08 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/skills/SkillsController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/skills/SkillsController.java @@ -105,4 +105,14 @@ public class SkillsController extends BaseController { public AjaxResult uploadDataset(@RequestParam("file") MultipartFile files) throws Exception { return AjaxResult.success(skillService.upload(files)); } + + /** + * 下载 + * + */ + @GetMapping("/download") + @ApiOperation("下载结果文件") + public GenericsAjaxResult download(@RequestParam("url") String url) throws Exception { + return genericsSuccess(skillService.download(url)); + } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/SkillService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/SkillService.java index 994cc711..5bcb1809 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/SkillService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/SkillService.java @@ -29,4 +29,6 @@ public interface SkillService { Skill unpraise(Long id); Map upload(MultipartFile files) throws IOException; + + String download(String url) throws Exception; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/SkillServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/SkillServiceImpl.java index 251f7362..44e2accf 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/SkillServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/SkillServiceImpl.java @@ -12,6 +12,7 @@ import com.ruoyi.platform.mapper.ApprovalInfoMapper; import com.ruoyi.platform.mapper.SkillDao; import com.ruoyi.platform.service.MinioService; import com.ruoyi.platform.service.SkillService; +import com.ruoyi.platform.utils.MinioUtil; import com.ruoyi.platform.vo.SkillVo; import com.ruoyi.system.api.constant.Constant; import com.ruoyi.system.api.model.LoginUser; @@ -51,6 +52,8 @@ public class SkillServiceImpl implements SkillService { private ApprovalInfoMapper approvalInfoMapper; @Resource private MinioService minioService; + @Resource + private MinioUtil minioUtil; @Override public Page queryByPage(Skill skill, PageRequest pageRequest) { @@ -73,6 +76,7 @@ public class SkillServiceImpl implements SkillService { String username = SecurityUtils.getLoginUser().getUsername(); skill.setCreateBy(username); skill.setUpdateBy(username); + skill.setPraisesCount(0); skillDao.save(skill); return skill; } @@ -158,7 +162,7 @@ public class SkillServiceImpl implements SkillService { @Override public Skill unpraise(Long id) { Skill skill = skillDao.getSkillById(id); - int praiseCount = skill.getPraisesCount() == null?0:skill.getPraisesCount() - 1; + int praiseCount = skill.getPraisesCount() == null ? 0 : skill.getPraisesCount() - 1; skill.setPraisesCount(praiseCount); skillDao.edit(skill); return skill; @@ -177,10 +181,10 @@ public class SkillServiceImpl implements SkillService { skill.setMdContent(IoUtil.read(file.getInputStream(), StandardCharsets.UTF_8)); } else if ("zip".equals(fileType)) { // 解析 ZIP,直接填充 metadata 的 directoryTree 和 contentText - parseZipAndFillMetadata(file.getInputStream(), skill); + parseZipAndFillMetadata(file.getInputStream(), skill, originalFilename.substring(0, originalFilename.length() - 4)); } - String savePath = "/mini-model-platform-data/skill_file/upload/" + "/" + cn.hutool.core.lang.UUID.fastUUID() + "/" + file.getOriginalFilename(); + String savePath = "/mini-model-platform-data/skill_file/upload/" + "/" + cn.hutool.core.lang.UUID.fastUUID() + "/" + file.getOriginalFilename(); HashMap result = MapUtil.newHashMap(); result.put("file_name", file.getOriginalFilename()); result.put("file_path", savePath); @@ -199,16 +203,33 @@ public class SkillServiceImpl implements SkillService { return result; } + @Override + public String download(String url) throws Exception { + return minioUtil.downloadUrlWithResponseHeader(bucketName, url); + } + /** * 解析 ZIP 包,直接填充 metadata 的 directoryTree 和 contentText */ - private void parseZipAndFillMetadata(InputStream inputStream, Skill skill) throws IOException { + private void parseZipAndFillMetadata(InputStream inputStream, Skill skill, String zipFileName) throws IOException { + // 创建 ZIP 根文件夹节点 + Map zipRootNode = new HashMap<>(); + zipRootNode.put("name", zipFileName); + List> zipRootChildren = new ArrayList<>(); + zipRootNode.put("children", zipRootChildren); + + // 根节点列表(包含 ZIP 根文件夹) List> rootChildren = new ArrayList<>(); + rootChildren.add(zipRootNode); + Map> pathToNode = new HashMap<>(); Map rootNode = new HashMap<>(); rootNode.put("children", rootChildren); pathToNode.put("", rootNode); + // 将 ZIP 根文件夹添加到路径映射中 + pathToNode.put(zipFileName, zipRootNode); + StringBuilder skillMdContent = new StringBuilder(); try (ZipInputStream zis = new ZipInputStream(inputStream)) { @@ -237,7 +258,9 @@ public class SkillServiceImpl implements SkillService { cleanName = cleanName.substring(0, cleanName.length() - 1); } - String[] parts = StrUtil.splitToArray(cleanName, '/'); + // 构建包含 ZIP 根文件夹的完整路径 + String fullPathWithRoot = zipFileName + "/" + cleanName; + String[] parts = StrUtil.splitToArray(fullPathWithRoot, '/'); StringBuilder currentPath = new StringBuilder(); Map parentNode = pathToNode.get("");