机器管理代码格式化提交
This commit is contained in:
parent
c26a183209
commit
ea35ed1f0b
@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static cd.casic.framework.commons.pojo.CommonResult.success;
|
||||
@ -51,7 +52,7 @@ public class MachineEnvController {
|
||||
|
||||
@DeleteMapping("/deleteList")
|
||||
@Operation(summary = "批量删除机器环境变量")
|
||||
public CommonResult deleteList(@RequestParam String ids){
|
||||
public CommonResult deleteList(@RequestParam String ids) {
|
||||
machineEnvService.deleteList(ids);
|
||||
return success(true);
|
||||
}
|
||||
@ -64,7 +65,7 @@ public class MachineEnvController {
|
||||
|
||||
|
||||
@PostMapping("/list")
|
||||
@Operation(summary ="获取环境变量列表")
|
||||
@Operation(summary = "获取环境变量列表")
|
||||
public CommonResult list(@RequestBody MachineEnvDTO machineEnvDTO) {
|
||||
return success(machineEnvService.listEnv(machineEnvDTO));
|
||||
}
|
||||
|
@ -103,8 +103,8 @@ public class MachineInfoController {
|
||||
@PostMapping("/execute/{sessionId}")
|
||||
@Operation(summary = "执行远程命令")
|
||||
public CommonResult<String> executeCommand(
|
||||
@PathVariable String sessionId,
|
||||
@RequestBody String command) {
|
||||
@PathVariable String sessionId,
|
||||
@RequestBody String command) {
|
||||
|
||||
return success(machineInfoService.executeCommand(sessionId, command));
|
||||
}
|
||||
@ -112,18 +112,18 @@ public class MachineInfoController {
|
||||
@PostMapping("/upload/{sessionId}")
|
||||
@Operation(summary = "上传文件到远程机器")
|
||||
public CommonResult<Boolean> uploadFile(
|
||||
@PathVariable String sessionId,
|
||||
@RequestParam String localFilePath,
|
||||
@RequestParam String remoteFilePath) {
|
||||
@PathVariable String sessionId,
|
||||
@RequestParam String localFilePath,
|
||||
@RequestParam String remoteFilePath) {
|
||||
return success(machineInfoService.uploadFile(sessionId, localFilePath, remoteFilePath));
|
||||
}
|
||||
|
||||
@PostMapping("/download/{sessionId}")
|
||||
@Operation(summary = "从远程机器下载文件")
|
||||
public CommonResult<Boolean> downloadFile(
|
||||
@PathVariable String sessionId,
|
||||
@RequestParam String remoteFilePath,
|
||||
@RequestParam String localFilePath) {
|
||||
@PathVariable String sessionId,
|
||||
@RequestParam String remoteFilePath,
|
||||
@RequestParam String localFilePath) {
|
||||
return success(machineInfoService.downloadFile(sessionId, remoteFilePath, localFilePath));
|
||||
}
|
||||
}
|
||||
|
@ -27,42 +27,43 @@ public class MachineProxyController {
|
||||
private MachineProxyService machineProxyService;
|
||||
|
||||
@PostMapping("/register")
|
||||
@Operation(summary ="注册新的机器代理")
|
||||
@Operation(summary = "注册新的机器代理")
|
||||
public CommonResult register(@RequestBody MachineProxyDTO machineProxyDTO) {
|
||||
machineProxyService.register(machineProxyDTO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@PostMapping("/list")
|
||||
@Operation(summary ="获取代理列表")
|
||||
public CommonResult list(MachineProxyDTO machineProxyDTO) {
|
||||
@Operation(summary = "获取代理列表")
|
||||
public CommonResult list(@RequestBody MachineProxyDTO machineProxyDTO) {
|
||||
return success(machineProxyService.list(machineProxyDTO));
|
||||
}
|
||||
|
||||
@PutMapping("/updateStatus")
|
||||
@Operation(summary ="更新代理状态")
|
||||
@Operation(summary = "更新代理状态")
|
||||
public CommonResult updateStatus(@RequestBody MachineProxyDTO machineProxyDTO) {
|
||||
machineProxyService.updateStatus(machineProxyDTO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/statistics/status")
|
||||
@Operation(summary ="获取所有代理的状态统计")
|
||||
@Operation(summary = "获取所有代理的状态统计")
|
||||
public CommonResult getStatusStatistics() {
|
||||
return success(machineProxyService.getStatusStatistics());
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary ="更新代理信息")
|
||||
@Operation(summary = "更新代理信息")
|
||||
public CommonResult updateConfig(@RequestBody MachineProxyDTO machineProxyDTO) {
|
||||
machineProxyService.update(machineProxyDTO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/batch")
|
||||
@Operation(summary ="批量删除代理")
|
||||
@Operation(summary = "批量删除代理")
|
||||
public CommonResult deleteBatch(@RequestParam String ids) {
|
||||
return success(machineProxyService.delete(ids));
|
||||
machineProxyService.delete(ids);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
package cd.casic.module.machine.controller;
|
||||
|
||||
import cd.casic.framework.commons.pojo.CommonResult;
|
||||
import cd.casic.module.machine.entity.SecretKey;
|
||||
import cd.casic.module.machine.service.SecretKeyService;
|
||||
@ -23,51 +24,51 @@ import static cd.casic.framework.commons.pojo.CommonResult.success;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/secretKey")
|
||||
@Tag(name = "密钥管理")
|
||||
@Tag(name = "密钥管理")
|
||||
public class SecretKeyController {
|
||||
@Resource
|
||||
private SecretKeyService secretKeyService;
|
||||
|
||||
@PostMapping(value = "/add", consumes = "multipart/form-data")
|
||||
@Operation(summary ="新增密钥")
|
||||
@Operation(summary = "新增密钥")
|
||||
public CommonResult<Boolean> add(@RequestBody SecretKeyDto secretKeyDto, @RequestPart("file") MultipartFile file) {
|
||||
return success(secretKeyService.addSecretKey(secretKeyDto, file));
|
||||
}
|
||||
|
||||
@PutMapping("/bindingMachine")
|
||||
@Operation(summary ="绑定机器")
|
||||
@Operation(summary = "绑定机器")
|
||||
public CommonResult<Boolean> bindingMachine(@RequestBody SecretKeyDto secretKeyDto) {
|
||||
secretKeyService.bindingMachine(secretKeyDto);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary ="编辑密钥信息")
|
||||
@Operation(summary = "编辑密钥信息")
|
||||
public CommonResult<Boolean> update(@RequestBody SecretKeyDto secretKeyDto, @RequestPart(value = "file", required = false) MultipartFile file) {
|
||||
return success(secretKeyService.updateSecretKey(secretKeyDto, file));
|
||||
}
|
||||
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary ="删除密钥")
|
||||
@Operation(summary = "删除密钥")
|
||||
public CommonResult<Boolean> delete(@RequestParam Long secretKeyId) {
|
||||
return success(secretKeyService.deleteSecretKey(secretKeyId));
|
||||
}
|
||||
|
||||
@DeleteMapping("/deleteList")
|
||||
@Operation(summary ="批量删除密钥")
|
||||
@Operation(summary = "批量删除密钥")
|
||||
public CommonResult<Boolean> deleteList(@RequestParam String secretKeyIds) {
|
||||
return success(secretKeyService.deleteList(secretKeyIds));
|
||||
}
|
||||
|
||||
@PostMapping("/list")
|
||||
@Operation(summary ="获取密钥信息列表")
|
||||
@Operation(summary = "获取密钥信息列表")
|
||||
public CommonResult<PageResult<SecretKey>> list(@RequestBody SecretKeyDto secretKeyDto) {
|
||||
return success(secretKeyService.listSecretKey(secretKeyDto));
|
||||
}
|
||||
|
||||
@GetMapping("/downloadSecretKeyFile")
|
||||
@Operation(summary ="下载密钥文件")
|
||||
@Operation(summary = "下载密钥文件")
|
||||
public CommonResult<InputStreamResource> downloadSecretKeyFile(@RequestParam("secretKeyId") Long secretKeyId) {
|
||||
return success(secretKeyService.downloadSecretKeyFile(secretKeyId).getBody());
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
package cd.casic.module.machine.dto;
|
||||
|
||||
import cd.casic.module.machine.enums.MachineProxyStatus;
|
||||
import lombok.*;
|
||||
|
||||
@ -40,6 +41,6 @@ public class MachineProxyDTO extends PageDto implements Serializable {
|
||||
// 假设5分钟内有心跳为在线
|
||||
long fiveMinutes = 5 * 60 * 1000;
|
||||
return Objects.equals(MachineProxyStatus.ONLINE.getMessage(), status) &&
|
||||
System.currentTimeMillis() - lastHeartbeatTime.getTime() < fiveMinutes;
|
||||
System.currentTimeMillis() - lastHeartbeatTime.getTime() < fiveMinutes;
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ package cd.casic.module.machine.dto;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PageDto{
|
||||
public class PageDto {
|
||||
private int pageIndex = 1;
|
||||
|
||||
private int pageSize = 10;
|
||||
|
@ -15,7 +15,7 @@ import lombok.NoArgsConstructor;
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@TableName(value = "machine_info")
|
||||
public class MachineInfo extends BaseEntity{
|
||||
public class MachineInfo extends BaseEntity {
|
||||
@TableField(value = "name")
|
||||
private String name;
|
||||
|
||||
|
@ -1,4 +1,6 @@
|
||||
package cd.casic.module.machine.entity;
|
||||
|
||||
import cd.casic.module.machine.enums.MachineProxyStatus;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import cd.casic.module.machine.enums.MachineInfoStatus;
|
||||
import cd.casic.module.machine.enums.MachineProxyType;
|
||||
@ -45,7 +47,7 @@ public class MachineProxy extends BaseEntity implements Serializable {
|
||||
* 代理状态 (online, offline, installing, updating, error)
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private MachineInfoStatus status;
|
||||
private MachineProxyStatus status;
|
||||
|
||||
@TableField(value = "status_code")
|
||||
private int statusCode;
|
||||
@ -67,5 +69,4 @@ public class MachineProxy extends BaseEntity implements Serializable {
|
||||
private String description;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -10,11 +10,11 @@ public enum MachineProxyStatus implements CodeEnum {
|
||||
/**
|
||||
* 代理状态 (online, offline, installing, updating, error)
|
||||
*/
|
||||
ONLINE(1,"online"),
|
||||
OFFLINE(2,"offline"),
|
||||
INSTALLING(3,"installing"),
|
||||
UPDATING(4,"updating"),
|
||||
ERROR(5,"error");
|
||||
ONLINE(1, "online"),
|
||||
OFFLINE(2, "offline"),
|
||||
INSTALLING(3, "installing"),
|
||||
UPDATING(4, "updating"),
|
||||
ERROR(5, "error");
|
||||
|
||||
private final int code;
|
||||
|
||||
|
@ -7,9 +7,9 @@ import lombok.Getter;
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum MachineProxyType implements CodeEnum {
|
||||
HTTP(1,"http"),
|
||||
SOCKS4(2,"socks4"),
|
||||
SOCKS5(3,"socks5");
|
||||
HTTP(1, "http"),
|
||||
SOCKS4(2, "socks4"),
|
||||
SOCKS5(3, "socks5");
|
||||
|
||||
private final int code;
|
||||
|
||||
|
@ -7,8 +7,8 @@ import lombok.Getter;
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum RequestExceptionEnum implements CodeEnum {
|
||||
REQUEST_TYPE_NOT_JSON(1,"传递参数格式错误,请使用json格式"),
|
||||
REQUEST_JSON_ERROR(2,"json格式错误"),
|
||||
REQUEST_TYPE_NOT_JSON(1, "传递参数格式错误,请使用json格式"),
|
||||
REQUEST_JSON_ERROR(2, "json格式错误"),
|
||||
REQUEST_METHOD_NOT_POST(3, "不支持该请求方法,请求方法应为POST"),
|
||||
REQUEST_METHOD_NOT_GET(4, "不支持该请求方法,请求方法应为GET"),
|
||||
PARAM_ERROR(5, "参数错误");
|
||||
|
@ -62,13 +62,13 @@ public class ConnectionSession implements AutoCloseable {
|
||||
doConnect();
|
||||
status = ConnectionStatus.CONNECTED;
|
||||
log.info("SSH connection established successfully to {} (attempt {}/{})",
|
||||
machineInfo.getHostIp(), attempt, RETRY_COUNT);
|
||||
machineInfo.getHostIp(), attempt, RETRY_COUNT);
|
||||
return;
|
||||
} catch (JSchException e) {
|
||||
lastException = e;
|
||||
status = ConnectionStatus.CONNECTION_ERROR;
|
||||
log.error("SSH connection attempt {}/{} failed: {}",
|
||||
attempt, RETRY_COUNT, e.getMessage());
|
||||
attempt, RETRY_COUNT, e.getMessage());
|
||||
|
||||
// 认证失败直接退出,无需重试
|
||||
if (e.getMessage().contains("Auth fail")) {
|
||||
@ -105,9 +105,9 @@ public class ConnectionSession implements AutoCloseable {
|
||||
|
||||
// 创建SSH会话
|
||||
sshSession = jsch.getSession(
|
||||
machineInfo.getUsername(),
|
||||
machineInfo.getHostIp(),
|
||||
machineInfo.getSshPort() != null ? machineInfo.getSshPort() : 22
|
||||
machineInfo.getUsername(),
|
||||
machineInfo.getHostIp(),
|
||||
machineInfo.getSshPort() != null ? machineInfo.getSshPort() : 22
|
||||
);
|
||||
|
||||
// 配置连接参数
|
||||
@ -120,7 +120,7 @@ public class ConnectionSession implements AutoCloseable {
|
||||
/**
|
||||
* 配置认证方式(密码或密钥)
|
||||
*/
|
||||
private void configureAuthentication(JSch jsch) throws JSchException{
|
||||
private void configureAuthentication(JSch jsch) throws JSchException {
|
||||
if (machineInfo.getAuthenticationType() == AuthenticationType.SECRET_KEY) {
|
||||
// 密钥认证
|
||||
if (machineInfo.getSecretKeyId() == null) {
|
||||
@ -134,10 +134,10 @@ public class ConnectionSession implements AutoCloseable {
|
||||
|
||||
// 加载私钥(支持密码短语,可从配置中获取)
|
||||
jsch.addIdentity(
|
||||
machineInfo.getName(),
|
||||
privateKeyContent.getBytes(StandardCharsets.UTF_8),
|
||||
null,
|
||||
null // 密码短语,可为null
|
||||
machineInfo.getName(),
|
||||
privateKeyContent.getBytes(StandardCharsets.UTF_8),
|
||||
null,
|
||||
null // 密码短语,可为null
|
||||
);
|
||||
} else if (machineInfo.getAuthenticationType() == AuthenticationType.PASSWORD) {
|
||||
// 密码认证
|
||||
@ -158,7 +158,7 @@ public class ConnectionSession implements AutoCloseable {
|
||||
// 安全增强:默认验证主机密钥
|
||||
if (isTrustedEnvironment()) {
|
||||
log.warn("Running in trusted environment - disabling strict host key checking for {}",
|
||||
machineInfo.getHostIp());
|
||||
machineInfo.getHostIp());
|
||||
config.put("StrictHostKeyChecking", "no");
|
||||
} else {
|
||||
config.put("StrictHostKeyChecking", "yes");
|
||||
@ -261,7 +261,7 @@ public class ConnectionSession implements AutoCloseable {
|
||||
|
||||
// 使用线程中断机制实现超时控制
|
||||
Thread readerThread = new Thread(() -> {
|
||||
int bytesRead ;
|
||||
int bytesRead;
|
||||
try {
|
||||
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||
outputStream.write(buffer, 0, bytesRead);
|
||||
@ -349,10 +349,10 @@ public class ConnectionSession implements AutoCloseable {
|
||||
|
||||
// 使用更健壮的上传方式
|
||||
channel.put(
|
||||
new FileInputStream(localFile),
|
||||
remoteFilePath,
|
||||
new ProgressMonitorAdapter(localFile.length()),
|
||||
ChannelSftp.OVERWRITE
|
||||
new FileInputStream(localFile),
|
||||
remoteFilePath,
|
||||
new ProgressMonitorAdapter(localFile.length()),
|
||||
ChannelSftp.OVERWRITE
|
||||
);
|
||||
|
||||
uploadSuccess = true;
|
||||
@ -361,7 +361,7 @@ public class ConnectionSession implements AutoCloseable {
|
||||
|
||||
} catch (SftpException e) {
|
||||
log.error("SFTP error during file upload ({} -> {}): {}",
|
||||
localFilePath, remoteFilePath, e.getMessage(), e);
|
||||
localFilePath, remoteFilePath, e.getMessage(), e);
|
||||
throw new IOException("SFTP error: " + e.getMessage(), e);
|
||||
} catch (FileNotFoundException e) {
|
||||
log.error("Local file not found during upload: {}", localFilePath, e);
|
||||
@ -418,16 +418,16 @@ public class ConnectionSession implements AutoCloseable {
|
||||
|
||||
// 执行下载并监控进度
|
||||
channel.get(
|
||||
remoteFilePath,
|
||||
new FileOutputStream(tempFile).toString(),
|
||||
new ProgressMonitorAdapter(fileSize),
|
||||
ChannelSftp.OVERWRITE
|
||||
remoteFilePath,
|
||||
new FileOutputStream(tempFile).toString(),
|
||||
new ProgressMonitorAdapter(fileSize),
|
||||
ChannelSftp.OVERWRITE
|
||||
);
|
||||
|
||||
// 验证下载完整性
|
||||
if (tempFile.length() != fileSize) {
|
||||
throw new IOException("Download incomplete: expected " + fileSize +
|
||||
" bytes, but got " + tempFile.length() + " bytes");
|
||||
" bytes, but got " + tempFile.length() + " bytes");
|
||||
}
|
||||
|
||||
// 重命名临时文件为目标文件(原子操作)
|
||||
@ -441,7 +441,7 @@ public class ConnectionSession implements AutoCloseable {
|
||||
|
||||
} catch (SftpException e) {
|
||||
log.error("SFTP error during file download ({} -> {}): {}",
|
||||
remoteFilePath, localFilePath, e.getMessage(), e);
|
||||
remoteFilePath, localFilePath, e.getMessage(), e);
|
||||
if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) {
|
||||
throw new FileNotFoundException("Remote file not found: " + remoteFilePath);
|
||||
}
|
||||
@ -482,11 +482,13 @@ public class ConnectionSession implements AutoCloseable {
|
||||
log.debug("Created remote directory: {}", directory);
|
||||
}
|
||||
}
|
||||
|
||||
// 获取路径的父目录
|
||||
private String getParentDirectory(String path) {
|
||||
int lastSlash = path.lastIndexOf('/');
|
||||
return lastSlash > 0 ? path.substring(0, lastSlash) : "";
|
||||
}
|
||||
|
||||
// 断开SFTP通道
|
||||
private void disconnectChannel(Channel channel) {
|
||||
if (channel != null && channel.isConnected()) {
|
||||
@ -513,6 +515,7 @@ public class ConnectionSession implements AutoCloseable {
|
||||
disconnectChannel(channel);
|
||||
}
|
||||
}
|
||||
|
||||
// 增强的进度监控器
|
||||
private static class ProgressMonitorAdapter implements SftpProgressMonitor {
|
||||
private final long totalBytes;
|
||||
@ -538,7 +541,7 @@ public class ConnectionSession implements AutoCloseable {
|
||||
String speedStr = formatTransferSpeed(speed);
|
||||
|
||||
log.debug("Upload progress: {}% ({}/{} bytes, {})",
|
||||
progress, bytesWritten, totalBytes, speedStr);
|
||||
progress, bytesWritten, totalBytes, speedStr);
|
||||
lastProgress = progress;
|
||||
}
|
||||
|
||||
@ -552,7 +555,7 @@ public class ConnectionSession implements AutoCloseable {
|
||||
String speedStr = formatTransferSpeed(speed);
|
||||
|
||||
log.info("Upload completed: {} bytes in {} ms (avg speed: {})",
|
||||
totalBytes, elapsedTime, speedStr);
|
||||
totalBytes, elapsedTime, speedStr);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -575,13 +578,12 @@ public class ConnectionSession implements AutoCloseable {
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 检查连接状态
|
||||
*/
|
||||
public ConnectionStatus getStatus() {
|
||||
if (status == ConnectionStatus.CONNECTED &&
|
||||
(sshSession == null || !sshSession.isConnected())) {
|
||||
(sshSession == null || !sshSession.isConnected())) {
|
||||
status = ConnectionStatus.DISCONNECTED;
|
||||
}
|
||||
return status;
|
||||
@ -592,8 +594,8 @@ public class ConnectionSession implements AutoCloseable {
|
||||
*/
|
||||
public boolean isConnected() {
|
||||
return status == ConnectionStatus.CONNECTED &&
|
||||
sshSession != null &&
|
||||
sshSession.isConnected();
|
||||
sshSession != null &&
|
||||
sshSession.isConnected();
|
||||
}
|
||||
|
||||
|
||||
|
@ -16,6 +16,7 @@ public interface MachineEnvService extends IService<MachineEnv> {
|
||||
* 创建或更新机器的环境变量(一对一关系)
|
||||
*/
|
||||
boolean add(MachineEnvDTO machineEnvDTO);
|
||||
|
||||
/**
|
||||
* 删除机器的环境变量
|
||||
*/
|
||||
@ -23,6 +24,7 @@ public interface MachineEnvService extends IService<MachineEnv> {
|
||||
|
||||
/**
|
||||
* 获取机器的环境变量
|
||||
*
|
||||
* @param machineId 机器ID
|
||||
* @return 环境变量DTO
|
||||
*/
|
||||
|
@ -25,9 +25,9 @@ public interface MachineInfoService extends IService<MachineInfo> {
|
||||
void deleteMachineInfo(Long machineInfoId);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 测试机器连接
|
||||
*
|
||||
* @param machineInfo 机器信息
|
||||
* @return 连接是否成功
|
||||
*/
|
||||
@ -35,6 +35,7 @@ public interface MachineInfoService extends IService<MachineInfo> {
|
||||
|
||||
/**
|
||||
* 获取机器连接状态
|
||||
*
|
||||
* @param machineName 机器名称
|
||||
* @return 连接状态
|
||||
*/
|
||||
@ -42,12 +43,14 @@ public interface MachineInfoService extends IService<MachineInfo> {
|
||||
|
||||
/**
|
||||
* 获取所有连接状态
|
||||
*
|
||||
* @return 机器名称到连接状态的映射
|
||||
*/
|
||||
Map<String, ConnectionStatus> getAllConnectionStatus();
|
||||
|
||||
/**
|
||||
* 建立机器连接
|
||||
*
|
||||
* @param machineInfo 机器信息
|
||||
* @return 连接会话ID
|
||||
*/
|
||||
@ -55,6 +58,7 @@ public interface MachineInfoService extends IService<MachineInfo> {
|
||||
|
||||
/**
|
||||
* 断开机器连接
|
||||
*
|
||||
* @param sessionId 会话ID
|
||||
* @return 操作结果
|
||||
*/
|
||||
@ -62,16 +66,18 @@ public interface MachineInfoService extends IService<MachineInfo> {
|
||||
|
||||
/**
|
||||
* 执行远程命令
|
||||
*
|
||||
* @param sessionId 会话ID
|
||||
* @param command 命令
|
||||
* @param command 命令
|
||||
* @return 命令执行结果
|
||||
*/
|
||||
String executeCommand(String sessionId, String command);
|
||||
|
||||
/**
|
||||
* 上传文件到远程机器
|
||||
* @param sessionId 会话ID
|
||||
* @param localFilePath 本地文件路径
|
||||
*
|
||||
* @param sessionId 会话ID
|
||||
* @param localFilePath 本地文件路径
|
||||
* @param remoteFilePath 远程文件路径
|
||||
* @return 操作结果
|
||||
*/
|
||||
@ -79,9 +85,10 @@ public interface MachineInfoService extends IService<MachineInfo> {
|
||||
|
||||
/**
|
||||
* 从远程机器下载文件
|
||||
* @param sessionId 会话ID
|
||||
*
|
||||
* @param sessionId 会话ID
|
||||
* @param remoteFilePath 远程文件路径
|
||||
* @param localFilePath 本地文件路径
|
||||
* @param localFilePath 本地文件路径
|
||||
* @return 操作结果
|
||||
*/
|
||||
boolean downloadFile(String sessionId, String remoteFilePath, String localFilePath);
|
||||
|
@ -1,4 +1,5 @@
|
||||
package cd.casic.module.machine.service;
|
||||
|
||||
import cd.casic.module.machine.dto.MachineProxyDTO;
|
||||
import cd.casic.module.machine.entity.MachineProxy;
|
||||
import cd.casic.module.machine.utils.PageResult;
|
||||
@ -22,7 +23,6 @@ public interface MachineProxyService extends IService<MachineProxy> {
|
||||
boolean updateStatus(MachineProxyDTO machineProxyDTO);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取所有代理的状态统计
|
||||
*
|
||||
@ -38,9 +38,10 @@ public interface MachineProxyService extends IService<MachineProxy> {
|
||||
|
||||
/**
|
||||
* 批量删除代理
|
||||
*
|
||||
* @param proxyIds 代理ID列表
|
||||
*/
|
||||
String delete(String proxyIds);
|
||||
void delete(String proxyIds);
|
||||
|
||||
PageResult<MachineProxyDTO> list(MachineProxyDTO machineProxyDTO);
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ public interface SecretKeyService extends IService<SecretKey> {
|
||||
|
||||
void bindingMachine(SecretKeyDto secretKeyDto);
|
||||
|
||||
boolean updateSecretKey(SecretKeyDto secretKeyDto,MultipartFile file);
|
||||
boolean updateSecretKey(SecretKeyDto secretKeyDto, MultipartFile file);
|
||||
|
||||
boolean deleteSecretKey(Long secretKeyId);
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
package cd.casic.module.machine.service.impl;
|
||||
|
||||
import cd.casic.module.machine.dto.MachineEnvDTO;
|
||||
import cd.casic.module.machine.entity.MachineEnv;
|
||||
import cd.casic.module.machine.exception.ServiceException;
|
||||
@ -32,13 +33,13 @@ public class MachineEnvServiceImpl extends ServiceImpl<MachineEnvMapper, Machine
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean add(MachineEnvDTO machineEnvDTO) {
|
||||
// 参数校验
|
||||
if (machineEnvDTO==null) {
|
||||
throw new ServiceException(ServiceException.MACHINE_ENV_NULL,"环境变量不能为空");
|
||||
if (machineEnvDTO == null) {
|
||||
throw new ServiceException(ServiceException.MACHINE_ENV_NULL, "环境变量不能为空");
|
||||
}
|
||||
|
||||
// 检查键是否合法
|
||||
if (!isValidKey(machineEnvDTO.getEnvKey())) {
|
||||
throw new ServiceException(ServiceException.MACHINE_ENV_KEY_ILLEGAL,"环境变量键不合法");
|
||||
throw new ServiceException(ServiceException.MACHINE_ENV_KEY_ILLEGAL, "环境变量键不合法");
|
||||
}
|
||||
|
||||
// 判断是否敏感变量
|
||||
@ -55,7 +56,6 @@ public class MachineEnvServiceImpl extends ServiceImpl<MachineEnvMapper, Machine
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public MachineEnvDTO getByMachineId(Long machineId) {
|
||||
if (machineId == null) {
|
||||
@ -63,8 +63,8 @@ public class MachineEnvServiceImpl extends ServiceImpl<MachineEnvMapper, Machine
|
||||
}
|
||||
|
||||
MachineEnv machineEnv = getOne(
|
||||
new LambdaQueryWrapper<MachineEnv>()
|
||||
.eq(MachineEnv::getMachineId, machineId)
|
||||
new LambdaQueryWrapper<MachineEnv>()
|
||||
.eq(MachineEnv::getMachineId, machineId)
|
||||
);
|
||||
|
||||
return machineEnv != null ? convertToDTO(machineEnv) : null;
|
||||
@ -115,17 +115,17 @@ public class MachineEnvServiceImpl extends ServiceImpl<MachineEnvMapper, Machine
|
||||
|
||||
// 转换结果
|
||||
List<MachineEnvDTO> dtoList = page.getRecords().stream()
|
||||
.map(this::convertToDTO)
|
||||
.collect(Collectors.toList());
|
||||
.map(this::convertToDTO)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 构建分页结果
|
||||
return PageResult.<MachineEnvDTO>builder()
|
||||
.pageNum(page.getCurrent())
|
||||
.pageSize(page.getSize())
|
||||
.total(page.getTotal())
|
||||
.pages(page.getPages())
|
||||
.list(dtoList)
|
||||
.build();
|
||||
.pageNum(page.getCurrent())
|
||||
.pageSize(page.getSize())
|
||||
.total(page.getTotal())
|
||||
.pages(page.getPages())
|
||||
.list(dtoList)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -141,7 +141,7 @@ public class MachineEnvServiceImpl extends ServiceImpl<MachineEnvMapper, Machine
|
||||
@Override
|
||||
public boolean update(MachineEnvDTO machineEnvDTO) {
|
||||
MachineEnv machineEnv = new MachineEnv();
|
||||
BeanUtils.copyProperties(machineEnvDTO,machineEnv);
|
||||
BeanUtils.copyProperties(machineEnvDTO, machineEnv);
|
||||
return this.updateById(machineEnv);
|
||||
}
|
||||
|
||||
@ -169,6 +169,6 @@ public class MachineEnvServiceImpl extends ServiceImpl<MachineEnvMapper, Machine
|
||||
}
|
||||
String upperKey = key.toUpperCase();
|
||||
return upperKey.contains("PASSWORD") || upperKey.contains("SECRET") ||
|
||||
upperKey.contains("TOKEN") || upperKey.contains("KEY");
|
||||
upperKey.contains("TOKEN") || upperKey.contains("KEY");
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
package cd.casic.module.machine.service.impl;
|
||||
|
||||
import cd.casic.module.machine.dto.MachineProxyDTO;
|
||||
import cd.casic.module.machine.entity.MachineProxy;
|
||||
import cd.casic.module.machine.enums.MachineProxyStatus;
|
||||
@ -18,6 +19,7 @@ import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
@ -38,7 +40,7 @@ public class MachineProxyServiceImpl extends ServiceImpl<MachineProxyMapper, Mac
|
||||
BeanUtils.copyProperties(machineProxyDTO, proxy);
|
||||
proxy.setProxyTypeCode(EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode());
|
||||
proxy.setVersion("1.0.0");
|
||||
proxy.setStatusCode(MachineProxyStatus.INSTALLING.getCode());
|
||||
proxy.setStatusCode(MachineProxyStatus.ONLINE.getCode());
|
||||
return save(proxy);
|
||||
}
|
||||
|
||||
@ -46,24 +48,23 @@ public class MachineProxyServiceImpl extends ServiceImpl<MachineProxyMapper, Mac
|
||||
public boolean updateStatus(MachineProxyDTO machineProxyDTO) {
|
||||
// 参数校验
|
||||
if (machineProxyDTO == null) {
|
||||
throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL,"MachineProxyDTO对象为空");
|
||||
throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL, "MachineProxyDTO对象为空");
|
||||
}
|
||||
|
||||
// 查询代理
|
||||
MachineProxy proxy = this.getById(machineProxyDTO.getId());
|
||||
|
||||
if (proxy == null) {
|
||||
throw new ServiceException(ServiceException.MACHINE_PROXY_NULL,"代理不存在");
|
||||
throw new ServiceException(ServiceException.MACHINE_PROXY_NULL, "代理不存在");
|
||||
}
|
||||
|
||||
// 更新状态
|
||||
proxy.setStatusCode(EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(),MachineProxyStatus.class).getCode());
|
||||
proxy.setStatusCode(EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode());
|
||||
proxy.setUpdateDate(new Date());
|
||||
return updateById(proxy);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public Map<String, Long> getStatusStatistics() {
|
||||
List<MachineProxy> proxyList = list();
|
||||
@ -72,35 +73,34 @@ public class MachineProxyServiceImpl extends ServiceImpl<MachineProxyMapper, Mac
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return proxyList.stream()
|
||||
.map(proxy -> EnumUtils.getEnumByCode(proxy.getStatusCode(), MachineProxyStatus.class).getMessage())
|
||||
.collect(Collectors.groupingBy(
|
||||
Function.identity(),
|
||||
Collectors.counting() // 统计每个分组的元素数量
|
||||
));
|
||||
.map(proxy -> EnumUtils.getEnumByCode(proxy.getStatusCode(), MachineProxyStatus.class).getMessage())
|
||||
.collect(Collectors.groupingBy(
|
||||
Function.identity(),
|
||||
Collectors.counting() // 统计每个分组的元素数量
|
||||
));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(MachineProxyDTO machineProxyDTO) {
|
||||
// 参数校验
|
||||
if (machineProxyDTO == null) {
|
||||
throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL,"MachineProxyDTO对象为空");
|
||||
throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL, "MachineProxyDTO对象为空");
|
||||
}
|
||||
MachineProxy machineProxy = new MachineProxy();
|
||||
BeanUtils.copyProperties(machineProxyDTO, machineProxy);
|
||||
if (machineProxyDTO.getProxyType()!= null && !machineProxyDTO.getProxyType().isEmpty()){
|
||||
if (machineProxyDTO.getProxyType() != null && !machineProxyDTO.getProxyType().isEmpty()) {
|
||||
machineProxy.setProxyTypeCode(EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode());
|
||||
}
|
||||
if (machineProxyDTO.getStatus()!= null && !machineProxyDTO.getStatus().isEmpty()){
|
||||
if (machineProxyDTO.getStatus() != null && !machineProxyDTO.getStatus().isEmpty()) {
|
||||
machineProxy.setStatusCode(EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode());
|
||||
}
|
||||
this.updateById(machineProxy);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public String delete(String ids) {
|
||||
public void delete(String ids) {
|
||||
List<Long> machineProxyIds = Arrays.stream(ids.split(","))
|
||||
.map(String::trim)
|
||||
.filter(s -> !s.isEmpty())
|
||||
@ -108,28 +108,12 @@ public class MachineProxyServiceImpl extends ServiceImpl<MachineProxyMapper, Mac
|
||||
.toList();
|
||||
// 参数校验
|
||||
if (CollectionUtils.isEmpty(machineProxyIds)) {
|
||||
throw new ServiceException(ServiceException.PARAMETER_ERROR,"参数错误");
|
||||
throw new ServiceException(ServiceException.PARAMETER_ERROR, "参数错误");
|
||||
}
|
||||
|
||||
// 查询在线代理
|
||||
List<MachineProxy> onlineProxies = list(new LambdaQueryWrapper<MachineProxy>()
|
||||
.in(MachineProxy::getId, machineProxyIds)
|
||||
.eq(MachineProxy::getStatusCode, MachineProxyStatus.ONLINE.getCode()));
|
||||
|
||||
if (!CollectionUtils.isEmpty(onlineProxies)) {
|
||||
List<Long> onlineIds = onlineProxies.stream()
|
||||
.map(MachineProxy::getId)
|
||||
.toList();
|
||||
|
||||
// 将 [10, 9] 转换为 "10, 9"
|
||||
String idStr = onlineIds.toString().replaceAll("[\\[\\]]", "");
|
||||
return "以下代理处于在线状态,无法删除: " + idStr;
|
||||
}
|
||||
|
||||
// 批量逻辑删除
|
||||
remove(new LambdaQueryWrapper<MachineProxy>()
|
||||
.in(MachineProxy::getId, machineProxyIds));
|
||||
return "";
|
||||
.in(MachineProxy::getId, machineProxyIds)
|
||||
.ne(MachineProxy::getStatus, MachineProxyStatus.ONLINE.getCode()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -144,15 +128,15 @@ public class MachineProxyServiceImpl extends ServiceImpl<MachineProxyMapper, Mac
|
||||
return dto;
|
||||
}).toList();
|
||||
return new PageResult<>(
|
||||
page.getCurrent(),
|
||||
page.getSize(),
|
||||
page.getTotal(),
|
||||
page.getPages(),
|
||||
machineProxyDtos
|
||||
page.getCurrent(),
|
||||
page.getSize(),
|
||||
page.getTotal(),
|
||||
page.getPages(),
|
||||
machineProxyDtos
|
||||
);
|
||||
}
|
||||
|
||||
private QueryWrapper<MachineProxy> getMachineProxyQueryWrapper(MachineProxyDTO machineProxyDTO){
|
||||
private QueryWrapper<MachineProxy> getMachineProxyQueryWrapper(MachineProxyDTO machineProxyDTO) {
|
||||
QueryWrapper<MachineProxy> queryWrapper = new QueryWrapper<>();
|
||||
if (machineProxyDTO.getHostIp() != null && !machineProxyDTO.getHostIp().isEmpty()) {
|
||||
queryWrapper.like("host_ip", machineProxyDTO.getHostIp());
|
||||
@ -167,7 +151,10 @@ public class MachineProxyServiceImpl extends ServiceImpl<MachineProxyMapper, Mac
|
||||
queryWrapper.like("description", machineProxyDTO.getDescription());
|
||||
}
|
||||
if (machineProxyDTO.getStatus() != null && !machineProxyDTO.getStatus().isEmpty()) {
|
||||
queryWrapper.like("status_code", EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(),MachineProxyStatus.class).getCode());
|
||||
queryWrapper.like("status_code", EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode());
|
||||
}
|
||||
if (machineProxyDTO.getProxyType() != null && !machineProxyDTO.getProxyType().isEmpty()) {
|
||||
queryWrapper.like("proxy_type_code", EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode());
|
||||
}
|
||||
return queryWrapper.orderByDesc("create_date");
|
||||
}
|
||||
|
@ -37,8 +37,8 @@ import java.util.stream.Collectors;
|
||||
@Service
|
||||
public class MachineinfoServiceImpl extends ServiceImpl<MachineInfoMapper, MachineInfo> implements MachineInfoService {
|
||||
|
||||
int ENABLE=1;
|
||||
int UN_ENABLE=0;
|
||||
int ENABLE = 1;
|
||||
int UN_ENABLE = 0;
|
||||
|
||||
@Resource
|
||||
private MachineInfoMapper machineInfoMapper;
|
||||
@ -57,6 +57,7 @@ public class MachineinfoServiceImpl extends ServiceImpl<MachineInfoMapper, Machi
|
||||
* 机器名称 -> 会话ID
|
||||
*/
|
||||
private final Map<String, String> machineSessionMapping = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
public boolean addMachineInfo(MachineInfoDto machineInfoDto) {
|
||||
if (machineInfoDto == null) {
|
||||
@ -72,8 +73,8 @@ public class MachineinfoServiceImpl extends ServiceImpl<MachineInfoMapper, Machi
|
||||
);
|
||||
machineInfo.setMachineInfoTypeCode(
|
||||
"Windows".equals(machineInfoDto.getMachineInfoType())
|
||||
? MachineInfoType.WINDOWS.getCode()
|
||||
: MachineInfoType.Linux.getCode()
|
||||
? MachineInfoType.WINDOWS.getCode()
|
||||
: MachineInfoType.Linux.getCode()
|
||||
);
|
||||
|
||||
return this.save(machineInfo);
|
||||
@ -119,8 +120,8 @@ public class MachineinfoServiceImpl extends ServiceImpl<MachineInfoMapper, Machi
|
||||
);
|
||||
machineInfo.setMachineInfoTypeCode(
|
||||
"Windows".equals(machineInfoDto.getMachineInfoType())
|
||||
? MachineInfoType.WINDOWS.getCode()
|
||||
: MachineInfoType.Linux.getCode()
|
||||
? MachineInfoType.WINDOWS.getCode()
|
||||
: MachineInfoType.Linux.getCode()
|
||||
);
|
||||
return this.updateById(machineInfo);
|
||||
}
|
||||
@ -135,7 +136,7 @@ public class MachineinfoServiceImpl extends ServiceImpl<MachineInfoMapper, Machi
|
||||
@Override
|
||||
public boolean bindingSecretKey(MachineInfoDto machineInfoDto) {
|
||||
UpdateWrapper<MachineInfo> updateWrapper = new UpdateWrapper<>();
|
||||
updateWrapper.eq("id", machineInfoDto.getId()).set("secret_key_id", machineInfoDto.getSecretKeyId()).set("authentication_type_code",2);
|
||||
updateWrapper.eq("id", machineInfoDto.getId()).set("secret_key_id", machineInfoDto.getSecretKeyId()).set("authentication_type_code", 2);
|
||||
return this.update(updateWrapper);
|
||||
}
|
||||
|
||||
@ -147,7 +148,7 @@ public class MachineinfoServiceImpl extends ServiceImpl<MachineInfoMapper, Machi
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toList());
|
||||
machineInfoMapper.selectBatchIds(machineInfoIdList).forEach(machineInfo -> {
|
||||
if (machineInfo.getStatusCode() == 1){
|
||||
if (machineInfo.getStatusCode() == 1) {
|
||||
this.removeById(machineInfo.getId());
|
||||
}
|
||||
});
|
||||
@ -156,14 +157,14 @@ public class MachineinfoServiceImpl extends ServiceImpl<MachineInfoMapper, Machi
|
||||
@Override
|
||||
public void deleteMachineInfo(Long machineInfoId) {
|
||||
MachineInfo machineInfo = this.getById(machineInfoId);
|
||||
if (machineInfo.getStatusCode() == 1){
|
||||
if (machineInfo.getStatusCode() == 1) {
|
||||
this.removeById(machineInfoId);
|
||||
}
|
||||
}
|
||||
|
||||
private QueryWrapper<MachineInfo> getMachineInfoQueryWrapper(MachineInfoDto machineInfoDto) {
|
||||
QueryWrapper<MachineInfo> queryWrapper = new QueryWrapper<>();
|
||||
if (machineInfoDto.getStatus() != null && !machineInfoDto.getStatus().isEmpty()){
|
||||
if (machineInfoDto.getStatus() != null && !machineInfoDto.getStatus().isEmpty()) {
|
||||
queryWrapper.eq("status_code", EnumUtils.getEnumByMessage(machineInfoDto.getStatus(), MachineInfoStatus.class).getCode());
|
||||
}
|
||||
if (machineInfoDto.getName() != null && !machineInfoDto.getName().isEmpty()) {
|
||||
@ -182,11 +183,9 @@ public class MachineinfoServiceImpl extends ServiceImpl<MachineInfoMapper, Machi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public boolean testConnection(MachineInfo machineInfo) {
|
||||
if (machineInfo.getStatus().getCode()==UN_ENABLE) {
|
||||
if (machineInfo.getStatus().getCode() == UN_ENABLE) {
|
||||
throw new RuntimeException("机器不可用");
|
||||
}
|
||||
log.info("测试机器连接: {}", machineInfo.getHostIp());
|
||||
@ -225,7 +224,7 @@ public class MachineinfoServiceImpl extends ServiceImpl<MachineInfoMapper, Machi
|
||||
|
||||
@Override
|
||||
public String connect(MachineInfo machineInfo) {
|
||||
if (machineInfo.getStatus().getCode()==UN_ENABLE) {
|
||||
if (machineInfo.getStatus().getCode() == UN_ENABLE) {
|
||||
throw new RuntimeException("机器不可用");
|
||||
}
|
||||
log.info("建立机器连接: {}", machineInfo.getHostIp());
|
||||
|
@ -36,14 +36,13 @@ public class SecretKeyServiceImpl extends ServiceImpl<SecretServiceMapper, Secre
|
||||
@Resource
|
||||
private MachineInfoService machineInfoService;
|
||||
|
||||
// @Resource
|
||||
// @Resource
|
||||
private AliYunConfig aliYunConfig;
|
||||
|
||||
@Resource
|
||||
private SecretServiceMapper secretServiceMapper;
|
||||
|
||||
|
||||
|
||||
//todo public方便测试,后面改为private
|
||||
public static final ExecutorService FILE_DELETE_EXECUTOR = Executors.newFixedThreadPool(10);
|
||||
|
||||
@ -57,7 +56,7 @@ public class SecretKeyServiceImpl extends ServiceImpl<SecretServiceMapper, Secre
|
||||
secretKeyDto.setPath(path);
|
||||
secretKeyDto.setFileName(fileName);
|
||||
SecretKey secretKey = new SecretKey();
|
||||
BeanUtils.copyProperties(secretKeyDto,secretKey);
|
||||
BeanUtils.copyProperties(secretKeyDto, secretKey);
|
||||
return this.save(secretKey);
|
||||
}
|
||||
|
||||
@ -70,7 +69,7 @@ public class SecretKeyServiceImpl extends ServiceImpl<SecretServiceMapper, Secre
|
||||
|
||||
@Override
|
||||
public boolean updateSecretKey(SecretKeyDto secretKeyDto, MultipartFile file) {
|
||||
if (file != null){
|
||||
if (file != null) {
|
||||
secretKeyDto.setFile(file);
|
||||
String fileName = aliOssUtil.save(file);
|
||||
String path = "https://" + aliYunConfig.getBucketName() + "." + aliYunConfig.getEndpoint() + "/" + fileName;
|
||||
@ -78,7 +77,7 @@ public class SecretKeyServiceImpl extends ServiceImpl<SecretServiceMapper, Secre
|
||||
secretKeyDto.setFileName(fileName);
|
||||
}
|
||||
SecretKey secretKey = new SecretKey();
|
||||
BeanUtils.copyProperties(secretKeyDto,secretKey);
|
||||
BeanUtils.copyProperties(secretKeyDto, secretKey);
|
||||
return this.updateById(secretKey);
|
||||
}
|
||||
|
||||
@ -92,15 +91,15 @@ public class SecretKeyServiceImpl extends ServiceImpl<SecretServiceMapper, Secre
|
||||
@Override
|
||||
public PageResult<SecretKey> listSecretKey(SecretKeyDto secretKeyDto) {
|
||||
QueryWrapper<SecretKey> queryWrapper = new QueryWrapper<>();
|
||||
if (secretKeyDto.getName() != null && !secretKeyDto.getName().isEmpty()){
|
||||
if (secretKeyDto.getName() != null && !secretKeyDto.getName().isEmpty()) {
|
||||
queryWrapper.like("name", secretKeyDto.getName());
|
||||
}
|
||||
if (secretKeyDto.getDescription() != null && !secretKeyDto.getDescription().isEmpty()){
|
||||
if (secretKeyDto.getDescription() != null && !secretKeyDto.getDescription().isEmpty()) {
|
||||
queryWrapper.like("description", secretKeyDto.getDescription());
|
||||
}
|
||||
queryWrapper.orderByDesc("create_date");
|
||||
Page<SecretKey> page = secretServiceMapper.selectPage(new Page<>(secretKeyDto.getPageIndex(), secretKeyDto.getPageSize()), queryWrapper);
|
||||
return new PageResult<>(
|
||||
return new PageResult<>(
|
||||
page.getCurrent(),
|
||||
page.getSize(),
|
||||
page.getTotal(),
|
||||
@ -127,15 +126,15 @@ public class SecretKeyServiceImpl extends ServiceImpl<SecretServiceMapper, Secre
|
||||
FILE_DELETE_EXECUTOR.execute(() -> {
|
||||
try {
|
||||
for (SecretKey secretKey : secretKeys) {
|
||||
if (secretKey.getFileName() != null && !secretKey.getFileName().isEmpty()){
|
||||
if (secretKey.getFileName() != null && !secretKey.getFileName().isEmpty()) {
|
||||
aliOssUtil.deleteFile(secretKey.getFileName());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("异步删除文件失败:{}", e.getMessage());
|
||||
throw new ServiceException(ServiceException.DELETE_FILE_FAIL,"异步删除文件失败:"+e.getMessage());
|
||||
throw new ServiceException(ServiceException.DELETE_FILE_FAIL, "异步删除文件失败:" + e.getMessage());
|
||||
}
|
||||
});
|
||||
return secretServiceMapper.deleteBatchIds(secretKeyIds) > 0 ;
|
||||
return secretServiceMapper.deleteBatchIds(secretKeyIds) > 0;
|
||||
}
|
||||
}
|
||||
|
@ -21,12 +21,12 @@ import java.nio.charset.StandardCharsets;
|
||||
|
||||
|
||||
@Component
|
||||
public class AliOssUtil{
|
||||
public class AliOssUtil {
|
||||
|
||||
// @Autowired
|
||||
// @Autowired
|
||||
private OSS ossClient;
|
||||
|
||||
// @Resource
|
||||
// @Resource
|
||||
private AliYunConfig aliyunConfig;
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(AliOssUtil.class);
|
||||
@ -35,14 +35,14 @@ public class AliOssUtil{
|
||||
try {
|
||||
String fileName = generateUniqueFileName(file.getName());
|
||||
ossClient.putObject(
|
||||
// 存储桶名称
|
||||
aliyunConfig.getBucketName(),
|
||||
//对象键(Object Key),即文件在 OSS 中的完整路径和名称
|
||||
fileName,
|
||||
//文件内容的输入流,用于读取待上传的文件数据。
|
||||
file.getInputStream(),
|
||||
//文件的元数据信息,如内容类型(Content-Type)、缓存策略、文件大小等。
|
||||
null
|
||||
// 存储桶名称
|
||||
aliyunConfig.getBucketName(),
|
||||
//对象键(Object Key),即文件在 OSS 中的完整路径和名称
|
||||
fileName,
|
||||
//文件内容的输入流,用于读取待上传的文件数据。
|
||||
file.getInputStream(),
|
||||
//文件的元数据信息,如内容类型(Content-Type)、缓存策略、文件大小等。
|
||||
null
|
||||
);
|
||||
return fileName;
|
||||
} catch (Exception e) {
|
||||
@ -58,7 +58,7 @@ public class AliOssUtil{
|
||||
|
||||
// 处理文件名编码(防止中文乱码)
|
||||
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8)
|
||||
.replaceAll("\\+", "%20");
|
||||
.replaceAll("\\+", "%20");
|
||||
|
||||
// 设置响应头
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
@ -67,8 +67,8 @@ public class AliOssUtil{
|
||||
headers.setCacheControl("no-cache, no-store, must-revalidate");
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.headers(headers)
|
||||
.body(new InputStreamResource(inputStream));
|
||||
.headers(headers)
|
||||
.body(new InputStreamResource(inputStream));
|
||||
} catch (Exception e) {
|
||||
logger.error("下载失败:{}", e.getMessage());
|
||||
throw new ServiceException(ServiceException.DOWNLOAD_FILE_FAIL, "下载失败: " + e.getMessage());
|
||||
|
Loading…
x
Reference in New Issue
Block a user