You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@linkis.apache.org by ca...@apache.org on 2022/08/23 07:59:02 UTC

[incubator-linkis] branch dev-1.3.0 updated: EnginePlugin managment module (#2914) (#2916)

This is an automated email from the ASF dual-hosted git repository.

casion pushed a commit to branch dev-1.3.0
in repository https://gitbox.apache.org/repos/asf/incubator-linkis.git


The following commit(s) were added to refs/heads/dev-1.3.0 by this push:
     new 40f7d5bb9 EnginePlugin managment module (#2914) (#2916)
40f7d5bb9 is described below

commit 40f7d5bb9cbd4f6a75ad928c1968beb6810b4ac7
Author: yyuser5201314 <63...@users.noreply.github.com>
AuthorDate: Tue Aug 23 15:58:56 2022 +0800

    EnginePlugin managment module (#2914) (#2916)
    
    * EnginePlugin managment module (#2914)
    * EnginePlugin managment module add swagger annotation(#2914)
---
 .../server/dao/EngineConnBmlResourceDao.java       |   7 +
 .../dao/impl/EngineConnBmlResourceMapper.xml       |  32 +-
 .../server/entity/EngineConnBmlResource.java       |   6 +
 .../server/restful/EnginePluginRestful.java        | 198 ++++++++-
 .../EnginePluginAdminService.java}                 |  29 +-
 .../service/impl/EnginePluginAdminService.java     | 154 +++++++
 .../EnginePluginBMLVo.java}                        |  34 +-
 .../PageViewVo.java}                               |  31 +-
 .../AbstractEngineConnBmlResourceGenerator.scala   |   4 +-
 linkis-web/src/apps/linkis/i18n/common/zh.json     |  27 +-
 .../linkis/module/EnginePluginManagement/index.js  |  25 +-
 .../module/EnginePluginManagement/index.scss       |  46 +-
 .../linkis/module/EnginePluginManagement/index.vue | 479 +++++++++++++++++++++
 linkis-web/src/apps/linkis/router.js               |  14 +-
 linkis-web/src/apps/linkis/view/linkis/index.vue   |   5 +-
 15 files changed, 997 insertions(+), 94 deletions(-)

diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
index 8da15ca50..54d4fcd8a 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
@@ -18,6 +18,7 @@
 package org.apache.linkis.engineplugin.server.dao;
 
 import org.apache.linkis.engineplugin.server.entity.EngineConnBmlResource;
+import org.apache.linkis.engineplugin.vo.EnginePluginBMLVo;
 
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -27,6 +28,12 @@ import java.util.List;
 @Mapper
 public interface EngineConnBmlResourceDao {
 
+  List<String> getTypeList();
+
+  List<String> getTypeVersionList(@Param("type") String type);
+
+  List<EngineConnBmlResource> selectByPageVo(EnginePluginBMLVo enginePluginBMLVo);
+
   List<EngineConnBmlResource> getAllEngineConnBmlResource(
       @Param("engineConnType") String engineConnType, @Param("version") String version);
 
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/impl/EngineConnBmlResourceMapper.xml b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/impl/EngineConnBmlResourceMapper.xml
index 5145b3532..1be548bbc 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/impl/EngineConnBmlResourceMapper.xml
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/impl/EngineConnBmlResourceMapper.xml
@@ -6,16 +6,16 @@
   ~ The ASF licenses this file to You under the Apache License, Version 2.0
   ~ (the "License"); you may not use this file except in compliance with
   ~ the License.  You may obtain a copy of the License at
-  ~ 
+  ~
   ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~ 
+  ~
   ~ Unless required by applicable law or agreed to in writing, software
   ~ distributed under the License is distributed on an "AS IS" BASIS,
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-  
+
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 
 <mapper namespace="org.apache.linkis.engineplugin.server.dao.EngineConnBmlResourceDao">
@@ -31,6 +31,30 @@
         WHERE engine_conn_type=#{engineConnType} and `version`=#{version}
     </select>
 
+    <select id="getTypeVersionList" resultType="String">
+        SELECT version FROM linkis_cg_engine_conn_plugin_bml_resources where engine_conn_type = #{type} GROUP BY version
+    </select>
+
+    <select id="getTypeList" resultType="String">
+        SELECT engine_conn_type FROM linkis_cg_engine_conn_plugin_bml_resources GROUP BY engine_conn_type
+    </select>
+
+    <select id="selectByPageVo"
+            resultType="org.apache.linkis.engineplugin.server.entity.EngineConnBmlResource">
+        SELECT
+        *
+        FROM linkis_cg_engine_conn_plugin_bml_resources
+        <where>
+            <if test="engineConnType != null and engineConnType != ''">
+                <![CDATA[AND `engine_conn_type` like concat('%', #{engineConnType}, '%')]]>
+            </if>
+            <if test="engineConnVersion != null and engineConnVersion != ''">
+                <![CDATA[AND `version` like concat('%', #{engineConnVersion}, '%')]]>
+            </if>
+        </where>
+        <![CDATA[ ORDER BY create_time DESC ]]>
+    </select>
+
     <delete id="delete" parameterType="org.apache.linkis.engineplugin.server.entity.EngineConnBmlResource">
         delete from linkis_cg_engine_conn_plugin_bml_resources where
         engine_conn_type=#{engineConnBmlResource.engineConnType} and
@@ -66,4 +90,4 @@
     </insert>
 
 
-</mapper>
\ No newline at end of file
+</mapper>
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/entity/EngineConnBmlResource.java b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/entity/EngineConnBmlResource.java
index d177e8616..6b341e83e 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/entity/EngineConnBmlResource.java
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/entity/EngineConnBmlResource.java
@@ -19,6 +19,8 @@ package org.apache.linkis.engineplugin.server.entity;
 
 import java.util.Date;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+
 public class EngineConnBmlResource {
 
   private Long id;
@@ -29,7 +31,11 @@ public class EngineConnBmlResource {
   private Long fileSize;
   private String bmlResourceId;
   private String bmlResourceVersion;
+
+  @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
   private Date createTime;
+
+  @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
   private Date lastUpdateTime;
 
   public Long getId() {
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/restful/EnginePluginRestful.java b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/restful/EnginePluginRestful.java
index a9207d2fd..86600e0fc 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/restful/EnginePluginRestful.java
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/restful/EnginePluginRestful.java
@@ -17,17 +17,19 @@
 
 package org.apache.linkis.engineplugin.server.restful;
 
+import com.github.pagehelper.PageInfo;
+import org.apache.linkis.bml.protocol.Version;
 import org.apache.linkis.common.conf.Configuration;
+import org.apache.linkis.engineplugin.server.entity.EngineConnBmlResource;
 import org.apache.linkis.engineplugin.server.service.EngineConnResourceService;
+import org.apache.linkis.engineplugin.server.service.EnginePluginAdminService;
 import org.apache.linkis.engineplugin.server.service.RefreshEngineConnResourceRequest;
+import org.apache.linkis.engineplugin.vo.EnginePluginBMLVo;
 import org.apache.linkis.server.Message;
 import org.apache.linkis.server.utils.ModuleUserUtils;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -35,6 +37,9 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 @Api(tags = "ECP(engineconn plugin) operation")
 @RestController
@@ -44,6 +49,191 @@ public class EnginePluginRestful {
     private static final Logger log = LoggerFactory.getLogger(EnginePluginRestful.class);
 
     @Autowired private EngineConnResourceService engineConnResourceService;
+    @Autowired private EnginePluginAdminService enginePluginAdminService;
+
+    @ApiOperation(value = "rollBack", notes = "modify the default bmlResourceVersion of the engineplugin", response = Message.class)
+    @RequestMapping(path = "/rollBack", method = RequestMethod.POST)
+    public Message rollBackEnginePlugin(HttpServletRequest req,
+                                        @RequestBody EngineConnBmlResource engineConnBmlResource) {
+        String username = ModuleUserUtils.getOperationUser(req, "rollBackEnginePlugin");
+        if (Configuration.isAdmin(username)) {
+            log.info("{} start to rollBack EnginePlugin {} {}", username,engineConnBmlResource.getEngineConnType(),engineConnBmlResource.getVersion());
+            try {
+                enginePluginAdminService.rollBackEnginePlugin(engineConnBmlResource);
+                log.info("{} finished to rollBack EnginePlugin {} {}", username,engineConnBmlResource.getEngineConnType(),engineConnBmlResource.getVersion());
+                return Message.ok();
+            } catch (Exception e) {
+                return Message.error(e.getMessage());
+            }
+        } else {
+            return Message.error("Only administrators can operate");
+        }
+    }
+
+    @ApiOperation(value = "getVersionList", notes = "get all bmlResourceVersion of engineplugin", response = Message.class)
+    @RequestMapping(path = "/getVersionList", method = RequestMethod.GET)
+    public Message getVersionList(HttpServletRequest req,
+                                  @RequestParam(value = "ecType", required = false) String ecType,
+                                  @RequestParam(value = "version", required = false) String version,
+                                  @RequestParam(value = "bmlResourceId", required = false) String bmlResourceId) {
+        String username = ModuleUserUtils.getOperationUser(req, "getVersionList");
+        if (Configuration.isAdmin(username)) {
+            log.info("{} start to get all ec resource versionList", username);
+            try {
+                List<Version> typeList = enginePluginAdminService.getVersionList(username,bmlResourceId);
+                log.info("{} finished get all ec resource versionList", username);
+                return Message.ok().data("versionList", typeList);
+            } catch (Exception e) {
+                return Message.error(e.getMessage());
+            }
+        } else {
+            return Message.error("Only administrators can operate");
+        }
+    }
+
+    @ApiOperation(value = "getTypeList", notes = "get all types of engineplugin", response = Message.class)
+    @RequestMapping(path = "/getTypeList", method = RequestMethod.GET)
+    public Message getTypeList(HttpServletRequest req) {
+        String username = ModuleUserUtils.getOperationUser(req, "getTypeList");
+        if (Configuration.isAdmin(username)) {
+            log.info("{} start to get all ec resource TypeList", username);
+            try {
+                List<String> typeList = enginePluginAdminService.getTypeList();
+                log.info("{} finished get all ec resource TypeList", username);
+                return Message.ok().data("typeList", typeList);
+            } catch (Exception e) {
+                return Message.error(e.getMessage());
+            }
+        } else {
+            return Message.error("Only administrators can operate");
+        }
+    }
+
+    @ApiOperation(value = "getTypeVersionList", notes = "get all versions of the engineplgin type", response = Message.class)
+    @RequestMapping(path = "/getTypeVersionList/{type}", method = RequestMethod.GET)
+    public Message getTypeVersionList(
+            @PathVariable("type") String type,
+            HttpServletRequest req) {
+        String username = ModuleUserUtils.getOperationUser(req, "getTypeList");
+        if (Configuration.isAdmin(username)) {
+            log.info("{} start to get all ec resource TypeList", username);
+            try {
+                List<String> typeList = enginePluginAdminService.getTypeVersionList(type);
+                log.info("{} finished get all ec resource TypeList", username);
+                return Message.ok().data("queryList", typeList);
+            } catch (Exception e) {
+                return Message.error(e.getMessage());
+            }
+        } else {
+            return Message.error("Only administrators can operate");
+        }
+    }
+
+    @ApiOperation(value = "updateEnginePluginBML", notes = "Add a new version of the engineplugin", response = Message.class)
+    @RequestMapping(path = "/updateEnginePluginBML", method = RequestMethod.POST)
+    public Message updateEnginePluginBML(@RequestParam("file") MultipartFile file,
+                                         @RequestParam(value = "ecType") String ecType,
+                                         @RequestParam(value = "version") String version,
+                                         HttpServletRequest req) {
+        if(ecType.isEmpty() || ecType.length() == 0 || ecType.equals("null")){
+            return Message.error("ecType is not null");
+        }else if(version.isEmpty() || version.length() == 0 || version.equals("null")){
+            return Message.error("version is not null");
+        }
+        file.getOriginalFilename().toLowerCase().endsWith(".zip");
+        if(file.getOriginalFilename().toLowerCase().endsWith(".zip")){
+            String username = ModuleUserUtils.getOperationUser(req, "uploadEnginePluginBML");
+            if (Configuration.isAdmin(username)) {
+                log.info("{} start to update enginePlugin {} {}", username,ecType,version);
+                try {
+                    enginePluginAdminService.uploadToECHome(file);
+                    RefreshEngineConnResourceRequest refreshEngineConnResourceRequest =
+                            new RefreshEngineConnResourceRequest();
+                    refreshEngineConnResourceRequest.setEngineConnType(ecType);
+                    refreshEngineConnResourceRequest.setVersion(version);
+                    engineConnResourceService.refresh(refreshEngineConnResourceRequest);
+                } catch (Exception e) {
+                    return Message.error(e.getMessage());
+                }
+                log.info("{} finished to update enginePlugin {} {}", username,ecType,version);
+                return Message.ok().data("mes", "upload file success");
+            } else {
+                return Message.error("Only administrators can operate");
+            }
+        }else {
+            return Message.error("Only suppose zip format file");
+        }
+    }
+
+    @ApiOperation(value = "list", notes = "list all engineplugin", response = Message.class)
+    @RequestMapping(path = "/list", method = RequestMethod.GET)
+    public Message list(
+            @RequestParam(value = "ecType", required = false) String ecType,
+            @RequestParam(value = "version", required = false) String version,
+            @RequestParam(value = "currentPage", required = false) Integer currentPage,
+            @RequestParam(value = "pageSize", required = false) Integer pageSize,
+            HttpServletRequest req) {
+        String username = ModuleUserUtils.getOperationUser(req, "list");
+        if (Configuration.isAdmin(username)) {
+            log.info("{} start to list all ec resource", username);
+            EnginePluginBMLVo enginePluginBMLVo =
+                    new EnginePluginBMLVo(
+                            ecType,version);
+            enginePluginBMLVo.setCurrentPage(null != currentPage ? currentPage : 1);
+            enginePluginBMLVo.setPageSize(null != pageSize ? pageSize : 10);
+            PageInfo<EngineConnBmlResource> engineConnBmlResourcePageInfo = enginePluginAdminService.queryDataSourceInfoPage(enginePluginBMLVo);
+            log.info("{} finished to list all ec resource", username);
+            List<EngineConnBmlResource> queryList = engineConnBmlResourcePageInfo.getList();
+            return Message.ok().data("queryList", queryList)
+                    .data("totalPage", engineConnBmlResourcePageInfo.getTotal());
+        } else {
+            return Message.error("Only administrators can operate");
+        }
+    }
+
+    @ApiOperation(value = "uploadEnginePluginBML", notes = "add one engineplugin", response = Message.class)
+    @RequestMapping(path = "/uploadEnginePluginBML", method = RequestMethod.POST)
+    public Message uploadEnginePluginBML(@RequestParam("file") MultipartFile file, HttpServletRequest req) {
+        file.getOriginalFilename().toLowerCase().endsWith(".zip");
+        if(file.getOriginalFilename().toLowerCase().endsWith(".zip")){
+            String username = ModuleUserUtils.getOperationUser(req, "uploadEnginePluginBML");
+            if (Configuration.isAdmin(username)) {
+                log.info("{} start to upload enginePlugin", username);
+                try {
+                    enginePluginAdminService.uploadToECHome(file);
+                } catch (Exception e) {
+                    return Message.error(e.getMessage());
+                }
+                engineConnResourceService.refreshAll(true);
+                log.info("{} finished to upload enginePlugin", username);
+                return Message.ok().data("mes", "upload file success");
+            } else {
+                return Message.error("Only administrators can operate");
+            }
+        }else {
+            return Message.error("Only suppose zip format file");
+        }
+    }
+
+    @ApiOperation(value = "deleteEnginePluginBML", notes = "delete one engineplugin", response = Message.class)
+    @RequestMapping(path = "/deleteEnginePluginBML", method = RequestMethod.GET)
+    public Message deleteEnginePluginBML(HttpServletRequest req,
+                                         @RequestParam(value = "ecType") String ecType,
+                                         @RequestParam(value = "version", required = false) String version) {
+        String username = ModuleUserUtils.getOperationUser(req, "deleteEnginePluginBML");
+        if (Configuration.isAdmin(username)) {
+            log.info("{} start to delete engineplugin {} {}", username,ecType,version);
+            try {
+                enginePluginAdminService.deleteEnginePluginBML(ecType,version,username);
+            } catch (Exception e) {
+                return Message.error(e.getMessage());
+            }
+            log.info("{} finished to delete engineplugin {} {}", username,ecType,version);
+            return Message.ok().data("msg", "delete successfully");
+        } else {
+            return Message.error("Only administrators can operate");
+        }
+    }
 
     @ApiOperation(value = "refreshAll", notes = "refresh all engineconn resource", response = Message.class)
     @RequestMapping(path = "/refreshAll", method = RequestMethod.GET)
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/service/EnginePluginAdminService.java
similarity index 52%
copy from linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
copy to linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/service/EnginePluginAdminService.java
index 8da15ca50..211c51454 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/service/EnginePluginAdminService.java
@@ -6,7 +6,7 @@
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *    http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,24 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.linkis.engineplugin.server.dao;
+package org.apache.linkis.engineplugin.server.service;
 
+import org.apache.linkis.bml.protocol.Version;
 import org.apache.linkis.engineplugin.server.entity.EngineConnBmlResource;
+import org.apache.linkis.engineplugin.vo.EnginePluginBMLVo;
 
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
-@Mapper
-public interface EngineConnBmlResourceDao {
+import com.github.pagehelper.PageInfo;
 
-  List<EngineConnBmlResource> getAllEngineConnBmlResource(
-      @Param("engineConnType") String engineConnType, @Param("version") String version);
+public interface EnginePluginAdminService {
 
-  void save(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
+  void rollBackEnginePlugin(EngineConnBmlResource engineConnBmlResource);
 
-  void update(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
+  void uploadToECHome(MultipartFile file);
 
-  void delete(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
+  void deleteEnginePluginBML(String ecType, String version, String username);
+
+  PageInfo<EngineConnBmlResource> queryDataSourceInfoPage(EnginePluginBMLVo enginePluginBMLVo);
+
+  List<String> getTypeList();
+
+  List<String> getTypeVersionList(String type);
+
+  List<Version> getVersionList(String userName, String bmlResourceId);
 }
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/service/impl/EnginePluginAdminService.java b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/service/impl/EnginePluginAdminService.java
new file mode 100644
index 000000000..bf6369857
--- /dev/null
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/service/impl/EnginePluginAdminService.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.linkis.engineplugin.server.service.impl;
+
+import org.apache.linkis.bml.client.BmlClient;
+import org.apache.linkis.bml.client.BmlClientFactory;
+import org.apache.linkis.bml.protocol.BmlResourceVersionsResponse;
+import org.apache.linkis.bml.protocol.Version;
+import org.apache.linkis.common.utils.ZipUtils;
+import org.apache.linkis.engineplugin.server.dao.EngineConnBmlResourceDao;
+import org.apache.linkis.engineplugin.server.entity.EngineConnBmlResource;
+import org.apache.linkis.engineplugin.server.localize.AbstractEngineConnBmlResourceGenerator;
+import org.apache.linkis.engineplugin.server.restful.EnginePluginRestful;
+import org.apache.linkis.engineplugin.vo.EnginePluginBMLVo;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Service
+public class EnginePluginAdminService
+    implements org.apache.linkis.engineplugin.server.service.EnginePluginAdminService {
+
+  private static final Logger log = LoggerFactory.getLogger(EnginePluginRestful.class);
+  @Autowired private EngineConnBmlResourceDao engineConnBmlResourceDao;
+  @Autowired private AbstractEngineConnBmlResourceGenerator abstractEngineConnBmlResourceGenerator;
+
+  private BmlClient bmlClient = BmlClientFactory.createBmlClient();
+
+  @Override
+  public void rollBackEnginePlugin(EngineConnBmlResource engineConnBmlResource) {
+    engineConnBmlResourceDao.update(engineConnBmlResource);
+  }
+
+  @Override
+  public List<String> getTypeVersionList(String type) {
+    return engineConnBmlResourceDao.getTypeVersionList(type);
+  }
+
+  @Override
+  public List<Version> getVersionList(String userName, String bmlResourceId) {
+    BmlResourceVersionsResponse versions = bmlClient.getVersions(userName, bmlResourceId);
+    List<Version> versions1 = versions.resourceVersions().versions();
+    return versions1;
+  }
+
+  @Override
+  public List<String> getTypeList() {
+    return engineConnBmlResourceDao.getTypeList();
+  }
+
+  @Override
+  public void deleteEnginePluginBML(String ecType, String version, String username) {
+    List<EngineConnBmlResource> allEngineConnBmlResource = null;
+    try {
+      allEngineConnBmlResource =
+          engineConnBmlResourceDao.getAllEngineConnBmlResource(ecType, version);
+      allEngineConnBmlResource.forEach(
+          engineConnBmlResource -> {
+            // 等待bug修复后修改
+            // bmlClient.deleteResource(username,engineConnBmlResource.getBmlResourceId());
+            engineConnBmlResourceDao.delete(engineConnBmlResource);
+          });
+      String engineConnsHome = abstractEngineConnBmlResourceGenerator.getEngineConnsHome();
+      File file = new File(engineConnsHome + "/" + ecType);
+      if (file.exists()) {
+        deleteDir(file);
+        log.info("file {} delete success", ecType);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Override
+  public PageInfo<EngineConnBmlResource> queryDataSourceInfoPage(
+      EnginePluginBMLVo enginePluginBMLVo) {
+    PageHelper.startPage(enginePluginBMLVo.getCurrentPage(), enginePluginBMLVo.getPageSize());
+    try {
+      List<EngineConnBmlResource> queryList =
+          engineConnBmlResourceDao.selectByPageVo(enginePluginBMLVo);
+      return new PageInfo<>(queryList);
+    } finally {
+      PageHelper.clearPage();
+    }
+  }
+
+  @Override
+  public void uploadToECHome(MultipartFile mfile) {
+    String engineConnsHome = abstractEngineConnBmlResourceGenerator.getEngineConnsHome();
+    try {
+      InputStream in = mfile.getInputStream();
+      byte[] buffer = new byte[1024];
+      int len = 0;
+      File file = new File(engineConnsHome);
+      if (!file.exists()) {
+        log.info("engineplugin's home doesn’t exist");
+      }
+      OutputStream out = new FileOutputStream(engineConnsHome + "/" + mfile.getOriginalFilename());
+      while ((len = in.read(buffer)) != -1) {
+        out.write(buffer, 0, len);
+      }
+      out.close();
+      in.close();
+    } catch (Exception e) {
+      log.info("file {} upload fail", mfile.getOriginalFilename());
+    }
+
+    ZipUtils.fileToUnzip(engineConnsHome + "/" + mfile.getOriginalFilename(), engineConnsHome);
+    File file = new File(engineConnsHome + "/" + mfile.getOriginalFilename());
+    if (file.exists()) {
+      file.delete();
+      log.info("file {} delete success", mfile.getOriginalFilename());
+    }
+  }
+
+  public static void deleteDir(File directory) {
+    File files[] = directory.listFiles();
+    for (File file : files) {
+      if (file.isDirectory()) {
+        deleteDir(file);
+      } else {
+        file.delete();
+      }
+    }
+    directory.delete();
+  }
+}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/vo/EnginePluginBMLVo.java
similarity index 53%
copy from linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
copy to linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/vo/EnginePluginBMLVo.java
index 8da15ca50..f5265b9d6 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/vo/EnginePluginBMLVo.java
@@ -15,24 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.linkis.engineplugin.server.dao;
+package org.apache.linkis.engineplugin.vo;
 
-import org.apache.linkis.engineplugin.server.entity.EngineConnBmlResource;
+public class EnginePluginBMLVo extends PageViewVo {
+  private String engineConnType;
+  private String engineConnVersion;
 
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
+  public EnginePluginBMLVo(String engineConnType, String engineConnVersion) {
+    this.engineConnType = engineConnType;
+    this.engineConnVersion = engineConnVersion;
+  }
 
-import java.util.List;
+  public String getEngineConnType() {
+    return engineConnType;
+  }
 
-@Mapper
-public interface EngineConnBmlResourceDao {
+  public void setEngineConnType(String engineConnType) {
+    this.engineConnType = engineConnType;
+  }
 
-  List<EngineConnBmlResource> getAllEngineConnBmlResource(
-      @Param("engineConnType") String engineConnType, @Param("version") String version);
+  public String getEngineConnVersion() {
+    return engineConnVersion;
+  }
 
-  void save(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
-
-  void update(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
-
-  void delete(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
+  public void setEngineConnVersion(String engineConnVersion) {
+    this.engineConnVersion = engineConnVersion;
+  }
 }
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/vo/PageViewVo.java
similarity index 53%
copy from linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
copy to linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/vo/PageViewVo.java
index 8da15ca50..bb48a24dd 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/vo/PageViewVo.java
@@ -15,24 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.linkis.engineplugin.server.dao;
+package org.apache.linkis.engineplugin.vo;
 
-import org.apache.linkis.engineplugin.server.entity.EngineConnBmlResource;
+public class PageViewVo {
+  private int currentPage;
+  private int pageSize;
 
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
+  public int getCurrentPage() {
+    return currentPage;
+  }
 
-import java.util.List;
+  public void setCurrentPage(int currentPage) {
+    this.currentPage = currentPage;
+  }
 
-@Mapper
-public interface EngineConnBmlResourceDao {
+  public int getPageSize() {
+    return pageSize;
+  }
 
-  List<EngineConnBmlResource> getAllEngineConnBmlResource(
-      @Param("engineConnType") String engineConnType, @Param("version") String version);
-
-  void save(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
-
-  void update(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
-
-  void delete(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
+  public void setPageSize(int pageSize) {
+    this.pageSize = pageSize;
+  }
 }
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/scala/org/apache/linkis/engineplugin/server/localize/AbstractEngineConnBmlResourceGenerator.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/scala/org/apache/linkis/engineplugin/server/localize/AbstractEngineConnBmlResourceGenerator.scala
index 11d520644..b46b82455 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/scala/org/apache/linkis/engineplugin/server/localize/AbstractEngineConnBmlResourceGenerator.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/scala/org/apache/linkis/engineplugin/server/localize/AbstractEngineConnBmlResourceGenerator.scala
@@ -51,9 +51,9 @@ abstract class AbstractEngineConnBmlResourceGenerator extends EngineConnBmlResou
         "Cannot find the home path of engineconn dist."
       )
     if (StringUtils.isBlank(version) || NO_VERSION_MARK == version) return engineConnDistHome
-    val engineConnPackageHome = Paths.get(engineConnDistHome, "v" + version).toFile.getPath
+    val engineConnPackageHome = Paths.get(engineConnDistHome, version).toFile.getPath
     if (new File(engineConnPackageHome).exists()) engineConnPackageHome
-    else engineConnDistHome
+    else Paths.get(engineConnDistHome, "v" + version).toFile.getPath
   }
 
   protected def getEngineConnDistHomeList(engineConnType: String): Array[String] = {
diff --git a/linkis-web/src/apps/linkis/i18n/common/zh.json b/linkis-web/src/apps/linkis/i18n/common/zh.json
index 8cb191b8c..2e0ed0dbe 100644
--- a/linkis-web/src/apps/linkis/i18n/common/zh.json
+++ b/linkis-web/src/apps/linkis/i18n/common/zh.json
@@ -155,7 +155,8 @@
                         "udfFunctionManage": "UDF管理",
                         "functionManagement": "函数管理",
                         "dataSourceManage": "数据源管理",
-                        "userResourceManagement": "用户资源管理"
+                        "userResourceManagement": "用户资源管理",
+                        "EnginePluginManagement": "引擎物料管理"
                     }
                 }
             },
@@ -317,7 +318,29 @@
                 "cannotPublish": "不可发布",
                 "used": "可用",
                 "commentValue": "从版本 {text} 回滚"
-            }
+            },
+          "EnginePluginManagement": {
+            "engineConnType": "引擎类型",
+            "engineConnVersion": "引擎版本",
+            "create": "新增引擎插件",
+            "fileName": "文件名称",
+            "fileSize": "文件大小",
+            "lastModified": "文件更新时间",
+            "bmlResourceId": "物料资源Id",
+            "bmlResourceVersion": "物料资源版本",
+            "lastUpdateTime": "更新时间",
+            "createTime": "创建时间",
+            "Reset": "重置",
+            "delete": "删除已选物料的版本",
+            "update": "更新引擎插件",
+            "updateFileOnly": "更新",
+            "resourceVersion": "引擎物料bml版本",
+            "user": "所属人",
+            "deleteCurrentbml": "删除",
+            "versionList": "版本列表",
+            "rollback": "回滚",
+            "action": "操作"
+          }
         }
     }
 }
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java b/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.js
similarity index 52%
copy from linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
copy to linkis-web/src/apps/linkis/module/EnginePluginManagement/index.js
index 8da15ca50..7e9d3693c 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
+++ b/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.js
@@ -15,24 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.linkis.engineplugin.server.dao;
-
-import org.apache.linkis.engineplugin.server.entity.EngineConnBmlResource;
-
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-@Mapper
-public interface EngineConnBmlResourceDao {
-
-  List<EngineConnBmlResource> getAllEngineConnBmlResource(
-      @Param("engineConnType") String engineConnType, @Param("version") String version);
-
-  void save(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
-
-  void update(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
-
-  void delete(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
-}
+export default {
+  name: 'EnginePluginManagement',
+  component: () => import('./index.vue'),
+};
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java b/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.scss
similarity index 53%
copy from linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
copy to linkis-web/src/apps/linkis/module/EnginePluginManagement/index.scss
index 8da15ca50..f9898b0f2 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/src/main/java/org/apache/linkis/engineplugin/server/dao/EngineConnBmlResourceDao.java
+++ b/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.scss
@@ -14,25 +14,37 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+@import '@/common/style/variables.scss';
+
+.search-bar {
+  .search-item11 {
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+    font-size: $font-size-base;
+
+    .lable {
+      width: 180px;
+      // flex-basis: 130px;
+      text-align: right;
+    }
+  }
+
+  .ivu-col {
+    display: flex;
+    justify-content: center;
+  }
 
-package org.apache.linkis.engineplugin.server.dao;
-
-import org.apache.linkis.engineplugin.server.entity.EngineConnBmlResource;
-
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-@Mapper
-public interface EngineConnBmlResourceDao {
-
-  List<EngineConnBmlResource> getAllEngineConnBmlResource(
-      @Param("engineConnType") String engineConnType, @Param("version") String version);
+}
 
-  void save(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
+.table-content {
+  margin-top: 25px;
+}
 
-  void update(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
 
-  void delete(@Param("engineConnBmlResource") EngineConnBmlResource engineConnBmlResource);
+.modal {
+  .footer {
+    display: flex;
+    justify-content: space-between;
+  }
 }
diff --git a/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.vue b/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.vue
new file mode 100644
index 000000000..d7d073a92
--- /dev/null
+++ b/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.vue
@@ -0,0 +1,479 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<template>
+  <div :style="{height: '100%', overflow: 'hidden'}">
+    <Modal
+      width="800"
+      class="modal"
+      v-model="showVersionList"
+      :loading="loadingForm"
+      :title="`${currentEngineType}${$t('message.linkis.EnginePluginManagement.versionList')} 当前版本${currentEngineVersion}`"
+    >
+      <Table
+        border
+        size="small"
+        align="center"
+        :columns="versionTableColumnNum"
+        :data="this.currentVersionList"
+        max-height="300"
+        class="table-content"
+      >
+        <template slot-scope="{ row }" slot="action">
+          <ButtonGroup size="small" :key="row.resourceVersion">
+            <Button
+              v-if="row.resourceVersion != currentResourcebmlVersion"
+              size="primary"
+              type="text"
+              @click="onRollback(row)"
+            >
+
+              {{ $t('message.linkis.EnginePluginManagement.rollback') }}
+            </Button>
+            <Button
+              v-if="row.resourceVersion != currentResourcebmlVersion"
+              size="primary"
+              type="error"
+              @click="deleteCurrentbml(row)"
+            >
+              {{ $t('message.linkis.EnginePluginManagement.deleteCurrentbml') }}
+            </Button>
+
+          </ButtonGroup>
+        </template>
+      </Table>
+      <div slot="footer">
+        <div>
+          <Button @click="showVersionList = false">{{
+            $t('message.linkis.cancel')
+          }}</Button>
+        </div>
+      </div>
+    </Modal>
+    <Modal
+      width="800"
+      class="modal"
+      v-model="showFileOperate"
+      :title="`${actionType} ${ecType}`"
+    >
+      <Spin size="large" fix v-if="loadingForm"></Spin>
+      <div style="height: 200px">
+        <form style="width: 200px;height: 200px">
+          <input type="file" @change="getFile($event)"></input>
+        </form>
+      </div>
+
+      <div slot="footer">
+        <div class="footer">
+          <div>
+            <Button
+              type="primary"
+              @click="showFileOperate = false"
+            >{{ $t('message.linkis.close') }}</Button>
+            <Button type="primary" @click="onSubmit">{{
+              $t('message.linkis.complete')}}</Button>
+          </div>
+        </div>
+      </div>
+    </Modal>
+    <Row class="search-bar" type="flex" justify="space-around">
+      <Col>
+        <span class="lable" :title="$t('message.linkis.EnginePluginManagement.engineConnType')">{{ $t('message.linkis.EnginePluginManagement.engineConnType') }}</span>
+        <Select  v-model="ecType" clearable>
+          <Option
+            v-for="(item) in typeList"
+            :label="item"
+            :value="item"
+            :key="item"/>
+        </Select>
+      </Col>
+      <Col>
+        <span class="lable" :title="$t('message.linkis.EnginePluginManagement.engineConnVersion')">{{ $t('message.linkis.EnginePluginManagement.engineConnVersion') }}</span>
+        <Select  v-model="version" clearable>
+          <Option
+            v-for="(item) in typeVersionList"
+            :label="item"
+            :value="item"
+            :key="item"/>
+        </Select>
+      </Col>
+      <Col span="12">
+        <Button type="primary" :style="{width: '60px', marginRight: '5px', padding: '5px'}" @click="resetSearch">{{
+          $t('message.linkis.EnginePluginManagement.Reset')}}</Button>
+        <Button type="primary" class="button" :style="{width: '60px', marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="initECMList()">{{
+          $t('message.linkis.search') }}</Button>
+        <Button type="primary" :style="{width: '120px', marginRight: '5px', padding: '5px'}" @click="createOrUpdate(1)">{{
+          $t('message.linkis.EnginePluginManagement.update')}}</Button>
+        <Button type="error" :style="{width: '120px', marginRight: '5px', padding: '5px'}" @click="deleteBML">{{
+          $t('message.linkis.EnginePluginManagement.delete')}}</Button>
+        <Button type="primary" :style="{width: '90px', marginRight: '5px', padding: '5px'}" @click="createOrUpdate(0)">{{
+          $t('message.linkis.EnginePluginManagement.create') }}</Button>
+      </Col>
+    </Row>
+    <Table
+      border
+      size="small"
+      align="center"
+      :columns="tableColumnNum"
+      :data="pageDatalist"
+      :loading="tableLoading"
+      class="table-content engineplugin-management-table"
+    >
+      <template slot-scope="{ row, index }" slot="bmlResourceVersion">
+        <Button
+          size="small"
+          type="primary"
+          :disabled="row.expire"
+          @click="openVersionList(row, index)"
+        >{{ `${row.bmlResourceVersion || '-'}` }}</Button
+        >
+      </template>
+    </Table>
+    <div style="margin: 10px; overflow: hidden; textAlign: center">
+      <div>
+        <Page
+          :page-size="page.pageSize"
+          :total="page.totalSize"
+          :current="page.pageNow"
+          @on-change="changePage"
+          size="small"
+          show-total
+          show-elevator
+          :prev-text="$t('message.linkis.previousPage')" :next-text="$t('message.linkis.nextPage')"
+        ></Page>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import api from '@/common/service/api';
+export default {
+  data() {
+    return {
+      ecType: null,
+      version: null,
+      typeList: [],
+      typeVersionList: [],
+      page: {
+        totalSize: 0,
+        pageSize: 8,
+        pageNow: 1,
+      },
+      file: null,
+      currentEnginpluginData: null,
+      showFileOperate: false,
+      actionType: '',
+      actionNum: '',
+      loadingForm: false,
+      tableLoading: false,
+      tableColumnNum: [
+        {
+          title: "ID",
+          key: 'id',
+          width: 60,
+          tooltip: true,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.engineConnType'),
+          key: 'engineConnType',
+          width: 120,
+          tooltip: true,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.engineConnVersion'),
+          key: 'version',
+          width: 120,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.fileName'),
+          key: 'fileName',
+          width: 120,
+          tooltip: true,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.fileSize'),
+          key: 'fileSize',
+          tooltip: true,
+          width: 120,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.lastModified'),
+          key: 'lastModified',
+          tooltip: true,
+          width: 120,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.bmlResourceId'),
+          key: 'bmlResourceId',
+          tooltip: true,
+          width: 120,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.bmlResourceVersion'),
+          key: 'bmlResourceVersion',
+          slot: 'bmlResourceVersion',
+          width: 120,
+          tooltip: true,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.lastUpdateTime'),
+          key: 'lastUpdateTime',
+          width: 120,
+          tooltip: true,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.createTime'),
+          key: 'createTime',
+          width: 120,
+          tooltip: true,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.action'),
+          width: 120,
+          slot: 'action',
+          align: 'center',
+        },
+      ],
+      pageDatalist: [],
+      currentVersionList: [],
+      currentEngineType: null,
+      currentEngineVersion: null,
+      currentResourcebmlVersion: null,
+      showVersionList: false,
+      versionTableColumnNum: [
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.resourceVersion'),
+          key: 'resourceVersion',
+          tooltip: true,
+          minWidth: 60,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.user'),
+          key: 'user',
+          tooltip: true,
+          minWidth: 60,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.EnginePluginManagement.action'),
+          key: 'action',
+          tooltip: true,
+          minWidth: 120,
+          align: 'center',
+          slot: 'action',
+        },
+      ],
+    }
+  },
+  watch: {
+    ecType(newName, oldName) {
+      console.log(oldName);
+      this.getTypeVersionList(newName)
+    }
+  },
+  created() {
+    this.getTypeList();
+    this.initECMList();
+  },
+  methods: {
+    async initECMList() {
+      let paramsData = {
+        "ecType": this.ecType,
+        "version": this.version,
+        "pageSize": this.page.pageSize,
+        "currentPage": this.page.pageNow
+      }
+      let ECM = await api.fetch('/engineplugin/list',paramsData,'get') || {};
+      this.pageDatalist = ECM.queryList || []
+      this.page.totalSize=ECM.totalPage
+    },
+
+    async getTypeList(){
+      let typeListTem = await api.fetch('/engineplugin/getTypeList','get') || {};
+      this.typeList=typeListTem.typeList
+    },
+    async getTypeVersionList(ecType){
+      let urlTemp = '/engineplugin/getTypeVersionList/'+ ecType
+      let typeVersionListTem = await api.fetch(urlTemp, 'get') || {};
+      this.typeVersionList=typeVersionListTem.queryList
+      this.version=(typeVersionListTem.queryList)[0]
+    },
+    resetSearch(){
+      this.ecType = null
+      this.version=null
+      this.initECMList();
+    },
+    getFile(event) {
+      this.file = event.target.files[0];
+    },
+    onSubmit() {
+      var formData = new FormData();
+      if(this.actionNum === 0){
+        formData.append('file', this.file);
+        api.fetch('/engineplugin/uploadEnginePluginBML', formData, {methed: 'post', 'Content-Type': 'multipart/form-data'}).then(response => {
+          console.log(response);
+          this.$Message.success(response.mes);
+          this.getTypeList();
+          this.showFileOperate = false;
+        }).catch(e => {
+          console.log(e);
+          this.$Message.error(e);
+          this.showFileOperate = false;
+        })
+
+      }else if(this.actionNum === 1){
+        formData.append('file', this.file);
+        formData.append('ecType', this.ecType);
+        formData.append('version', this.version);
+        api.fetch('/engineplugin/updateEnginePluginBML', formData, {methed: 'post', 'Content-Type': 'multipart/form-data'}).then(response => {
+          this.$Message.success(response.mes);
+          this.getTypeList();
+          this.initECMList();
+          this.showFileOperate = false;
+        }).catch(e => {
+          console.log(e);
+          this.$Message.error(e);
+          this.showFileOperate = false;
+        })
+
+      }
+
+    },
+    deleteBML(){
+      var th=this;
+      var reqList=[]
+      th.pageDatalist.forEach(it => {
+        if(it.engineConnType == th.ecType && it.version == th.version){
+          reqList.push(it.bmlResourceId);
+        }
+      })
+      api.fetch('/bml/deleteResources', {'resourceIds': reqList}, 'post').then(response => {
+        console.log(response);
+        api.fetch('/engineplugin/deleteEnginePluginBML', {'ecType': th.ecType, 'version': th.version}, 'get').then(response2 => {
+          th.getTypeList();
+          th.resetSearch();
+          this.$Message.success(response2.msg);
+        }).catch(e2 => {
+          console.log(e2);
+          this.$Message.error(e2);
+        })
+      }).catch(e => {
+        th.$Message.error(e);
+        console.log(e);
+      })
+
+      //暂存后续相关bug修复后修改
+      // var th=this;
+      // api.fetch('/engineplugin/deleteEnginePluginBML', {'ecType': th.ecType, 'version': th.version}, 'get').then(response => {
+      //   this.$Message.success(response.mes);
+      // }).catch(e => {
+      //   console.log(e);
+      //   this.$Message.error(e);
+      // })
+    },
+    createOrUpdate(num) {
+      this.actionNum = num
+      if(num === 0){
+        this.actionType=this.$t('message.linkis.EnginePluginManagement.create')
+      }else if(num === 1){
+        this.actionType=this.$t('message.linkis.EnginePluginManagement.update')
+      }
+      this.showFileOperate = true
+    },
+    async openVersionList(row) {
+      this.currentEnginpluginData = row
+      this.currentEngineType=row.engineConnType;
+      this.currentEngineVersion=row.version;
+      this.currentResourcebmlVersion=row.bmlResourceVersion;
+      this.currentVersionList=[]
+      // this.getVersionListBybmlResourceId()
+      var th=this;
+      await api.fetch('/bml/getVersions', {'resourceId': th.currentEnginpluginData.bmlResourceId}, 'get').then(response => {
+        let userName=response.ResourceVersions.user;
+        for (let index = 0; index < response.ResourceVersions.versions.length; index++) {
+          let element = {};
+          element.resourceVersion = response.ResourceVersions.versions[index].version;
+          element.user=userName;
+          th.currentVersionList.push(element);
+        }
+        th.showVersionList = true
+      }).catch(e => {
+        th.$Message.error(e);
+        console.log(e);
+      })
+      console.log(th.currentVersionList);
+    },
+    changePage(value) {
+      this.page.pageNow = value
+      this.initECMList()
+    },
+    onRollback(data) {
+      this.showVersionList = false
+      var reqData = {};
+      reqData.bmlResourceVersion=data.resourceVersion;
+      reqData.bmlResourceId=this.currentEnginpluginData.bmlResourceId;
+      reqData.createTime=this.currentEnginpluginData.createTime;
+      reqData.engineConnType=this.currentEnginpluginData.engineConnType;
+      reqData.fileName=this.currentEnginpluginData.fileName;
+      reqData.fileSize=this.currentEnginpluginData.fileSize;
+      reqData.lastModified=this.currentEnginpluginData.lastModified;
+      reqData.lastUpdateTime=this.currentEnginpluginData.lastUpdateTime;
+      reqData.version=this.currentEnginpluginData.version;
+      api.fetch('/engineplugin/rollBack', reqData).then(response => {
+        this.initECMList();
+        this.$Message.success('onRollback Success'+response)
+      }).catch(e => {
+        this.$Message.error(e);
+      })
+    },
+  },
+}
+</script>
+<style lang="scss" src="./index.scss" scoped></style>
+
+<style lang="scss">
+.engineplugin-management-table {
+  border: 0;
+  height: calc(100% - 110px);
+  width: 100%;
+
+  .ivu-table:before {
+    height: 0
+  }
+
+  .ivu-table:after {
+    width: 0
+  }
+
+  .ivu-table {
+    height: auto;
+    border: 1px solid #dcdee2;
+    width: 100%;
+  }
+}
+</style>
diff --git a/linkis-web/src/apps/linkis/router.js b/linkis-web/src/apps/linkis/router.js
index 52f4906d2..bfec3ad54 100644
--- a/linkis-web/src/apps/linkis/router.js
+++ b/linkis-web/src/apps/linkis/router.js
@@ -5,9 +5,9 @@
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
- * 
+ *
  *   http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -157,6 +157,16 @@ export default [
         title: 'datasourceManagement',
         publicPage: true,
       },
+    },
+    {
+      name: 'EnginePluginManagement',
+      path: 'EnginePluginManagement',
+      component: () =>
+        import('./module/EnginePluginManagement/index.vue'),
+      meta: {
+        title: 'EnginePluginManagement',
+        publicPage: true,
+      },
     }
     ],
   },
diff --git a/linkis-web/src/apps/linkis/view/linkis/index.vue b/linkis-web/src/apps/linkis/view/linkis/index.vue
index d8b835784..a5e275755 100644
--- a/linkis-web/src/apps/linkis/view/linkis/index.vue
+++ b/linkis-web/src/apps/linkis/view/linkis/index.vue
@@ -103,6 +103,7 @@ export default {
           { key: '1-7', name: this.$t('message.linkis.sideNavList.function.children.microserviceManage'), path: '/console/microService' },
           { key: '1-9', name: this.$t('message.linkis.sideNavList.function.children.udfFunctionTitle'), path: '/console/urm/udfManagement'},
           { key: '1-8', name: this.$t('message.linkis.sideNavList.function.children.dataSourceManage'), path: '/console/dataSource' },
+          { key: '1-10', name: this.$t('message.linkis.sideNavList.function.children.EnginePluginManagement'), path: '/console/EnginePluginManagement' },
         ],
       },
       urmSideNavList: {
@@ -111,7 +112,7 @@ export default {
         padding: 0,
         icon: 'ios-options',
         children: [
-          {key: '1-9-1', name: this.$t('message.linkis.sideNavList.function.children.udfFunctionManage'), path: '/console/urm/udfManagement'}, 
+          {key: '1-9-1', name: this.$t('message.linkis.sideNavList.function.children.udfFunctionManage'), path: '/console/urm/udfManagement'},
           {key: '1-9-2', name: this.$t('message.linkis.sideNavList.function.children.functionManagement'), path: '/console/urm/functionManagement'}
         ]
       },
@@ -217,4 +218,4 @@ export default {
     border-bottom: 0;
   }
 }
-</style>
\ No newline at end of file
+</style>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@linkis.apache.org
For additional commands, e-mail: commits-help@linkis.apache.org