diff --git a/cool-admin-java/src/main/java/com/cool/modules/plugin/controller/admin/AdminPluginInfoController.java b/cool-admin-java/src/main/java/com/cool/modules/plugin/controller/admin/AdminPluginInfoController.java new file mode 100644 index 0000000..9af66b2 --- /dev/null +++ b/cool-admin-java/src/main/java/com/cool/modules/plugin/controller/admin/AdminPluginInfoController.java @@ -0,0 +1,79 @@ +package com.cool.modules.plugin.controller.admin; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.cool.core.annotation.CoolRestController; +import com.cool.core.annotation.IgnoreRecycleData; +import com.cool.core.base.BaseController; +import com.cool.core.plugin.service.CoolPluginService; +import com.cool.core.request.R; +import com.cool.modules.plugin.entity.PluginInfoEntity; +import com.cool.modules.plugin.service.PluginInfoService; +import com.mybatisflex.core.query.QueryWrapper; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestAttribute; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.util.HashMap; +import java.util.Map; + +import static com.cool.modules.plugin.entity.table.PluginInfoEntityTableDef.PLUGIN_INFO_ENTITY; + +@Tag(name = "插件信息", description = "插件信息") +@CoolRestController(api = {"add", "delete", "update", "page", "list", "info"}) +@RequiredArgsConstructor +public class AdminPluginInfoController extends BaseController { + + final private CoolPluginService coolPluginService; + + @Override + protected void init(HttpServletRequest request, JSONObject requestParams) { + + setPageOption(createOp().queryWrapper( + QueryWrapper.create().orderBy(PLUGIN_INFO_ENTITY.UPDATE_TIME, false)) + .select(PLUGIN_INFO_ENTITY.DEFAULT_COLUMNS)); + } + + @Override + @Operation(summary = "修改", description = "根据ID修改") + @PostMapping("/update") + protected R update(@RequestBody PluginInfoEntity t, + @RequestAttribute() JSONObject requestParams) { + if (ObjUtil.isNotEmpty(t.getConfig())) { + t.setConfig(JSONUtil.parseObj(t.getConfig())); + } else { + t.setConfig(new HashMap<>()); + } + coolPluginService.updatePlugin(t); + return R.ok(); + } + + @Operation(summary = "安装插件") + @PostMapping(value = "/install", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R install( + @RequestParam(value = "files") @Parameter(description = "文件") MultipartFile[] files, + @RequestParam(value = "force") @Parameter(description = "是否强制安装") boolean force) { + coolPluginService.install(files[0], force); + return R.ok(); + } + + @Override + @Operation(summary = "卸载插件") + @PostMapping("/delete") + @IgnoreRecycleData() + public R delete(HttpServletRequest request, @RequestBody Map params, + @RequestAttribute() JSONObject requestParams) { + coolPluginService.uninstall(Convert.toLongArray(getIds(params))[0]); + return R.ok(); + } +} diff --git a/cool-admin-java/src/main/java/com/cool/modules/plugin/entity/PluginInfoEntity.java b/cool-admin-java/src/main/java/com/cool/modules/plugin/entity/PluginInfoEntity.java new file mode 100644 index 0000000..1e9797a --- /dev/null +++ b/cool-admin-java/src/main/java/com/cool/modules/plugin/entity/PluginInfoEntity.java @@ -0,0 +1,65 @@ +package com.cool.modules.plugin.entity; + +import com.cool.core.base.BaseEntity; +import com.cool.core.config.PluginJson; +import com.cool.core.mybatis.handler.Fastjson2TypeHandler; +import com.cool.core.mybatis.handler.JacksonTypeHandler; +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Table; +import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; +import com.tangzc.mybatisflex.autotable.annotation.UniIndex; +import lombok.Getter; +import lombok.Setter; +import org.dromara.autotable.annotation.Ignore; +import org.dromara.autotable.annotation.Index; + +@Getter +@Setter +@Table(value = "plugin_info", comment = "插件信息") +public class PluginInfoEntity extends BaseEntity { + + @ColumnDefine(comment = "名称") + private String name; + + @ColumnDefine(comment = "简介") + private String description; + + @UniIndex + @ColumnDefine(comment = "实例对象") + private String key; + + @Index + @ColumnDefine(comment = "Hook", length = 50) + private String hook; + + @ColumnDefine(comment = "描述", type = "text") + private String readme; + + @ColumnDefine(comment = "版本") + private String version; + + @ColumnDefine(comment = "Logo(base64)", type = "text", notNull = true) + private String logo; + + @ColumnDefine(comment = "作者") + private String author; + + @ColumnDefine(comment = "状态 0-禁用 1-启用", defaultValue = "1") + private Integer status; + + @ColumnDefine(comment = "插件的plugin.json", type = "json", notNull = true) + @Column(typeHandler = Fastjson2TypeHandler.class) + private PluginJson pluginJson; + + @ColumnDefine(comment = "配置", type = "json") + @Column(typeHandler = JacksonTypeHandler.class) + private Object config; + + @Ignore + @Column(ignore = true) + public String keyName; + + public String getKeyName() { + return key; + } +} diff --git a/cool-admin-java/src/main/java/com/cool/modules/plugin/mapper/PluginInfoMapper.java b/cool-admin-java/src/main/java/com/cool/modules/plugin/mapper/PluginInfoMapper.java new file mode 100644 index 0000000..c38e8d7 --- /dev/null +++ b/cool-admin-java/src/main/java/com/cool/modules/plugin/mapper/PluginInfoMapper.java @@ -0,0 +1,8 @@ +package com.cool.modules.plugin.mapper; + +import com.cool.modules.plugin.entity.PluginInfoEntity; +import com.mybatisflex.core.BaseMapper; + +public interface PluginInfoMapper extends BaseMapper { + +} diff --git a/cool-admin-java/src/main/java/com/cool/modules/plugin/service/PluginInfoService.java b/cool-admin-java/src/main/java/com/cool/modules/plugin/service/PluginInfoService.java new file mode 100644 index 0000000..acea573 --- /dev/null +++ b/cool-admin-java/src/main/java/com/cool/modules/plugin/service/PluginInfoService.java @@ -0,0 +1,12 @@ +package com.cool.modules.plugin.service; + +import com.cool.core.base.BaseService; +import com.cool.modules.plugin.entity.PluginInfoEntity; + +public interface PluginInfoService extends BaseService { + PluginInfoEntity getByKey(String key); + + PluginInfoEntity getPluginInfoEntityByHook(String hook); + + PluginInfoEntity getPluginInfoEntityById(Long id); +} diff --git a/cool-admin-java/src/main/java/com/cool/modules/plugin/service/impl/PluginInfoServiceImpl.java b/cool-admin-java/src/main/java/com/cool/modules/plugin/service/impl/PluginInfoServiceImpl.java new file mode 100644 index 0000000..e493e5c --- /dev/null +++ b/cool-admin-java/src/main/java/com/cool/modules/plugin/service/impl/PluginInfoServiceImpl.java @@ -0,0 +1,54 @@ +package com.cool.modules.plugin.service.impl; + +import com.cool.core.base.BaseServiceImpl; +import com.cool.modules.plugin.entity.PluginInfoEntity; +import com.cool.modules.plugin.mapper.PluginInfoMapper; +import com.cool.modules.plugin.service.PluginInfoService; +import com.mybatisflex.core.query.QueryWrapper; +import org.springframework.stereotype.Service; + +import static com.cool.modules.plugin.entity.table.PluginInfoEntityTableDef.PLUGIN_INFO_ENTITY; + +/** + * 插件信息服务类 + */ +@Service +public class PluginInfoServiceImpl extends BaseServiceImpl + implements PluginInfoService { + + /** + * 通过key获取插件信息 + */ + @Override + public PluginInfoEntity getByKey(String key) { + QueryWrapper queryWrapper = QueryWrapper.create(); + queryWrapper.and(PLUGIN_INFO_ENTITY.KEY.eq(key)); + return getOne(queryWrapper); + } + + /** + * 通过hook获取插件信息 + */ + @Override + public PluginInfoEntity getPluginInfoEntityByHook(String hook) { + QueryWrapper queryWrapper = getPluginInfoEntityQueryWrapper().and(PLUGIN_INFO_ENTITY.HOOK.eq(hook)) + .and(PLUGIN_INFO_ENTITY.STATUS.eq(1)).limit(1); + return getOne(queryWrapper); + } + + /** + * 通过id获取插件信息 + */ + @Override + public PluginInfoEntity getPluginInfoEntityById(Long id) { + QueryWrapper queryWrapper = getPluginInfoEntityQueryWrapper().and(PLUGIN_INFO_ENTITY.ID.eq(id)); + return getOne(queryWrapper); + } + + /** + * 获取查询对象 + */ + private QueryWrapper getPluginInfoEntityQueryWrapper() { + return QueryWrapper.create(); + } +}