diff --git a/api-test/backend/src/main/java/io/metersphere/api/dto/plugin/PluginResourceDTO.java b/api-test/backend/src/main/java/io/metersphere/api/dto/plugin/PluginResourceDTO.java deleted file mode 100644 index 825c229180..0000000000 --- a/api-test/backend/src/main/java/io/metersphere/api/dto/plugin/PluginResourceDTO.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.metersphere.api.dto.plugin; - -import io.metersphere.plugin.core.ui.PluginResource; -import lombok.Data; - -@Data -public class PluginResourceDTO extends PluginResource { - private String entry; -} diff --git a/api-test/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.xml b/api-test/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.xml deleted file mode 100644 index ca671513c5..0000000000 --- a/api-test/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.xml +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - and ${criterion.condition} - - - and ${criterion.condition} #{criterion.value} - - - and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} - - - and ${criterion.condition} - - #{listItem} - - - - - - - - - - - - - - - - - - and ${criterion.condition} - - - and ${criterion.condition} #{criterion.value} - - - and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} - - - and ${criterion.condition} - - #{listItem} - - - - - - - - - - - id, `name`, plugin_id, script_id, jmeter_clazz, clazz_name, source_path, source_name, - exec_entry, create_time, update_time, create_user_id - - - form_option, form_script - - - select - - distinct - - - , - - from plugin - - - - - order by ${orderByClause} - - - - select - - distinct - - - from plugin - - - - - order by ${orderByClause} - - - - select - - , - - from plugin - where id = #{id,jdbcType=VARCHAR} - - - delete from plugin - where id = #{id,jdbcType=VARCHAR} - - - delete from plugin - - - - - - insert into plugin (id, `name`, plugin_id, - script_id, jmeter_clazz, clazz_name, - source_path, source_name, exec_entry, - create_time, update_time, create_user_id, - form_option, form_script) - values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{pluginId,jdbcType=VARCHAR}, - #{scriptId,jdbcType=VARCHAR}, #{jmeterClazz,jdbcType=VARCHAR}, #{clazzName,jdbcType=VARCHAR}, - #{sourcePath,jdbcType=VARCHAR}, #{sourceName,jdbcType=VARCHAR}, #{execEntry,jdbcType=VARCHAR}, - #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT}, #{createUserId,jdbcType=VARCHAR}, - #{formOption,jdbcType=LONGVARCHAR}, #{formScript,jdbcType=LONGVARCHAR}) - - - insert into plugin - - - id, - - - `name`, - - - plugin_id, - - - script_id, - - - jmeter_clazz, - - - clazz_name, - - - source_path, - - - source_name, - - - exec_entry, - - - create_time, - - - update_time, - - - create_user_id, - - - form_option, - - - form_script, - - - - - #{id,jdbcType=VARCHAR}, - - - #{name,jdbcType=VARCHAR}, - - - #{pluginId,jdbcType=VARCHAR}, - - - #{scriptId,jdbcType=VARCHAR}, - - - #{jmeterClazz,jdbcType=VARCHAR}, - - - #{clazzName,jdbcType=VARCHAR}, - - - #{sourcePath,jdbcType=VARCHAR}, - - - #{sourceName,jdbcType=VARCHAR}, - - - #{execEntry,jdbcType=VARCHAR}, - - - #{createTime,jdbcType=BIGINT}, - - - #{updateTime,jdbcType=BIGINT}, - - - #{createUserId,jdbcType=VARCHAR}, - - - #{formOption,jdbcType=LONGVARCHAR}, - - - #{formScript,jdbcType=LONGVARCHAR}, - - - - - select count(*) from plugin - - - - - - update plugin - - - id = #{record.id,jdbcType=VARCHAR}, - - - `name` = #{record.name,jdbcType=VARCHAR}, - - - plugin_id = #{record.pluginId,jdbcType=VARCHAR}, - - - script_id = #{record.scriptId,jdbcType=VARCHAR}, - - - jmeter_clazz = #{record.jmeterClazz,jdbcType=VARCHAR}, - - - clazz_name = #{record.clazzName,jdbcType=VARCHAR}, - - - source_path = #{record.sourcePath,jdbcType=VARCHAR}, - - - source_name = #{record.sourceName,jdbcType=VARCHAR}, - - - exec_entry = #{record.execEntry,jdbcType=VARCHAR}, - - - create_time = #{record.createTime,jdbcType=BIGINT}, - - - update_time = #{record.updateTime,jdbcType=BIGINT}, - - - create_user_id = #{record.createUserId,jdbcType=VARCHAR}, - - - form_option = #{record.formOption,jdbcType=LONGVARCHAR}, - - - form_script = #{record.formScript,jdbcType=LONGVARCHAR}, - - - - - - - - update plugin - set id = #{record.id,jdbcType=VARCHAR}, - `name` = #{record.name,jdbcType=VARCHAR}, - plugin_id = #{record.pluginId,jdbcType=VARCHAR}, - script_id = #{record.scriptId,jdbcType=VARCHAR}, - jmeter_clazz = #{record.jmeterClazz,jdbcType=VARCHAR}, - clazz_name = #{record.clazzName,jdbcType=VARCHAR}, - source_path = #{record.sourcePath,jdbcType=VARCHAR}, - source_name = #{record.sourceName,jdbcType=VARCHAR}, - exec_entry = #{record.execEntry,jdbcType=VARCHAR}, - create_time = #{record.createTime,jdbcType=BIGINT}, - update_time = #{record.updateTime,jdbcType=BIGINT}, - create_user_id = #{record.createUserId,jdbcType=VARCHAR}, - form_option = #{record.formOption,jdbcType=LONGVARCHAR}, - form_script = #{record.formScript,jdbcType=LONGVARCHAR} - - - - - - update plugin - set id = #{record.id,jdbcType=VARCHAR}, - `name` = #{record.name,jdbcType=VARCHAR}, - plugin_id = #{record.pluginId,jdbcType=VARCHAR}, - script_id = #{record.scriptId,jdbcType=VARCHAR}, - jmeter_clazz = #{record.jmeterClazz,jdbcType=VARCHAR}, - clazz_name = #{record.clazzName,jdbcType=VARCHAR}, - source_path = #{record.sourcePath,jdbcType=VARCHAR}, - source_name = #{record.sourceName,jdbcType=VARCHAR}, - exec_entry = #{record.execEntry,jdbcType=VARCHAR}, - create_time = #{record.createTime,jdbcType=BIGINT}, - update_time = #{record.updateTime,jdbcType=BIGINT}, - create_user_id = #{record.createUserId,jdbcType=VARCHAR} - - - - - - update plugin - - - `name` = #{name,jdbcType=VARCHAR}, - - - plugin_id = #{pluginId,jdbcType=VARCHAR}, - - - script_id = #{scriptId,jdbcType=VARCHAR}, - - - jmeter_clazz = #{jmeterClazz,jdbcType=VARCHAR}, - - - clazz_name = #{clazzName,jdbcType=VARCHAR}, - - - source_path = #{sourcePath,jdbcType=VARCHAR}, - - - source_name = #{sourceName,jdbcType=VARCHAR}, - - - exec_entry = #{execEntry,jdbcType=VARCHAR}, - - - create_time = #{createTime,jdbcType=BIGINT}, - - - update_time = #{updateTime,jdbcType=BIGINT}, - - - create_user_id = #{createUserId,jdbcType=VARCHAR}, - - - form_option = #{formOption,jdbcType=LONGVARCHAR}, - - - form_script = #{formScript,jdbcType=LONGVARCHAR}, - - - where id = #{id,jdbcType=VARCHAR} - - - update plugin - set `name` = #{name,jdbcType=VARCHAR}, - plugin_id = #{pluginId,jdbcType=VARCHAR}, - script_id = #{scriptId,jdbcType=VARCHAR}, - jmeter_clazz = #{jmeterClazz,jdbcType=VARCHAR}, - clazz_name = #{clazzName,jdbcType=VARCHAR}, - source_path = #{sourcePath,jdbcType=VARCHAR}, - source_name = #{sourceName,jdbcType=VARCHAR}, - exec_entry = #{execEntry,jdbcType=VARCHAR}, - create_time = #{createTime,jdbcType=BIGINT}, - update_time = #{updateTime,jdbcType=BIGINT}, - create_user_id = #{createUserId,jdbcType=VARCHAR}, - form_option = #{formOption,jdbcType=LONGVARCHAR}, - form_script = #{formScript,jdbcType=LONGVARCHAR} - where id = #{id,jdbcType=VARCHAR} - - - update plugin - set `name` = #{name,jdbcType=VARCHAR}, - plugin_id = #{pluginId,jdbcType=VARCHAR}, - script_id = #{scriptId,jdbcType=VARCHAR}, - jmeter_clazz = #{jmeterClazz,jdbcType=VARCHAR}, - clazz_name = #{clazzName,jdbcType=VARCHAR}, - source_path = #{sourcePath,jdbcType=VARCHAR}, - source_name = #{sourceName,jdbcType=VARCHAR}, - exec_entry = #{execEntry,jdbcType=VARCHAR}, - create_time = #{createTime,jdbcType=BIGINT}, - update_time = #{updateTime,jdbcType=BIGINT}, - create_user_id = #{createUserId,jdbcType=VARCHAR} - where id = #{id,jdbcType=VARCHAR} - - \ No newline at end of file diff --git a/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/Plugin.java b/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/Plugin.java index 832b8adcc5..1c8e2d69e3 100644 --- a/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/Plugin.java +++ b/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/Plugin.java @@ -1,8 +1,7 @@ package io.metersphere.base.domain; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; @Data public class Plugin implements Serializable { @@ -14,10 +13,10 @@ public class Plugin implements Serializable { private String scriptId; - private String jmeterClazz; - private String clazzName; + private String jmeterClazz; + private String sourcePath; private String sourceName; @@ -30,5 +29,9 @@ public class Plugin implements Serializable { private String createUserId; + private Boolean xpack; + + private String scenario; + private static final long serialVersionUID = 1L; -} \ No newline at end of file +} diff --git a/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/PluginExample.java b/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/PluginExample.java index fb6f44fcc7..cb6a297afd 100644 --- a/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/PluginExample.java +++ b/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/PluginExample.java @@ -384,76 +384,6 @@ public class PluginExample { return (Criteria) this; } - public Criteria andJmeterClazzIsNull() { - addCriterion("jmeter_clazz is null"); - return (Criteria) this; - } - - public Criteria andJmeterClazzIsNotNull() { - addCriterion("jmeter_clazz is not null"); - return (Criteria) this; - } - - public Criteria andJmeterClazzEqualTo(String value) { - addCriterion("jmeter_clazz =", value, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzNotEqualTo(String value) { - addCriterion("jmeter_clazz <>", value, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzGreaterThan(String value) { - addCriterion("jmeter_clazz >", value, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzGreaterThanOrEqualTo(String value) { - addCriterion("jmeter_clazz >=", value, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzLessThan(String value) { - addCriterion("jmeter_clazz <", value, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzLessThanOrEqualTo(String value) { - addCriterion("jmeter_clazz <=", value, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzLike(String value) { - addCriterion("jmeter_clazz like", value, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzNotLike(String value) { - addCriterion("jmeter_clazz not like", value, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzIn(List values) { - addCriterion("jmeter_clazz in", values, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzNotIn(List values) { - addCriterion("jmeter_clazz not in", values, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzBetween(String value1, String value2) { - addCriterion("jmeter_clazz between", value1, value2, "jmeterClazz"); - return (Criteria) this; - } - - public Criteria andJmeterClazzNotBetween(String value1, String value2) { - addCriterion("jmeter_clazz not between", value1, value2, "jmeterClazz"); - return (Criteria) this; - } - public Criteria andClazzNameIsNull() { addCriterion("clazz_name is null"); return (Criteria) this; @@ -524,6 +454,76 @@ public class PluginExample { return (Criteria) this; } + public Criteria andJmeterClazzIsNull() { + addCriterion("jmeter_clazz is null"); + return (Criteria) this; + } + + public Criteria andJmeterClazzIsNotNull() { + addCriterion("jmeter_clazz is not null"); + return (Criteria) this; + } + + public Criteria andJmeterClazzEqualTo(String value) { + addCriterion("jmeter_clazz =", value, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzNotEqualTo(String value) { + addCriterion("jmeter_clazz <>", value, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzGreaterThan(String value) { + addCriterion("jmeter_clazz >", value, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzGreaterThanOrEqualTo(String value) { + addCriterion("jmeter_clazz >=", value, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzLessThan(String value) { + addCriterion("jmeter_clazz <", value, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzLessThanOrEqualTo(String value) { + addCriterion("jmeter_clazz <=", value, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzLike(String value) { + addCriterion("jmeter_clazz like", value, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzNotLike(String value) { + addCriterion("jmeter_clazz not like", value, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzIn(List values) { + addCriterion("jmeter_clazz in", values, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzNotIn(List values) { + addCriterion("jmeter_clazz not in", values, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzBetween(String value1, String value2) { + addCriterion("jmeter_clazz between", value1, value2, "jmeterClazz"); + return (Criteria) this; + } + + public Criteria andJmeterClazzNotBetween(String value1, String value2) { + addCriterion("jmeter_clazz not between", value1, value2, "jmeterClazz"); + return (Criteria) this; + } + public Criteria andSourcePathIsNull() { addCriterion("source_path is null"); return (Criteria) this; @@ -923,6 +923,136 @@ public class PluginExample { addCriterion("create_user_id not between", value1, value2, "createUserId"); return (Criteria) this; } + + public Criteria andXpackIsNull() { + addCriterion("xpack is null"); + return (Criteria) this; + } + + public Criteria andXpackIsNotNull() { + addCriterion("xpack is not null"); + return (Criteria) this; + } + + public Criteria andXpackEqualTo(Boolean value) { + addCriterion("xpack =", value, "xpack"); + return (Criteria) this; + } + + public Criteria andXpackNotEqualTo(Boolean value) { + addCriterion("xpack <>", value, "xpack"); + return (Criteria) this; + } + + public Criteria andXpackGreaterThan(Boolean value) { + addCriterion("xpack >", value, "xpack"); + return (Criteria) this; + } + + public Criteria andXpackGreaterThanOrEqualTo(Boolean value) { + addCriterion("xpack >=", value, "xpack"); + return (Criteria) this; + } + + public Criteria andXpackLessThan(Boolean value) { + addCriterion("xpack <", value, "xpack"); + return (Criteria) this; + } + + public Criteria andXpackLessThanOrEqualTo(Boolean value) { + addCriterion("xpack <=", value, "xpack"); + return (Criteria) this; + } + + public Criteria andXpackIn(List values) { + addCriterion("xpack in", values, "xpack"); + return (Criteria) this; + } + + public Criteria andXpackNotIn(List values) { + addCriterion("xpack not in", values, "xpack"); + return (Criteria) this; + } + + public Criteria andXpackBetween(Boolean value1, Boolean value2) { + addCriterion("xpack between", value1, value2, "xpack"); + return (Criteria) this; + } + + public Criteria andXpackNotBetween(Boolean value1, Boolean value2) { + addCriterion("xpack not between", value1, value2, "xpack"); + return (Criteria) this; + } + + public Criteria andScenarioIsNull() { + addCriterion("scenario is null"); + return (Criteria) this; + } + + public Criteria andScenarioIsNotNull() { + addCriterion("scenario is not null"); + return (Criteria) this; + } + + public Criteria andScenarioEqualTo(String value) { + addCriterion("scenario =", value, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioNotEqualTo(String value) { + addCriterion("scenario <>", value, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioGreaterThan(String value) { + addCriterion("scenario >", value, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioGreaterThanOrEqualTo(String value) { + addCriterion("scenario >=", value, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioLessThan(String value) { + addCriterion("scenario <", value, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioLessThanOrEqualTo(String value) { + addCriterion("scenario <=", value, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioLike(String value) { + addCriterion("scenario like", value, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioNotLike(String value) { + addCriterion("scenario not like", value, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioIn(List values) { + addCriterion("scenario in", values, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioNotIn(List values) { + addCriterion("scenario not in", values, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioBetween(String value1, String value2) { + addCriterion("scenario between", value1, value2, "scenario"); + return (Criteria) this; + } + + public Criteria andScenarioNotBetween(String value1, String value2) { + addCriterion("scenario not between", value1, value2, "scenario"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { @@ -1017,4 +1147,4 @@ public class PluginExample { this(condition, value, secondValue, null); } } -} \ No newline at end of file +} diff --git a/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/PluginWithBLOBs.java b/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/PluginWithBLOBs.java index 889cacb428..997dba2c29 100644 --- a/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/PluginWithBLOBs.java +++ b/framework/sdk-parent/domain/src/main/java/io/metersphere/base/domain/PluginWithBLOBs.java @@ -1,11 +1,10 @@ package io.metersphere.base.domain; +import java.io.Serializable; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import java.io.Serializable; - @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @@ -15,4 +14,4 @@ public class PluginWithBLOBs extends Plugin implements Serializable { private String formScript; private static final long serialVersionUID = 1L; -} \ No newline at end of file +} diff --git a/framework/sdk-parent/frontend/src/components/template/CustomFiledComponent.vue b/framework/sdk-parent/frontend/src/components/template/CustomFiledComponent.vue index 040ab5c9bd..2452a4fe27 100644 --- a/framework/sdk-parent/frontend/src/components/template/CustomFiledComponent.vue +++ b/framework/sdk-parent/frontend/src/components/template/CustomFiledComponent.vue @@ -105,10 +105,21 @@ :default-open="defaultOpen" :data="data" :disabled="disabled"/> - + + + @input="handleChange"/> diff --git a/framework/sdk-parent/frontend/src/i18n/lang/en-US.js b/framework/sdk-parent/frontend/src/i18n/lang/en-US.js index 244fd031bb..bce694a1c9 100644 --- a/framework/sdk-parent/frontend/src/i18n/lang/en-US.js +++ b/framework/sdk-parent/frontend/src/i18n/lang/en-US.js @@ -1256,6 +1256,7 @@ const message = { jar_file: "Jar Package", jar_manage: "JAR package management", delete_tip: "The deletion takes effect after the service is restarted", + delete_confirm: "Confirm to delete the plugin", file_exist: "The name already exists in the project", upload_limit_size: "Upload file size cannot exceed 30MB!", upload_limit_size_warn: "Upload file size cannot exceed {0} MB!", diff --git a/framework/sdk-parent/frontend/src/i18n/lang/zh-CN.js b/framework/sdk-parent/frontend/src/i18n/lang/zh-CN.js index db6cacd557..d3340222d1 100644 --- a/framework/sdk-parent/frontend/src/i18n/lang/zh-CN.js +++ b/framework/sdk-parent/frontend/src/i18n/lang/zh-CN.js @@ -1266,6 +1266,7 @@ const message = { jar_file: "jar包", jar_manage: "JAR包管理", delete_tip: "删除需重启服务后生效", + delete_confirm: "确认删除插件", file_exist: "该项目下已存在该jar包", upload_limit_size: "上传文件大小不能超过 30MB!", upload_limit_size_warn: "上传文件大小不能超过 {0} MB!", diff --git a/framework/sdk-parent/frontend/src/i18n/lang/zh-TW.js b/framework/sdk-parent/frontend/src/i18n/lang/zh-TW.js index d0df714336..1546a4807e 100644 --- a/framework/sdk-parent/frontend/src/i18n/lang/zh-TW.js +++ b/framework/sdk-parent/frontend/src/i18n/lang/zh-TW.js @@ -1264,6 +1264,7 @@ const message = { jar_manage: "JAR包管理", delete_tip: "刪除需重啟服務後生效", file_exist: "該項目下已存在該jar包", + delete_confirm: "確認刪除插件", upload_limit_size: "上傳文件大小不能超過 30MB!", upload_limit_size_warn: "上傳文件大小不能超過 {0} MB!", upload_limit: "上傳文件大小不能超過", diff --git a/api-test/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.java b/framework/sdk-parent/sdk/src/main/java/io/metersphere/base/mapper/PluginMapper.java similarity index 99% rename from api-test/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.java rename to framework/sdk-parent/sdk/src/main/java/io/metersphere/base/mapper/PluginMapper.java index 7b31811c62..a8ef5a9547 100644 --- a/api-test/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.java +++ b/framework/sdk-parent/sdk/src/main/java/io/metersphere/base/mapper/PluginMapper.java @@ -3,9 +3,8 @@ package io.metersphere.base.mapper; import io.metersphere.base.domain.Plugin; import io.metersphere.base.domain.PluginExample; import io.metersphere.base.domain.PluginWithBLOBs; -import org.apache.ibatis.annotations.Param; - import java.util.List; +import org.apache.ibatis.annotations.Param; public interface PluginMapper { long countByExample(PluginExample example); @@ -35,4 +34,4 @@ public interface PluginMapper { int updateByPrimaryKeyWithBLOBs(PluginWithBLOBs record); int updateByPrimaryKey(Plugin record); -} \ No newline at end of file +} diff --git a/system-setting/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.xml b/framework/sdk-parent/sdk/src/main/java/io/metersphere/base/mapper/PluginMapper.xml similarity index 87% rename from system-setting/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.xml rename to framework/sdk-parent/sdk/src/main/java/io/metersphere/base/mapper/PluginMapper.xml index ca671513c5..f4b53c8717 100644 --- a/system-setting/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.xml +++ b/framework/sdk-parent/sdk/src/main/java/io/metersphere/base/mapper/PluginMapper.xml @@ -6,14 +6,16 @@ - + + + @@ -78,8 +80,8 @@ - id, `name`, plugin_id, script_id, jmeter_clazz, clazz_name, source_path, source_name, - exec_entry, create_time, update_time, create_user_id + id, `name`, plugin_id, script_id, clazz_name, jmeter_clazz, source_path, source_name, + exec_entry, create_time, update_time, create_user_id, xpack, scenario form_option, form_script @@ -115,7 +117,7 @@ - select + select , @@ -133,16 +135,18 @@ - insert into plugin (id, `name`, plugin_id, - script_id, jmeter_clazz, clazz_name, - source_path, source_name, exec_entry, - create_time, update_time, create_user_id, - form_option, form_script) - values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{pluginId,jdbcType=VARCHAR}, - #{scriptId,jdbcType=VARCHAR}, #{jmeterClazz,jdbcType=VARCHAR}, #{clazzName,jdbcType=VARCHAR}, - #{sourcePath,jdbcType=VARCHAR}, #{sourceName,jdbcType=VARCHAR}, #{execEntry,jdbcType=VARCHAR}, - #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT}, #{createUserId,jdbcType=VARCHAR}, - #{formOption,jdbcType=LONGVARCHAR}, #{formScript,jdbcType=LONGVARCHAR}) + insert into plugin (id, `name`, plugin_id, + script_id, clazz_name, jmeter_clazz, + source_path, source_name, exec_entry, + create_time, update_time, create_user_id, + xpack, scenario, form_option, + form_script) + values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{pluginId,jdbcType=VARCHAR}, + #{scriptId,jdbcType=VARCHAR}, #{clazzName,jdbcType=VARCHAR}, #{jmeterClazz,jdbcType=VARCHAR}, + #{sourcePath,jdbcType=VARCHAR}, #{sourceName,jdbcType=VARCHAR}, #{execEntry,jdbcType=VARCHAR}, + #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT}, #{createUserId,jdbcType=VARCHAR}, + #{xpack,jdbcType=BIT}, #{scenario,jdbcType=VARCHAR}, #{formOption,jdbcType=LONGVARCHAR}, + #{formScript,jdbcType=LONGVARCHAR}) insert into plugin @@ -159,12 +163,12 @@ script_id, - - jmeter_clazz, - clazz_name, + + jmeter_clazz, + source_path, @@ -183,6 +187,12 @@ create_user_id, + + xpack, + + + scenario, + form_option, @@ -203,12 +213,12 @@ #{scriptId,jdbcType=VARCHAR}, - - #{jmeterClazz,jdbcType=VARCHAR}, - #{clazzName,jdbcType=VARCHAR}, + + #{jmeterClazz,jdbcType=VARCHAR}, + #{sourcePath,jdbcType=VARCHAR}, @@ -227,6 +237,12 @@ #{createUserId,jdbcType=VARCHAR}, + + #{xpack,jdbcType=BIT}, + + + #{scenario,jdbcType=VARCHAR}, + #{formOption,jdbcType=LONGVARCHAR}, @@ -256,12 +272,12 @@ script_id = #{record.scriptId,jdbcType=VARCHAR}, - - jmeter_clazz = #{record.jmeterClazz,jdbcType=VARCHAR}, - clazz_name = #{record.clazzName,jdbcType=VARCHAR}, + + jmeter_clazz = #{record.jmeterClazz,jdbcType=VARCHAR}, + source_path = #{record.sourcePath,jdbcType=VARCHAR}, @@ -280,6 +296,12 @@ create_user_id = #{record.createUserId,jdbcType=VARCHAR}, + + xpack = #{record.xpack,jdbcType=BIT}, + + + scenario = #{record.scenario,jdbcType=VARCHAR}, + form_option = #{record.formOption,jdbcType=LONGVARCHAR}, @@ -297,14 +319,16 @@ `name` = #{record.name,jdbcType=VARCHAR}, plugin_id = #{record.pluginId,jdbcType=VARCHAR}, script_id = #{record.scriptId,jdbcType=VARCHAR}, - jmeter_clazz = #{record.jmeterClazz,jdbcType=VARCHAR}, clazz_name = #{record.clazzName,jdbcType=VARCHAR}, + jmeter_clazz = #{record.jmeterClazz,jdbcType=VARCHAR}, source_path = #{record.sourcePath,jdbcType=VARCHAR}, source_name = #{record.sourceName,jdbcType=VARCHAR}, exec_entry = #{record.execEntry,jdbcType=VARCHAR}, create_time = #{record.createTime,jdbcType=BIGINT}, update_time = #{record.updateTime,jdbcType=BIGINT}, create_user_id = #{record.createUserId,jdbcType=VARCHAR}, + xpack = #{record.xpack,jdbcType=BIT}, + scenario = #{record.scenario,jdbcType=VARCHAR}, form_option = #{record.formOption,jdbcType=LONGVARCHAR}, form_script = #{record.formScript,jdbcType=LONGVARCHAR} @@ -317,14 +341,16 @@ `name` = #{record.name,jdbcType=VARCHAR}, plugin_id = #{record.pluginId,jdbcType=VARCHAR}, script_id = #{record.scriptId,jdbcType=VARCHAR}, - jmeter_clazz = #{record.jmeterClazz,jdbcType=VARCHAR}, clazz_name = #{record.clazzName,jdbcType=VARCHAR}, + jmeter_clazz = #{record.jmeterClazz,jdbcType=VARCHAR}, source_path = #{record.sourcePath,jdbcType=VARCHAR}, source_name = #{record.sourceName,jdbcType=VARCHAR}, exec_entry = #{record.execEntry,jdbcType=VARCHAR}, create_time = #{record.createTime,jdbcType=BIGINT}, update_time = #{record.updateTime,jdbcType=BIGINT}, - create_user_id = #{record.createUserId,jdbcType=VARCHAR} + create_user_id = #{record.createUserId,jdbcType=VARCHAR}, + xpack = #{record.xpack,jdbcType=BIT}, + scenario = #{record.scenario,jdbcType=VARCHAR} @@ -341,12 +367,12 @@ script_id = #{scriptId,jdbcType=VARCHAR}, - - jmeter_clazz = #{jmeterClazz,jdbcType=VARCHAR}, - clazz_name = #{clazzName,jdbcType=VARCHAR}, + + jmeter_clazz = #{jmeterClazz,jdbcType=VARCHAR}, + source_path = #{sourcePath,jdbcType=VARCHAR}, @@ -365,6 +391,12 @@ create_user_id = #{createUserId,jdbcType=VARCHAR}, + + xpack = #{xpack,jdbcType=BIT}, + + + scenario = #{scenario,jdbcType=VARCHAR}, + form_option = #{formOption,jdbcType=LONGVARCHAR}, @@ -379,14 +411,16 @@ set `name` = #{name,jdbcType=VARCHAR}, plugin_id = #{pluginId,jdbcType=VARCHAR}, script_id = #{scriptId,jdbcType=VARCHAR}, - jmeter_clazz = #{jmeterClazz,jdbcType=VARCHAR}, clazz_name = #{clazzName,jdbcType=VARCHAR}, + jmeter_clazz = #{jmeterClazz,jdbcType=VARCHAR}, source_path = #{sourcePath,jdbcType=VARCHAR}, source_name = #{sourceName,jdbcType=VARCHAR}, exec_entry = #{execEntry,jdbcType=VARCHAR}, create_time = #{createTime,jdbcType=BIGINT}, update_time = #{updateTime,jdbcType=BIGINT}, create_user_id = #{createUserId,jdbcType=VARCHAR}, + xpack = #{xpack,jdbcType=BIT}, + scenario = #{scenario,jdbcType=VARCHAR}, form_option = #{formOption,jdbcType=LONGVARCHAR}, form_script = #{formScript,jdbcType=LONGVARCHAR} where id = #{id,jdbcType=VARCHAR} @@ -396,14 +430,16 @@ set `name` = #{name,jdbcType=VARCHAR}, plugin_id = #{pluginId,jdbcType=VARCHAR}, script_id = #{scriptId,jdbcType=VARCHAR}, - jmeter_clazz = #{jmeterClazz,jdbcType=VARCHAR}, clazz_name = #{clazzName,jdbcType=VARCHAR}, + jmeter_clazz = #{jmeterClazz,jdbcType=VARCHAR}, source_path = #{sourcePath,jdbcType=VARCHAR}, source_name = #{sourceName,jdbcType=VARCHAR}, exec_entry = #{execEntry,jdbcType=VARCHAR}, create_time = #{createTime,jdbcType=BIGINT}, update_time = #{updateTime,jdbcType=BIGINT}, - create_user_id = #{createUserId,jdbcType=VARCHAR} + create_user_id = #{createUserId,jdbcType=VARCHAR}, + xpack = #{xpack,jdbcType=BIT}, + scenario = #{scenario,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} - \ No newline at end of file + diff --git a/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/constants/PluginScenario.java b/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/constants/PluginScenario.java new file mode 100644 index 0000000000..d4c85a79c7 --- /dev/null +++ b/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/constants/PluginScenario.java @@ -0,0 +1,5 @@ +package io.metersphere.commons.constants; + +public enum PluginScenario { + api, platform +} diff --git a/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/utils/ShiroUtils.java b/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/utils/ShiroUtils.java index ab476c8289..dab3d60f45 100644 --- a/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/utils/ShiroUtils.java +++ b/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/utils/ShiroUtils.java @@ -8,6 +8,7 @@ public class ShiroUtils { filterChainDefinitionMap.put("/resource/md/get/**", "anon"); filterChainDefinitionMap.put("/resource/ui/get/**", "anon"); + filterChainDefinitionMap.put("/platform/plugin/resource/**", "anon"); filterChainDefinitionMap.put("/attachment/preview/**", "anon"); filterChainDefinitionMap.put("/*.worker.js", "anon"); filterChainDefinitionMap.put("/*.html", "anon"); diff --git a/system-setting/backend/src/main/java/io/metersphere/dto/PluginResourceDTO.java b/framework/sdk-parent/sdk/src/main/java/io/metersphere/dto/PluginResourceDTO.java similarity index 100% rename from system-setting/backend/src/main/java/io/metersphere/dto/PluginResourceDTO.java rename to framework/sdk-parent/sdk/src/main/java/io/metersphere/dto/PluginResourceDTO.java diff --git a/framework/sdk-parent/sdk/src/main/java/io/metersphere/metadata/repository/MinIOFileRepository.java b/framework/sdk-parent/sdk/src/main/java/io/metersphere/metadata/repository/MinIOFileRepository.java index c8e28c91ae..042f9c7b38 100644 --- a/framework/sdk-parent/sdk/src/main/java/io/metersphere/metadata/repository/MinIOFileRepository.java +++ b/framework/sdk-parent/sdk/src/main/java/io/metersphere/metadata/repository/MinIOFileRepository.java @@ -5,7 +5,9 @@ import io.metersphere.config.MinioProperties; import io.metersphere.dto.FileInfoDTO; import io.metersphere.metadata.vo.FileRequest; import io.minio.*; +import io.minio.messages.Item; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -56,12 +58,55 @@ public class MinIOFileRepository implements FileRepository { @Override public void delete(FileRequest request) throws Exception { String bucket = minioProperties.getBucket(); - String fileName = request.getProjectId() + "/" + request.getFileName(); + String fileName = request.getProjectId(); + if (StringUtils.isNotBlank(request.getFileName())) { + fileName += "/" + request.getFileName(); + } + if (fileName.endsWith("/")) { + // 删除文件夹 + removeObjects(bucket, fileName); + } else { + // 删除单个文件 + removeObject(bucket, fileName); + } + } + + private boolean removeObject(String bucketName, String objectName) throws Exception { minioClient.removeObject(RemoveObjectArgs.builder() - .bucket(bucket) // 存储桶 - .object(fileName) // 文件名 + .bucket(bucketName) // 存储桶 + .object(objectName) // 文件名 .build()); + return true; + } + + public void removeObjects(String bucketName, String objectName) throws Exception { + List objects = listObjects(bucketName, objectName); + for (String object : objects) { + removeObject(bucketName, object); + } + } + + /** + * 递归获取某路径下的所有文件 + */ + public List listObjects(String bucketName, String objectName) throws Exception { + List list = new ArrayList<>(12); + Iterable> results = minioClient.listObjects( + ListObjectsArgs.builder() + .bucket(bucketName) + .prefix(objectName) + .build()); + for (Result result : results) { + Item item = result.get(); + if (item.isDir()) { + List files = listObjects(bucketName, item.objectName()); + list.addAll(files); + } else { + list.add(item.objectName()); + } + } + return list; } @Override diff --git a/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/BasePluginService.java b/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/BasePluginService.java new file mode 100644 index 0000000000..b87904d8ae --- /dev/null +++ b/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/BasePluginService.java @@ -0,0 +1,23 @@ +package io.metersphere.service; + +import io.metersphere.base.domain.PluginExample; +import io.metersphere.base.domain.PluginWithBLOBs; +import io.metersphere.base.mapper.PluginMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +@Service +@Transactional(rollbackFor = Exception.class) +public class BasePluginService { + @Resource + private PluginMapper pluginMapper; + + public List getPlugins(String scenario) { + PluginExample example = new PluginExample(); + example.createCriteria().andScenarioEqualTo(scenario); + return pluginMapper.selectByExampleWithBLOBs(example); + } +} diff --git a/pom.xml b/pom.xml index 9b99b2b970..70e43791ba 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,7 @@ 2021.0.5 5.7.5 2.7.15 + main 7.15.0 1.10.0 7.4.1.jre8 diff --git a/system-setting/backend/pom.xml b/system-setting/backend/pom.xml index 3f0c83244d..e905bdaba8 100644 --- a/system-setting/backend/pom.xml +++ b/system-setting/backend/pom.xml @@ -22,6 +22,11 @@ xpack-interface ${revision} + + metersphere-platform-plugin-sdk + io.metersphere + ${platform-plugin-sdk.version} + diff --git a/system-setting/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.java b/system-setting/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.java deleted file mode 100644 index 7b31811c62..0000000000 --- a/system-setting/backend/src/main/java/io/metersphere/base/mapper/PluginMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.metersphere.base.mapper; - -import io.metersphere.base.domain.Plugin; -import io.metersphere.base.domain.PluginExample; -import io.metersphere.base.domain.PluginWithBLOBs; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -public interface PluginMapper { - long countByExample(PluginExample example); - - int deleteByExample(PluginExample example); - - int deleteByPrimaryKey(String id); - - int insert(PluginWithBLOBs record); - - int insertSelective(PluginWithBLOBs record); - - List selectByExampleWithBLOBs(PluginExample example); - - List selectByExample(PluginExample example); - - PluginWithBLOBs selectByPrimaryKey(String id); - - int updateByExampleSelective(@Param("record") PluginWithBLOBs record, @Param("example") PluginExample example); - - int updateByExampleWithBLOBs(@Param("record") PluginWithBLOBs record, @Param("example") PluginExample example); - - int updateByExample(@Param("record") Plugin record, @Param("example") PluginExample example); - - int updateByPrimaryKeySelective(PluginWithBLOBs record); - - int updateByPrimaryKeyWithBLOBs(PluginWithBLOBs record); - - int updateByPrimaryKey(Plugin record); -} \ No newline at end of file diff --git a/system-setting/backend/src/main/java/io/metersphere/controller/PlatformPluginController.java b/system-setting/backend/src/main/java/io/metersphere/controller/PlatformPluginController.java new file mode 100644 index 0000000000..5d0c1692e0 --- /dev/null +++ b/system-setting/backend/src/main/java/io/metersphere/controller/PlatformPluginController.java @@ -0,0 +1,28 @@ +package io.metersphere.controller; + +import io.metersphere.service.PlatformPluginService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; + + +@RestController +@RequestMapping(value = "/platform/plugin") +public class PlatformPluginController { + + @Resource + private PlatformPluginService platformPluginService; + + @GetMapping("/integration/info") + public Object getIntegrationInfo() { + return platformPluginService.getIntegrationInfo(); + } + + @GetMapping("/resource/{pluginId}") + public void getPluginResource(@PathVariable("pluginId") String pluginId, @RequestParam("fileName") String fileName, HttpServletResponse response) { + platformPluginService.getPluginResource(pluginId, fileName, response); + } +} diff --git a/system-setting/backend/src/main/java/io/metersphere/controller/PluginController.java b/system-setting/backend/src/main/java/io/metersphere/controller/PluginController.java index 0ba19a6e51..34f0dd9d71 100644 --- a/system-setting/backend/src/main/java/io/metersphere/controller/PluginController.java +++ b/system-setting/backend/src/main/java/io/metersphere/controller/PluginController.java @@ -19,12 +19,12 @@ public class PluginController { @Resource private PluginService pluginService; - @PostMapping("/add") - public String create(@RequestPart(value = "file", required = false) MultipartFile file) { + @PostMapping("/add/{scenario}") + public void create(@RequestPart(value = "file", required = false) MultipartFile file, @PathVariable String scenario) { if (file == null) { MSException.throwException("上传文件/执行入口为空"); } - return pluginService.editPlugin(file); + pluginService.addPlugin(file, scenario); } @GetMapping("/list") @@ -37,14 +37,13 @@ public class PluginController { return pluginService.get(id); } - @GetMapping("/delete/{id}") - public String delete(@PathVariable String id) { - return pluginService.delete(id); + @GetMapping("/delete/{scenario}/{id}") + public void delete(@PathVariable String scenario, @PathVariable String id) { + pluginService.delete(scenario, id); } @PostMapping("/custom/method") public Object customMethod(@RequestBody PluginRequest request) { return pluginService.customMethod(request); } - } diff --git a/system-setting/backend/src/main/java/io/metersphere/listener/InitListener.java b/system-setting/backend/src/main/java/io/metersphere/listener/InitListener.java new file mode 100644 index 0000000000..528cdc04f8 --- /dev/null +++ b/system-setting/backend/src/main/java/io/metersphere/listener/InitListener.java @@ -0,0 +1,20 @@ +package io.metersphere.listener; + +import io.metersphere.service.PlatformPluginService; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class InitListener implements ApplicationRunner { + + @Resource + private PlatformPluginService platformPluginService; + + @Override + public void run(ApplicationArguments applicationArguments) throws Exception { + platformPluginService.loadPlatFormPlugins(); + } +} diff --git a/system-setting/backend/src/main/java/io/metersphere/service/ApiPluginService.java b/system-setting/backend/src/main/java/io/metersphere/service/ApiPluginService.java new file mode 100644 index 0000000000..741951bb95 --- /dev/null +++ b/system-setting/backend/src/main/java/io/metersphere/service/ApiPluginService.java @@ -0,0 +1,157 @@ +package io.metersphere.service; + +import io.metersphere.base.domain.Plugin; +import io.metersphere.base.domain.PluginExample; +import io.metersphere.base.domain.PluginWithBLOBs; +import io.metersphere.base.mapper.PluginMapper; +import io.metersphere.commons.constants.PluginScenario; +import io.metersphere.commons.exception.MSException; +import io.metersphere.commons.utils.BeanUtils; +import io.metersphere.commons.utils.FileUtils; +import io.metersphere.commons.utils.LogUtil; +import io.metersphere.commons.utils.SessionUtils; +import io.metersphere.dto.PluginResourceDTO; +import io.metersphere.plugin.core.ui.PluginResource; +import io.metersphere.utils.CommonUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.File; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.UUID; + +@Service +@Transactional(rollbackFor = Exception.class) +public class ApiPluginService { + + @Resource + private PluginMapper pluginMapper; + + public List addApiPlugin(MultipartFile file) { + String id = UUID.randomUUID().toString(); + String path = FileUtils.create(id, file); + List addPlugins = new ArrayList<>(); + if (StringUtils.isNotEmpty(path)) { + List resources = this.getMethod(path, file.getOriginalFilename()); + if (CollectionUtils.isNotEmpty(resources)) { + for (PluginResourceDTO resource : resources) { + PluginExample example = new PluginExample(); + example.createCriteria().andPluginIdEqualTo(resource.getPluginId()); + List plugins = pluginMapper.selectByExample(example); + if (CollectionUtils.isNotEmpty(plugins)) { + String delPath = plugins.get(0).getSourcePath(); + FileUtils.deleteFile(delPath); + pluginMapper.deleteByExample(example); + } + this.create(resource, path, file.getOriginalFilename(), addPlugins); + } + } + } + return addPlugins; + } + + private boolean loadJar(String jarPath) { + try { + ClassLoader classLoader = ClassLoader.getSystemClassLoader(); + try { + File file = new File(jarPath); + if (!file.exists()) { + return false; + } + Method method = classLoader.getClass().getDeclaredMethod("addURL", URL.class); + method.setAccessible(true); + method.invoke(classLoader, file.toURI().toURL()); + } catch (NoSuchMethodException e) { + Method method = classLoader.getClass() + .getDeclaredMethod("appendToClassPathForInstrumentation", String.class); + method.setAccessible(true); + method.invoke(classLoader, jarPath); + } + return true; + } catch (Exception e) { + LogUtil.error(e); + } + return false; + } + + private List getMethod(String path, String fileName) { + List resources = new LinkedList<>(); + this.loadJar(path); + List> classes = CommonUtil.getSubClass(fileName); + try { + for (Class> aClass : classes) { + Object instance = aClass.newInstance(); + Object pluginObj = aClass.getDeclaredMethod("init").invoke(instance); + if (pluginObj != null) { + PluginResourceDTO pluginResourceDTO = new PluginResourceDTO(); + BeanUtils.copyBean(pluginResourceDTO, (PluginResource) pluginObj); + pluginResourceDTO.setEntry(aClass.getName()); + resources.add(pluginResourceDTO); + } + } + } catch (Exception e) { + LogUtil.error("初始化脚本异常:" + e.getMessage()); + MSException.throwException("调用插件初始化脚本失败"); + } + return resources; + } + + private void create(PluginResourceDTO resource, String path, String name, List addPlugins) { + resource.getUiScripts().forEach(item -> { + PluginWithBLOBs plugin = new PluginWithBLOBs(); + plugin.setName(item.getName()); + plugin.setPluginId(resource.getPluginId()); + plugin.setScriptId(item.getId()); + plugin.setSourcePath(path); + plugin.setFormOption(item.getFormOption()); + plugin.setFormScript(item.getFormScript()); + plugin.setClazzName(item.getClazzName()); + plugin.setSourceName(name); + plugin.setJmeterClazz(item.getJmeterClazz()); + plugin.setExecEntry(resource.getEntry()); + plugin.setCreateUserId(SessionUtils.getUserId()); + plugin.setScenario(PluginScenario.api.name()); + addPlugins.add(plugin); + }); + } + + + public boolean isXpack(Plugin item) { + try { + Class> clazz = Class.forName(item.getExecEntry()); + Object instance = clazz.newInstance(); + return isXpack(Class.forName(item.getExecEntry()), instance); + } catch (Exception e) { + LogUtil.error(e.getMessage()); + } + return false; + } + + private boolean isXpack(Class> aClass, Object instance) { + try { + Object verify = aClass.getDeclaredMethod("xpack").invoke(instance); + return (Boolean) verify; + } catch (Exception e) { + return false; + } + } + + public void delete(String id) { + //通过pluginId判断是否还有其他脚本,无则清理加载的jar包 + PluginExample example = new PluginExample(); + example.createCriteria().andPluginIdEqualTo(id); + List list = pluginMapper.selectByExample(example); + if (CollectionUtils.isNotEmpty(list)) { + FileUtils.deleteFile(list.get(0).getSourcePath()); + pluginMapper.deleteByExample(example); + } + } +} diff --git a/system-setting/backend/src/main/java/io/metersphere/service/PlatformPluginService.java b/system-setting/backend/src/main/java/io/metersphere/service/PlatformPluginService.java new file mode 100644 index 0000000000..9615b92dab --- /dev/null +++ b/system-setting/backend/src/main/java/io/metersphere/service/PlatformPluginService.java @@ -0,0 +1,121 @@ +package io.metersphere.service; + +import im.metersphere.loader.PluginManager; +import io.metersphere.api.PluginMetaInfo; +import io.metersphere.base.domain.PluginWithBLOBs; +import io.metersphere.base.mapper.PluginMapper; +import io.metersphere.commons.constants.PluginScenario; +import io.metersphere.commons.utils.JSON; +import io.metersphere.commons.utils.LogUtil; +import io.metersphere.commons.utils.SessionUtils; +import io.metersphere.utils.PluginManagerUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@Service +@Transactional(rollbackFor = Exception.class) +public class PlatformPluginService { + + @Resource + private BasePluginService basePluginService; + @Resource + private PluginMapper pluginMapper; + + private PluginManager pluginManager; + + public PluginWithBLOBs addPlatformPlugin(MultipartFile file) { + if (pluginManager != null) { + pluginManager = new PluginManager(); + } + String id = UUID.randomUUID().toString(); + + PluginManagerUtil.loadPlugin(id, pluginManager, file); + PluginMetaInfo pluginMetaInfo = pluginManager.getImplInstance(id, PluginMetaInfo.class); + + Map map = JSON.parseMap(pluginMetaInfo.getFrontendMetaData()); + map.put("id", id); + map.put("key", pluginMetaInfo.getKey()); + + PluginWithBLOBs plugin = new PluginWithBLOBs(); + plugin.setId(id); + plugin.setName(file.getOriginalFilename()); + plugin.setPluginId(pluginMetaInfo.getKey() + "-" + pluginMetaInfo.getVersion()); + plugin.setScriptId(plugin.getPluginId()); + plugin.setSourcePath(""); +// plugin.setFormOption(item.getFormOption()); + plugin.setFormScript(JSON.toJSONString(map)); + plugin.setClazzName(""); + plugin.setSourceName(file.getOriginalFilename()); + plugin.setJmeterClazz(""); + plugin.setExecEntry(""); + plugin.setCreateUserId(SessionUtils.getUserId()); + plugin.setXpack(pluginMetaInfo.isXpack()); + plugin.setScenario(PluginScenario.platform.name()); + return plugin; + } + + /** + * 查询所有平台插件并加载 + */ + public void loadPlatFormPlugins() { + pluginManager = new PluginManager(); + List plugins = basePluginService.getPlugins(PluginScenario.platform.name()); + PluginManagerUtil.loadPlugins(pluginManager, plugins); + } + + public void getPluginResource(String pluginId, String name, HttpServletResponse response) { + InputStream inputStream = pluginManager.getClassLoader(pluginId) + .getResourceAsStream(name); + getImage(inputStream, response); + } + + public Object getIntegrationInfo() { + List plugins = basePluginService.getPlugins(PluginScenario.platform.name()); + List configs = new ArrayList<>(); + plugins.forEach(item ->{ + Map metaData = JSON.parseMap(item.getFormScript()); + Map serviceIntegration = (Map) metaData.get("serviceIntegration"); + serviceIntegration.put("id", metaData.get("id")); + serviceIntegration.put("key", metaData.get("key")); + configs.add(serviceIntegration); + }); + return configs; + } + + public void getImage(InputStream in, HttpServletResponse response) { + response.setContentType("image/png"); + try(OutputStream out = response.getOutputStream()) { + out.write(in.readAllBytes()); + out.flush(); + } catch (Exception e) { + LogUtil.error(e); + } finally { + try { + in.close(); + } catch (IOException e) { + LogUtil.error(e); + } + } + } + + public void delete(String id) { + pluginMapper.deleteByPrimaryKey(id); + try { + pluginManager.getClassLoader(id).getStorageStrategy().delete(); + pluginManager.deletePlugin(id); + } catch (IOException e) { + LogUtil.error(e); + } + } +} diff --git a/system-setting/backend/src/main/java/io/metersphere/service/PluginService.java b/system-setting/backend/src/main/java/io/metersphere/service/PluginService.java index d105cf3095..c10a6d9f13 100644 --- a/system-setting/backend/src/main/java/io/metersphere/service/PluginService.java +++ b/system-setting/backend/src/main/java/io/metersphere/service/PluginService.java @@ -4,16 +4,12 @@ import io.metersphere.base.domain.Plugin; import io.metersphere.base.domain.PluginExample; import io.metersphere.base.domain.PluginWithBLOBs; import io.metersphere.base.mapper.PluginMapper; +import io.metersphere.commons.constants.PluginScenario; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.BeanUtils; -import io.metersphere.commons.utils.FileUtils; import io.metersphere.commons.utils.LogUtil; -import io.metersphere.commons.utils.SessionUtils; -import io.metersphere.dto.PluginResourceDTO; -import io.metersphere.plugin.core.ui.PluginResource; import io.metersphere.request.PluginDTO; import io.metersphere.request.PluginRequest; -import io.metersphere.utils.CommonUtil; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -21,175 +17,57 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.io.File; -import java.lang.reflect.Method; -import java.net.URL; import java.util.*; -import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) public class PluginService { @Resource private PluginMapper pluginMapper; + @Resource + private PlatformPluginService platformPluginService; + @Resource + private ApiPluginService apiPluginService; - public String editPlugin(MultipartFile file) { - String id = UUID.randomUUID().toString(); - String path = FileUtils.create(id, file); - if (StringUtils.isNotEmpty(path)) { - List resources = this.getMethod(path, file.getOriginalFilename()); - if (CollectionUtils.isNotEmpty(resources)) { - for (PluginResourceDTO resource : resources) { - PluginExample example = new PluginExample(); - example.createCriteria().andPluginIdEqualTo(resource.getPluginId()); - List plugins = pluginMapper.selectByExample(example); - if (CollectionUtils.isNotEmpty(plugins)) { - String delPath = plugins.get(0).getSourcePath(); - // this.closeJar(delPath); - FileUtils.deleteFile(delPath); - pluginMapper.deleteByExample(example); - } - this.create(resource, path, file.getOriginalFilename()); - } - } - } - return null; - } - - private void create(PluginResourceDTO resource, String path, String name) { - resource.getUiScripts().forEach(item -> { - PluginWithBLOBs plugin = new PluginWithBLOBs(); + public void addPlugin(PluginWithBLOBs plugin) { + if (StringUtils.isBlank(plugin.getId())) { plugin.setId(UUID.randomUUID().toString()); - plugin.setCreateTime(System.currentTimeMillis()); - plugin.setUpdateTime(System.currentTimeMillis()); - plugin.setName(item.getName()); - plugin.setPluginId(resource.getPluginId()); - plugin.setScriptId(item.getId()); - plugin.setSourcePath(path); - plugin.setFormOption(item.getFormOption()); - plugin.setFormScript(item.getFormScript()); - plugin.setClazzName(item.getClazzName()); - plugin.setSourceName(name); - plugin.setJmeterClazz(item.getJmeterClazz()); - plugin.setExecEntry(resource.getEntry()); - plugin.setCreateUserId(SessionUtils.getUserId()); - pluginMapper.insert(plugin); - }); - } - - private boolean isXpack(Class> aClass, Object instance) { - try { - Object verify = aClass.getDeclaredMethod("xpack").invoke(instance); - return (Boolean) verify; - } catch (Exception e) { - return false; - } - } - - private List getMethod(String path, String fileName) { - List resources = new LinkedList<>(); - this.loadJar(path); - List> classes = CommonUtil.getSubClass(fileName); - try { - for (Class> aClass : classes) { - Object instance = aClass.newInstance(); - Object pluginObj = aClass.getDeclaredMethod("init").invoke(instance); - if (pluginObj != null) { - PluginResourceDTO pluginResourceDTO = new PluginResourceDTO(); - BeanUtils.copyBean(pluginResourceDTO, (PluginResource) pluginObj); - pluginResourceDTO.setEntry(aClass.getName()); - resources.add(pluginResourceDTO); - } - } - } catch (Exception e) { - LogUtil.error("初始化脚本异常:" + e.getMessage()); - MSException.throwException("调用插件初始化脚本失败"); - } - return resources; - } - - private boolean loadJar(String jarPath) { - try { - ClassLoader classLoader = ClassLoader.getSystemClassLoader(); - try { - File file = new File(jarPath); - if (!file.exists()) { - return false; - } - Method method = classLoader.getClass().getDeclaredMethod("addURL", URL.class); - method.setAccessible(true); - method.invoke(classLoader, file.toURI().toURL()); - } catch (NoSuchMethodException e) { - Method method = classLoader.getClass() - .getDeclaredMethod("appendToClassPathForInstrumentation", String.class); - method.setAccessible(true); - method.invoke(classLoader, jarPath); - } - return true; - } catch (Exception e) { - LogUtil.error(e); - } - return false; - } - - public void loadPlugins() { - try { - PluginExample example = new PluginExample(); - List plugins = pluginMapper.selectByExample(example); - if (CollectionUtils.isNotEmpty(plugins)) { - plugins = plugins.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() - -> new TreeSet<>(Comparator.comparing(Plugin::getPluginId))), ArrayList::new)); - if (CollectionUtils.isNotEmpty(plugins)) { - plugins.forEach(item -> { - boolean isLoad = this.loadJar(item.getSourcePath()); - if (!isLoad) { - PluginExample pluginExample = new PluginExample(); - pluginExample.createCriteria().andPluginIdEqualTo(item.getPluginId()); - pluginMapper.deleteByExample(pluginExample); - } - }); - } - } - } catch (Exception e) { - LogUtil.error(e); } + plugin.setCreateTime(System.currentTimeMillis()); + plugin.setUpdateTime(System.currentTimeMillis()); + pluginMapper.insert(plugin); } public List list(String name) { - try { - PluginExample example = new PluginExample(); - if (StringUtils.isNotBlank(name)) { - name = "%" + name + "%"; - example.createCriteria().andNameLike(name); - } - List plugins = pluginMapper.selectByExample(example); - Map pluginMap = new HashMap<>(); - List lists = new LinkedList<>(); - if (CollectionUtils.isNotEmpty(plugins)) { - // 校验插件是否是企业版 - plugins.forEach(item -> { - PluginDTO dto = new PluginDTO(); - BeanUtils.copyBean(dto, item); + PluginExample example = new PluginExample(); + if (StringUtils.isNotBlank(name)) { + name = "%" + name + "%"; + example.createCriteria().andNameLike(name); + } + List plugins = pluginMapper.selectByExample(example); + Map pluginMap = new HashMap<>(); + List lists = new LinkedList<>(); + if (CollectionUtils.isNotEmpty(plugins)) { + // 校验插件是否是企业版 + plugins.forEach(item -> { + PluginDTO dto = new PluginDTO(); + BeanUtils.copyBean(dto, item); + if (StringUtils.equals(PluginScenario.api.name(), item.getScenario())) { + // api 插件调用 if (!pluginMap.containsKey(item.getPluginId())) { - try { - Class> clazz = Class.forName(item.getExecEntry()); - Object instance = clazz.newInstance(); - dto.setLicense(this.isXpack(Class.forName(item.getExecEntry()), instance)); - } catch (Exception e) { - LogUtil.error(e.getMessage()); - } + dto.setLicense(apiPluginService.isXpack(item)); } else { dto.setLicense(pluginMap.get(item.getPluginId())); } - lists.add(dto); pluginMap.put(item.getPluginId(), dto.getLicense()); - }); - return lists; - } - } catch (Exception e) { - LogUtil.error(e); + } else { + // 平台插件加载时已经保存 + dto.setLicense(item.getXpack()); + } + lists.add(dto); + }); } - return null; + return lists; } public Plugin get(String scriptId) { @@ -202,16 +80,14 @@ public class PluginService { return null; } - public String delete(String id) { - //通过pluginId判断是否还有其他脚本,无则清理加载的jar包 - PluginExample example = new PluginExample(); - example.createCriteria().andPluginIdEqualTo(id); - List list = pluginMapper.selectByExample(example); - if (CollectionUtils.isNotEmpty(list)) { - FileUtils.deleteFile(list.get(0).getSourcePath()); - pluginMapper.deleteByExample(example); + public void delete(String scenario, String id) { + if (StringUtils.equalsIgnoreCase(scenario, PluginScenario.platform.name())) { + // 平台插件传的是 id + platformPluginService.delete(id); + } else { + // 接口传的是 pluginId + apiPluginService.delete(id); } - return "success"; } public Object customMethod(PluginRequest request) { @@ -229,4 +105,25 @@ public class PluginService { PluginExample example = new PluginExample(); return pluginMapper.selectByExample(example); } + + public void addPlugin(MultipartFile file, String scenario) { + checkPluginExist(file); + if (StringUtils.equalsIgnoreCase(scenario, PluginScenario.platform.name())) { + PluginWithBLOBs plugin = platformPluginService.addPlatformPlugin(file); + addPlugin(plugin); + } else { + List plugins = apiPluginService.addApiPlugin(file); + plugins.forEach(this::addPlugin); + } + } + + public void checkPluginExist(MultipartFile file) { + String filename = file.getOriginalFilename(); + PluginExample example = new PluginExample(); + example.createCriteria().andSourceNameEqualTo(filename); + List plugins = pluginMapper.selectByExample(example); + if (CollectionUtils.isNotEmpty(plugins)) { + MSException.throwException("Plugin exist!"); + } + } } diff --git a/system-setting/backend/src/main/java/io/metersphere/service/plugin/MinioStorageStrategy.java b/system-setting/backend/src/main/java/io/metersphere/service/plugin/MinioStorageStrategy.java new file mode 100644 index 0000000000..41e0d9a8aa --- /dev/null +++ b/system-setting/backend/src/main/java/io/metersphere/service/plugin/MinioStorageStrategy.java @@ -0,0 +1,54 @@ +package io.metersphere.service.plugin; + +import im.metersphere.storage.StorageStrategy; +import io.metersphere.commons.constants.StorageConstants; +import io.metersphere.commons.utils.CommonBeanFactory; +import io.metersphere.metadata.service.FileManagerService; +import io.metersphere.metadata.vo.FileRequest; + +import java.io.IOException; +import java.io.InputStream; + +/** + * jar包静态资源存储策略,存储在 Minio + */ +public class MinioStorageStrategy implements StorageStrategy { + + private FileManagerService fileManagerService; + private String pluginId; + + public static final String DIR_PATH = "system/plugin"; + + public MinioStorageStrategy(String pluginId) { + this.pluginId = pluginId; + fileManagerService = CommonBeanFactory.getBean(FileManagerService.class); + } + + @Override + public String store(String name, InputStream in) throws IOException { + FileRequest request = getFileRequest(name); + return fileManagerService.upload(in.readAllBytes(), request); + } + + @Override + public InputStream get(String name) { + FileRequest request = getFileRequest(name); + return fileManagerService.downloadFileAsStream(request); + } + + @Override + public void delete() throws IOException { + FileRequest request = new FileRequest(); + request.setProjectId(DIR_PATH + "/" + this.pluginId + "/"); + request.setStorage(StorageConstants.MINIO.name()); + fileManagerService.delete(request); + } + + private FileRequest getFileRequest(String name) { + FileRequest request = new FileRequest(); + request.setProjectId(DIR_PATH + "/" + this.pluginId); + request.setFileName(name); + request.setStorage(StorageConstants.MINIO.name()); + return request; + } +} diff --git a/system-setting/backend/src/main/java/io/metersphere/utils/PluginManagerUtil.java b/system-setting/backend/src/main/java/io/metersphere/utils/PluginManagerUtil.java new file mode 100644 index 0000000000..834afac827 --- /dev/null +++ b/system-setting/backend/src/main/java/io/metersphere/utils/PluginManagerUtil.java @@ -0,0 +1,55 @@ +package io.metersphere.utils; + +import im.metersphere.loader.PluginManager; +import io.metersphere.base.domain.PluginWithBLOBs; +import io.metersphere.commons.exception.MSException; +import io.metersphere.commons.utils.LogUtil; +import io.metersphere.service.plugin.MinioStorageStrategy; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +public class PluginManagerUtil { + + public static void loadPlugin(String id, PluginManager pluginManager, MultipartFile file) { + if (pluginManager == null) { + pluginManager = new PluginManager(); + } + + MinioStorageStrategy minioStorageStrategy = new MinioStorageStrategy(id); + + try { + // 上传到 sso + minioStorageStrategy.store(file.getOriginalFilename(), file.getInputStream()); + } catch (IOException e) { + LogUtil.error("上传 jar 包失败: ", e); + MSException.throwException("上传 jar 包失败: " + e.getMessage()); + } + + // 加载 jar + try { + pluginManager.loadJar(id, file.getInputStream(), minioStorageStrategy); + } catch (IOException e) { + LogUtil.error("加载jar包失败: ", e); + MSException.throwException("加载jar包失败: " + e.getMessage()); + } + } + + /** + * 加载插件 + */ + public static void loadPlugins(PluginManager pluginManager, List plugins) { + plugins.forEach(plugin -> { + String id = plugin.getId(); + MinioStorageStrategy minioStorageStrategy = new MinioStorageStrategy(id); + InputStream inputStream = minioStorageStrategy.get(plugin.getSourceName()); + try { + pluginManager.loadJar(id, inputStream, minioStorageStrategy); + } catch (IOException e) { + LogUtil.error("初始化插件失败:", e); + } + }); + } +} diff --git a/system-setting/frontend/src/api/platform-plugin.js b/system-setting/frontend/src/api/platform-plugin.js new file mode 100644 index 0000000000..2456e124b8 --- /dev/null +++ b/system-setting/frontend/src/api/platform-plugin.js @@ -0,0 +1,6 @@ +import {post, get} from "metersphere-frontend/src/plugins/request"; +const BASE_URL = "/platform/plugin/"; + +export function getIntegrationInfo() { + return get(BASE_URL + 'integration/info'); +} diff --git a/system-setting/frontend/src/api/plugin.js b/system-setting/frontend/src/api/plugin.js index 7a662dd784..218f4a4b25 100644 --- a/system-setting/frontend/src/api/plugin.js +++ b/system-setting/frontend/src/api/plugin.js @@ -8,22 +8,23 @@ export function getPluginPageByName(name) { return get(`/plugin/list?name=${name}`); } -export function delPluginById(pluginId) { - return get(`/plugin/delete/${pluginId}`); +export function delPluginById(scenario, pluginId) { + return get(`/plugin/delete/${scenario}/${pluginId}`); } export function getPluginById(pluginId) { return get(`/plugin/get/${pluginId}`); } -export function addPlugin(file) { +export function addPlugin(scenario, file) { let formData = new FormData(); if (file) { formData.append("file", file); } + let url = '/plugin/add/' + scenario; let config = { method: 'POST', - url: '/plugin/add', + url: url, data: formData, headers: { 'Content-Type': undefined diff --git a/system-setting/frontend/src/business/system/plugin/JarConfig.vue b/system-setting/frontend/src/business/system/plugin/JarConfig.vue index e834cb540c..c5eb16d953 100644 --- a/system-setting/frontend/src/business/system/plugin/JarConfig.vue +++ b/system-setting/frontend/src/business/system/plugin/JarConfig.vue @@ -1,28 +1,45 @@ - + - - - - {{ $t('api_test.jar_config.upload_tip') }} - - - - - {{ $t('commons.confirm') }} - + + + + + + + + + + + + + + + {{ $t('api_test.jar_config.upload_tip') }} + + + + + {{ $t('commons.confirm') }} + + @@ -40,7 +57,12 @@ export default { name: '', description: '', fileName: '', + scenario: 'api' }, + scenarioOptions: [ + {text: '接口测试', value: 'api'}, + {text: '平台对接', value: "platform"}, + ], rules: { name: [ {required: true, message: this.$t('commons.input_name'), trigger: 'blur'}, @@ -115,7 +137,7 @@ export default { this.$warning(this.$t('commons.please_upload')); return; } - this.loading = addPlugin(this.fileList[0]).then(() => { + this.loading = addPlugin(this.currentConfig.scenario, this.fileList[0]).then(() => { this.$success(this.$t('organization.integration.successful_operation')); this.$emit("close"); this.fileList = []; diff --git a/system-setting/frontend/src/business/system/plugin/PluginConfig.vue b/system-setting/frontend/src/business/system/plugin/PluginConfig.vue index bf6b83d497..55b7db84f2 100644 --- a/system-setting/frontend/src/business/system/plugin/PluginConfig.vue +++ b/system-setting/frontend/src/business/system/plugin/PluginConfig.vue @@ -44,7 +44,7 @@ :tip="$t('commons.delete')" icon="el-icon-delete" type="danger" - @exec="handleDelete(scope.row.id)" v-permission="['SYSTEM_PLUGIN:DEL']"/> + @exec="handleDelete(scope.row)" v-permission="['SYSTEM_PLUGIN:DEL']"/> - + @@ -106,10 +106,19 @@ export default { if (res.data) { this.format(res.data); this.dataMap.forEach((values, key) => { - let obj = {id: key, license: values[0].license, name: values[0].sourceName, sourceName: values[0].sourceName, pluginId: key, createUserId: values[0].createUserId, updateTime: values[0].updateTime}; - obj.children = values; - this.tableData.push(obj); - }) + let item = values[0]; + if (item.scenario === 'api') { + let obj = {}; + Object.assign(obj, item); + obj.id = key; + obj.pluginId = key; + obj.name = item.sourceName; + obj.children = values; + this.tableData.push(obj); + } else { + this.tableData.push(item); + } + }); } }) }, @@ -131,9 +140,10 @@ export default { handleView(row) { this.$refs.scriptView.open(row.scriptId); }, - handleDelete(id) { - operationConfirm(this, this.$t('api_test.jar_config.delete_tip'), () => { - this.loading = delPluginById(id).then(() => { + handleDelete(row) { + let tip = row.scenario === 'api' ? this.$t('api_test.jar_config.delete_tip') : this.$t('api_test.jar_config.delete_confirm'); + operationConfirm(this, tip, () => { + this.loading = delPluginById(row.scenario, row.id).then(() => { this.$success(this.$t('commons.delete_success')); this.initPlugins(); }); diff --git a/system-setting/frontend/src/business/workspace/integration/BugManagement.vue b/system-setting/frontend/src/business/workspace/integration/BugManagement.vue index 14bcfcb97b..ab033c0657 100644 --- a/system-setting/frontend/src/business/workspace/integration/BugManagement.vue +++ b/system-setting/frontend/src/business/workspace/integration/BugManagement.vue @@ -2,13 +2,16 @@ {{ $t('organization.integration.select_defect_platform') }} - + + + + + + - - - @@ -19,9 +22,15 @@ - + + + + @@ -30,46 +39,43 @@ import TapdSetting from '@/business/workspace/integration/TapdSetting'; import JiraSetting from '@/business/workspace/integration/JiraSetting'; import ZentaoSetting from '@/business/workspace/integration/ZentaoSetting'; import AzuredevopsSetting from '@/business/workspace/integration/AzureDevopsSetting'; -import {AZURE_DEVOPS, JIRA, TAPD, ZEN_TAO} from "metersphere-frontend/src/utils/constants"; +import {AZURE_DEVOPS, TAPD, ZEN_TAO} from "metersphere-frontend/src/utils/constants"; +import PlatformConfig from "@/business/workspace/integration/PlatformConfig"; +import {getIntegrationInfo} from "@/api/platform-plugin"; export default { name: "BugManagement", - components: {TapdSetting, JiraSetting, ZentaoSetting, AzuredevopsSetting}, + components: {PlatformConfig, TapdSetting, JiraSetting, ZentaoSetting, AzuredevopsSetting}, data() { return { - tapdEnable: true, - jiraEnable: false, - zentaoEnable: false, - azuredevopsEnable: false, loading: false, - platform: TAPD + platformConfigs: [], + platform: TAPD, } }, - methods: { - change(platform) { - if (platform === TAPD) { - this.tapdEnable = true; - this.jiraEnable = false; - this.zentaoEnable = false; - this.azuredevopsEnable = false; - } else if (platform === JIRA) { - this.tapdEnable = false; - this.jiraEnable = true; - this.zentaoEnable = false; - this.azuredevopsEnable = false; - } else if (platform === ZEN_TAO) { - this.tapdEnable = false; - this.jiraEnable = false; - this.zentaoEnable = true; - this.azuredevopsEnable = false; - } else if (platform === AZURE_DEVOPS) { - this.tapdEnable = false; - this.jiraEnable = false; - this.zentaoEnable = false; - this.azuredevopsEnable = true; - } - } - } + created() { + this.platformConfigs = []; + + getIntegrationInfo() + .then((r) => { + this.platformConfigs = r.data; + }); + + this.platform = TAPD; + this.platformConfigs[0].key; + }, + computed: { + tapdEnable() { + return this.platform === TAPD; + }, + zentaoEnable() { + return this.platform === ZEN_TAO; + }, + azuredevopsEnable() { + return this.platform === AZURE_DEVOPS; + }, + }, + methods: {} } diff --git a/system-setting/frontend/src/business/workspace/integration/PlatformConfig.vue b/system-setting/frontend/src/business/workspace/integration/PlatformConfig.vue new file mode 100644 index 0000000000..4584bb471b --- /dev/null +++ b/system-setting/frontend/src/business/workspace/integration/PlatformConfig.vue @@ -0,0 +1,215 @@ + + + + {{ $t('organization.integration.basic_auth_info') }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +