Compare commits

..

No commits in common. "2d4653b29a231719cfabdddbee7757d378b0a689" and "926c1af1e1a5cbc92f9aff8a78a409d28e4332e6" have entirely different histories.

14 changed files with 348 additions and 344 deletions

View File

@ -13,19 +13,13 @@ public interface MachineErrorCodeConstants {
ErrorCode FILENAME_NULL = new ErrorCode(1_003_000_003, "文件名为空"); ErrorCode FILENAME_NULL = new ErrorCode(1_003_000_003, "文件名为空");
ErrorCode READ_FILE_FAIL = new ErrorCode(1_003_000_004, "读取文件失败"); ErrorCode READ_FILE_FAIL = new ErrorCode(1_003_000_004, "读取文件失败");
ErrorCode DELETE_FILE_FAIL = new ErrorCode(1_003_000_005, "删除文件失败"); ErrorCode DELETE_FILE_FAIL = new ErrorCode(1_003_000_005, "删除文件失败");
ErrorCode MACHINE_PROXY_DTO_NULL = new ErrorCode(1_003_000_006, "MachineProxyDTO对象为空");
ErrorCode MACHINE_PROXY_NULL = new ErrorCode(1_003_000_007, "MachineProxy代理不存在");
ErrorCode PARAMETER_ERROR = new ErrorCode(1_003_000_008, "参数错误"); ErrorCode PARAMETER_ERROR = new ErrorCode(1_003_000_008, "参数错误");
// ========== 机器环境变量模块 1-003-000-009 ==========
ErrorCode MACHINE_ENV_NULL = new ErrorCode(1_003_000_009, "机器环境变量为空"); ErrorCode MACHINE_ENV_NULL = new ErrorCode(1_003_000_009, "机器环境变量为空");
ErrorCode MACHINE_ENV_NOT_EXISTS = new ErrorCode(1_003_000_009, "机器不存在"); ErrorCode MACHINE_ENV_NOT_EXISTS = new ErrorCode(1_003_000_009, "机器不存在");
ErrorCode MACHINE_ENV_EXISTS = new ErrorCode(1_003_000_009, "机器已存在");
ErrorCode MACHINE_ENV_KEY_ILLEGAL = new ErrorCode(1_003_000_010, "机器环境变量键不合法"); ErrorCode MACHINE_ENV_KEY_ILLEGAL = new ErrorCode(1_003_000_010, "机器环境变量键不合法");
// ========== 机器代理模块 1-003-000-006 ==========
ErrorCode MACHINE_PROXY_HOST_IP_NULL = new ErrorCode(1_003_000_006, "机器代理主机地址为空");
ErrorCode MACHINE_PROXY_USER_NAME_NULL = new ErrorCode(1_003_000_006, "机器代理用户名为空");
ErrorCode MACHINE_PROXY_NOT_EXISTS = new ErrorCode(1_003_000_007, "机器代理不存在");
ErrorCode MACHINE_PROXY_TYPE_NOT_EXISTS = new ErrorCode(1_003_000_007, "机器代理类型不存在");
ErrorCode MACHINE_PROXY_IS_ONLINE = new ErrorCode(1_003_000_007, "机器代理在线,不能删除");
ErrorCode OSS_PARAM_NULL = new ErrorCode(1_003_000_011, "oss参数无法读取"); ErrorCode OSS_PARAM_NULL = new ErrorCode(1_003_000_011, "oss参数无法读取");
ErrorCode SECRETKEY_NULL = new ErrorCode(1_003_000_012, "密钥为空"); ErrorCode SECRETKEY_NULL = new ErrorCode(1_003_000_012, "密钥为空");
} }

View File

@ -1,72 +1,67 @@
package cd.casic.module.machine.controller; //package cd.casic.module.machine.controller;
import cd.casic.framework.commons.pojo.CommonResult; //
import cd.casic.framework.commons.pojo.PageResult; //import cd.casic.framework.commons.pojo.CommonResult;
import cd.casic.framework.commons.util.object.BeanUtils; //import cd.casic.module.machine.service.MachineProxyService;
import cd.casic.module.machine.controller.vo.MachineProxyVO; //import cd.casic.module.machine.controller.vo.MachineProxyDTO;
import cd.casic.module.machine.dal.dataobject.MachineProxyDO; //
import cd.casic.module.machine.service.MachineProxyService; //import io.swagger.v3.oas.annotations.Operation;
import cn.hutool.core.collection.CollUtil; //import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation; //import jakarta.annotation.Resource;
import io.swagger.v3.oas.annotations.tags.Tag; //import lombok.RequiredArgsConstructor;
import jakarta.annotation.Resource; //import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid; //
import org.springframework.security.access.prepost.PreAuthorize; //import static cd.casic.framework.commons.pojo.CommonResult.success;
import org.springframework.validation.annotation.Validated; //
import org.springframework.web.bind.annotation.*; ///**
import java.util.Map; // * 机器代理控制器
import static cd.casic.framework.commons.pojo.CommonResult.success; // */
//@RestController
/** //@RequestMapping("/api/machineProxy")
* 机器代理控制器 //@Tag(name = "机器代理管理")
*/ //@RequiredArgsConstructor
@RestController //public class MachineProxyController {
@RequestMapping("/ci/machineProxy") //
@Tag(name = "机器代理管理") // @Resource
@Validated // private MachineProxyService machineProxyService;
public class MachineProxyController { //
// @PostMapping("/register")
@Resource // @Operation(summary = "注册新的机器代理")
private MachineProxyService machineProxyService; // public CommonResult register(@RequestBody MachineProxyDTO machineProxyDTO) {
// machineProxyService.register(machineProxyDTO);
@PostMapping("/create") // return success(true);
@Operation(summary = "注册新的机器代理") // }
@PreAuthorize("@ss.hasPermission('ci:machineProxy:create')") //
public CommonResult<Long> createProxy(@Valid @RequestBody MachineProxyVO machineProxyVO) { // @PostMapping("/list")
Long id = machineProxyService.createProxy(machineProxyVO); // @Operation(summary = "获取代理列表")
return success(id); // public CommonResult list(@RequestBody MachineProxyDTO machineProxyDTO) {
} // return success(machineProxyService.list(machineProxyDTO));
// }
@PutMapping("/update") //
@Operation(summary = "修改代理") // @PutMapping("/updateStatus")
@PreAuthorize("@ss.hasPermission('ci:machineProxy:update')") // @Operation(summary = "更新代理状态")
public CommonResult<Boolean> updateProxy(@Valid @RequestBody MachineProxyVO machineProxyVO) { // public CommonResult updateStatus(@RequestBody MachineProxyDTO machineProxyDTO) {
machineProxyService.updateProxy(machineProxyVO); // machineProxyService.updateStatus(machineProxyDTO);
return success(true); // return success(true);
} // }
//
@PostMapping("/list") // @GetMapping("/statistics/status")
@Operation(summary = "获取代理列表") // @Operation(summary = "获取所有代理的状态统计")
public CommonResult<PageResult<MachineProxyVO>> getProxyPage(@Valid @RequestBody MachineProxyVO machineProxyVO) { // public CommonResult getStatusStatistics() {
PageResult<MachineProxyDO> pageResult = machineProxyService.getProxyPage(machineProxyVO); // return success(machineProxyService.getStatusStatistics());
if (CollUtil.isEmpty(pageResult.getList())) { // }
return success(new PageResult<>(pageResult.getTotal())); //
} // @PutMapping("/update")
return success(BeanUtils.toBean(pageResult, MachineProxyVO.class)); // @Operation(summary = "更新代理信息")
} // public CommonResult updateConfig(@RequestBody MachineProxyDTO machineProxyDTO) {
// machineProxyService.update(machineProxyDTO);
@GetMapping("/allStatus") // return success(true);
@Operation(summary = "获取所有代理的状态统计") // }
public CommonResult<Map<Integer, Long>> getStatusStatistics() { //
return success(machineProxyService.getAllProxyStatus()); // @DeleteMapping("/batch")
} // @Operation(summary = "批量删除代理")
// public CommonResult deleteBatch(@RequestParam String ids) {
// machineProxyService.delete(ids);
@DeleteMapping("/deleteList") // return success(true);
@Operation(summary = "批量删除代理") // }
@PreAuthorize("@ss.hasPermission('ci:machineProxy:delete')") //
public CommonResult<Boolean> deleteProxyList(@RequestParam String ids) { //}
machineProxyService.deleteProxyList(ids);
return success(true);
}
}

View File

@ -5,7 +5,6 @@ import lombok.*;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@EqualsAndHashCode(callSuper = true)
@Schema(description = "管理后台 - 机器环境变量信息 Response VO") @Schema(description = "管理后台 - 机器环境变量信息 Response VO")
@Data @Data
@NoArgsConstructor @NoArgsConstructor

View File

@ -1,50 +1,46 @@
package cd.casic.module.machine.controller.vo; package cd.casic.module.machine.controller.vo;
import cd.casic.framework.commons.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 机器代理信息 Response VO") import cd.casic.module.machine.enums.MachineProxyStatus;
import lombok.*;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;
/**
* 机器代理数据传输对象
*/
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Accessors(chain = true) public class MachineProxyVO extends PageDto implements Serializable {
public class MachineProxyVO extends PageParam { private static final long serialVersionUID = 1L;
@Schema(description = "代理ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id; private Long id;
@Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "admin")
private String username; private String username;
private String proxyType;
@Schema(description = "代理类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "HTTP")
private Integer proxyType;
@Schema(description = "版本号", example = "1.0.0")
private String version; private String version;
@Schema(description = "状态ONLINE:在线OFFLINE:离线)", requiredMode = Schema.RequiredMode.REQUIRED, example = "ONLINE")
private String status; private String status;
private Date lastHeartbeatTime;
@Schema(description = "描述信息", example = "用于生产环境的代理服务器")
private String description; private String description;
@Schema(description = "主机IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "192.168.1.100")
private String hostIp; private String hostIp;
@Schema(description = "SSH端口", requiredMode = Schema.RequiredMode.REQUIRED, example = "22")
private String sshPort; private String sshPort;
private Date createDate;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-06-15T10:30:00") private Date updateDate;
private LocalDateTime createTime;
@Schema(description = "更新时间", example = "2023-06-15T10:30:00")
private LocalDateTime updateTime;
@Schema(description = "密码", example = "******")
private String password; private String password;
/**
* 计算代理是否在线
*/
public boolean isOnline() {
if (status == null || lastHeartbeatTime == null) {
return false;
}
// 假设5分钟内有心跳为在线
long fiveMinutes = 5 * 60 * 1000;
return Objects.equals(MachineProxyStatus.ONLINE.getMessage(), status) &&
System.currentTimeMillis() - lastHeartbeatTime.getTime() < fiveMinutes;
}
} }

View File

@ -0,0 +1,10 @@
package cd.casic.module.machine.controller.vo;
import lombok.Data;
@Data
public class PageDto {
private int pageIndex = 1;
private int pageSize = 10;
}

View File

@ -15,10 +15,10 @@ import java.io.Serializable;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
@TableName("machine_env")
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@TableName("machine_env")
public class MachineEnvDO extends BaseDO { public class MachineEnvDO extends BaseDO {
@ -51,7 +51,3 @@ public class MachineEnvDO extends BaseDO {
} }

View File

@ -1,11 +1,9 @@
package cd.casic.module.machine.dal.dataobject; package cd.casic.module.machine.dal.dataobject;
import cd.casic.framework.mybatis.core.dataobject.BaseDO;
import cd.casic.module.machine.enums.MachineProxyStatus; import cd.casic.module.machine.enums.MachineProxyStatus;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import cd.casic.module.machine.enums.MachineProxyType; import cd.casic.module.machine.enums.MachineProxyType;
import lombok.*; import lombok.*;
import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
@ -15,18 +13,12 @@ import java.util.Date;
*/ */
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@Accessors(chain = true)
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@TableName("machine_proxy") @TableName("machine_proxy")
public class MachineProxyDO extends BaseDO { public class MachineProxy extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 代理id
*/
@TableId
private Long id;
@TableField(value = "host_ip") @TableField(value = "host_ip")
private String hostIp; private String hostIp;
@ -34,23 +26,43 @@ public class MachineProxyDO extends BaseDO {
@TableField(value = "ssh_port") @TableField(value = "ssh_port")
private String sshPort; private String sshPort;
//todo 字典 /**
@TableField(value = "proxy_type") * 代理类型
private int proxyType; */
@TableField(exist = false)
private MachineProxyType proxyType;
@TableField(value = "proxy_type_code")
private int proxyTypeCode;
/**
* 代理版本
*/
@TableField(value = "version") @TableField(value = "version")
private String version; private String version;
//todo 字典 /**
@TableField(value = "status") * 代理状态 (online, offline, installing, updating, error)
private int status; */
@TableField(exist = false)
private MachineProxyStatus status;
@TableField(value = "status_code")
private int statusCode;
@TableField(value = "username") @TableField(value = "username")
private String username; private String username;
/**
* 最后心跳时间
*/
private Date lastHeartbeatTime;
@TableField(value = "password") @TableField(value = "password")
private String password; private String password;
/**
* 描述信息
*/
@TableField(value = "description") @TableField(value = "description")
private String description; private String description;

View File

@ -16,7 +16,13 @@ public interface MachineEnvMapper extends BaseMapperX<MachineEnvDO> {
default PageResult<MachineEnvDO>selectPage(MachineEnvVO machineEnvVO){ default PageResult<MachineEnvDO>selectPage(MachineEnvVO machineEnvVO){
return selectPage(machineEnvVO,new LambdaQueryWrapperX<MachineEnvDO>() return selectPage(machineEnvVO,new LambdaQueryWrapperX<MachineEnvDO>()
.likeIfPresent(MachineEnvDO::getEnvKey, machineEnvVO.getEnvKey()) .likeIfPresent(MachineEnvDO::getEnvKey, machineEnvVO.getEnvKey())
.likeIfPresent(MachineEnvDO::getDescription, machineEnvVO.getDescription())); .likeIfPresent(MachineEnvDO::getDescription, machineEnvVO.getDescription())
.inIfPresent(MachineEnvDO::getMachineId, machineEnvVO.getMachineId())
.orderByDesc( MachineEnvDO::getMachineId));
}
default void deleteBatchByIds(String ids) {
this.delete(new LambdaQueryWrapperX<MachineEnvDO>()
.in(MachineEnvDO::getId, ids.split(","))
);
} }
} }

View File

@ -1,44 +1,11 @@
package cd.casic.module.machine.dal.mysql; package cd.casic.module.machine.dal.mysql;
import cd.casic.framework.commons.pojo.PageResult; import cd.casic.module.machine.dal.dataobject.MachineProxy;
import cd.casic.framework.mybatis.core.mapper.BaseMapperX; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cd.casic.framework.mybatis.core.query.LambdaQueryWrapperX;
import cd.casic.module.machine.controller.vo.MachineEnvVO;
import cd.casic.module.machine.controller.vo.MachineProxyVO;
import cd.casic.module.machine.dal.dataobject.MachineEnvDO;
import cd.casic.module.machine.dal.dataobject.MachineProxyDO;
import cd.casic.module.machine.enums.MachineProxyStatus;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import static com.baomidou.mybatisplus.extension.toolkit.Db.listObjs;
/** /**
* 机器代理Mapper接口 * 机器代理Mapper接口
*/ */
@Mapper @Mapper
public interface MachineProxyMapper extends BaseMapperX<MachineProxyDO> { public interface MachineProxyMapper extends BaseMapper<MachineProxy> {
default PageResult<MachineProxyDO> selectPage(MachineProxyVO machineProxyVO) {
return selectPage(machineProxyVO, new LambdaQueryWrapperX<MachineProxyDO>()
.eqIfPresent(MachineProxyDO::getHostIp, machineProxyVO.getHostIp())
.eqIfPresent(MachineProxyDO::getProxyType, machineProxyVO.getProxyType())
.eqIfPresent(MachineProxyDO::getStatus, machineProxyVO.getStatus())
.likeIfPresent(MachineProxyDO::getDescription, machineProxyVO.getDescription())
);
}
default List<Long> getOnlineProxyListInIds(List<Long> ids) {
LambdaQueryWrapperX<MachineProxyDO> queryWrapper = new LambdaQueryWrapperX<>();
// 1. 状态为在线eqIfPresent 确保状态非空时拼接条件
queryWrapper.eqIfPresent(MachineProxyDO::getStatus, MachineProxyStatus.ONLINE.getCode());
// 2. 传入的 ID 列表非空时添加 IN 条件使用 inIfPresent 自动过滤空值
queryWrapper.inIfPresent(MachineProxyDO::getId, ids);
// 4. 仅查询 ID 字段提升性能
return listObjs(queryWrapper.select(MachineProxyDO::getId));
}
} }

View File

@ -1,30 +1,17 @@
package cd.casic.module.machine.enums; package cd.casic.module.machine.enums;
import cd.casic.framework.commons.core.IntArrayValuable;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum MachineProxyType implements IntArrayValuable { public enum MachineProxyType implements CodeEnum {
HTTP(1, "http"), HTTP(1, "http"),
SOCKS4(2, "socks4"), SOCKS4(2, "socks4"),
SOCKS5(3, "socks5"); SOCKS5(3, "socks5");
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MachineProxyType::getCode).toArray();
/** private final int code;
* 状态值
*/
private final Integer code;
/**
* 状态名
*/
private final String message; private final String message;
@Override
public int[] array() {
return ARRAYS;
}
} }

View File

@ -0,0 +1,19 @@
package cd.casic.module.machine.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum RequestExceptionEnum implements CodeEnum {
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, "参数错误");
private final int code;
private final String message;
}

View File

@ -2,23 +2,24 @@ package cd.casic.module.machine.service;
import cd.casic.framework.commons.pojo.PageResult; import cd.casic.framework.commons.pojo.PageResult;
import cd.casic.module.machine.controller.vo.MachineProxyVO; import cd.casic.module.machine.controller.vo.MachineProxyVO;
import cd.casic.module.machine.dal.dataobject.MachineProxyDO; import cd.casic.module.machine.dal.dataobject.MachineProxy;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Map; import java.util.Map;
/** /**
* 机器代理服务接口 * 机器代理服务接口
*/ */
public interface MachineProxyService { public interface MachineProxyService extends IService<MachineProxy> {
/** /**
* 注册新的机器代理 * 注册新的机器代理
*/ */
Long createProxy(MachineProxyVO machineProxyVO); boolean register(MachineProxyVO machineProxyVO);
/** /**
* 更新代理状态 * 更新代理状态
*/ */
void updateProxy(MachineProxyVO machineProxyVO); boolean updateStatus(MachineProxyVO machineProxyVO);
/** /**
@ -26,8 +27,12 @@ public interface MachineProxyService {
* *
* @return 状态统计Map * @return 状态统计Map
*/ */
Map<Integer, Long> getAllProxyStatus(); Map<String, Long> getStatusStatistics();
/**
* 更新代理配置
*/
void update(MachineProxyVO machineProxyVO);
/** /**
@ -35,7 +40,7 @@ public interface MachineProxyService {
* *
* @param proxyIds 代理ID列表 * @param proxyIds 代理ID列表
*/ */
void deleteProxyList(String proxyIds); void delete(String proxyIds);
PageResult<MachineProxyDO> getProxyPage(MachineProxyVO machineProxyVO); PageResult<MachineProxyVO> list(MachineProxyVO machineProxyVO);
} }

View File

@ -10,10 +10,6 @@ import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import cd.casic.framework.commons.util.object.BeanUtils; import cd.casic.framework.commons.util.object.BeanUtils;
import java.util.Arrays;
import java.util.List;
import static cd.casic.framework.commons.exception.util.ServiceExceptionUtil.exception; import static cd.casic.framework.commons.exception.util.ServiceExceptionUtil.exception;
import static cd.casic.module.machine.contants.MachineErrorCodeConstants.*; import static cd.casic.module.machine.contants.MachineErrorCodeConstants.*;
@ -60,14 +56,7 @@ public class MachineEnvServiceImpl implements MachineEnvService {
@Override @Override
public void deleteEnvList(String ids) { public void deleteEnvList(String ids) {
//ids转换为List,使用流 machineEnvMapper.deleteBatchByIds(ids);
List<Long> machineEnvIds = Arrays.stream(ids.split(","))
.map(String::trim)
.filter(s -> !s.isEmpty())
.map(Long::parseLong)
.toList();
machineEnvMapper.deleteBatchIds(machineEnvIds);
} }
@Override @Override

View File

@ -1,132 +1,161 @@
package cd.casic.module.machine.service.impl; //package cd.casic.module.machine.service.impl;
import cd.casic.framework.commons.pojo.PageResult; //
import cd.casic.module.machine.controller.vo.MachineProxyVO; //import cd.casic.module.machine.controller.vo.MachineProxyDTO;
import cd.casic.module.machine.dal.dataobject.MachineProxyDO; //import cd.casic.module.machine.dal.dataobject.MachineProxy;
import cd.casic.module.machine.enums.MachineProxyStatus; //import cd.casic.module.machine.enums.MachineProxyStatus;
import cd.casic.module.machine.enums.MachineProxyType; //import cd.casic.module.machine.enums.MachineProxyType;
import cd.casic.module.machine.dal.mysql.MachineProxyMapper; //import cd.casic.module.machine.exception.ServiceException;
import cd.casic.module.machine.service.MachineProxyService; //import cd.casic.module.machine.dal.mysql.MachineProxyMapper;
import cd.casic.module.machine.utils.EnumUtils; //import cd.casic.module.machine.service.MachineProxyService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; //import cd.casic.module.machine.utils.EnumUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; //import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.annotations.VisibleForTesting; //import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource; //import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cd.casic.framework.commons.util.object.BeanUtils; //
import org.springframework.stereotype.Service; //import jakarta.annotation.Resource;
import org.springframework.transaction.annotation.Transactional; //import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils; //import org.springframework.stereotype.Service;
import java.util.*; //import org.springframework.transaction.annotation.Transactional;
import java.util.function.Function; //import org.springframework.util.CollectionUtils;
import java.util.stream.Collectors; //
//import java.util.*;
import static cd.casic.framework.commons.exception.util.ServiceExceptionUtil.exception; //import java.util.function.Function;
import static cd.casic.module.machine.contants.MachineErrorCodeConstants.*; //import java.util.stream.Collectors;
import static com.baomidou.mybatisplus.extension.toolkit.Db.save; //
import static org.apache.catalina.security.SecurityUtil.remove; ///**
// * 机器代理服务实现类
/** // */
* 机器代理服务实现类 //@Service
*/ //public class MachineProxyServiceImpl extends ServiceImpl<MachineProxyMapper, MachineProxy> implements MachineProxyService {
@Service // @Resource
public class MachineProxyServiceImpl implements MachineProxyService { // private MachineProxyMapper machineProxyMapper;
@Resource //
private MachineProxyMapper machineProxyMapper; // @Override
// @Transactional(rollbackFor = Exception.class)
@Override // public boolean register(MachineProxyDTO machineProxyDTO) {
@Transactional(rollbackFor = Exception.class) // // 创建代理记录
public Long createProxy(MachineProxyVO machineProxyVO) { // MachineProxy proxy = new MachineProxy();
validateMachineProxyAdd(machineProxyVO); // BeanUtils.copyProperties(machineProxyDTO, proxy);
// 创建代理记录 // proxy.setProxyTypeCode(EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode());
MachineProxyDO machineProxyDO = BeanUtils.toBean(machineProxyVO, MachineProxyDO.class);; // proxy.setVersion("1.0.0");
save(machineProxyDO); // proxy.setStatusCode(MachineProxyStatus.ONLINE.getCode());
return machineProxyDO.getId(); // return save(proxy);
} // }
//
@Override // @Override
public void updateProxy(MachineProxyVO machineProxyVO) { // public boolean updateStatus(MachineProxyDTO machineProxyDTO) {
// 参数校验 // // 参数校验
MachineProxyDO machineProxyDO = validateMachineProxyExists(machineProxyVO.getId()); // if (machineProxyDTO == null) {
// 更新状态 // throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL, "MachineProxyDTO对象为空");
BeanUtils.copyProperties(machineProxyVO, machineProxyDO); // }
machineProxyMapper.updateById(machineProxyDO); //
} // // 查询代理
// MachineProxy proxy = this.getById(machineProxyDTO.getId());
//
@Override // if (proxy == null) {
public Map<Integer, Long> getAllProxyStatus() { // throw new ServiceException(ServiceException.MACHINE_PROXY_NULL, "代理不存在");
List<MachineProxyDO> proxyList = machineProxyMapper.selectList(new QueryWrapper<>()); // }
if (CollectionUtils.isEmpty(proxyList)) { //
return Collections.emptyMap(); // // 更新状态
} // proxy.setStatusCode(EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode());
return proxyList.stream() // proxy.setUpdateTime(new Date());
.map(MachineProxyDO::getStatus) // return updateById(proxy);
.collect(Collectors.groupingBy( // }
Function.identity(), //
// 统计每个分组的元素数量 //
Collectors.counting() // @Override
)); // public Map<String, Long> getStatusStatistics() {
} // List<MachineProxy> proxyList = list();
//
// if (CollectionUtils.isEmpty(proxyList)) {
@Override // return Collections.emptyMap();
@Transactional(rollbackFor = Exception.class) // }
public void deleteProxyList(String ids) { // return proxyList.stream()
if (ids == null) { // .map(proxy -> EnumUtils.getEnumByCode(proxy.getStatusCode(), MachineProxyStatus.class).getMessage())
return; // .collect(Collectors.groupingBy(
} // Function.identity(),
List<Long> machineProxyIds = Arrays.stream(ids.split(",")) // Collectors.counting() // 统计每个分组的元素数量
.map(String::trim) // ));
.filter(s -> !s.isEmpty()) // }
.map(Long::parseLong) //
.toList(); // @Override
//检查是否存在在线的代理 // public void update(MachineProxyDTO machineProxyDTO) {
validateMachineProxyOnline(machineProxyIds); // // 参数校验
// 批量逻辑删除 // if (machineProxyDTO == null) {
machineProxyMapper.deleteBatchIds(machineProxyIds); // throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL, "MachineProxyDTO对象为空");
} // }
// MachineProxy machineProxy = new MachineProxy();
@Override // BeanUtils.copyProperties(machineProxyDTO, machineProxy);
public PageResult<MachineProxyDO> getProxyPage(MachineProxyVO machineProxyVO) { // if (machineProxyDTO.getProxyType() != null && !machineProxyDTO.getProxyType().isEmpty()) {
return machineProxyMapper.selectPage(machineProxyVO); // machineProxy.setProxyTypeCode(EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode());
} // }
// if (machineProxyDTO.getStatus() != null && !machineProxyDTO.getStatus().isEmpty()) {
// machineProxy.setStatusCode(EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode());
// }
@VisibleForTesting // this.updateById(machineProxy);
MachineProxyDO validateMachineProxyExists(Long id) { // }
if (id == null) { //
return null; //
} // @Override
MachineProxyDO machineProxyDO = machineProxyMapper.selectById(id); // @Transactional(rollbackFor = Exception.class)
if (machineProxyDO == null) { // public void delete(String ids) {
throw exception(MACHINE_PROXY_NOT_EXISTS); // List<Long> machineProxyIds = Arrays.stream(ids.split(","))
} // .map(String::trim)
return machineProxyDO; // .filter(s -> !s.isEmpty())
} // .map(Long::parseLong)
// .toList();
@VisibleForTesting // // 参数校验
void validateMachineProxyOnline(List<Long> ids) { // if (CollectionUtils.isEmpty(machineProxyIds)) {
List<Long> idList = machineProxyMapper.getOnlineProxyListInIds(ids); // throw new ServiceException(ServiceException.PARAMETER_ERROR, "参数错误");
if(!idList.isEmpty()){ // }
throw exception(MACHINE_PROXY_IS_ONLINE,idList); // // 批量逻辑删除
} // remove(new LambdaQueryWrapper<MachineProxy>()
} // .in(MachineProxy::getId, machineProxyIds)
// .ne(MachineProxy::getStatus, MachineProxyStatus.ONLINE.getCode()));
@VisibleForTesting // }
void validateMachineProxyAdd(MachineProxyVO machineProxyVO) { //
if (machineProxyVO.getHostIp()==null) { // @Override
throw exception(MACHINE_PROXY_HOST_IP_NULL); // public PageResult<MachineProxyDTO> list(MachineProxyDTO machineProxyDTO) {
} // QueryWrapper<MachineProxy> queryWrapper = getMachineProxyQueryWrapper(machineProxyDTO);
if (machineProxyVO.getUsername()==null) { // Page<MachineProxy> page = machineProxyMapper.selectPage(new Page<>(machineProxyDTO.getPageIndex(), machineProxyDTO.getPageSize()), queryWrapper);
throw exception(MACHINE_PROXY_USER_NAME_NULL); // List<MachineProxyDTO> machineProxyDtos = page.getRecords().stream().map(machineProxy -> {
} // MachineProxyDTO dto = new MachineProxyDTO();
// BeanUtils.copyProperties(machineProxy, dto);
// 校验代理类型 // dto.setProxyType(EnumUtils.getEnumByCode(machineProxy.getProxyTypeCode(), MachineProxyType.class).getMessage());
int[] arrays = MachineProxyType.ARRAYS; // dto.setStatus(EnumUtils.getEnumByCode(machineProxy.getStatusCode(), MachineProxyStatus.class).getMessage());
if (Arrays.stream(arrays).filter(i -> i == machineProxyVO.getProxyType()).findAny().isEmpty()) { // return dto;
throw exception(MACHINE_PROXY_TYPE_NOT_EXISTS); // }).toList();
} // return new PageResult<>(
} // page.getCurrent(),
// page.getSize(),
} // page.getTotal(),
// page.getPages(),
// machineProxyDtos
// );
// }
//
// private QueryWrapper<MachineProxy> getMachineProxyQueryWrapper(MachineProxyDTO machineProxyDTO) {
// QueryWrapper<MachineProxy> queryWrapper = new QueryWrapper<>();
// if (machineProxyDTO.getHostIp() != null && !machineProxyDTO.getHostIp().isEmpty()) {
// queryWrapper.like("host_ip", machineProxyDTO.getHostIp());
// }
// if (machineProxyDTO.getSshPort() != null && !machineProxyDTO.getSshPort().isEmpty()) {
// queryWrapper.like("ssh_port", machineProxyDTO.getSshPort());
// }
// if (machineProxyDTO.getUsername() != null && !machineProxyDTO.getUsername().isEmpty()) {
// queryWrapper.like("username", machineProxyDTO.getUsername());
// }
// if (machineProxyDTO.getDescription() != null && !machineProxyDTO.getDescription().isEmpty()) {
// queryWrapper.like("description", machineProxyDTO.getDescription());
// }
// if (machineProxyDTO.getStatus() != null && !machineProxyDTO.getStatus().isEmpty()) {
// 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");
// }
//
//}