generator-code-server/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java

105 lines
3.7 KiB
Java
Raw Normal View History

2025-06-28 22:10:25 +08:00
package cn.bunny.service.impl;
import cn.bunny.core.vms.VmsCodeGeneratorService;
import cn.bunny.core.vms.VmsZipService;
2025-06-28 22:10:25 +08:00
import cn.bunny.domain.dto.VmsArgumentDto;
import cn.bunny.domain.vo.GeneratorVo;
import cn.bunny.domain.vo.VmsPathVo;
import cn.bunny.service.VmsService;
import cn.bunny.utils.ResourceFileUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.UUID;
2025-06-28 22:10:25 +08:00
import java.util.stream.Collectors;
2025-06-29 09:30:24 +08:00
/**
* VMS服务主实现类负责协调各子服务完成代码生成资源管理和打包下载功能
*/
2025-06-28 22:10:25 +08:00
@Service
@RequiredArgsConstructor
public class VmsServiceImpl implements VmsService {
2025-06-29 09:30:24 +08:00
private final VmsCodeGeneratorService codeGeneratorService;
private final VmsZipService zipService;
2025-06-28 22:10:25 +08:00
@Override
2025-06-29 09:30:24 +08:00
public Map<String, List<GeneratorVo>> generator(VmsArgumentDto dto) {
return codeGeneratorService.generateCode(dto);
2025-06-28 22:10:25 +08:00
}
2025-07-01 15:31:58 +08:00
/**
* 获取VMS资源文件路径列表并按类型分组
2025-07-01 15:31:58 +08:00
*
* @return 按类型分组的VMS路径Mapkey为类型value为对应类型的VMS路径列表
* @throws RuntimeException 当获取资源路径失败时抛出
2025-07-01 15:31:58 +08:00
*/
2025-06-28 22:10:25 +08:00
public Map<String, List<VmsPathVo>> vmsResourcePathList() {
2025-07-01 15:31:58 +08:00
try {
// 1. 获取vms目录下所有相对路径文件列表
List<String> vmsRelativeFiles = ResourceFileUtil.getRelativeFiles("vms");
// 2. 处理文件路径并分组
return vmsRelativeFiles.stream()
.map(this::convertToVmsPathVo) // 转换为VO对象
.collect(Collectors.groupingBy(VmsPathVo::getType)); // 按类型分组
2025-07-01 15:31:58 +08:00
} catch (Exception e) {
throw new RuntimeException("Failed to get VMS resource paths: " + e.getMessage(), e);
2025-07-01 15:31:58 +08:00
}
}
/**
* 将文件路径字符串转换为VmsPathVo对象
*
* @param vmFile 文件相对路径字符串
* @return 转换后的VmsPathVo对象
*/
private VmsPathVo convertToVmsPathVo(String vmFile) {
// 分割文件路径
String[] filepathList = vmFile.split("/");
// 获取文件名(不含扩展名)
String filename = filepathList[filepathList.length - 1].replace(".vm", "");
/*
生成前端可用的唯一DOM元素ID
格式: "id-" + 无横线的UUID (例如: "id-550e8400e29b41d4a716446655440000")
2025-07-01 15:31:58 +08:00
用途:
1. 用于关联label标签和input元素的for属性
2. 确保列表项在前端有唯一标识
*/
String id = "id-" + UUID.randomUUID().toString().replace("-", "");
2025-07-01 15:31:58 +08:00
return VmsPathVo.builder()
.id(id)
.name(vmFile)
.label(filename)
.type(filepathList[0]) // 使用路径的第一部分作为类型
.build();
2025-06-28 22:10:25 +08:00
}
@Override
public ResponseEntity<byte[]> downloadByZip(VmsArgumentDto dto) {
// 创建ZIP文件
2025-06-29 09:30:24 +08:00
byte[] zipBytes = zipService.createZipFile(dto);
2025-06-28 22:10:25 +08:00
2025-06-29 09:30:24 +08:00
// 下载文件名称
String uuid = UUID.randomUUID().toString().split("-")[0];
String generateZipFilename = "code-" + uuid + ".zip";
2025-06-28 22:10:25 +08:00
2025-06-29 09:30:24 +08:00
// 设置响应头
2025-06-28 22:10:25 +08:00
HttpHeaders headers = new HttpHeaders();
2025-06-29 09:30:24 +08:00
headers.add("Content-Disposition", "attachment; filename=" + generateZipFilename);
2025-06-28 22:10:25 +08:00
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
2025-06-29 09:30:24 +08:00
return new ResponseEntity<>(zipBytes, headers, HttpStatus.OK);
2025-06-28 22:10:25 +08:00
}
2025-06-29 09:30:24 +08:00
}