【功能完善】IoT: 添加插件和插件实例管理功能,包括插件信息的增删改查接口,支持文件上传和状态更新,同时优化了枚举类型的处理逻辑。
This commit is contained in:
parent
8ca9bebfd1
commit
cbfbc55cd8
Binary file not shown.
|
@ -34,12 +34,10 @@ public enum IotPluginDeployTypeEnum implements IntArrayValuable {
|
|||
}
|
||||
|
||||
public static IotPluginDeployTypeEnum fromDeployType(Integer deployType) {
|
||||
for (IotPluginDeployTypeEnum value : values()) {
|
||||
if (value.getDeployType().equals(deployType)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return Arrays.stream(values())
|
||||
.filter(value -> value.getDeployType().equals(deployType))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public static boolean isValidDeployType(Integer deployType) {
|
||||
|
|
|
@ -34,12 +34,10 @@ public enum IotPluginStatusEnum implements IntArrayValuable {
|
|||
}
|
||||
|
||||
public static IotPluginStatusEnum fromState(Integer state) {
|
||||
for (IotPluginStatusEnum value : values()) {
|
||||
if (value.getStatus().equals(state)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return Arrays.stream(values())
|
||||
.filter(value -> value.getStatus().equals(state))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -35,14 +35,11 @@ public enum IotPluginTypeEnum implements IntArrayValuable {
|
|||
return ARRAYS;
|
||||
}
|
||||
|
||||
// TODO @haohao:可以使用 hutool 简化
|
||||
public static IotPluginTypeEnum fromType(Integer type) {
|
||||
for (IotPluginTypeEnum value : values()) {
|
||||
if (value.getType().equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return Arrays.stream(values())
|
||||
.filter(value -> value.getType().equals(type))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public static boolean isValidType(Integer type) {
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugininfo;
|
||||
package cn.iocoder.yudao.module.iot.controller.admin.plugin;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoImportReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoPageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoRespVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoImportReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoRespVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
|
||||
import cn.iocoder.yudao.module.iot.service.plugininfo.PluginInfoService;
|
||||
import cn.iocoder.yudao.module.iot.service.plugin.PluginInfoService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
@ -72,6 +72,7 @@ public class PluginInfoController {
|
|||
|
||||
@PostMapping("/upload-file")
|
||||
@Operation(summary = "上传插件文件")
|
||||
@PreAuthorize("@ss.hasPermission('iot:plugin-info:update')")
|
||||
public CommonResult<Boolean> uploadFile(@Valid PluginInfoImportReqVO reqVO) {
|
||||
pluginInfoService.uploadFile(reqVO.getId(), reqVO.getFile());
|
||||
return success(true);
|
|
@ -1,32 +1,31 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugininstance;
|
||||
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
|
||||
import jakarta.validation.*;
|
||||
import jakarta.servlet.http.*;
|
||||
import java.util.*;
|
||||
import java.io.IOException;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
package cn.iocoder.yudao.module.iot.controller.admin.plugin;
|
||||
|
||||
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
|
||||
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
|
||||
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.*;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceRespVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
|
||||
import cn.iocoder.yudao.module.iot.service.plugininstance.PluginInstanceService;
|
||||
import cn.iocoder.yudao.module.iot.service.plugin.PluginInstanceService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
@Tag(name = "管理后台 - IoT 插件实例")
|
||||
@RestController
|
||||
|
@ -78,17 +77,4 @@ public class PluginInstanceController {
|
|||
return success(BeanUtils.toBean(pageResult, PluginInstanceRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出IoT 插件实例 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('iot:plugin-instance:export')")
|
||||
@ApiAccessLog(operateType = EXPORT)
|
||||
public void exportPluginInstanceExcel(@Valid PluginInstancePageReqVO pageReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||
List<PluginInstanceDO> list = pluginInstanceService.getPluginInstancePage(pageReqVO).getList();
|
||||
// 导出 Excel
|
||||
ExcelUtils.write(response, "IoT 插件实例.xls", "数据", PluginInstanceRespVO.class,
|
||||
BeanUtils.toBean(list, PluginInstanceRespVO.class));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
|
||||
package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotNull;
|
|
@ -0,0 +1,17 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Schema(description = "管理后台 - IoT 插件信息分页 Request VO")
|
||||
@Data
|
||||
public class PluginInfoPageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "插件名称", example = "http")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "状态")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
|
||||
package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
|
@ -34,7 +34,7 @@ public class PluginInfoRespVO {
|
|||
|
||||
@Schema(description = "插件包文件名", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("插件包文件名")
|
||||
private String file;
|
||||
private String fileName;
|
||||
|
||||
@Schema(description = "插件版本", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("插件版本")
|
|
@ -1,4 +1,4 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
|
||||
package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
|
@ -23,7 +23,7 @@ public class PluginInfoSaveReqVO {
|
|||
private Integer deployType;
|
||||
|
||||
@Schema(description = "插件包文件名", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String file;
|
||||
private String fileName;
|
||||
|
||||
@Schema(description = "插件版本", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String version;
|
|
@ -1,4 +1,4 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo;
|
||||
package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
|
||||
|
||||
import lombok.*;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
|
@ -1,4 +1,4 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo;
|
||||
package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
|
@ -1,4 +1,4 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo;
|
||||
package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
|
@ -1,116 +0,0 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugininfo;
|
||||
|
||||
import jakarta.annotation.Resource;
|
||||
import org.pf4j.spring.SpringPluginManager;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.security.PermitAll;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 插件 Controller 测试用例
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/iot/plugins")
|
||||
public class PluginController {
|
||||
|
||||
@Resource
|
||||
private SpringPluginManager springPluginManager;
|
||||
|
||||
@Value("${pf4j.pluginsDir}")
|
||||
private String pluginsDir;
|
||||
|
||||
/**
|
||||
* 上传插件 JAR 文件并加载插件
|
||||
*
|
||||
* @param file 上传的 JAR 文件
|
||||
* @return 上传结果
|
||||
*/
|
||||
@PermitAll
|
||||
@PostMapping("/upload")
|
||||
public ResponseEntity<String> uploadPlugin(@RequestParam("file") MultipartFile file) {
|
||||
if (file.isEmpty()) {
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("上传的文件为空");
|
||||
}
|
||||
|
||||
// 确保插件目录存在
|
||||
Path pluginsPath = Paths.get(pluginsDir);
|
||||
try {
|
||||
if (!Files.exists(pluginsPath)) {
|
||||
Files.createDirectories(pluginsPath);
|
||||
}
|
||||
|
||||
// 保存上传的 JAR 文件到插件目录
|
||||
String filename = file.getOriginalFilename();
|
||||
if (filename == null || (!filename.endsWith(".jar") && !filename.endsWith(".zip"))) {
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("上传的文件不是 JAR 或 ZIP 文件");
|
||||
}
|
||||
|
||||
Path jarPath = pluginsPath.resolve(filename);
|
||||
|
||||
Files.copy(file.getInputStream(), jarPath, StandardCopyOption.REPLACE_EXISTING);
|
||||
|
||||
// 加载插件
|
||||
String pluginId = springPluginManager.loadPlugin(jarPath.toAbsolutePath());
|
||||
|
||||
// 启动插件
|
||||
springPluginManager.startPlugin(pluginId);
|
||||
|
||||
return ResponseEntity.ok("插件上传并加载成功");
|
||||
} catch (IOException e) {
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("上传插件时发生错误: " + e.getMessage());
|
||||
} catch (Exception e) {
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("加载插件时发生错误: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 卸载指定插件
|
||||
*
|
||||
* @param pluginId 插件 ID
|
||||
* @return 卸载结果
|
||||
*/
|
||||
@PermitAll
|
||||
@DeleteMapping("/unload/{pluginId}")
|
||||
public ResponseEntity<String> unloadPlugin(@PathVariable String pluginId) {
|
||||
if (springPluginManager.getPlugins().stream().noneMatch(plugin -> plugin.getDescriptor().getPluginId().equals(pluginId))) {
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("插件未加载: " + pluginId);
|
||||
}
|
||||
|
||||
springPluginManager.stopPlugin(pluginId);
|
||||
springPluginManager.unloadPlugin(pluginId);
|
||||
|
||||
// 删除插件 JAR 文件(可选)
|
||||
// PluginWrapper plugin = pluginManager.getPlugin(pluginId);
|
||||
// PluginDescriptor descriptor = plugin.getDescriptor();
|
||||
// Path jarPath = Paths.get(pluginsDir).resolve(descriptor.getPluginId() + ".jar");
|
||||
// Files.deleteIfExists(jarPath);
|
||||
|
||||
return ResponseEntity.ok("插件卸载成功: " + pluginId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 列出所有已加载的插件
|
||||
*
|
||||
* @return 插件列表
|
||||
*/
|
||||
@PermitAll
|
||||
@GetMapping("/list")
|
||||
public ResponseEntity<List<String>> listPlugins() {
|
||||
List<String> plugins = springPluginManager.getPlugins().stream()
|
||||
.map(plugin -> plugin.getDescriptor().getPluginId())
|
||||
.collect(Collectors.toList());
|
||||
return ResponseEntity.ok(plugins);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,59 +0,0 @@
|
|||
package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||
import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginTypeEnum;
|
||||
import lombok.*;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
// TODO @haohao:只查询必要字段哈
|
||||
@Schema(description = "管理后台 - IoT 插件信息分页 Request VO")
|
||||
@Data
|
||||
public class PluginInfoPageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "插件包 ID ", example = "24627")
|
||||
private String pluginId;
|
||||
|
||||
@Schema(description = "插件名称", example = "赵六")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "描述", example = "你猜")
|
||||
private String description;
|
||||
|
||||
@Schema(description = "部署方式", example = "2")
|
||||
private Integer deployType;
|
||||
|
||||
@Schema(description = "插件包文件名")
|
||||
private String file;
|
||||
|
||||
@Schema(description = "插件版本")
|
||||
private String version;
|
||||
|
||||
@Schema(description = "插件类型", example = "2")
|
||||
@InEnum(IotPluginTypeEnum.class)
|
||||
private Integer type;
|
||||
|
||||
@Schema(description = "设备插件协议类型")
|
||||
private String protocol;
|
||||
|
||||
@Schema(description = "状态")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "插件配置项描述信息")
|
||||
private String configSchema;
|
||||
|
||||
@Schema(description = "插件配置信息")
|
||||
private String config;
|
||||
|
||||
@Schema(description = "插件脚本")
|
||||
private String script;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] createTime;
|
||||
|
||||
}
|
|
@ -1,6 +1,9 @@
|
|||
package cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginDeployTypeEnum;
|
||||
import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum;
|
||||
import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginTypeEnum;
|
||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
|
@ -27,6 +30,7 @@ public class PluginInfoDO extends BaseDO {
|
|||
@TableId
|
||||
private Long id;
|
||||
// TODO @haohao:这个是不是改成类似 key 之类的字段哈?
|
||||
// 回复:默认是 pluginId,可以不用改
|
||||
/**
|
||||
* 插件包 ID
|
||||
*/
|
||||
|
@ -41,22 +45,23 @@ public class PluginInfoDO extends BaseDO {
|
|||
private String description;
|
||||
/**
|
||||
* 部署方式
|
||||
* <p>
|
||||
* 枚举 {@link IotPluginDeployTypeEnum}
|
||||
*/
|
||||
// TODO @haohao:枚举
|
||||
private Integer deployType;
|
||||
/**
|
||||
* 插件包文件名
|
||||
*/
|
||||
// TODO @haohao:是不是叫 fileName 哈?避免后续有别的字段,类似 fileUrl?
|
||||
private String file;
|
||||
private String fileName;
|
||||
/**
|
||||
* 插件版本
|
||||
*/
|
||||
private String version;
|
||||
/**
|
||||
* 插件类型
|
||||
* <p>
|
||||
* 枚举 {@link IotPluginTypeEnum}
|
||||
*/
|
||||
// TODO @haohao:枚举
|
||||
private Integer type;
|
||||
/**
|
||||
* 设备插件协议类型
|
||||
|
@ -64,8 +69,9 @@ public class PluginInfoDO extends BaseDO {
|
|||
private String protocol;
|
||||
/**
|
||||
* 状态
|
||||
* <p>
|
||||
* 枚举 {@link IotPluginStatusEnum}
|
||||
*/
|
||||
// TODO @haohao:枚举
|
||||
private Integer status;
|
||||
/**
|
||||
* 插件配置项描述信息
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
package cn.iocoder.yudao.module.iot.dal.mysql.plugin;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.*;
|
||||
|
||||
/**
|
||||
* IoT 插件信息 Mapper
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Mapper
|
||||
public interface PluginInfoMapper extends BaseMapperX<PluginInfoDO> {
|
||||
|
||||
default PageResult<PluginInfoDO> selectPage(PluginInfoPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<PluginInfoDO>()
|
||||
.likeIfPresent(PluginInfoDO::getName, reqVO.getName())
|
||||
.eqIfPresent(PluginInfoDO::getStatus, reqVO.getStatus())
|
||||
.orderByDesc(PluginInfoDO::getId));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
package cn.iocoder.yudao.module.iot.dal.mysql.plugininstance;
|
||||
package cn.iocoder.yudao.module.iot.dal.mysql.plugin;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.*;
|
||||
|
||||
/**
|
||||
* IoT 插件实例 Mapper
|
|
@ -1,36 +0,0 @@
|
|||
package cn.iocoder.yudao.module.iot.dal.mysql.plugininfo;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.*;
|
||||
|
||||
/**
|
||||
* IoT 插件信息 Mapper
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Mapper
|
||||
public interface PluginInfoMapper extends BaseMapperX<PluginInfoDO> {
|
||||
|
||||
default PageResult<PluginInfoDO> selectPage(PluginInfoPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<PluginInfoDO>()
|
||||
.eqIfPresent(PluginInfoDO::getPluginId, reqVO.getPluginId())
|
||||
.likeIfPresent(PluginInfoDO::getName, reqVO.getName())
|
||||
.eqIfPresent(PluginInfoDO::getDescription, reqVO.getDescription())
|
||||
.eqIfPresent(PluginInfoDO::getDeployType, reqVO.getDeployType())
|
||||
.eqIfPresent(PluginInfoDO::getFile, reqVO.getFile())
|
||||
.eqIfPresent(PluginInfoDO::getVersion, reqVO.getVersion())
|
||||
.eqIfPresent(PluginInfoDO::getType, reqVO.getType())
|
||||
.eqIfPresent(PluginInfoDO::getProtocol, reqVO.getProtocol())
|
||||
.eqIfPresent(PluginInfoDO::getStatus, reqVO.getStatus())
|
||||
.eqIfPresent(PluginInfoDO::getConfigSchema, reqVO.getConfigSchema())
|
||||
.eqIfPresent(PluginInfoDO::getConfig, reqVO.getConfig())
|
||||
.eqIfPresent(PluginInfoDO::getScript, reqVO.getScript())
|
||||
.betweenIfPresent(PluginInfoDO::getCreateTime, reqVO.getCreateTime())
|
||||
.orderByDesc(PluginInfoDO::getId));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,8 +1,8 @@
|
|||
package cn.iocoder.yudao.module.iot.service.plugininfo;
|
||||
package cn.iocoder.yudao.module.iot.service.plugin;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoPageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
|
@ -1,11 +1,11 @@
|
|||
package cn.iocoder.yudao.module.iot.service.plugininfo;
|
||||
package cn.iocoder.yudao.module.iot.service.plugin;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoPageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
|
||||
import cn.iocoder.yudao.module.iot.dal.mysql.plugininfo.PluginInfoMapper;
|
||||
import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInfoMapper;
|
||||
import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
@ -41,7 +41,6 @@ public class PluginInfoServiceImpl implements PluginInfoService {
|
|||
|
||||
@Resource
|
||||
private PluginInfoMapper pluginInfoMapper;
|
||||
|
||||
@Resource
|
||||
private SpringPluginManager pluginManager;
|
||||
|
||||
|
@ -94,12 +93,12 @@ public class PluginInfoServiceImpl implements PluginInfoService {
|
|||
Executors.newSingleThreadExecutor().submit(() -> {
|
||||
try {
|
||||
TimeUnit.SECONDS.sleep(1); // 等待 1 秒,避免插件未卸载完毕
|
||||
File file = new File(pluginsDir, pluginInfoDO.getFile());
|
||||
File file = new File(pluginsDir, pluginInfoDO.getFileName());
|
||||
if (file.exists() && !file.delete()) {
|
||||
log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFile());
|
||||
log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFileName());
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFile(), e);
|
||||
log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFileName(), e);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -213,7 +212,7 @@ public class PluginInfoServiceImpl implements PluginInfoService {
|
|||
private void updatePluginInfo(PluginInfoDO pluginInfoDo, String pluginIdNew, MultipartFile file) {
|
||||
pluginInfoDo.setPluginId(pluginIdNew);
|
||||
pluginInfoDo.setStatus(IotPluginStatusEnum.STOPPED.getStatus());
|
||||
pluginInfoDo.setFile(file.getOriginalFilename());
|
||||
pluginInfoDo.setFileName(file.getOriginalFilename());
|
||||
pluginInfoDo.setScript("");
|
||||
|
||||
PluginDescriptor pluginDescriptor = pluginManager.getPlugin(pluginIdNew).getDescriptor();
|
|
@ -1,8 +1,8 @@
|
|||
package cn.iocoder.yudao.module.iot.service.plugininstance;
|
||||
package cn.iocoder.yudao.module.iot.service.plugin;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstancePageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstanceSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
|
||||
import jakarta.validation.Valid;
|
||||
|
|
@ -1,11 +1,11 @@
|
|||
package cn.iocoder.yudao.module.iot.service.plugininstance;
|
||||
package cn.iocoder.yudao.module.iot.service.plugin;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstancePageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstanceSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceSaveReqVO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
|
||||
import cn.iocoder.yudao.module.iot.dal.mysql.plugininstance.PluginInstanceMapper;
|
||||
import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInstanceMapper;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
@ -13,7 +13,6 @@ import org.springframework.validation.annotation.Validated;
|
|||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.PLUGIN_INSTANCE_NOT_EXISTS;
|
||||
|
||||
// TODO @haohao:可以搞个 plugin 包,然后把 plugininfo、plugininstance
|
||||
/**
|
||||
* IoT 插件实例 Service 实现类
|
||||
*
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.iocoder.yudao.module.iot.dal.mysql.plugininstance.PluginInstanceMapper">
|
||||
<mapper namespace="cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInstanceMapper">
|
||||
|
||||
<!--
|
||||
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
|
||||
|
|
Loading…
Reference in New Issue