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

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


The following commit(s) were added to refs/heads/dev-1.3.2 by this push:
     new bbaa47893 Add ipListManage, tenantManage and codeRetrival page; 
optimization i18n and partial interaction
bbaa47893 is described below

commit bbaa47893c90dca28ad324614aeecfa529b0bb18
Author: Yonghao Mei <[email protected]>
AuthorDate: Mon Jan 16 20:10:00 2023 +0800

    Add ipListManage, tenantManage and codeRetrival page; optimization i18n and 
partial interaction
    
    Add ipListManage, tenantManage and codeRetrival page; optimization i18n and 
partial interaction
---
 linkis-web/src/apps/URM/i18n/common/en.json        |   23 +-
 linkis-web/src/apps/URM/i18n/common/zh.json        |   23 +-
 .../module/functionManagement/addFunctionModal.vue |   43 +-
 .../apps/URM/module/functionManagement/index.vue   |   20 +-
 .../apps/URM/module/functionManagement/vlist.vue   |   30 +-
 .../URM/module/udfManagement/addFunctionModal.vue  |   73 +-
 .../src/apps/URM/module/udfManagement/index.vue    |   20 +-
 .../src/apps/URM/module/udfManagement/vlist.vue    |   30 +-
 linkis-web/src/apps/linkis/i18n/common/en.json     |   87 +-
 linkis-web/src/apps/linkis/i18n/common/zh.json     | 1125 ++++++++++----------
 linkis-web/src/apps/linkis/module/ECM/index.scss   |    9 +
 linkis-web/src/apps/linkis/module/ECM/index.vue    |   76 +-
 linkis-web/src/apps/linkis/module/ECM/search.vue   |    4 +
 .../linkis/module/EnginePluginManagement/index.vue |   10 -
 .../linkis/module/codeQuery/codeDetail/index.vue   |   83 ++
 .../src/apps/linkis/module/codeQuery/index.js      |   23 +
 .../src/apps/linkis/module/codeQuery/index.scss    |   24 +
 .../src/apps/linkis/module/codeQuery/index.vue     |  423 ++++++++
 .../apps/linkis/module/datasourceAccess/index.vue  |   12 +-
 .../src/apps/linkis/module/datasourceEnv/index.vue |    8 +-
 .../apps/linkis/module/datasourceType/index.vue    |    6 +-
 .../module/gatewayAuthToken/EditForm/index.vue     |    2 +-
 .../apps/linkis/module/gatewayAuthToken/index.vue  |   13 +-
 .../module/globalHistoryManagement/index.vue       |   14 +-
 .../apps/linkis/module/ipListManagement/index.vue  |   23 +-
 .../module/resourceManagement/engineConn.vue       |   10 +-
 .../module/rmExternalResourceProvider/index.vue    |    7 +-
 .../linkis/module/tenantTagManagement/index.vue    |   23 +-
 .../src/apps/linkis/module/udfManager/index.vue    |    1 +
 .../src/apps/linkis/module/udfTree/index.vue       |    5 +-
 linkis-web/src/apps/linkis/router.js               |   22 +-
 linkis-web/src/apps/linkis/view/linkis/index.vue   |   59 +-
 linkis-web/src/common/i18n/en.json                 |   10 +-
 linkis-web/src/dss/view/layout.vue                 |    2 +-
 34 files changed, 1588 insertions(+), 755 deletions(-)

diff --git a/linkis-web/src/apps/URM/i18n/common/en.json 
b/linkis-web/src/apps/URM/i18n/common/en.json
index 0c6ce4124..f6f8319cc 100644
--- a/linkis-web/src/apps/URM/i18n/common/en.json
+++ b/linkis-web/src/apps/URM/i18n/common/en.json
@@ -28,6 +28,21 @@
         "lastModifyTime": "Modify Time",
         "lastModifyUser": "Modify User",
         "changeuser": "UDF Transfer",
+        "changeUserTo": "Transfer to:",
+        "share": "Share",
+        "shareUser": "Share User",
+        "separateWithCommas": "Separate With Commas",
+        "versionList": "Version List",
+        "cancel": "Cancel",
+        "confirm": "Confirm",
+        "inputUser": "Please Input User Name",
+        "createNewVersion": "Create New Version",
+        "download": "Download",
+        "success": "Operation Succeeded",
+        "notes": "Notes",
+        "publish": "Publish",
+        "viewSourceCode": "View Source Code",
+        "version": "Version",
         "action": {
           "title": "Action",
           "markAsExpired": "Mark As Expired",
@@ -50,9 +65,9 @@
         "registerFormat": "Register Format",
         "preview": "Preview",
         "useFormat": "Use Format",
-        "returnType": "Return Type",
-        "paramType": "Param Type",
-        "inputType": "Input Type",
+        "returnType": "Return Type(eg. String)",
+        "paramType": "Param Type(eg. String)",
+        "inputType": "Input Type(eg. String)",
         "defaultLoad": "Default Load",
         "LJCJ": "Create",
         "QSRMC": "Please enter the name",
@@ -72,7 +87,7 @@
         "SRFL": "Please enter the directory",
         "XGHS": "Update Funtion",
         "XG": "Update",
-        "QPZS": "View In Full Screen",
+        "QPZS": "View in Full Screen",
         "QXQP": "Cancel Full Screen"
       }
     }
diff --git a/linkis-web/src/apps/URM/i18n/common/zh.json 
b/linkis-web/src/apps/URM/i18n/common/zh.json
index 17702c31d..942c66a7e 100644
--- a/linkis-web/src/apps/URM/i18n/common/zh.json
+++ b/linkis-web/src/apps/URM/i18n/common/zh.json
@@ -28,6 +28,21 @@
         "lastModifyTime": "修改时间",
         "lastModifyUser": "修改人",
         "changeuser": "UDF移交",
+        "changeUserTo": "移交给:",
+        "share": "共享",
+        "shareUser": "共享用户",
+        "createNewVersion": "创建新版本",
+        "separateWithCommas": "使用逗号分隔",
+        "versionList": "版本列表",
+        "cancel": "取消",
+        "confirm": "确定",
+        "inputUser": "请输入用户名",
+        "viewSourceCode": "查看源码",
+        "success": "操作成功",
+        "version": "版本",
+        "publish": "发布",
+        "download": "下载",
+        "notes": "注释",
         "action": {
           "title": "操作",
           "markAsExpired": "标为过期",
@@ -46,13 +61,13 @@
         "sprak": "sprak",
         "jarPackage": "jar包",
         "scriptPath": "脚本路径",
-        "registerFunction": "注册函数",
+        "registerFunction": "注册的函数",
         "registerFormat": "注册格式",
         "preview": "预览",
         "useFormat": "使用格式",
-        "returnType": "返回类型",
-        "paramType": "参数类型",
-        "inputType": "输入类型",
+        "returnType": "返回类型如:String",
+        "paramType": "参数类型如:String",
+        "inputType": "输入类型如:String",
         "defaultLoad": "默认加载",
         "LJCJ": "立即创建",
         "QSRMC": "请输入名称",
diff --git 
a/linkis-web/src/apps/URM/module/functionManagement/addFunctionModal.vue 
b/linkis-web/src/apps/URM/module/functionManagement/addFunctionModal.vue
index 60c9d6146..d9eb7206d 100644
--- a/linkis-web/src/apps/URM/module/functionManagement/addFunctionModal.vue
+++ b/linkis-web/src/apps/URM/module/functionManagement/addFunctionModal.vue
@@ -54,7 +54,7 @@
           <Radio
             v-if="isUdf"
             :disabled="model === 1"
-            label="spark"/>
+            label="Spark"/>
           <Radio
             v-if="!isUdf"
             :label="$t('message.linkis.udf.ZDYHS')"/>
@@ -159,7 +159,7 @@
       </FormItem> -->
       <FormItem
         :label="$t('message.linkis.udf.useFormat')"
-        required>
+        class="ivu-form-item-required">
         <div class="format-div">
           <FormItem class="format-item">
             <Input
@@ -270,7 +270,7 @@ export default {
       },
       TYPELIB: {
         jar: 0,
-        spark: {
+        Spark: {
           py: 1,
           scala: 2,
         },
@@ -341,8 +341,7 @@ export default {
           // $t('message.linkis.udf.KHDBJZPP')
           {
             type: 'string',
-            pattern: /^[\w\u4e00-\u9fa5:.\\/]*(jar)$/,
-            message: this.$t('message.linkis.udf.HZMZC'),
+            validator: this.jarValidator,
             trigger: 'change',
           },
         ],
@@ -355,8 +354,7 @@ export default {
           // $t('message.linkis.udf.KHDBJZPP')
           {
             type: 'string',
-            pattern: /^[\w\u4e00-\u9fa5:.\\/]*(py|scala)$/,
-            message: this.$t('message.linkis.udf.ZCPYSCA'),
+            validator: this.pyValidator,
             trigger: 'change',
           },
         ],
@@ -369,8 +367,7 @@ export default {
           // $t('message.linkis.udf.KHDBJZPP')
           {
             type: 'string',
-            pattern: /^[\w\u4e00-\u9fa5:.\\/]*(py|scala)$/,
-            message: this.$t('message.linkis.udf.ZCPYSCA'),
+            validator: this.pyValidator,
             trigger: 'change',
           },
         ],
@@ -417,7 +414,7 @@ export default {
             type: 'string',
             required: true,
             message: this.$t('message.linkis.udf.SRFL'),
-            trigger: 'blur',
+            trigger: 'change',
           },
         ],
       },
@@ -441,7 +438,7 @@ export default {
       if (this.fnCategory.isCommon) {
         prop = 'jar';
       } else if (this.fnCategory.isSpark) {
-        prop = `spark.${suffix}`;
+        prop = `Spark.${suffix}`;
       } else {
         prop = `custom.${suffix}`;
       }
@@ -492,7 +489,7 @@ export default {
     'setting.fnType'(val) {
       let map = {};
       map[this.$t('message.linkis.udf.common')] = 'isCommon';
-      map['spark'] = 'isSpark';
+      map['Spark'] = 'isSpark';
       map[this.$t('message.linkis.udf.ZDYHS')] = 'isCustom';
       let type = map[val];
       Object.keys(this.fnCategory).forEach((key) => this.fnCategory[key] = 
false);
@@ -537,7 +534,7 @@ export default {
 
     init() {
       let { name, shared, description, path, udfName, directory, udfType, 
registerFormat, load, useFormat } = this.node;
-      let fnType = 'spark'
+      let fnType = 'Spark'
       if (udfType === 0) {
         fnType = this.$t('message.linkis.udf.common');
       } else if (udfType > 2) {
@@ -726,6 +723,26 @@ export default {
         this.$refs.directory.setQuery(null)
         this.directories = [...this.remoteDirectories]
       }
+    },
+    jarValidator(rule, val, cb) {
+      if (!val) {
+        cb(new Error(this.$t('message.linkis.udf.QSRWZLJ')));
+      }
+      const fileName = val.split('/')[val.split('/').length - 1]
+      if (!/^[\w\u4e00-\u9fa5:.\\/]*(jar)$/.test(fileName)) {
+        cb(new Error(this.$t('message.linkis.udf.HZMZC')));
+      }
+      cb();
+    },
+    pyValidator(rule, val, cb) {
+      if (!val) {
+        cb(new Error(this.$t('message.linkis.udf.QSRWZLJ')));
+      }
+      const fileName = val.split('/')[val.split('/').length - 1]
+      if (!/^[\w\u4e00-\u9fa5:.\\/]*(py|scala)$/.test(fileName)) {
+        cb(new Error(this.$t('message.linkis.udf.ZCPYSCA')));
+      }
+      cb();
     }
   },
 };
diff --git a/linkis-web/src/apps/URM/module/functionManagement/index.vue 
b/linkis-web/src/apps/URM/module/functionManagement/index.vue
index 6062cfb52..23a046785 100644
--- a/linkis-web/src/apps/URM/module/functionManagement/index.vue
+++ b/linkis-web/src/apps/URM/module/functionManagement/index.vue
@@ -104,12 +104,12 @@
       :mask-closable="false"
       @on-visible-change="changUserModalChange"
     >
-      <span>移交给:</span>
+      <span>{{$t('message.linkis.udf.changeUserTo')}}</span>
       <Select ref="userSelect" v-model="handleUser" filterable 
-        v-if=allUsers.length
+        v-if="allUsers.length"
         :remoteMethod="filterSelect" 
         @on-query-change="queryChange"
-        placeholder="请输入用户名" style="width:200px;">
+        :placeholder="$t('message.linkis.udf.inputUser')" style="width:200px;">
         <Option
           v-for="(item) in udfUsers"
           :label="item"
@@ -117,28 +117,28 @@
           :key="item"
         />
       </Select>
-      <Input v-if=!allUsers.length v-model="handleUser" placeholder="请输入用户名" 
style="width: 250px" />
+      <Input v-if="!allUsers.length" v-model="handleUser" 
:placeholder="$t('message.linkis.udf.inputUser')" style="width: 250px" />
       <div slot="footer">
-        <Button @click="changUserModal=false">取消</Button>
-        <Button type="primary" :disabled="!this.handleUser" 
@click="changeUser">确定</Button>
+        <Button 
@click="changUserModal=false">{{$t('message.linkis.udf.cancel')}}</Button>
+        <Button type="primary" :disabled="!this.handleUser" 
@click="changeUser">{{$t('message.linkis.udf.confirm')}}</Button>
       </div>
     </Modal>
     <Modal
-      title="共享"
+      :title="$t('message.linkis.udf.share')"
       v-model="shareModal"
       :mask-closable="false"
       @on-ok="share"
     >
-      <span>共享用户:</span>
+      <span>{{$t('message.linkis.udf.shareUser')}}</span>
       <Input
         v-model="sharedUsers"
         type="textarea"
         :autosize="{ minRows: 2, maxRows: 5 }"
-        placeholder="使用逗号分隔"
+        :placeholder="$t('message.linkis.udf.separateWithCommas')"
       />
     </Modal>
     <Modal
-      title="版本列表"
+      :title="$t('message.linkis.udf.versionList')"
       v-model="vlistModal"
       width="1024"
       :mask-closable="false"
diff --git a/linkis-web/src/apps/URM/module/functionManagement/vlist.vue 
b/linkis-web/src/apps/URM/module/functionManagement/vlist.vue
index 5dc3574f2..7cc41de04 100644
--- a/linkis-web/src/apps/URM/module/functionManagement/vlist.vue
+++ b/linkis-web/src/apps/URM/module/functionManagement/vlist.vue
@@ -28,7 +28,7 @@
       show-elevator
       @on-change="changePage"
     />
-    <Modal v-model="showContent" footer-hide width="80%" title="查看源码" 
class="view-code">
+    <Modal v-model="showContent" footer-hide width="80%" 
:title="$t('message.linkis.udf.viewSourceCode')" class="view-code">
       <Spin v-if="loadingContent" size="large" fix />
       <Input
         v-show="!loadingContent"
@@ -55,42 +55,42 @@ export default {
     return {
       cols: [
         {
-          title: '版本',
+          title: this.$t('message.linkis.udf.version'),
           key: 'bmlResourceVersion',
           align: 'center',
           width: 95
         },
         {
-          title: '发布',
+          title: this.$t('message.linkis.udf.publish'),
           key: 'publish',
           align: 'center',
           width: 75
         },
         {
-          title: '状态',
+          title: this.$t('message.linkis.udf.status'),
           key: 'status',
           align: 'center',
           width: 80
         },
         {
-          title: '注释',
+          title: this.$t('message.linkis.udf.notes'),
           key: 'description',
           align: 'center',
           width: 170
         },
         {
-          title: '修改时间',
+          title: this.$t('message.linkis.udf.lastModifyTime'),
           key: 'createTimeFormat',
           align: 'center',
           width: 160
         },
         {
-          title: '创建者',
+          title: this.$t('message.linkis.udf.creator'),
           key: 'createUser',
           align: 'center',
           width: 120
         }, {
-          title: '操作',
+          title: this.$t('message.linkis.udf.action.title'),
           align: 'center',
           width: 285,
           render: (h, params) => {
@@ -107,7 +107,7 @@ export default {
                     this.back(params.row)
                   }
                 }
-              }, '创建新版本'),
+              }, this.$t('message.linkis.udf.createNewVersion')),
               h('Button', {
                 props: {
                   size: 'small',
@@ -121,7 +121,7 @@ export default {
                     this.publish(params.row)
                   }
                 }
-              }, '发布'),
+              }, this.$t('message.linkis.udf.publish')),
               h('Button', {
                 props: {
                   size: 'small',
@@ -134,7 +134,7 @@ export default {
                     this.download(params.row)
                   }
                 }
-              }, '下载'),
+              }, this.$t('message.linkis.udf.download')),
               h('Button', {
                 props: {
                   size: 'small',
@@ -148,7 +148,7 @@ export default {
                     this.viewCode(params.row)
                   }
                 }
-              }, '查看源码')
+              }, this.$t('message.linkis.udf.viewSourceCode'))
             ]);
           }
         }],
@@ -225,7 +225,7 @@ export default {
         }, 'post')
         .then(() => {
           this.fetchList()
-          this.$Message.success('操作成功')
+          this.$Message.success(this.$t('message.linkis.udf.success'))
           this.$emit('refresh-list')
         })
         .catch(() => {
@@ -240,7 +240,7 @@ export default {
           version: row.bmlResourceVersion
         }, 'post')
         .then(() => {
-          this.$Message.success('操作成功')
+          this.$Message.success(this.$t('message.linkis.udf.success'))
           this.fetchList()
         })
         .catch(() => {
@@ -267,7 +267,7 @@ export default {
           document.body.appendChild(l);
           l.click()
           window.URL.revokeObjectURL(url)
-          this.$Message.success('操作成功')
+          this.$Message.success(this.$t('message.linkis.udf.success'))
         })
         .catch(() => {
           this.loading = false
diff --git a/linkis-web/src/apps/URM/module/udfManagement/addFunctionModal.vue 
b/linkis-web/src/apps/URM/module/udfManagement/addFunctionModal.vue
index 64aa7a2ee..5efa0fa93 100644
--- a/linkis-web/src/apps/URM/module/udfManagement/addFunctionModal.vue
+++ b/linkis-web/src/apps/URM/module/udfManagement/addFunctionModal.vue
@@ -54,7 +54,7 @@
           <Radio
             v-if="isUdf"
             :disabled="isUdf && model === 1"
-            label="spark"/>
+            label="Spark"/>
           <Radio
             v-if="!isUdf"
             :label="$t('message.linkis.udf.ZDYHS')"/>
@@ -115,7 +115,7 @@
       <FormItem
         v-else-if="fnType === 2 && fnCategory.isSpark"
         :label="$t('message.linkis.udf.registerFormat')"
-        required>
+        class="ivu-form-item-required">
         <div class="format-div">
           <FormItem prop="scalaTypeL">
             <Input
@@ -160,7 +160,7 @@
       </FormItem>
       <FormItem
         :label="$t('message.linkis.udf.useFormat')"
-        required>
+        class="ivu-form-item-required">
         <div class="format-div">
           <FormItem class="format-item">
             <Input
@@ -203,7 +203,8 @@
       <FormItem :label="$t('message.linkis.udf.class')" prop="directory">
         <Select 
           ref="directory" 
-          v-model="setting.directory" filterable 
+          v-model="setting.directory"
+          filterable 
           :remoteMethod="filterAdd" 
           @on-query-change="queryChange"
           :disabled="isUdf && model === 1">
@@ -277,7 +278,7 @@ export default {
       },
       TYPELIB: {
         jar: 0,
-        spark: {
+        Spark: {
           py: 1,
           scala: 2,
         },
@@ -327,8 +328,7 @@ export default {
           {
             type: 'string',
             pattern: /^[a-zA-Z][a-zA-Z0-9_\u4e00-\u9fa5]*$/,
-            message:
-                            this.$t('message.linkis.udf.BXYZMKT'),
+            message: this.$t('message.linkis.udf.BXYZMKT'),
             trigger: 'change',
           },
         ],
@@ -348,8 +348,7 @@ export default {
           // $t('message.linkis.udf.KHDBJZPP')
           {
             type: 'string',
-            pattern: /^[\w\u4e00-\u9fa5:.\\/]*(jar)$/,
-            message: this.$t('message.linkis.udf.HZMZC'),
+            validator: this.jarValidator,
             trigger: 'change',
           },
         ],
@@ -362,8 +361,7 @@ export default {
           // $t('message.linkis.udf.KHDBJZPP')
           {
             type: 'string',
-            pattern: /^[\w\u4e00-\u9fa5:.\\/]*(py|scala)$/,
-            message: this.$t('message.linkis.udf.ZCPYSCA'),
+            validator: this.pyValidator,
             trigger: 'change',
           },
         ],
@@ -376,8 +374,7 @@ export default {
           // $t('message.linkis.udf.KHDBJZPP')
           {
             type: 'string',
-            pattern: /^[\w\u4e00-\u9fa5:.\\/]*(py|scala)$/,
-            message: this.$t('message.linkis.udf.ZCPYSCA'),
+            validator: this.pyValidator,
             trigger: 'change',
           },
         ],
@@ -424,7 +421,7 @@ export default {
             type: 'string',
             required: true,
             message: this.$t('message.linkis.udf.SRFL'),
-            trigger: 'blur',
+            trigger: 'change',
           },
         ]
       },
@@ -449,7 +446,7 @@ export default {
       if (this.fnCategory.isCommon) {
         prop = 'jar';
       } else if (this.fnCategory.isSpark) {
-        prop = `spark.${suffix}`;
+        prop = `Spark.${suffix}`;
       } else {
         prop = `custom.${suffix}`;
       }
@@ -500,7 +497,7 @@ export default {
     'setting.fnType'(val) {
       let map = {};
       map[this.$t('message.linkis.udf.common')] = 'isCommon';
-      map['spark'] = 'isSpark';
+      map['Spark'] = 'isSpark';
       map[this.$t('message.linkis.udf.ZDYHS')] = 'isCustom';
       let type = map[val];
       Object.keys(this.fnCategory).forEach((key) => this.fnCategory[key] = 
false);
@@ -541,7 +538,7 @@ export default {
       }
       this.title = titleMap[this.model];
       this.btnLabel = btnLabelMap[this.model];
-      if (this.setting.fnType === 'spark') {
+      if (this.setting.fnType === 'Spark') {
         this.filterNode = (node) => {
           const name = node.label;
           const tabSuffix = name.substr(name.lastIndexOf('.'), name.length);
@@ -558,7 +555,7 @@ export default {
 
     init() {
       let { name, shared, description, path, udfName, directory, udfType, 
registerFormat, load, useFormat } = this.node;
-      let fnType = 'spark'
+      let fnType = 'Spark'
       if (udfType === 0) {
         fnType = this.$t('message.linkis.udf.common');
       } else if (udfType > 2) {
@@ -597,11 +594,23 @@ export default {
       } else if (this.node.udfType === 1) {
         this.setting.pyPara = conver(',', ')', 'indexOf', 'lastIndexOf');
       } else {
-        const type = rf.slice(rf.indexOf('['), rf.indexOf(']'));
+        const type = rf.slice(rf.indexOf('[') + 1, rf.indexOf(']'));
+        console.log(type, rf, '=====');
         // 如果存在多个逗号,就只用使用格式来截取,否则会出现多个类型填入input异常的问题
         if (type.indexOf(',') !== type.lastIndexOf(',')) {
-          this.setting.scalaTypeL = '';
-          this.setting.scalaTypeR = '';
+          // there are 2 case:
+          // 1. tuple,  return params in ();
+          // 2. multi params, the first params is return params
+          if (type.indexOf('(') !== -1) {
+            // tuple
+            this.setting.scalaTypeL = type.slice(type.indexOf('('), 
type.indexOf(')') + 1)
+            this.setting.scalaTypeR = type.slice(type.indexOf(')')+2)
+          } else {
+            // multi params
+            this.setting.scalaTypeL = type.split(',')[0];
+            this.setting.scalaTypeR = type.split(',').slice(1).toString();
+          }
+         
           this.showScalaRF = this.node.registerFormat;
         } else {
           this.setting.scalaTypeL = conver('[', ',', 'indexOf', 'indexOf');
@@ -699,7 +708,7 @@ export default {
 
     onTypeChange() {
       this.$emit('type-change', this.setting.fnType);
-      if (this.setting.fnType === 'spark') {
+      if (this.setting.fnType === 'Spark') {
         this.filterNode = (node) => {
           const name = node.label;
           const tabSuffix = name.substr(name.lastIndexOf('.'), name.length);
@@ -761,6 +770,26 @@ export default {
         this.$refs.directory.setQuery(null)
         this.directories = [...this.remoteDirectories]
       }
+    },
+    jarValidator(rule, val, cb) {
+      if (!val) {
+        cb(new Error(this.$t('message.linkis.udf.QSRWZLJ')));
+      }
+      const fileName = val.split('/')[val.split('/').length - 1]
+      if (!/^[\w\u4e00-\u9fa5:.\\/]*(jar)$/.test(fileName)) {
+        cb(new Error(this.$t('message.linkis.udf.HZMZC')));
+      }
+      cb();
+    },
+    pyValidator(rule, val, cb) {
+      if (!val) {
+        cb(new Error(this.$t('message.linkis.udf.QSRWZLJ')));
+      }
+      const fileName = val.split('/')[val.split('/').length - 1]
+      if (!/^[\w\u4e00-\u9fa5:.\\/]*(py|scala)$/.test(fileName)) {
+        cb(new Error(this.$t('message.linkis.udf.ZCPYSCA')));
+      }
+      cb();
     }
   },
 };
diff --git a/linkis-web/src/apps/URM/module/udfManagement/index.vue 
b/linkis-web/src/apps/URM/module/udfManagement/index.vue
index a0631260d..269107963 100644
--- a/linkis-web/src/apps/URM/module/udfManagement/index.vue
+++ b/linkis-web/src/apps/URM/module/udfManagement/index.vue
@@ -101,12 +101,12 @@
       :mask-closable="false"
       @on-visible-change="changUserModalChange"
     >
-      <span>移交给:</span>
+      <span>{{$t('message.linkis.udf.changeUserTo')}}</span>
       <Select ref="userSelect" v-model="handleUser" filterable
-        v-if=allUsers.length
+        v-if="allUsers.length"
         :remoteMethod="filterSelectTransUser"
         @on-query-change="queryChange"
-        placeholder="请输入用户名" style="width:200px;">
+        :placeholder="$t('message.linkis.udf.inputUser')" style="width:200px;">
         <Option
           v-for="(item) in transUsers"
           :label="item"
@@ -114,28 +114,28 @@
           :key="item"
         />
       </Select>
-      <Input v-if=!allUsers.length v-model="handleUser" placeholder="请输入用户名" 
style="width: 300px" />
+      <Input v-if="!allUsers.length" v-model="handleUser" 
:placeholder="$t('message.linkis.udf.inputUser')" style="width: 300px" />
       <div slot="footer">
-        <Button @click="changUserModal=false">取消</Button>
-        <Button type="primary" :disabled="!this.handleUser" 
@click="changeUser">确定</Button>
+        <Button 
@click="changUserModal=false">{{$t('message.linkis.udf.cancel')}}</Button>
+        <Button type="primary" :disabled="!this.handleUser" 
@click="changeUser">{{$t('message.linkis.udf.confirm')}}</Button>
       </div>
     </Modal>
     <Modal
-      title="共享"
+      :title="$t('message.linkis.udf.share')"
       v-model="shareModal"
       :mask-closable="false"
       @on-ok="share"
     >
-      <span>共享用户:</span>
+      <span>{{$t('message.linkis.udf.shareUser')}}</span>
       <Input
         v-model="sharedUsers"
         type="textarea"
         :autosize="{ minRows: 2, maxRows: 5 }"
-        placeholder="使用逗号分隔"
+        :placeholder="$t('message.linkis.udf.separateWithCommas')"
       />
     </Modal>
     <Modal
-      title="版本列表"
+      :title="$t('message.linkis.udf.versionList')"
       v-model="vlistModal"
       width="1024"
       :mask-closable="false"
diff --git a/linkis-web/src/apps/URM/module/udfManagement/vlist.vue 
b/linkis-web/src/apps/URM/module/udfManagement/vlist.vue
index 5dc3574f2..7cc41de04 100644
--- a/linkis-web/src/apps/URM/module/udfManagement/vlist.vue
+++ b/linkis-web/src/apps/URM/module/udfManagement/vlist.vue
@@ -28,7 +28,7 @@
       show-elevator
       @on-change="changePage"
     />
-    <Modal v-model="showContent" footer-hide width="80%" title="查看源码" 
class="view-code">
+    <Modal v-model="showContent" footer-hide width="80%" 
:title="$t('message.linkis.udf.viewSourceCode')" class="view-code">
       <Spin v-if="loadingContent" size="large" fix />
       <Input
         v-show="!loadingContent"
@@ -55,42 +55,42 @@ export default {
     return {
       cols: [
         {
-          title: '版本',
+          title: this.$t('message.linkis.udf.version'),
           key: 'bmlResourceVersion',
           align: 'center',
           width: 95
         },
         {
-          title: '发布',
+          title: this.$t('message.linkis.udf.publish'),
           key: 'publish',
           align: 'center',
           width: 75
         },
         {
-          title: '状态',
+          title: this.$t('message.linkis.udf.status'),
           key: 'status',
           align: 'center',
           width: 80
         },
         {
-          title: '注释',
+          title: this.$t('message.linkis.udf.notes'),
           key: 'description',
           align: 'center',
           width: 170
         },
         {
-          title: '修改时间',
+          title: this.$t('message.linkis.udf.lastModifyTime'),
           key: 'createTimeFormat',
           align: 'center',
           width: 160
         },
         {
-          title: '创建者',
+          title: this.$t('message.linkis.udf.creator'),
           key: 'createUser',
           align: 'center',
           width: 120
         }, {
-          title: '操作',
+          title: this.$t('message.linkis.udf.action.title'),
           align: 'center',
           width: 285,
           render: (h, params) => {
@@ -107,7 +107,7 @@ export default {
                     this.back(params.row)
                   }
                 }
-              }, '创建新版本'),
+              }, this.$t('message.linkis.udf.createNewVersion')),
               h('Button', {
                 props: {
                   size: 'small',
@@ -121,7 +121,7 @@ export default {
                     this.publish(params.row)
                   }
                 }
-              }, '发布'),
+              }, this.$t('message.linkis.udf.publish')),
               h('Button', {
                 props: {
                   size: 'small',
@@ -134,7 +134,7 @@ export default {
                     this.download(params.row)
                   }
                 }
-              }, '下载'),
+              }, this.$t('message.linkis.udf.download')),
               h('Button', {
                 props: {
                   size: 'small',
@@ -148,7 +148,7 @@ export default {
                     this.viewCode(params.row)
                   }
                 }
-              }, '查看源码')
+              }, this.$t('message.linkis.udf.viewSourceCode'))
             ]);
           }
         }],
@@ -225,7 +225,7 @@ export default {
         }, 'post')
         .then(() => {
           this.fetchList()
-          this.$Message.success('操作成功')
+          this.$Message.success(this.$t('message.linkis.udf.success'))
           this.$emit('refresh-list')
         })
         .catch(() => {
@@ -240,7 +240,7 @@ export default {
           version: row.bmlResourceVersion
         }, 'post')
         .then(() => {
-          this.$Message.success('操作成功')
+          this.$Message.success(this.$t('message.linkis.udf.success'))
           this.fetchList()
         })
         .catch(() => {
@@ -267,7 +267,7 @@ export default {
           document.body.appendChild(l);
           l.click()
           window.URL.revokeObjectURL(url)
-          this.$Message.success('操作成功')
+          this.$Message.success(this.$t('message.linkis.udf.success'))
         })
         .catch(() => {
           this.loading = false
diff --git a/linkis-web/src/apps/linkis/i18n/common/en.json 
b/linkis-web/src/apps/linkis/i18n/common/en.json
index 3ad87e5ea..9b9dd78b1 100644
--- a/linkis-web/src/apps/linkis/i18n/common/en.json
+++ b/linkis-web/src/apps/linkis/i18n/common/en.json
@@ -38,6 +38,14 @@
       "result": "Task Result",
       "startUp": "Start-up",
       "tagEdit": "Edit",
+      "tipForKill": "The unlock engines of ECM [{instance}}] will be killed",
+      "killAll": "Kill Unlock Engine",
+      "allEngine": "Include Multiple User Engine?",
+      "killFinishedInfo": "Expected to stop {killEngineNum} engines, will 
release ECM {cores}cores,{memory}G resources",
+      "yes": "Yes",
+      "no": "No",
+      "noDataTextBeforeSearch": "Please input the execution code for query",
+      "noDataTextAfterSearch": "No data yet",
       "rename": "Rename",
       "instanceNum": "Instance Number",
       "keyTip": "The key cannot be empty",
@@ -62,8 +70,8 @@
       "unselect": "Please select task",
       "noselection": "Please select first",
       "searchName": "Please enter username to search",
-      "generalView": "Switch to The Common View",
-      "manageView": "Switch to The Admin View",
+      "generalView": "Switch to the Common View",
+      "manageView": "Switch to the Admin View",
       "back": "Back",
       "prev": "Previous Step",
       "complete": "Complete",
@@ -73,6 +81,8 @@
       "previousPage": "Previous Page",
       "all": "All",
       "common": "Common",
+      "tenant": "Tenant",
+      "inputTenant": "Please Input Tenant",
       "warning": {
         "api": "Requesting API, please hold on!",
         "data": "Requesting data, please hold on!",
@@ -114,7 +124,7 @@
         "executeApplicationName": "Execution Engine",
         "requestApplicationName": "Created From",
         "user": "User",
-        "createdTime": "Created At",
+        "createdTime": "Created at",
         "updateTime": "Update Time",
         "failedReason": "Key Information",
         "control": {
@@ -143,7 +153,7 @@
           "name": "Frequently Used",
           "children": {
             "globalHistory": "Global History",
-            "resource": "Resource Manager",
+            "resource": "Resource Management",
             "resourceEngineConnList": "History Engine",
             "setting": "Settings",
             "dateReport": "Global Variables",
@@ -152,7 +162,7 @@
             "ECMManage": "ECM Management",
             "udfFunctionTitle": "UDF Function",
             "udfFunctionManage": "UDF Management",
-            "dataSourceManage": "DataSource Manage",
+            "dataSourceManage": "DataSource Management",
             "userResourceManagement": "User Resource Management",
             "tenantTagManagement": "Tenant Tag Management",
             "ipListManagement": "White List Management",
@@ -162,6 +172,7 @@
             "udfManager": "UDF User Manage",
             "udfTree": "UDF Tree",
             "datasourceAccess": "Data source access permissions",
+            "codeQuery": "Code Retrieval",
             "datasourceEnv": "Datasource Environment",
             "datasourceType": "Datasource Type",
             "datasourceTypeKey": "Datasource Config Options",
@@ -204,8 +215,8 @@
         "executeApplicationName": "Execution Engine",
         "requestApplicationName": "Created From",
         "progress": "Progress",
-        "createdTime": "Created At",
-        "updatedTime": "Updated At",
+        "createdTime": "Created at",
+        "updatedTime": "Updated at",
         "control": {
           "title": "Handle",
           "label": "View"
@@ -217,7 +228,7 @@
         "memory": "Memory",
         "engineInstance": "Engine Instance",
         "applicationName": "Application Name",
-        "usedTime": "Started At",
+        "usedTime": "Started at",
         "engineStatus": "Status",
         "username": "Username"
       },
@@ -251,7 +262,7 @@
       "core": "Cores",
       "row": {
         "applicationName": "Application Name",
-        "usedTime": "Started At",
+        "usedTime": "Started at",
         "engineStatus": "Status",
         "engineInstance": "Engine Instance",
         "queueName": "Queue Name",
@@ -299,7 +310,7 @@
       "datasource": {
         "pleaseUpload": "Please upload",
         "pleaseInput": "Please input",
-        "datasourceSrc": "Datasource",
+        "datasourceSrc": "DataSource",
         "connectTest": "Test Connection",
         "sourceName": "DataSource Name",
         "sourceDec": "DataSource Description",
@@ -365,6 +376,7 @@
         "delete": "Delete",
         "userIsExisted": "User Tag Already Exists",
         "addSuccessful": "Successfully Addded",
+        "editSuccessful": "Successfully edited",
         "confirmDel": "Confirm Deletion",
         "isConfirmDel": "Are you sure you want to delete this tag"
       },
@@ -399,9 +411,30 @@
         "delete": "Delete",
         "userIsExisted": "User Tag Already Exists",
         "addSuccessful": "Successfully Addded",
+        "editSuccessful": "Successfully edited",
         "confirmDel": "Confirm Deletion",
         "isConfirmDel": "Are you sure you want to delete this tag"
       },
+      "codeQuery": {
+        "executionCode": "Execution Code",
+        "dateRange": "Date Range",
+        "placeholder": {
+            "executionCode": "Please input execution code",
+            "dateRange": "Please select date range",
+            "status": "Please select status"
+        },
+        "inputCode": "Please input execution code",
+        "id": "ID",
+        "code": "Code",
+        "check": "View",
+        "search": "Search",
+        "clear": "Clear",
+        "status": "Status",
+        "submitUser": "Submit User",
+        "createdTime": "Created Time",
+        "searchRange": "Only T-1 history code can be queried"
+      
+      },
       "basedataManagement": {
         "add": "Add",
         "remove": "Remove",
@@ -415,7 +448,8 @@
           "cancel": "Cancel",
           "modalTitle": "Info",
           "modalFormat": "Confirm deleting the {0} record?",
-          "modalDelete": "Confirm that the record [{name}] should be deleted?",
+          "modalDelete1": "Confirm that the record [{username}] should be 
deleted?",
+          "modalDelete": "Confirm that the record [{envName}] should be 
deleted?",
           "modalDeleteSuccess": "Successfully delete",
           "modalDeleteFail": "Fail to delete",
           "modalAddSuccess": "Successfully added",
@@ -527,17 +561,21 @@
           "all": "All"
         }
       },
-      "EnginePluginManagement": {
-        "engineConnType": "EngineConn Type",
-        "engineConnVersion": "Engine Conn Version",
-        "create": "Create",
-        "fileName": "File Name",
-        "fileSize": "File Size",
-        "lastModified": "Last Modified",
-        "bmlResourceId": "Material Resource Id",
-        "bmlResourceVersion": "Material Resource version",
-        "lastUpdateTime": "Last Update Time",
+      "basedata": {
+        "add": "Add",
+        "remove": "Remove",
+        "edit": "Edit",
+        "addUDFAdmin": "Add UDF Administrator",
+        "search": "Search",
+        "envName": "Environment Name",
+        "envDesc": "Environment Description",
+        "dataSourceName": "DataSource Name",
+        "parameter": "Parameter",
         "createTime": "Create Time",
+        "creator": "Creator",
+        "modifyUser": "Modify User",
+        "updateTime": "Update Time",
+        "action": "Action",
         "Reset": "Reset",
         "delete": "Delete",
         "update": "Update",
@@ -547,13 +585,8 @@
         "deleteCurrentbml": "Delete",
         "versionList": "Version List",
         "rollback": "Rollback",
-        "action": "Operate",
         "checkEngineConnTypeAndVersion": "Please select the engine type and 
version",
-        "upload": "Please click the button to upload the engine plug-in",
-        "hasUpload": "The file has been uploaded, you can click to upload 
again",
-        "force": "Whether to overwrite",
-        "yes": "Yes",
-        "no": "No"
+        "upload": "Please click the button to upload the engine plug-in"
       }
     }
   }
diff --git a/linkis-web/src/apps/linkis/i18n/common/zh.json 
b/linkis-web/src/apps/linkis/i18n/common/zh.json
index b38b9e7f0..e06ecd046 100644
--- a/linkis-web/src/apps/linkis/i18n/common/zh.json
+++ b/linkis-web/src/apps/linkis/i18n/common/zh.json
@@ -1,562 +1,585 @@
 {
   "message": {
-    "linkis": {
-      "refresh": "刷新",
-      "placeholderZip": "请输入工作空间python包路径(只支持zip)!",
-      "emptyString": "空字符串",
-      "addAppType": "新增应用类型",
-      "editContents": "编辑目录",
-      "ConfirmEdit": "完成编辑",
-      "eurekaRegisterCenter": "Eureka注册中心",
-      "addParameterConfig": "新增参数配置",
-      "addEngineType": "新增引擎类型",
-      "editDescriptionEngineConfig": "编辑引擎配置",
-      "name": "名称",
-      "order": "顺序",
-      "description": "描述",
-      "noDescription": "暂无描述",
-      "addTags": "添加标签",
-      "find": "查询",
-      "initiator": "创建者",
-      "inputOwnerHint": "请输入创建者",
-      "jumpPage": "请在跳转页面查看……",
-      "editedSuccess": "修改成功",
-      "errorCode": "错误码",
-      "errorDescription": "错误描述",
-      "notLog": "未获取到日志!",
-      "unfold": "展开",
-      "fold": "收起",
-      "addVariable": "新增变量",
-      "defaultValue": "默认值",
-      "noDefaultValue": "无默认值",
-      "stop": "停止",
-      "tip": "提示",
-      "serverTip": "无结果集(resultLocation:null)",
-      "stopEngineTip": "请问确认要停止当前引擎?",
-      "log": "任务日志",
-      "detail": "任务详情",
-      "result": "任务结果",
-      "startUp": "启动",
-      "tagEdit": "编辑",
-      "keyTip": "不能为空",
-      "rename": "重命名",
-      "resources": "资源",
-      "instanceNum": "实例数",
-      "instanceName": "实例名称",
-      "reset": "重置",
-      "clearSearch": "清空",
-      "showOperations": "显示操作",
-      "hide": "隐藏操作",
-      "resetAll": "全部重置",
-      "remove": "移除",
-      "submit": "确定",
-      "search": "搜索",
-      "save": "保存",
-      "edit": "编辑",
-      "cancel": "取消",
-      "create": "新建",
-      "noDataText": "暂无数据",
-      "jobId": "任务ID",
-      "userName": "用户名",
-      "password": "密码",
-      "unselect": "请选择",
-      "noselection": "请先选择",
-      "searchName": "请输入用户名搜索",
-      "generalView": "切换普通视图",
-      "manageView": "切换管理员视图",
-      "back": "返回",
-      "prev": "上一步",
-      "complete": "完成",
-      "close": "关闭",
-      "udfName": "UDF名称",
-      "udfType": "UDF类型",
-      "nextPage": "下一页",
-      "previousPage": "上一页",
-      "all": "全部",
-      "common": "通用",
-      "warning": {
-        "api": "接口请求中,请稍候!",
-        "data": "数据请求中,请稍候!",
-        "waiting": "请等待接口返回!",
-        "biLoading": "正在和Visualis系统通讯,请稍候!",
-        "comingSoon": "尚未开源,敬请期待!"
-      },
-      "resourceManagement": {
-        "resourceUsage": "资源使用情况",
-        "applicationList": "应用列表"
-      },
-      "time": {
-        "second": "秒",
-        "minute": "分钟",
-        "hour": "小时",
-        "day": "天"
-      },
-      "tableColumns": {
-        "instanceName": "实例名称",
-        "initiator": "启动者",
-        "engineInstance": "引擎实例",
-        "engineType": "引擎类型",
-        "serveType": "服务类型",
-        "appType": "应用类型",
-        "taskID": "任务ID",
-        "fileName": "来源",
-        "executionCode": "查询语句",
-        "status": "状态",
-        "costTime": "已耗时",
-        "label": "标签",
-        "engineVersion": "引擎版本",
-        "engineVersionCannotBeNull": "引擎版本不能为空",
-        "addEngineRules": "应用名称不能有特殊符号和空格",
-        "usedResources": "已用资源",
-        "lockedResource": "上锁资源",
-        "maximumAvailableResources": "最大可用资源",
-        "minimumAvailableResources": "最小可用资源",
-        "startTime": "启动时间",
-        "executeApplicationName": "执行引擎",
-        "requestApplicationName": "创建者",
-        "user": "用户",
-        "createdTime": "创建时间",
-        "updateTime": "更新时间",
-        "failedReason": "关键信息",
-        "control": {
-          "title": "操作",
-          "label": "查看"
-        },
-        "queenRemain": "队列剩余资源",
-        "queueUsed": "队列已用资源",
-        "queueTop": "队列上限资源",
-        "engineRemain": "引擎剩余资源",
-        "engineUsed": "引擎已用资源",
-        "engineTop": "引擎上限资源"
-      },
-      "logLoading": "日志请求中,请稍后",
-      "title": "Linkis管理台",
-      "info": "{num} 条新消息",
-      "hint": "请在跳转页面查看……",
-      "sideNavList": {
-        "news": {
-          "name": "最新动态",
-          "children": {
-            "daily": "运营日报"
-          }
-        },
-        "function": {
-          "name": "常用功能",
-          "children": {
-            "globalHistory": "全局历史",
-            "resource": "资源管理",
-            "resourceEngineConnList": "历史引擎",
-            "setting": "参数配置",
-            "dateReport": "全局变量",
-            "globalValiable": "常见问题",
-            "ECMManage": "ECM管理",
-            "microserviceManage": "微服务管理",
-            "udfFunctionTitle": "UDF函数",
-            "udfFunctionManage": "UDF管理",
-            "functionManagement": "函数管理",
-            "dataSourceManage": "数据源管理",
-            "userResourceManagement": "用户资源管理",
-            "tenantTagManagement": "租户标签管理",
-            "ipListManagement": "白名单管理",
-            "errorCode": "错误码管理",
-            "gatewayAuthToken": "令牌管理",
-            "rmExternalResourceProvider": "扩展资源管理",
-            "udfManager": "管理员用户",
-            "udfTree": "UDF分类",
-            "datasourceAccess": "数据源权限",
-            "datasourceEnv": "数据源环境",
-            "datasourceType": "数据源分类",
-            "datasourceTypeKey": "数据源配置项",
-            "EnginePluginManagement": "引擎物料管理",
-            "basedataManagement": "基础数据管理"
-          }
-        }
-      },
-      "formItems": {
-        "id": {
-          "placeholder": "请输入ID搜索"
-        },
-        "date": {
-          "label": "起始时间",
-          "placeholder": "请选择起始日期"
-        },
-        "instance": {
-          "label": "实例",
-          "placeholder": "请输入实例"
-        },
-        "creator": {
-          "label": "应用",
-          "placeholder": "请输入应用搜索"
-        },
-        "engine": {
-          "label": "引擎"
-        },
-        "status": {
-          "label": "状态"
-        },
-        "appType": "应用类型",
-        "engineType": "引擎类型"
-      },
-      "columns": {
-        "taskID": "任务ID",
-        "fileName": "脚本名称",
-        "executionCode": "查询语句",
-        "status": "状态",
-        "costTime": "已耗时",
-        "executeApplicationName": "执行引擎",
-        "requestApplicationName": "创建者",
-        "progress": "进度",
-        "createdTime": "创建时间",
-        "updatedTime": "最后更新时间",
-        "control": {
-          "title": "操作",
-          "label": "查看"
-        },
-        "moduleName": "模块名称",
-        "totalResource": "总资源",
-        "usedResource": "已用资源",
-        "initializingResource": "初始化中资源",
-        "memory": "内存",
-        "engineInstance": "引擎实例",
-        "applicationName": "应用名称",
-        "usedTime": "开始时间",
-        "engineStatus": "状态",
-        "username": "用户名"
-      },
-      "shortcuts": {
-        "week": "最近一周",
-        "month": "最近一个月",
-        "threeMonths": "最近三个月"
-      },
-      "statusType": {
-        "all": "全部",
-        "inited": "排队中",
-        "running": "运行",
-        "succeed": "成功",
-        "cancelled": "取消",
-        "failed": "失败",
-        "scheduled": "资源申请中",
-        "timeout": "超时",
-        "retry": "重试",
-        "unknown": "未知"
-      },
-      "engineTypes": {
-        "all": "全部"
-      },
-      "header": "资源管理器",
-      "tabs": {
-        "first": "用户会话",
-        "second": "用户资源",
-        "third": "服务器资源"
-      },
-      "noLimit": "无限制",
-      "core": "核",
-      "row": {
-        "applicationName": "应用名称",
-        "usedTime": "开始时间",
-        "engineStatus": "状态",
-        "engineInstance": "引擎实例",
-        "queueName": "队列名称",
-        "user": "用户",
-        "cpu": "已用的服务器CPU资源",
-        "memory": "已用的服务器内存资源",
-        "queueCpu": "已用的Yarn队列CPU资源",
-        "queueMemory": "已用的Yarn队列内存资源"
-      },
-      "setting": {
-        "global": "全局",
-        "globalSetting": "通用设置",
-        "hide": "隐藏",
-        "show": "显示",
-        "advancedSetting": "高级设置",
-        "dataDev": "数据开发"
-      },
-      "globalValiable": "全局变量",
-      "rules": {
-        "first": {
-          "required": "变量 {text} 的key为空",
-          "lengthLimit": "长度应为 1 至 128 个字符",
-          "letterTypeLimit": "仅支持以字母开头,且不得存在空格和中文",
-          "placeholder": "请输入变量名"
-        },
-        "second": {
-          "required": "变量 {text} 的value为空",
-          "lengthLimit": "长度应为 1 至 128 个字符",
-          "placeholder": "请输入变量值"
-        }
-      },
-      "addArgs": "增加参数",
-      "emptyDataText": "暂无全局变量数据",
-      "sameName": "存在同名key",
-      "error": {
-        "validate": "有验证项未通过,请检查后再试!"
-      },
-      "success": {
-        "update": "全局变量更新成功!"
-      },
-      "searchAppType": "请输入应用类型",
-      "resetTip": "是否确认重置该资源?",
-      "resetAllTip": "是否重置全部用户资源(该操作只会清理用户资源记录,不清理已经产生的资源)",
-      "viewlog": "查看日志",
-      "datasource": {
-        "pleaseInput": "请输入",
-        "pleaseUpload": "请上传",
-        "datasourceSrc": "数据源",
-        "connectTest": "测试连接",
-        "sourceName": "数据源名称",
-        "sourceDec": "数据源描述",
-        "sourceType": "数据源类型",
-        "creator": "创建人",
-        "create": "新增数据源",
-        "exports": "批量导出数据源",
-        "imports": "批量导入数据源",
-        "overdue": "过期",
-        "versionList": "版本列表",
-        "dataSourceName": "数据源名称",
-        "dataSourceType": "数据源类型",
-        "createSystem": "创建系统",
-        "dataSourceEnv": "可用集群",
-        "status": "状态",
-        "permissions": "权限",
-        "label": "标签",
-        "version": "版本",
-        "desc": "描述",
-        "action": "操作",
-        "createUser": "创建人",
-        "createTime": "创建时间",
-        "versionDec": "版本描述",
-        "watch": "查看",
-        "rollback": "回滚",
-        "publish": "发布",
-        "initVersion": "初始化版本",
-        "updateVersion": "版本更新",
-        "published": "已发布",
-        "unpublish": "未发布",
-        "cannotPublish": "不可发布",
-        "used": "可用",
-        "commentValue": "从版本 {text} 回滚"
-      },
-      "tenantTagManagement": {
-        "userName": "用户名",
-        "appName": "应用名",
-        "tenantTag": "租户标签",
-        "search": "搜索",
-        "clear": "清空",
-        "create": "新增",
-        "userCreator": "用户-应用",
-        "createUser": "创建人",
-        "createTime": "创建时间",
-        "desc": "业务来源",
-        "inputUser": "请输入用户名",
-        "inputApp": "请输入应用名",
-        "inputTenant": "请输入租户标签",
-        "inputDesc": "请输入业务来源",
-        "inputCreateUser": "请输入创建者",
-        "yourTagMapping": "您的标签映射",
-        "notEmpty": "不能为空",
-        "maxLen": "长度不能超过100",
-        "contentError": "仅限英文、数字、星号和下划线",
-        "contentError1": "仅限英文、数字和下划线",
-        "contentError2": "仅限英文、数字、下划线和横线",
-        "check": "检查",
-        "OK": "确定",
-        "Cancel": "取消",
-        "action": "操作",
-        "edit": "编辑",
-        "delete": "删除",
-        "userIsExisted": "用户标签已存在",
-        "addSuccessful": "添加成功",
-        "confirmDel": "确认删除",
-        "isConfirmDel": "确定要删除这条数据吗"
-      },
-      "ipListManagement": {
-        "userName": "用户名",
-        "appName": "应用名",
-        "ipList": "IP列表",
-        "search": "搜索",
-        "clear": "清空",
-        "create": "新增",
-        "userCreator": "用户-应用",
-        "createUser": "创建人",
-        "createTime": "创建时间",
-        "desc": "业务来源",
-        "inputUser": "请输入用户名",
-        "inputApp": "请输入应用名",
-        "inputIpList": "请输入IP列表",
-        "inputDesc": "请输入业务来源",
-        "inputCreateUser": "请输入创建者",
-        "yourTagMapping": "您的标签映射",
-        "notEmpty": "不能为空",
-        "maxLen": "长度不能超过100",
-        "contentError": "仅限英文、数字、星号和下划线",
-        "contentError1": "仅限英文、数字和下划线",
-        "contentError2": "仅限英文、数字、下划线和横线",
-        "ipContentError": "请输入正确格式的IP地址(多个IP地址通过,分隔)",
-        "check": "检查",
-        "OK": "确定",
-        "Cancel": "取消",
-        "action": "操作",
-        "edit": "编辑",
-        "delete": "删除",
-        "userIsExisted": "用户标签已存在",
-        "addSuccessful": "添加成功",
-        "confirmDel": "确认删除",
-        "isConfirmDel": "确定要删除这条数据吗"
-      },
-      "basedataManagement": {
-        "add": "新增",
-        "addUDFAdmin": "新增UDF管理员",
-        "remove": "删除",
-        "edit": "编辑",
-        "searchLabel": "模糊搜索:",
-        "searchPlaceholder": "请输入搜索内容",
-        "search": "搜索",
-        "action": "操作",
-        "modal":{
-          "confirm": "确定",
+      "linkis": {
+          "refresh": "刷新",
+          "placeholderZip": "请输入工作空间python包路径(只支持zip)!",
+          "emptyString": "空字符串",
+          "addAppType": "新增应用类型",
+          "editContents": "编辑目录",
+          "ConfirmEdit": "完成编辑",
+          "eurekaRegisterCenter":  "Eureka注册中心",
+          "addParameterConfig": "新增参数配置",
+          "addEngineType": "新增引擎类型",
+          "editDescriptionEngineConfig": "编辑引擎配置",
+          "name": "名称",
+          "order": "顺序",
+          "description": "描述",
+          "noDescription": "暂无描述",
+          "addTags": "添加标签",
+          "find": "查询",
+          "initiator": "创建者",
+          "inputOwnerHint": "请输入创建者",
+          "jumpPage": "请在跳转页面查看……",
+          "editedSuccess": "修改成功",
+          "errorCode": "错误码",
+          "errorDescription": "错误描述",
+          "notLog": "未获取到日志!",
+          "unfold": "展开",
+          "fold": "收起",
+          "addVariable": "新增变量",
+          "defaultValue": "默认值",
+          "noDefaultValue": "无默认值",
+          "stop": "停止",
+          "tip": "提示",
+          "serverTip": "无结果集(resultLocation:null)",
+          "stopEngineTip": "请问确认要停止当前引擎?",
+          "log": "任务日志",
+          "detail": "任务详情",
+          "result": "任务结果",
+          "startUp": "启动",
+          "tagEdit": "编辑",
+          "tipForKill": "将要停止此ECM实例 【{instance}】上的空闲引擎",
+          "killAll": "停止空闲引擎",
+          "allEngine": "包含多用户引擎?",
+          "killFinishedInfo": "预计停止{killEngineNum}个引擎, 将释放 ECM 
{cores}cores,{memory}G 资源",
+          "noDataTextBeforeSearch": "请输入执行代码进行查询",
+          "noDataTextAfterSearch": "暂无数据",
+          "yes": "是",
+          "no": "否",
+          "keyTip": "不能为空",
+          "rename": "重命名",
+          "resources": "资源",
+          "instanceNum": "实例数",
+          "instanceName": "实例名称",
+          "reset": "重置",
+          "clearSearch": "清空",
+          "showOperations": "显示操作",
+          "hide": "隐藏操作",
+          "resetAll": "全部重置",
+          "remove": "移除",
+          "submit": "确定",
+          "search": "搜索",
+          "save": "保存",
+          "edit": "编辑",
           "cancel": "取消",
-          "modalTitle": "提示信息",
-          "modalFormat": "确定删除 {0} 这条记录?",
-          "modalDelete": "确认是否删除[{name}]该记录?",
-          "modalDeleteSuccess": "删除成功",
-          "modalDeleteFail": "删除失败",
-          "modalAddSuccess": "添加成功",
-          "modalAddFail": "添加失败",
-          "modalEditSuccess": "编辑成功",
-          "modalEditFail": "编辑失败"
-        },
-        "gatewayAuthToken": {
-          "tokenName": "名称",
-          "legalUsers": "用户",
-          "legalHosts": "主机",
-          "elapseDay": "有效天数",
-          "permanentlyValid": "永久有效",
-          "businessOwner": "所属者",
-          "createTime":"创建时间",
-          "updateTime": "更新时间",
-          "updateBy": "更新人",
-          "searchPlaceholder": "令牌名称/用户/主机",
-          "info":"有效天数: -1 表示永久",
-          "legalUsersInfo": "*允许所有用户;多用户使用,隔开,例如:user1,user2",
-          "legalUsersValidate": {
-            "empty": "请填写用户",
-            "format": "格式不正确,使用*或使用,分割,例如:user1,user2"
+          "create": "新建",
+          "noDataText": "暂无数据",
+          "jobId": "任务ID",
+          "userName": "用户名",
+          "password": "密码",
+          "unselect": "请选择",
+          "noselection": "请先选择",
+          "searchName": "请输入用户名搜索",
+          "generalView": "切换普通视图",
+          "manageView": "切换管理员视图",
+          "back": "返回",
+          "prev": "上一步",
+          "complete": "完成",
+          "close": "关闭",
+          "udfName": "UDF名称",
+          "udfType": "UDF类型",
+          "nextPage": "下一页",
+          "previousPage": "上一页",
+          "all": "全部",
+          "common": "通用",
+          "tenant": "租户标签",
+          "inputTenant": "请输入租户标签",
+          "warning": {
+              "api": "接口请求中,请稍候!",
+              "data": "数据请求中,请稍候!",
+              "waiting": "请等待接口返回!",
+              "biLoading": "正在和Visualis系统通讯,请稍候!",
+              "comingSoon": "尚未开源,敬请期待!"
           },
-          "legalHostsInfo": "*允许所有主机;多主机使用,隔开,例如:host1,host2",
-          "legalHostsInfoValidate": {
-            "empty": "请填写主机"
+          "resourceManagement": {
+              "resourceUsage": "资源使用情况",
+              "applicationList": "应用列表"
           },
-          "elapseDayValidate": {
-            "format": "格式不正确,使用*或使用,分割,例如:host1,host2",
-            "empty": "请填写有效天数",
-            "GT0": "有效天数必须大于0"
-          }
-        },
-        "errorCode": {
-          "errorCode": "错误代码",
-          "errorDesc": "错误描述",
-          "errorRegex": "错误正则",
-          "searchPlaceholder": "代码/描述/正则"
-        },
-        "rmExternalResourceProvider": {
-          "resourceType": "资源类型",
-          "name": "名称",
-          "labels": "标签",
-          "config": "配置信息",
-          "searchPlaceholder": "名称/标签/配置"
-        },
-        "udfManager": {
-          "userName": "用户名",
-          "searchPlaceholder": "用户名",
-          "userNameValidate": {
-            "size": "用户名长度不能超过20个字符",
-            "empty": "请输入用户名"
-          }
-        },
-        "udfTree": {
-          "name": "名称",
-          "category": "分类",
-          "userName": "用户名",
-          "description": "描述",
-          "parent": "父级",
-          "createTime": "创建时间",
-          "updateTime": "更新时间",
-          "searchPlaceholder": "名称/分类/描述/用户名",
-          "parentInfo": "父级分类,Root为根目录"
-        },
-        "datasourceEnv": {
-          "envName": "环境名称",
-          "envDesc": "环境描述",
-          "name": "数据源名称",
-          "datasourceType": "数据源类型",
-          "keytab": "kerboros认证",
-          "parameter": "参数",
+          "time": {
+              "second": "秒",
+              "minute": "分钟",
+              "hour": "小时",
+              "day": "天"
+          },
+          "tableColumns": {
+              "instanceName": "实例名称",
+              "initiator": "启动者",
+              "engineInstance": "引擎实例",
+              "engineType": "引擎类型",
+              "serveType": "服务类型",
+              "appType": "应用类型",
+              "taskID": "任务ID",
+              "fileName": "来源",
+              "executionCode": "查询语句",
+              "status": "状态",
+              "costTime": "已耗时",
+              "label": "标签",
+              "engineVersion": "引擎版本",
+              "engineVersionCannotBeNull": "引擎版本不能为空",
+              "addEngineRules": "应用名称不能有特殊符号和空格",
+              "usedResources": "已用资源",
+              "lockedResource": "上锁资源",
+              "maximumAvailableResources": "最大可用资源",
+              "minimumAvailableResources": "最小可用资源",
+              "startTime": "启动时间",
+              "executeApplicationName": "执行引擎",
+              "requestApplicationName": "创建者",
+              "user": "用户",
+              "createdTime": "创建时间",
+              "updateTime": "更新时间",
+              "failedReason": "关键信息",
+              "control": {
+                  "title": "操作",
+                  "label": "查看"
+              },
+              "queenRemain": "队列剩余资源",
+              "queueUsed": "队列已用资源",
+              "queueTop": "队列上限资源",
+              "engineRemain": "引擎剩余资源",
+              "engineUsed": "引擎已用资源",
+              "engineTop": "引擎上限资源"
+          },
+          "logLoading": "日志请求中,请稍后",
+          "title": "Linkis管理台",
+          "info": "{num} 条新消息",
+          "hint": "请在跳转页面查看……",
+          "sideNavList": {
+              "news": {
+                  "name": "最新动态",
+                  "children": {
+                      "daily": "运营日报"
+                  }
+              },
+              "function": {
+                  "name": "常用功能",
+                  "children": {
+                      "globalHistory": "全局历史",
+                      "resource": "资源管理",
+                      "resourceEngineConnList": "历史引擎",
+                      "setting": "参数配置",
+                      "dateReport": "全局变量",
+                      "globalValiable": "常见问题",
+                      "ECMManage": "ECM管理",
+                      "microserviceManage": "微服务管理",
+                      "udfFunctionTitle": "UDF函数",
+                      "udfFunctionManage": "UDF管理",
+                      "functionManagement": "函数管理",
+                      "dataSourceManage": "数据源管理",
+                      "userResourceManagement": "用户资源管理",
+                      "tenantTagManagement": "租户标签管理",
+                      "ipListManagement": "白名单管理",
+                      "errorCode": "错误码管理",
+                      "gatewayAuthToken": "令牌管理",
+                      "rmExternalResourceProvider": "扩展资源管理",
+                      "udfManager": "用户管理",
+                      "udfTree": "UDF分类",
+                      "datasourceAccess": "数据源权限",
+                      "datasourceEnv": "数据源环境",
+                      "datasourceType": "数据源分类",
+                      "EnginePluginManagement": "引擎物料管理",
+                      "basedataManagement": "基础数据管理",
+                      "codeQuery": "代码检索"
+                  }
+              }
+          },
+          "formItems": {
+              "id": {
+                  "placeholder": "请输入ID搜索"
+              },
+              "date": {
+                  "label": "起始时间",
+                  "placeholder": "请选择起始日期"
+              },
+              "instance": {
+                  "label": "实例",
+                  "placeholder": "请输入实例"
+              },
+              "creator": {
+                  "label": "应用",
+                  "placeholder": "请输入应用搜索"
+              },
+              "engine": {
+                  "label": "引擎"
+              },
+              "status": {
+                  "label": "状态"
+              },
+              "appType": "应用类型",
+              "engineType": "引擎类型"
+          },
+          "columns": {
+              "taskID": "任务ID",
+              "fileName": "脚本名称",
+              "executionCode": "查询语句",
+              "status": "状态",
+              "costTime": "已耗时",
+              "executeApplicationName": "执行引擎",
+              "requestApplicationName": "创建者",
+              "progress": "进度",
+              "createdTime": "创建时间",
+              "updatedTime": "最后更新时间",
+              "control": {
+                  "title": "操作",
+                  "label": "查看"
+              },
+              "moduleName": "模块名称",
+              "totalResource": "总资源",
+              "usedResource": "已用资源",
+              "initializingResource": "初始化中资源",
+              "memory": "内存",
+              "engineInstance": "引擎实例",
+              "applicationName": "应用名称",
+              "usedTime": "开始时间",
+              "engineStatus": "状态",
+              "username": "用户名"
+          },
+          "shortcuts": {
+              "week": "最近一周",
+              "month": "最近一个月",
+              "threeMonths": "最近三个月"
+          },
+          "statusType": {
+              "all": "全部",
+              "inited": "排队中",
+              "running": "运行",
+              "succeed": "成功",
+              "cancelled": "取消",
+              "failed": "失败",
+              "scheduled": "资源申请中",
+              "timeout": "超时",
+              "retry": "重试",
+              "unknown": "未知"
+          },
+          "engineTypes": {
+              "all": "全部"
+          },
+          "header": "资源管理器",
+          "tabs": {
+              "first": "用户会话",
+              "second": "用户资源",
+              "third": "服务器资源"
+          },
+          "noLimit": "无限制",
+          "core": "核",
+          "row": {
+              "applicationName": "应用名称",
+              "usedTime": "开始时间",
+              "engineStatus": "状态",
+              "engineInstance": "引擎实例",
+              "queueName": "队列名称",
+              "user": "用户",
+              "cpu": "已用的服务器CPU资源",
+              "memory": "已用的服务器内存资源",
+              "queueCpu": "已用的Yarn队列CPU资源",
+              "queueMemory": "已用的Yarn队列内存资源"
+          },
+          "setting": {
+              "global": "全局",
+              "globalSetting": "通用设置",
+              "hide": "隐藏",
+              "show": "显示",
+              "advancedSetting": "高级设置",
+              "dataDev": "数据开发"
+          },
+          "globalValiable": "全局变量",
+          "rules": {
+              "first": {
+                  "required": "变量 {text} 的key为空",
+                  "lengthLimit": "长度应为 1 至 128 个字符",
+                  "letterTypeLimit": "仅支持以字母开头,且不得存在空格和中文",
+                  "placeholder": "请输入变量名"
+              },
+              "second": {
+                  "required": "变量 {text} 的value为空",
+                  "lengthLimit": "长度应为 1 至 128 个字符",
+                  "placeholder": "请输入变量值"
+              }
+          },
+          "addArgs": "增加参数",
+          "emptyDataText": "暂无全局变量数据",
+          "sameName": "存在同名key",
+          "error": {
+              "validate": "有验证项未通过,请检查后再试!"
+          },
+          "success": {
+              "update": "全局变量更新成功!"
+          },
+        "searchAppType": "请输入应用类型",
+        "resetTip": "是否确认重置该资源?",
+        "resetAllTip": "是否重置全部用户资源(该操作只会清理用户资源记录,不清理已经产生的资源)",
+        "viewlog": "查看日志",
+        "datasource": {
+            "pleaseInput": "请输入",
+            "datasourceSrc": "数据源",
+            "connectTest": "测试连接",
+            "sourceName": "数据源名称",
+            "sourceDec": "数据源描述",
+            "sourceType": "数据源类型",
+            "creator": "创建人",
+            "create": "新增数据源",
+            "exports": "批量导出数据源",
+            "imports": "批量导入数据源",
+            "overdue": "过期",
+            "versionList": "版本列表",
+            "dataSourceName": "数据源名称",
+            "dataSourceType": "数据源类型",
+            "createSystem": "创建系统",
+            "dataSourceEnv": "可用集群",
+            "status": "状态",
+            "permissions": "权限",
+            "label": "标签",
+            "version": "版本",
+            "desc": "描述",
+            "action": "操作",
+            "createUser": "创建人",
+            "createTime": "创建时间",
+            "versionDec": "版本描述",
+            "watch": "查看",
+            "rollback": "回滚",
+            "publish": "发布",
+            "initVersion": "初始化版本",
+            "updateVersion": "版本更新",
+            "published": "已发布",
+            "unpublish": "未发布",
+            "cannotPublish": "不可发布",
+            "used": "可用",
+            "commentValue": "从版本 {text} 回滚"
+          },
+          "tenantTagManagement": {
+              "userName": "用户名",
+              "appName": "应用名",
+              "tenantTag": "租户标签",
+              "search": "搜索",
+              "clear": "清空",
+              "create": "新增",
+              "userCreator": "用户-应用",
+              "createUser": "创建人",
+              "createTime": "创建时间",
+              "desc": "业务来源",
+              "inputUser": "请输入用户名",
+              "inputApp": "请输入应用名",
+              "inputTenant": "请输入租户标签",
+              "inputDesc": "请输入业务来源",
+              "inputCreateUser": "请输入创建者",
+              "yourTagMapping": "您的标签映射",
+              "notEmpty": "不能为空",
+              "maxLen": "长度不能超过100",
+              "contentError": "仅限英文、数字、星号和下划线",
+              "contentError1": "仅限英文、数字和下划线",
+              "contentError2": "仅限英文、数字、下划线和横线",
+              "check": "检查",
+              "OK": "确定",
+              "Cancel": "取消",
+              "action": "操作",
+              "edit": "编辑",
+              "delete": "删除",
+              "userIsExisted": "用户标签已存在",
+              "addSuccessful": "添加成功",
+              "confirmDel": "确认删除",
+              "isConfirmDel": "确定要删除这条数据吗"
+          },
+          "ipListManagement": {
+              "userName": "用户名",
+              "appName": "应用名",
+              "ipList": "IP列表",
+              "search": "搜索",
+              "clear": "清空",
+              "create": "新增",
+              "userCreator": "用户-应用",
+              "createUser": "创建人",
+              "createTime": "创建时间",
+              "desc": "业务来源",
+              "inputUser": "请输入用户名",
+              "inputApp": "请输入应用名",
+              "inputIpList": "请输入IP列表",
+              "inputDesc": "请输入业务来源",
+              "inputCreateUser": "请输入创建者",
+              "yourTagMapping": "您的标签映射",
+              "notEmpty": "不能为空",
+              "maxLen": "长度不能超过100",
+              "contentError": "仅限英文、数字、星号和下划线",
+              "contentError1": "仅限英文、数字和下划线",
+              "contentError2": "仅限英文、数字、下划线和横线",
+              "ipContentError": "请输入正确格式的IP地址(多个IP地址通过,分隔)",
+              "check": "检查",
+              "OK": "确定",
+              "Cancel": "取消",
+              "action": "操作",
+              "edit": "编辑",
+              "delete": "删除",
+              "userIsExisted": "用户标签已存在",
+              "addSuccessful": "添加成功",
+              "confirmDel": "确认删除",
+              "isConfirmDel": "确定要删除这条数据吗"
+          },
+          "basedataManagement": {
+            "add": "新增",
+            "addUDFAdmin": "新增UDF管理员",
+            "remove": "删除",
+            "edit": "编辑",
+            "searchLabel": "模糊搜索:",
+            "searchPlaceholder": "请输入搜索内容",
+            "search": "搜索",
+            "action": "操作",
+            "modal":{
+              "confirm": "确定",
+              "cancel": "取消",
+              "modalTitle": "提示信息",
+              "modalFormat": "确定删除 {0} 这条记录?",
+              "modalDelete1": "确认是否删除[{username}]该记录?",
+              "modalDelete": "确认是否删除[{envName}]该记录?",
+              "modalDeleteSuccess": "删除成功",
+              "modalDeleteFail": "删除失败",
+              "modalAddSuccess": "添加成功",
+              "modalAddFail": "添加失败",
+              "modalEditSuccess": "编辑成功",
+              "modalEditFail": "编辑失败"
+            },
+            "gatewayAuthToken": {
+              "tokenName": "名称",
+              "legalUsers": "用户",
+              "legalHosts": "主机",
+              "elapseDay": "有效天数",
+              "permanentlyValid": "永久有效",
+              "businessOwner": "所属者",
+              "createTime":"创建时间",
+              "updateTime": "更新时间",
+              "updateBy": "更新人",
+              "searchPlaceholder": "令牌名称/用户/主机",
+              "info":"有效天数: -1 表示永久",
+              "legalUsersInfo": "*允许所有用户;多用户使用,隔开,例如:user1,user2",
+              "legalUsersValidate": {
+                "empty": "请填写用户",
+                "format": "格式不正确,使用*或使用,分割,例如:user1,user2"
+              },
+              "legalHostsInfo": "*允许所有主机;多主机使用,隔开,例如:host1,host2",
+              "legalHostsInfoValidate": {
+                "empty": "请填写主机"
+              },
+              "elapseDayValidate": {
+                "format": "格式不正确,使用*或使用,分割,例如:host1,host2",
+                "empty": "请填写有效天数",
+                "GT0": "有效天数必须大于0"
+              }
+            },
+            "errorCode": {
+              "errorCode": "错误代码",
+              "errorDesc": "错误描述",
+              "errorRegex": "错误正则",
+              "searchPlaceholder": "代码/描述/正则"
+            },
+            "rmExternalResourceProvider": {
+              "resourceType": "资源类型",
+              "name": "名称",
+              "labels": "标签",
+              "config": "配置信息",
+              "searchPlaceholder": "名称/标签/配置"
+            },
+            "udfManager": {
+              "userName": "用户名",
+              "searchPlaceholder": "用户名",
+              "userNameValidate": {
+                "size": "用户名长度不能超过20个字符",
+                "empty": "请输入用户名"
+              }
+            },
+            "udfTree": {
+              "name": "名称",
+              "category": "分类",
+              "userName": "用户名",
+              "description": "描述",
+              "parent": "父级",
+              "createTime": "创建时间",
+              "updateTime": "更新时间",
+              "searchPlaceholder": "名称/分类/描述/用户名",
+              "parentInfo": "父级分类,Root为根目录"
+            },
+            "datasourceEnv": {
+              "envName": "环境名称",
+              "envDesc": "环境描述",
+              "name": "数据源名称",
+              "datasourceType": "数据源类型",
+              "keytab": "kerboros认证",
+              "parameter": "参数",
+              "createTime": "创建时间",
+              "createUser": "创建者",
+              "updateTime": "更新时间",
+              "modifyUser": "更新者",
+              "searchPlaceholder": "环境名称/环境描述/参数"
+            },
+            "datasourceType": {
+              "name": "名称",
+              "description": "描述",
+              "option": "选项",
+              "classifier": "分类",
+              "icon": "图标",
+              "layers": "层级",
+              "searchPlaceholder": "名称/描述/分类",
+              "layersValidate": {
+                "range": "最小为0"
+              }
+            },
+            "datasourceTypeKey": {
+              "key": "键名",
+              "dataSourceType": "数据源类型",
+              "name": "名称",
+              "nameEn": "名称(英文)",
+              "valueType": "值类型",
+              "defaultValue": "默认值",
+              "scope": "范围",
+              "require": "必要字段",
+              "description": "描述",
+              "descriptionEn": "描述(英文)",
+              "valueRegex": "值校验规则",
+              "createTime": "创建时间",
+              "updateTime": "更新时间",
+              "searchPlaceholder": "名称",
+              "searchName": "名称",
+              "searchType": "类型",
+              "all": "全部"
+            }
+          },
+        "EnginePluginManagement": {
+          "engineConnType": "引擎类型",
+          "engineConnVersion": "引擎版本",
+          "create": "新增引擎插件",
+          "fileName": "文件名称",
+          "fileSize": "文件大小",
+          "lastModified": "文件更新时间",
+          "bmlResourceId": "物料资源Id",
+          "bmlResourceVersion": "物料资源版本",
+          "lastUpdateTime": "更新时间",
           "createTime": "创建时间",
-          "createUser": "创建者",
-          "updateTime": "更新时间",
-          "modifyUser": "更新者",
-          "searchPlaceholder": "环境名称/环境描述/参数"
+          "Reset": "重置",
+          "delete": "删除已选物料的版本",
+          "update": "更新引擎插件",
+          "updateFileOnly": "更新",
+          "resourceVersion": "引擎物料bml版本",
+          "user": "所属人",
+          "deleteCurrentbml": "删除",
+          "versionList": "版本列表",
+          "rollback": "回滚",
+          "action": "操作"
         },
-        "datasourceType": {
-          "name": "名称",
-          "description": "描述",
-          "option": "选项",
-          "classifier": "分类",
-          "icon": "图标",
-          "layers": "层级",
-          "searchPlaceholder": "名称/描述/分类",
-          "layersValidate": {
-            "range": "最小为0"
-          }
-        },
-        "datasourceTypeKey": {
-          "key": "键名",
-          "dataSourceType": "数据源类型",
-          "name": "名称",
-          "nameEn": "名称(英文)",
-          "valueType": "值类型",
-          "defaultValue": "默认值",
-          "scope": "范围",
-          "require": "必要字段",
-          "description": "描述",
-          "descriptionEn": "描述(英文)",
-          "valueRegex": "值校验规则",
-          "createTime": "创建时间",
-          "updateTime": "更新时间",
-          "searchPlaceholder": "名称",
-          "searchName": "名称",
-          "searchType": "类型",
-          "all": "全部"
+        "codeQuery": {
+          "executionCode": "执行代码",
+          "dateRange": "时间范围",
+          "placeholder": {
+              "executionCode": "请输入执行代码",
+              "dateRange": "时间范围",
+              "status": "状态"
+          },
+          "inputCode": "请输入执行代码",
+          "id": "任务ID",
+          "code": "代码",
+          "check": "查看",
+          "search": "搜索",
+          "clear": "清空",
+          "status": "状态",
+          "submitUser": "提交用户",
+          "createdTime": "创建时间",
+          "searchRange": "仅可查询T-1的历史代码"
         }
-      },
-      "EnginePluginManagement": {
-        "engineConnType": "引擎类型",
-        "engineConnVersion": "引擎版本",
-        "create": "新增引擎插件",
-        "fileName": "文件名称",
-        "fileSize": "文件大小",
-        "lastModified": "文件更新时间",
-        "bmlResourceId": "物料资源Id",
-        "bmlResourceVersion": "物料资源版本",
-        "lastUpdateTime": "更新时间",
-        "createTime": "创建时间",
-        "Reset": "重置",
-        "delete": "删除已选物料的版本",
-        "update": "更新引擎插件",
-        "updateFileOnly": "更新",
-        "resourceVersion": "引擎物料bml版本",
-        "user": "所属人",
-        "deleteCurrentbml": "删除",
-        "versionList": "版本列表",
-        "rollback": "回滚",
-        "action": "操作",
-        "checkEngineConnTypeAndVersion": "请选择引擎类型及版本",
-        "upload": "请点击上传引擎插件",
-        "hasUpload": "文件已上传,可以点击按钮重新上传",
-        "force": "是否覆盖",
-        "yes": "是",
-        "no": "否"
       }
-    }
   }
 }
diff --git a/linkis-web/src/apps/linkis/module/ECM/index.scss 
b/linkis-web/src/apps/linkis/module/ECM/index.scss
index eda67170d..73379036a 100644
--- a/linkis-web/src/apps/linkis/module/ECM/index.scss
+++ b/linkis-web/src/apps/linkis/module/ECM/index.scss
@@ -64,3 +64,12 @@ td.table-project-column {
     max-width: 100%;
   }
 }
+.tip {
+  text-align: center;
+  margin: 30px;
+
+}
+.radio {
+  text-align: center;
+  margin-bottom: 20px;
+}
diff --git a/linkis-web/src/apps/linkis/module/ECM/index.vue 
b/linkis-web/src/apps/linkis/module/ECM/index.vue
index 858482c77..ecd8902cf 100644
--- a/linkis-web/src/apps/linkis/module/ECM/index.vue
+++ b/linkis-web/src/apps/linkis/module/ECM/index.vue
@@ -83,6 +83,22 @@
         </FormItem>
       </Form>
     </Modal>
+    <Modal
+      @on-ok="confirmKill"
+      v-model="killModal">
+      <div>
+        <div class="tip">
+          {{$t('message.linkis.tipForKill', {instance: killInfo.curInstance})}}
+        </div>
+        <div class="radio">
+          {{$t('message.linkis.allEngine')}}
+          <RadioGroup v-model="killInfo.all">
+            <Radio :label="0">{{$t('message.linkis.no')}}</Radio>
+            <Radio :label="1">{{$t('message.linkis.yes')}}</Radio>
+          </RadioGroup>
+        </div>
+      </div>
+    </Modal>
   </div>
 </template>
 <script>
@@ -90,6 +106,7 @@ import api from '@/common/service/api';
 import moment from "moment";
 import Search from '@/apps/linkis/module/ECM/search.vue';
 import WbTag from '@/apps/linkis/components/tag';
+import { debounce } from 'lodash'
 export default {
   name: 'ECM',
   data() {
@@ -119,6 +136,12 @@ export default {
       tableWidth: 0,
       // Open the label modification popup(开启标签修改弹框)
       isTagEdit: false,
+      // 删除实例instance
+      killInfo: {
+        curInstance: '',
+        all: 0,
+      },
+      killModal: false,
       tableData: [],
       page: {
         totalSize: 0,
@@ -184,7 +207,7 @@ export default {
         {
           title: this.$t('message.linkis.tableColumns.control.title'),
           key: 'action',
-          width: '80',
+          width: '230',
           // fixed: 'right',
           align: 'center',
           render: (h, params) => {
@@ -192,7 +215,10 @@ export default {
               h('Button', {
                 props: {
                   type: 'primary',
-                  size: 'small'
+                  size: 'small',
+                },
+                style: {
+                  marginRight: '5px'
                 },
                 on: {
                   click: () => {
@@ -213,7 +239,23 @@ export default {
                     this.formItem = Object.assign(this.formItem, obj)
                   }
                 }
-              }, this.$t('message.linkis.tagEdit'))
+              }, this.$t('message.linkis.tagEdit')),
+              h('Button', {
+                props: {
+                  type: 'error',
+                  size: 'small'
+                },
+                style: {
+                  display: sessionStorage.getItem('isLogAdmin') ? 
'inline-block' : 'none'
+                },
+                on: {
+                  click: () => {
+                    this.killModal = true;
+                    console.log(params.row);
+                    this.killInfo.curInstance = params.row.instance;
+                  }
+                }
+              }, this.$t('message.linkis.killAll'))
             ]);
           }
         }
@@ -360,7 +402,8 @@ export default {
       let param = {
         instance: e.instance,
         nodeHealthy: e.nodeHealthy,
-        owner: e.owner
+        owner: e.owner,
+        tenantLabel: e.tenant,
       }
       api.fetch('/linkisManager/listAllEMs',param,'get').then((res)=>{
         this.tableData = res.EMs
@@ -382,7 +425,30 @@ export default {
       if (v===false && this.$refs.wbtags) {
         this.$refs.wbtags.resetTagAdd()
       }
-    }
+    },
+    confirmKill: debounce(async function() {
+      try {
+        const res = await api.fetch('/linkisManager/rm/killUnlockEngineByEM', {
+          instance: this.killInfo.curInstance,
+          withMultiUserEngine: this.killInfo.all === 1 ? true : false,
+        }, 'post');
+        const { killEngineNum, memory, cores } = res.result
+        console.log(res);
+        this.killModal = false;
+        this.killInfo = {
+          curInstance: '',
+          all: 0,
+        }
+        // 传回的是Byte
+        this.$Message.success(this.$t('message.linkis.killFinishedInfo', { 
killEngineNum, memory: memory / 1024 / 1024 / 1024, cores }))
+      } catch (err) {
+        console.warn(err);
+        this.killInfo = {
+          curInstance: '',
+          all: 0,
+        }
+      }
+    }, 1000, { leading: true })
   }
 }
 </script>
diff --git a/linkis-web/src/apps/linkis/module/ECM/search.vue 
b/linkis-web/src/apps/linkis/module/ECM/search.vue
index 3e4bfb063..5408a3175 100644
--- a/linkis-web/src/apps/linkis/module/ECM/search.vue
+++ b/linkis-web/src/apps/linkis/module/ECM/search.vue
@@ -47,6 +47,9 @@
           :key="item"/>
       </Select>
     </FormItem>
+    <FormItem prop="tenant" :label="$t('message.linkis.tenant')" >
+      <Input :maxlength="50" v-model="searchBar.tenant" style="width:120px" 
:placeholder="$t('message.linkis.inputTenant')"/>
+    </FormItem>
     <FormItem>
       <Button type="primary" @click="search">
         {{ $t('message.linkis.search') }}
@@ -87,6 +90,7 @@ export default {
         instance: "",
         nodeHealthy: "",
         owner: "",
+        tenant: "",
       },
     };
   },
diff --git a/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.vue 
b/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.vue
index ff60717be..2f2972c34 100644
--- a/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.vue
+++ b/linkis-web/src/apps/linkis/module/EnginePluginManagement/index.vue
@@ -417,10 +417,6 @@ export default {
           reqList.push(it.bmlResourceId);
         }
       })
-      if(!reqList || reqList.length<1){
-        
this.$Message.info(this.$t('message.linkis.EnginePluginManagement.checkEngineConnTypeAndVersion'));
-        return
-      }
       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 => {
@@ -446,12 +442,6 @@ export default {
       // })
     },
     createOrUpdate(num) {
-
-      if(!this.ecType || !this.version){
-        
this.$Message.info(this.$t('message.linkis.EnginePluginManagement.checkEngineConnTypeAndVersion'));
-        return
-      }
-
       this.actionNum = num
       if(num === 0){
         this.actionType=this.$t('message.linkis.EnginePluginManagement.create')
diff --git a/linkis-web/src/apps/linkis/module/codeQuery/codeDetail/index.vue 
b/linkis-web/src/apps/linkis/module/codeQuery/codeDetail/index.vue
new file mode 100644
index 000000000..25a499668
--- /dev/null
+++ b/linkis-web/src/apps/linkis/module/codeQuery/codeDetail/index.vue
@@ -0,0 +1,83 @@
+<!--
+  ~ 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%">
+    <Input
+      v-model="searchText"
+      :placeholder="$t('message.common.filter')"
+      suffix="ios-search"
+      size="small"
+      class="log-search"/>
+    <we-editor
+      style="height: calc(100% - 60px);"
+      ref="logEditor"
+      v-model="curCode"
+      type="log"/>
+  </div>
+</template>
+<script>
+import api from '@/common/service/api'
+import { filter, forEach } from 'lodash'
+export default {
+  name: 'codeDetail',
+  data() {
+    return {
+      code: '',
+      searchText: '',
+    }
+  },
+  async mounted() {
+    const id = this.$route.query.id
+    const res = await api.fetch(`/jobhistory/es/task/${id}`, 'get');
+    this.code = res.task.executionCode
+  },
+  computed: {
+    curCode: {
+      get() {
+        let MatchText = '';
+        let originCode = this.code;
+        const val = this.searchText;
+        if (!originCode) return MatchText;
+        if (val) {
+          // 这部分代码是为了让正则表达式不报错,所以在特殊符号前面加上\
+          let formatedVal = '';
+          forEach(val, (o) => {
+            if (/^[\w\u4e00-\u9fa5]$/.test(o)) {
+              formatedVal += o;
+            } else {
+              formatedVal += `\\${o}`;
+            }
+          });
+          // 全局和不区分大小写模式,正则是匹配searchText前后出了换行符之外的字符
+          let regexp = new RegExp(`.*${formatedVal}.*`);
+          MatchText = filter(originCode.split('\n'), (item) => {
+            return regexp.test(item);
+          }).join('\n');
+          regexp = null;
+        } else {
+          MatchText = originCode;
+        }
+        return MatchText;
+      },
+      set() {
+
+      }
+    }
+  }
+}
+</script>
diff --git a/linkis-web/src/apps/linkis/module/codeQuery/index.js 
b/linkis-web/src/apps/linkis/module/codeQuery/index.js
new file mode 100644
index 000000000..5ccbc651e
--- /dev/null
+++ b/linkis-web/src/apps/linkis/module/codeQuery/index.js
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+ 
+
+export default {
+  name: 'ipListManagement',
+  events: [],
+  component: () => import('./index.vue'),
+};
\ No newline at end of file
diff --git a/linkis-web/src/apps/linkis/module/codeQuery/index.scss 
b/linkis-web/src/apps/linkis/module/codeQuery/index.scss
new file mode 100644
index 000000000..71d03bb32
--- /dev/null
+++ b/linkis-web/src/apps/linkis/module/codeQuery/index.scss
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+
+@import '@/common/style/variables.scss';
+.code-query {
+    .table-content {
+        margin-top: 16px;
+        height: 610px;
+    }
+}
diff --git a/linkis-web/src/apps/linkis/module/codeQuery/index.vue 
b/linkis-web/src/apps/linkis/module/codeQuery/index.vue
new file mode 100644
index 000000000..07e164c92
--- /dev/null
+++ b/linkis-web/src/apps/linkis/module/codeQuery/index.vue
@@ -0,0 +1,423 @@
+<!--
+  ~ 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 class="code-query">
+    <Form class="code-query-searchbar" :model="searchBar" inline 
label-position="left" style="width: 99%" @submit.native.prevent>
+      <FormItem prop="executionCode" 
:label="$t('message.linkis.codeQuery.executionCode')" :label-width="60" 
style="width: 100%; margin-bottom: 5px">
+        <Input
+          v-model="searchBar.executionCode"
+          
:placeholder="$t('message.linkis.codeQuery.placeholder.executionCode')"
+        ></Input>
+      </FormItem>
+    </Form>
+    <div style="font-style: italic; color: 
#cccccc;">{{$t('message.linkis.codeQuery.searchRange')}}</div>
+    <Form class="code-query-searchbar" :model="searchBar" inline 
label-position="left">
+      <!-- <FormItem prop="executionCode" 
:label="$t('message.linkis.codeQuery.executionCode')" :label-width="60">
+        <Input
+          v-model="searchBar.executionCode"
+          
:placeholder="$t('message.linkis.codeQuery.placeholder.executionCode')"
+        ></Input>
+      </FormItem> -->
+      <FormItem prop="shortcut" 
:label="$t('message.linkis.codeQuery.dateRange')" :label-width="60">
+        <DatePicker
+          :transfer="true"
+          class="datepicker"
+          :options="shortcutOpt"
+          v-model="searchBar.shortcut"
+          type="daterange"
+          placement="bottom-start"
+          format="yyyy-MM-dd"
+          :placeholder="$t('message.linkis.codeQuery.placeholder.dateRange')"
+          style="width: 180px"
+          :editable="false"
+        />
+      </FormItem>
+      <FormItem prop="status" 
:label="$t('message.linkis.formItems.status.label')" :label-width="38">
+        <Select v-model="searchBar.status" style="width: 90px">
+          <Option
+            v-for="(item) in statusType"
+            :label="item.label"
+            :value="item.value"
+            :key="item.value"
+          />
+        </Select>
+      </FormItem>
+      <FormItem>
+        <Button
+          type="primary"
+          @click="confirmSearch"
+          style="margin-right: 10px;"
+        >{{ $t('message.linkis.search') }}</Button>
+        <Button
+          type="warning"
+          @click="reset"
+          style="margin-right: 10px;"
+        >{{ $t('message.linkis.clearSearch') }}</Button>
+        <Button
+          type="primary"
+          @click="switchAdmin"
+          v-if="isLogAdmin"
+        >{{ isAdminModel ? $t('message.linkis.generalView') : 
$t('message.linkis.manageView') }}</Button>
+      </FormItem>
+    </Form>
+    <Table
+      border
+      size="small"
+      align="center"
+      :columns="tableColumns"
+      :data="tableData"
+      :loading="tableLoading"
+      class="table-content data-source-table"
+      :no-data-text="this.noDataText">
+
+    </Table>
+    <Page
+      :page-size="page.pageSize"
+      :current="page.pageNow"
+      :total="page.totalPage"
+      @on-change="changePage"
+      size="small"
+      show-elevator
+      :prev-text="$t('message.linkis.previousPage')" 
:next-text="$t('message.linkis.nextPage')"
+      style="position: absoulute; bottom: 10px; overflow: hidden; text-align: 
center;"
+    ></Page>
+  </div>
+</template>
+<script>
+import api from '@/common/service/api'
+import { cloneDeep } from 'lodash'
+export default {
+  name: 'codeQuery',
+  data() {
+    return {
+      tableData: [],
+      beforeSearch: true,
+      searchBar: {
+        executionCode: "",
+        shortcut: [],
+        status: "",
+      },
+      searchParams: {
+        executionCode: "",
+        shortcut: [],
+        status: "",
+      },
+      tableLoading: false,
+      isLogAdmin: false,
+      isAdminModel: false,
+      shortcutOpt: {
+        shortcuts: [
+          {
+            text: this.$t('message.linkis.shortcuts.week'),
+            value() {
+              const end = new Date(new Date().toLocaleDateString())
+              const start = new Date(new Date().toLocaleDateString())
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 8)
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)
+              return [start, end]
+            }
+          },
+          {
+            text: this.$t('message.linkis.shortcuts.month'),
+            value() {
+              const end = new Date(new Date().toLocaleDateString())
+              const start = new Date(new Date().toLocaleDateString())
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 31)
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)
+              return [start, end]
+            }
+          },
+          {
+            text: this.$t('message.linkis.shortcuts.threeMonths'),
+            value() {
+              const end = new Date(new Date().toLocaleDateString())
+              const start = new Date(new Date().toLocaleDateString())
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 91)
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)
+              return [start, end]
+            }
+          }
+        ],
+        disabledDate(date) {
+          return date.valueOf() > Date.now() - 86400000
+        }
+      },
+      statusType: [
+        {
+          label: this.$t('message.linkis.statusType.all'),
+          value: 'all'
+        },
+        {
+          label: this.$t('message.linkis.statusType.inited'),
+          value: 'Inited'
+        },
+        {
+          label: this.$t('message.linkis.statusType.running'),
+          value: 'Running'
+        },
+        {
+          label: this.$t('message.linkis.statusType.succeed'),
+          value: 'Succeed'
+        },
+        {
+          label: this.$t('message.linkis.statusType.cancelled'),
+          value: 'Cancelled'
+        },
+        {
+          label: this.$t('message.linkis.statusType.failed'),
+          value: 'Failed'
+        },
+        {
+          label: this.$t('message.linkis.statusType.scheduled'),
+          value: 'Scheduled'
+        },
+        {
+          label: this.$t('message.linkis.statusType.timeout'),
+          value: 'Timeout'
+        }
+      ],
+      tableColumns: [
+        {
+          title: this.$t('message.linkis.tenantTagManagement.action'),
+          key: 'action',
+          width: 100,
+          align: 'center',
+          render: (h, params) => {
+            return h('div', [
+              h('Button', {
+                // props: {
+                //   type: 'default',
+                //   size: 'small'
+                // },
+                class: {
+                  'render-btn': true,
+                },
+                on: {
+                  click: () => {
+                    this.check(params.row.id)
+                  }
+                }
+              }, this.$t('message.linkis.codeQuery.check'))
+            ]);
+          }
+        },
+        {
+          title: this.$t('message.linkis.codeQuery.id'),
+          key: 'id',
+          width: 200,
+          align: 'center',
+        },
+        {
+          title: this.$t('message.linkis.codeQuery.code'),
+          key: 'executionCode',
+          width: 990,
+          ellipsis: true,
+          align: 'center',
+          render: (h, params) => {
+            return h('span', {
+              props: {
+                type: 'text',
+                size: 'small'
+              },
+              domProps: {
+                innerHTML: params.row.executionCode
+              }
+            })
+          }
+        },
+        {
+          title: this.$t('message.linkis.codeQuery.status'),
+          key: 'status',
+          width: 350,
+          ellipsis: true,
+          tooltip: true,
+          align: 'center',
+          render: (h, params) => {
+            return h('Tag', {
+              props: {
+                color: this.colorGetter(params.row.status)
+              }
+            }, 
this.$t(`message.linkis.statusType.${params.row.status.toLowerCase()}`))
+          }
+        },
+      ],
+      page: {
+        pageSize: 10,
+        pageNow: 1,
+        totalPage: 0,
+      },
+      userName: '',
+    }
+  },
+  computed: {
+    noDataText() {
+      if(this.beforeSearch) {
+        return this.$t('message.linkis.noDataTextBeforeSearch')
+      }
+      return this.$t('message.linkis.noDataTextAfterSearch')
+    },
+  },
+  methods: {
+    confirmSearch() {
+      if(this.tableLoading) return;
+      this.searchParams = cloneDeep(this.searchBar)
+      this.page.pageNow = 1
+      this.search()
+    },
+    switchAdmin() {
+      if (!this.tableLoading) {
+        this.isAdminModel = !this.isAdminModel
+        // this.searchParams = cloneDeep(this.searchBar)
+        // this.page.pageNow = 1
+        // this.search()
+      }
+    },
+    async reset() {
+      this.searchBar = {
+        executionCode: "",
+        shortcut: [],
+        status: "",
+      };
+      this.searchParams = {
+        executionCode: "",
+        shortcut: [],
+        status: "",
+      };
+      this.beforeSearch = true;
+      this.tableData = [];
+    },
+    async changePage(val) {
+      this.page.pageNow = val;
+      await this.search();
+    },
+    async search() {
+      try {
+        this.tableLoading = true
+        if(!this.searchParams.executionCode) {
+          this.$Message.warning(this.$t('message.linkis.codeQuery.inputCode'))
+          this.beforeSearch = true;
+          throw Error(this.$t('message.linkis.codeQuery.inputCode'));
+        }
+        this.beforeSearch = false;
+        const { executionCode, shortcut, status } = this.searchParams;
+        const { pageNow, pageSize } = this.page;
+        const params = {
+          executionCode,
+          startDate: Date.parse(shortcut[0]),
+          endDate: Date.parse(shortcut[1]) + 86399999,
+          isAdminView: this.isAdminModel,
+          pageNow,
+          pageSize,
+          status
+        }
+        if (!shortcut[0]) {
+          delete params.startDate
+          delete params.endDate
+        }
+        if (!status || status === 'all') {
+          delete params.status
+        }
+        const res = await api.fetch(`/jobhistory/es/search`, params, 'get');
+        this.tableData = res.tasks.content
+        this.page.totalPage = res.tasks.totalElements
+        this.tableLoading = false
+      } catch (err) {
+        console.warn(err);
+        this.tableLoading = false
+      }
+    },
+    check(id) {
+      const query = {
+        id
+      }
+      // set storage
+      sessionStorage.setItem('code-search', JSON.stringify(this.searchParams));
+      sessionStorage.setItem('code-use-cache', true);
+      sessionStorage.setItem('code-search-page', JSON.stringify(this.page));
+      sessionStorage.setItem('code-search-admin', this.isAdminModel);
+
+      this.$router.push({
+        path: '/console/codeDetail',
+        query
+      })
+    },
+    colorGetter(status) {
+      switch (status) {
+        case 'Running':
+          return 'yellow';
+        case 'Succeed':
+          return 'green';
+        case 'Failed':
+          return 'red';
+        default:
+          break;
+      }
+    },
+  },
+  created() {
+    // 获取是否是历史管理员权限
+    api.fetch('/jobhistory/governanceStationAdmin', 'get').then(res => {
+      this.isLogAdmin = res.admin
+    })
+  },
+  beforeRouteEnter(to, from, next) {
+    if(from.name !== 'codeDetail') {
+      sessionStorage.removeItem('code-search');
+      sessionStorage.removeItem('code-search-page');
+      sessionStorage.removeItem('code-search-admin');
+      sessionStorage.setItem('code-use-cache', false);
+    }
+    next();
+  },
+  mounted() {
+    if(sessionStorage.getItem('code-use-cache') === 'true') {
+      this.searchParams = JSON.parse(sessionStorage.getItem('code-search'));
+      this.searchBar = JSON.parse(sessionStorage.getItem('code-search'));
+      this.page = JSON.parse(sessionStorage.getItem('code-search-page'));
+      this.isAdminModel = 
JSON.parse(sessionStorage.getItem('code-search-admin'));
+      if(sessionStorage.getItem('isLogAdmin') !== 'true') {
+        this.isAdminModel = false;
+      }
+      this.search();
+    }
+  }
+};
+</script>
+<style lang="scss" src="./index.scss" scoped></style>
+<style lang="scss" scoped>
+/deep/ .ivu-btn {
+  &:hover {
+    border-color: transparent;
+  }
+  border-color: transparent;
+}
+.modal {
+  
+  .input-area {
+    padding: 20px 50px;
+    .item {
+      display: flex;
+      margin-bottom: 10px;
+      .input {
+        width: calc(100% - 66px);
+      }
+    }
+  }
+}
+
+</style>
\ No newline at end of file
diff --git a/linkis-web/src/apps/linkis/module/datasourceAccess/index.vue 
b/linkis-web/src/apps/linkis/module/datasourceAccess/index.vue
index 2a34f07ed..c311e1e71 100644
--- a/linkis-web/src/apps/linkis/module/datasourceAccess/index.vue
+++ b/linkis-web/src/apps/linkis/module/datasourceAccess/index.vue
@@ -139,13 +139,13 @@ export default {
         },
         {
           title: "访问时间",
-          key: 'accessTime',
+          key: 'access_time',
           minWidth: 50,
           tooltip: true,
           align: 'center',
           render: (h,params)=>{
             return h('div',
-              formatDate(new Date(params.row.accessTime),'yyyy-MM-dd hh:mm')
+              formatDate(new Date(params.row.createTime),'yyyy-MM-dd hh:mm')
             )
           }
         },
@@ -200,8 +200,6 @@ export default {
       this.modalShow = true
     },
     onTableEdit(row){
-      row.tableId = row.tableId+""
-      row.applicationId= row.applicationId+""
       this.modalEditData = row
       this.modalAddMode = 'edit'
       this.modalShow = true
@@ -227,8 +225,8 @@ export default {
                 content: "删除失败"
               })
             }
-            this.load()
           })
+          this.load()
         }
       })
 
@@ -238,6 +236,7 @@ export default {
         this.modalLoading = true
         if(this.modalAddMode=='add') {
           add(formData).then((data)=>{
+            console.log(data)
             if(data.result) {
               this.$Message.success({
                 duration: 3,
@@ -249,10 +248,10 @@ export default {
                 content: "添加失败"
               })
             }
-            this.load()
           })
         }else {
           edit(formData).then((data)=>{
+            console.log(data)
             if(data.result) {
               this.$Message.success({
                 duration: 3,
@@ -266,7 +265,6 @@ export default {
               })
             }
           })
-          this.load()
         }
         this.modalLoading=false
         this.modalShow = false
diff --git a/linkis-web/src/apps/linkis/module/datasourceEnv/index.vue 
b/linkis-web/src/apps/linkis/module/datasourceEnv/index.vue
index 2913efbac..dba47a6e1 100644
--- a/linkis-web/src/apps/linkis/module/datasourceEnv/index.vue
+++ b/linkis-web/src/apps/linkis/module/datasourceEnv/index.vue
@@ -273,8 +273,8 @@ export default {
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalDeleteFail')
               })
             }
-            this.load()
           })
+          this.load()
         }
       })
 
@@ -310,6 +310,7 @@ export default {
         if('uris' in formData) delete formData['uris'];
         if(this.modalAddMode=='add') {
           add(formData).then((data)=>{
+            //console.log(data)
             if(data.result) {
               this.$Message.success({
                 duration: 3,
@@ -321,28 +322,27 @@ export default {
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalAddFail')
               })
             }
-            this.load()
           })
         }else {
           edit(formData).then((data)=>{
+            //console.log(data)
             if(data.result) {
               this.$Message.success({
                 duration: 3,
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalEditSuccess')
               })
+              this.load()
             }else{
               this.$Message.success({
                 duration: 3,
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalEditFail')
               })
             }
-            this.load()
           })
         }
         console.log(formData);
         this.modalLoading=false
         this.modalShow = false
-
       })
     },
     onModalCancel(){
diff --git a/linkis-web/src/apps/linkis/module/datasourceType/index.vue 
b/linkis-web/src/apps/linkis/module/datasourceType/index.vue
index 0b6a434b9..aa8224ade 100644
--- a/linkis-web/src/apps/linkis/module/datasourceType/index.vue
+++ b/linkis-web/src/apps/linkis/module/datasourceType/index.vue
@@ -207,6 +207,7 @@ export default {
       this.modalShow = true
     },
     onTableDelete(row){
+      //console.log(row)
       this.$Modal.confirm({
         title: this.$t('message.linkis.basedataManagement.modal.modalTitle'),
         content: 
this.$t('message.linkis.basedataManagement.modal.modalFormat').format(row.name),
@@ -226,8 +227,8 @@ export default {
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalDeleteFail')
               })
             }
-            this.load()
           })
+          this.load()
         }
       })
 
@@ -252,7 +253,6 @@ export default {
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalAddFail')
               })
             }
-            this.load()
           })
         }else {
           edit(formData).then((data)=>{
@@ -261,13 +261,13 @@ export default {
                 duration: 3,
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalEditSuccess')
               })
+              this.load()
             }else{
               this.$Message.success({
                 duration: 3,
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalEditFail')
               })
             }
-            this.load()
           })
         }
         this.modalLoading=false
diff --git 
a/linkis-web/src/apps/linkis/module/gatewayAuthToken/EditForm/index.vue 
b/linkis-web/src/apps/linkis/module/gatewayAuthToken/EditForm/index.vue
index a9defcb69..c120b27a1 100644
--- a/linkis-web/src/apps/linkis/module/gatewayAuthToken/EditForm/index.vue
+++ b/linkis-web/src/apps/linkis/module/gatewayAuthToken/EditForm/index.vue
@@ -178,7 +178,7 @@ export default {
               trigger: 'blur',
             },
           ],
-        },
+        }
       ]
     }
   },
diff --git a/linkis-web/src/apps/linkis/module/gatewayAuthToken/index.vue 
b/linkis-web/src/apps/linkis/module/gatewayAuthToken/index.vue
index 9c85f6dbb..403a99a33 100644
--- a/linkis-web/src/apps/linkis/module/gatewayAuthToken/index.vue
+++ b/linkis-web/src/apps/linkis/module/gatewayAuthToken/index.vue
@@ -81,18 +81,18 @@
         <Button type="text" size="large" 
@click="onModalCancel()">{{$t('message.linkis.basedataManagement.modal.cancel')}}</Button>
         <Button type="primary" size="large" 
@click="onModalOk('userConfirm')">{{$t('message.linkis.basedataManagement.modal.confirm')}}</Button>
       </div>
-      <EditForm ref="editForm" :data="modalEditData"></EditForm>
+      <ErrorCodeForm ref="errorCodeForm" :data="modalEditData"></ErrorCodeForm>
     </Modal>
   </div>
 </template>
 <script>
 import mixin from '@/common/service/mixin';
-import EditForm from './EditForm/index'
+import ErrorCodeForm from './EditForm/index'
 import {add, del, edit, getList} from "./service";
 import {formatDate} from "iview/src/components/date-picker/util";
 export default {
   mixins: [mixin],
-  components: {EditForm},
+  components: {ErrorCodeForm},
   data() {
     return {
       searchName: "",
@@ -154,7 +154,7 @@ export default {
           align: 'center',
           render: (h,params)=>{
             return h('div',
-              formatDate(new Date(params.row.createTime),'yyyy-MM-dd')
+              formatDate(new Date(params.row.createTime),'yyyy-MM-dd hh:mm')
             )
           }
         },
@@ -166,7 +166,7 @@ export default {
           align: 'center',
           render: (h,params)=>{
             return h('div',
-              formatDate(new Date(params.row.updateTime),'yyyy-MM-dd')
+              formatDate(new Date(params.row.createTime),'yyyy-MM-dd hh:mm')
             )
           }
         },
@@ -252,8 +252,7 @@ export default {
 
     },
     onModalOk(){
-      this.$refs.editForm.formModel.submit((formData)=>{
-        console.log(formData);
+      this.$refs.errorCodeForm.formModel.submit((formData)=>{
         this.modalLoading = true
         if(this.modalAddMode=='add') {
           add(formData).then((data)=>{
diff --git 
a/linkis-web/src/apps/linkis/module/globalHistoryManagement/index.vue 
b/linkis-web/src/apps/linkis/module/globalHistoryManagement/index.vue
index 8e64f668c..dd7aec8c6 100644
--- a/linkis-web/src/apps/linkis/module/globalHistoryManagement/index.vue
+++ b/linkis-web/src/apps/linkis/module/globalHistoryManagement/index.vue
@@ -94,7 +94,7 @@
         <Button
           type="primary"
           @click="switchAdmin"
-          v-if="isLogAdmin"
+          v-if="isLogAdmin || isHistoryAdmin"
         >{{ isAdminModel ? $t('message.linkis.generalView') : 
$t('message.linkis.manageView') }}</Button>
       </FormItem>
     </Form>
@@ -260,6 +260,7 @@ export default {
         }
       ],
       isLogAdmin: false,
+      isHistoryAdmin: false,
       isAdminModel: false,
       moduleHeight: 300
     }
@@ -268,6 +269,7 @@ export default {
     // Get whether it is a historical administrator(获取是否是历史管理员权限)
     api.fetch('/jobhistory/governanceStationAdmin', 'get').then(res => {
       this.isLogAdmin = res.admin
+      this.isHistoryAdmin = res.historyAdmin
     })
     api.fetch('/configuration/engineType', 'get').then(res => {
       this.getEngineTypes = ['all', ...res.engineType]
@@ -285,6 +287,14 @@ export default {
     // storage.set('last-searchbar-status', this.searchBar)
     window.removeEventListener('resize', this.getHeight)
   },
+  beforeRouteEnter(to, from, next) {
+    if(from.name !== 'viewHistory') {
+      sessionStorage.removeItem('last-admin-model');
+      sessionStorage.removeItem('last-searchbar-status');
+      sessionStorage.removeItem('last-pageSetting-status');
+    }
+    next();
+  },
   activated() {
     this.init()
   },
@@ -524,7 +534,7 @@ export default {
           title: this.$t('message.linkis.tableColumns.fileName'),
           key: 'source',
           align: 'center',
-          tooltip: true,
+          ellipsis: true,
           width: 190
         },
         {
diff --git a/linkis-web/src/apps/linkis/module/ipListManagement/index.vue 
b/linkis-web/src/apps/linkis/module/ipListManagement/index.vue
index e587d386a..c5462bef8 100644
--- a/linkis-web/src/apps/linkis/module/ipListManagement/index.vue
+++ b/linkis-web/src/apps/linkis/module/ipListManagement/index.vue
@@ -44,10 +44,10 @@
         <Button type="primary" class="button" :style="{width: '70px', 
marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="search">{{
           $t('message.linkis.ipListManagement.search')
         }}</Button>
-        <Button type="primary" class="button" :style="{width: '70px', 
marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="clearSearch">{{
+        <Button type="warning" class="button" :style="{width: '70px', 
marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="clearSearch">{{
           $t('message.linkis.ipListManagement.clear')
         }}</Button>
-        <Button type="primary" class="button" :style="{width: '70px', 
marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="createTenant">{{
+        <Button type="success" class="button" :style="{width: '70px', 
marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="createTenant">{{
           $t('message.linkis.ipListManagement.create')
         }}</Button>
       </Col>
@@ -70,7 +70,7 @@
       size="small"
       show-elevator
       :prev-text="$t('message.linkis.previousPage')" 
:next-text="$t('message.linkis.nextPage')"
-      style="margin: 10px; overflow: hidden; text-align: center;"
+      style="position: absoulute; bottom: 10px; overflow: hidden; text-align: 
center;"
     ></Page>
     <Modal
       v-model="showCreateModal"
@@ -96,13 +96,13 @@
         </Form>
         <div style="margin-top: 60px">
           <span style="width: 60px">{{ 
$t('message.linkis.ipListManagement.yourTagMapping') }}</span>
-          <Input class="input" v-model="mapping" style="width: 240px; 
margin-left: 10px" disabled></Input>
-          <Button type="primary" @click="checkUserTag" style="margin-left: 
10px">{{$t('message.linkis.ipListManagement.check')}}</Button>
+          <Input class="input" v-model="mapping" style="width: 220px; 
margin-left: 10px" disabled></Input>
+          <Button type="primary" @click="checkUserTag" style="margin-left: 
10px" 
:loading="isRequesting">{{$t('message.linkis.ipListManagement.check')}}</Button>
         </div>
       </div>
       <div slot="footer">
         <Button 
@click="cancel">{{$t('message.linkis.ipListManagement.Cancel')}}</Button>
-        <Button type="primary" :disabled="tagIsExist" 
@click="addTenantTag">{{$t('message.linkis.ipListManagement.OK')}}</Button>
+        <Button type="primary" :disabled="tagIsExist" @click="addTenantTag" 
:loading="isRequesting">{{$t('message.linkis.ipListManagement.OK')}}</Button>
       </div>
     </Modal>
   </div>
@@ -236,6 +236,7 @@ export default {
         totalPage: 0,
       },
       userName: '',
+      isRequesting: false,
     }
   },
   computed: {
@@ -295,6 +296,7 @@ export default {
       this.modalData.bussinessUser = this.userName;
     },
     async checkUserTag() {
+      if(this.isRequesting) return;
       this.$refs.createTenantForm.validate(async (valid) => {
         if(valid) {
           const {user, creator} = this.modalData;
@@ -303,6 +305,7 @@ export default {
             return;
           }
           try {
+            this.isRequesting = true
             await 
api.fetch("/configuration/user-ip-mapping/check-user-creator",
               {
                 user,
@@ -313,9 +316,10 @@ export default {
               }
               this.tagIsExist = res.exist;
             })
+            this.isRequesting = false
           } catch (err) {
             console.log(err);
-            this.cancel();
+            this.isRequesting = false
           }
         }
         else {
@@ -342,6 +346,7 @@ export default {
       }
     },
     addTenantTag() {
+      if(this.isRequesting) return;
       const target = this.mode === 'edit' ? 
'/configuration/user-ip-mapping/update-user-ip' : 
'/configuration/user-ip-mapping/create-user-ip'
       this.$refs.createTenantForm.validate(async (valid) => {
         if(valid) {
@@ -350,14 +355,16 @@ export default {
             if(this.mode !== 'edit') {
               this.page.pageNow = 1;
             }
+            this.isRequesting = true
             await api.fetch(target, this.modalData, "post").then(async (res) 
=> {
               console.log(res);
               await this.getTableData();
               this.cancel();
               
this.$Message.success(this.$t('message.linkis.ipListManagement.addSuccessful'));
             });
+            this.isRequesting = false
           } catch(err) {
-            this.cancel();
+            this.isRequesting = false
             console.log(err);
           }
         } else {
diff --git 
a/linkis-web/src/apps/linkis/module/resourceManagement/engineConn.vue 
b/linkis-web/src/apps/linkis/module/resourceManagement/engineConn.vue
index beceb44fc..de77bbdbb 100644
--- a/linkis-web/src/apps/linkis/module/resourceManagement/engineConn.vue
+++ b/linkis-web/src/apps/linkis/module/resourceManagement/engineConn.vue
@@ -121,11 +121,11 @@ export default {
         pageNow: 1
       },
       columns: [
-        {
-          type: 'selection',
-          width: 60,
-          align: 'center'
-        },
+        // {
+        //   type: 'selection',
+        //   width: 60,
+        //   align: 'center'
+        // },
         {
           title: this.$t('message.linkis.tableColumns.engineInstance'),
           key: 'serviceInstance',
diff --git 
a/linkis-web/src/apps/linkis/module/rmExternalResourceProvider/index.vue 
b/linkis-web/src/apps/linkis/module/rmExternalResourceProvider/index.vue
index e9bc78ebb..066959c3c 100644
--- a/linkis-web/src/apps/linkis/module/rmExternalResourceProvider/index.vue
+++ b/linkis-web/src/apps/linkis/module/rmExternalResourceProvider/index.vue
@@ -213,8 +213,8 @@ export default {
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalDeleteFail')
               })
             }
-            this.load()
           })
+          this.load()
         }
       })
 
@@ -225,6 +225,7 @@ export default {
         formData.config = JSON.stringify(formData.config)
         if(this.modalAddMode=='add') {
           add(formData).then((data)=>{
+            console.log(data)
             if(data.result) {
               this.$Message.success({
                 duration: 3,
@@ -236,22 +237,22 @@ export default {
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalAddFail')
               })
             }
-            this.load()
           })
         }else {
           edit(formData).then((data)=>{
+            console.log(data)
             if(data.result) {
               this.$Message.success({
                 duration: 3,
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalEditSuccess')
               })
+              this.load()
             }else{
               this.$Message.success({
                 duration: 3,
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalEditFail')
               })
             }
-            this.load()
           })
         }
         this.modalLoading=false
diff --git a/linkis-web/src/apps/linkis/module/tenantTagManagement/index.vue 
b/linkis-web/src/apps/linkis/module/tenantTagManagement/index.vue
index 3dd5ebb8e..0496322d6 100644
--- a/linkis-web/src/apps/linkis/module/tenantTagManagement/index.vue
+++ b/linkis-web/src/apps/linkis/module/tenantTagManagement/index.vue
@@ -53,10 +53,10 @@
         <Button type="primary" class="button" :style="{width: '70px', 
marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="search">{{
           $t('message.linkis.tenantTagManagement.search')
         }}</Button>
-        <Button type="primary" class="button" :style="{width: '70px', 
marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="clearSearch">{{
+        <Button type="warning" class="button" :style="{width: '70px', 
marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="clearSearch">{{
           $t('message.linkis.tenantTagManagement.clear')
         }}</Button>
-        <Button type="primary" class="button" :style="{width: '70px', 
marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="createTenant">{{
+        <Button type="success" class="button" :style="{width: '70px', 
marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="createTenant">{{
           $t('message.linkis.tenantTagManagement.create')
         }}</Button>
       </Col>
@@ -79,7 +79,7 @@
       size="small"
       show-elevator
       :prev-text="$t('message.linkis.previousPage')" 
:next-text="$t('message.linkis.nextPage')"
-      style="margin: 10px; overflow: hidden; text-align: center;"
+      style="position: absoulute; bottom: 10px; overflow: hidden; text-align: 
center;"
     ></Page>
     <Modal
       v-model="showCreateModal"
@@ -105,13 +105,13 @@
         </Form>
         <div style="margin-top: 60px">
           <span style="width: 60px">{{ 
$t('message.linkis.tenantTagManagement.yourTagMapping') }}</span>
-          <Input class="input" v-model="mapping" style="width: 240px; 
margin-left: 10px" disabled></Input>
-          <Button type="primary" @click="checkUserTag" style="margin-left: 
10px">{{$t('message.linkis.tenantTagManagement.check')}}</Button>
+          <Input class="input" v-model="mapping" style="width: 220px; 
margin-left: 10px" disabled></Input>
+          <Button type="primary" @click="checkUserTag" style="margin-left: 
10px" 
:loading="isRequesting">{{$t('message.linkis.tenantTagManagement.check')}}</Button>
         </div>
       </div>
       <div slot="footer">
         <Button 
@click="cancel">{{$t('message.linkis.tenantTagManagement.Cancel')}}</Button>
-        <Button type="primary" :disabled="tagIsExist" 
@click="addTenantTag">{{$t('message.linkis.tenantTagManagement.OK')}}</Button>
+        <Button type="primary" :disabled="tagIsExist" @click="addTenantTag" 
:loading="isRequesting">{{$t('message.linkis.tenantTagManagement.OK')}}</Button>
       </div>
     </Modal>
   </div>
@@ -248,6 +248,7 @@ export default {
         totalPage: 0,
       },
       userName: '',
+      isRequesting: false
     }
   },
   computed: {
@@ -309,6 +310,7 @@ export default {
       this.modalData.bussinessUser = this.userName;
     },
     async checkUserTag() {
+      if(this.isRequesting) return;
       this.$refs.createTenantForm.validate(async (valid) => {
         if(valid) {
           const {user, creator} = this.modalData;
@@ -317,6 +319,7 @@ export default {
             return;
           }
           try {
+            this.isRequesting = true
             await api.fetch("/configuration/tenant-mapping/check-user-creator",
               {
                 user,
@@ -327,9 +330,10 @@ export default {
               }
               this.tagIsExist = res.exist;
             })
+            this.isRequesting = false
           } catch (err) {
             console.log(err);
-            this.cancel();
+            this.isRequesting = false
           }
         }
         else {
@@ -357,6 +361,7 @@ export default {
       this.$refs.createTenantForm.resetFields();
     },
     addTenantTag() {
+      if(this.isRequesting) return;
       const target = this.mode === 'edit' ? 
'/configuration/tenant-mapping/update-tenant' : 
'/configuration/tenant-mapping/create-tenant'
       this.$refs.createTenantForm.validate(async (valid) => {
         if(valid) {
@@ -365,14 +370,16 @@ export default {
             if(this.mode !== 'edit') {
               this.page.pageNow = 1;
             }
+            this.isRequesting = true;
             await api.fetch(target, this.modalData, "post").then(async (res) 
=> {
               console.log(res);
               await this.getTableData();
               this.cancel();
               
this.$Message.success(this.$t('message.linkis.tenantTagManagement.addSuccessful'));
             });
+            this.isRequesting = false;
           } catch(err) {
-            this.cancel();
+            this.isRequesting = false;
             console.log(err);
           }
         } else {
diff --git a/linkis-web/src/apps/linkis/module/udfManager/index.vue 
b/linkis-web/src/apps/linkis/module/udfManager/index.vue
index 289e03390..a1baddf8b 100644
--- a/linkis-web/src/apps/linkis/module/udfManager/index.vue
+++ b/linkis-web/src/apps/linkis/module/udfManager/index.vue
@@ -227,6 +227,7 @@ export default {
                 duration: 3,
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalEditSuccess')
               })
+              this.load()
             }else{
               this.$Message.success({
                 duration: 3,
diff --git a/linkis-web/src/apps/linkis/module/udfTree/index.vue 
b/linkis-web/src/apps/linkis/module/udfTree/index.vue
index 8f62c6fdc..5660b1184 100644
--- a/linkis-web/src/apps/linkis/module/udfTree/index.vue
+++ b/linkis-web/src/apps/linkis/module/udfTree/index.vue
@@ -241,8 +241,8 @@ export default {
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalDeleteFail')
               })
             }
-            this.load()
           })
+          this.load()
         }
       })
 
@@ -264,7 +264,6 @@ export default {
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalAddFail')
               })
             }
-            this.load()
           })
         }else {
           edit(formData).then((data)=>{
@@ -274,13 +273,13 @@ export default {
                 duration: 3,
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalEditSuccess')
               })
+              this.load()
             }else{
               this.$Message.success({
                 duration: 3,
                 content: 
this.$t('message.linkis.basedataManagement.modal.modalEditFail')
               })
             }
-            this.load()
           })
         }
         this.modalLoading=false
diff --git a/linkis-web/src/apps/linkis/router.js 
b/linkis-web/src/apps/linkis/router.js
index ea6b7a10b..e644f97ef 100644
--- a/linkis-web/src/apps/linkis/router.js
+++ b/linkis-web/src/apps/linkis/router.js
@@ -277,7 +277,27 @@ export default [
         title: 'EnginePluginManagement',
         publicPage: true,
       },
-    }
+    },
+    {
+      name: 'codeQuery',
+      path: 'codeQuery',
+      component: () =>
+        import('./module/codeQuery/index.vue'),
+      meta: {
+        title: 'codeQuery',
+        publicPage: true,
+      },
+    },
+    {
+      name: 'codeDetail',
+      path: 'codeDetail',
+      component: () =>
+        import('./module/codeQuery/codeDetail/index.vue'),
+      meta: {
+        title: 'codeDetail',
+        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 15d2d573c..9c84de71c 100644
--- a/linkis-web/src/apps/linkis/view/linkis/index.vue
+++ b/linkis-web/src/apps/linkis/view/linkis/index.vue
@@ -53,7 +53,7 @@
                     v-for="(item3, index3) in (item.key === '1-9' ? 
urmSideNavList.children : item.key === '1-8' 
?datasourceNavList.children:basedataNavList.children)"
                     :key="index3"
                     @on-click="clickToRoute">
-                    <div v-if="isLogAdmin ? true : item3.key === '1-8-1' || 
item3.key === '1-9-2' || item3.key === '1-9-3'">
+                    <div v-if="isLogAdmin ? true : item3.key === '1-8-1' || 
item3.key === '1-9-2' || item3.key === '1-9-3' || item3.key === '1-9-1'">
                       <Cell
                         :key="index3"
                         :class="{ crrentItem: crrentItem === item3.key }"
@@ -73,6 +73,7 @@
           <Breadcrumb v-if="$route.name !== 'resource' && $route.name !== 
'resourceEngineConnList'">
             <BreadcrumbItem :to="skipPath"><Icon v-if="skipPath" 
type="ios-arrow-back" size="16" color="#338cf0"></Icon>{{ breadcrumbSecondName 
}}</BreadcrumbItem>
             <BreadcrumbItem v-if="$route.name === 'viewHistory'">{{ 
$route.query.taskID }}</BreadcrumbItem>
+            <BreadcrumbItem v-if="$route.name === 'codeDetail'">{{ 
$route.query.id }}</BreadcrumbItem>
             <template v-if="$route.name === 'EngineConnList'">
               <BreadcrumbItem>{{ $route.query.instance }}</BreadcrumbItem>
               <BreadcrumbItem>EngineConnList</BreadcrumbItem>
@@ -115,6 +116,7 @@ export default {
           { key: '1-8', name: 
this.$t('message.linkis.sideNavList.function.children.dataSourceManage'), 
showSubMenu: true },
           { key: '1-9', name: 
this.$t('message.linkis.sideNavList.function.children.udfFunctionTitle'), path: 
'/console/urm/udfManagement', showSubMenu: true},
           { key: '1-10', name: 
this.$t('message.linkis.sideNavList.function.children.basedataManagement'), 
showSubMenu: true},
+          { key: '1-11', name: 
this.$t('message.linkis.sideNavList.function.children.codeQuery'), path: 
'/console/codeQuery' },
         ],
       },
       datasourceNavList: {
@@ -125,7 +127,7 @@ export default {
         children: [
           {key: '1-8-1', name: 
this.$t('message.linkis.sideNavList.function.children.dataSourceManage'), path: 
'/console/dataSource' },
           {key: '1-8-2', name: 
this.$t('message.linkis.sideNavList.function.children.datasourceEnv'), path: 
'/console/datasourceEnv' },
-          {key: '1-8-3', name: 
this.$t('message.linkis.sideNavList.function.children.datasourceType'), path: 
'/console/datasourceType' },
+          // {key: '1-8-3', name: 
this.$t('message.linkis.sideNavList.function.children.datasourceType'), path: 
'/console/datasourceType' },
           // {key: '1-8-4', name: 
this.$t('message.linkis.sideNavList.function.children.datasourceAccess'), path: 
'/console/datasourceAccess' },
           {key: '1-8-5', name: 
this.$t('message.linkis.sideNavList.function.children.datasourceTypeKey'), 
path: '/console/datasourceTypeKey' },
         ]
@@ -140,8 +142,8 @@ export default {
           {key: '1-10-2', name: 
this.$t('message.linkis.sideNavList.function.children.errorCode'), path: 
'/console/errorCode' },
           {key: '1-10-3', name: 
this.$t('message.linkis.sideNavList.function.children.rmExternalResourceProvider'),
 path: '/console/rmExternalResourceProvider'},
           {key: '1-10-4', name: 
this.$t('message.linkis.sideNavList.function.children.EnginePluginManagement'), 
path: '/console/EnginePluginManagement' },
-          // {key: '1-10-5', name: 
this.$t('message.linkis.sideNavList.function.children.tenantTagManagement'), 
path: '/console/tenantTagManagement' },
-          // {key: '1-10-6', name: 
this.$t('message.linkis.sideNavList.function.children.ipListManagement'), path: 
'/console/ipListManagement' },
+          {key: '1-10-5', name: 
this.$t('message.linkis.sideNavList.function.children.tenantTagManagement'), 
path: '/console/tenantTagManagement' },
+          {key: '1-10-6', name: 
this.$t('message.linkis.sideNavList.function.children.ipListManagement'), path: 
'/console/ipListManagement' },
 
         ]
       },
@@ -153,17 +155,18 @@ export default {
         children: [
           {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'},
-          {key: '1-9-3', name: 
this.$t('message.linkis.sideNavList.function.children.udfManager'), path: 
'/console/udfManager' },
-          {key: '1-9-4', name: 
this.$t('message.linkis.sideNavList.function.children.udfTree'), path: 
'/console/udfTree' },
+          // {key: '1-9-3', name: 
this.$t('message.linkis.sideNavList.function.children.udfManager'), path: 
'/console/udfManager' },
+          // {key: '1-9-4', name: 
this.$t('message.linkis.sideNavList.function.children.udfTree'), path: 
'/console/udfTree' },
         ]
       },
-      breadcrumbSecondName: 
this.$t('message.linkis.sideNavList.function.children.globalHistory')
+      breadcrumbSecondName: 
this.$t('message.linkis.sideNavList.function.children.globalHistory'),
     };
   },
   computed: {
     skipPath() {
       let path = '';
       if(this.$route.name === 'viewHistory') path = '/console';
+      if(this.$route.name === 'codeDetail') path = '/console/codeQuery';
       if(this.$route.name === 'EngineConnList') path = '/console/ECM';
       return path;
     },
@@ -180,6 +183,10 @@ export default {
         this.breadcrumbSecondName = element.name
       }
     });
+    if(this.$route.name === 'codeDetail') {
+      this.breadcrumbSecondName = 
this.$t('message.linkis.sideNavList.function.children.codeQuery')
+      this.crrentItem = '1-11'
+    }
     // Get whether it is a historical administrator(获取是否是历史管理员权限)
     api.fetch('/jobhistory/governanceStationAdmin', 'get').then((res) => {
       this.isLogAdmin = res.admin;
@@ -200,8 +207,38 @@ export default {
         this.sideNavList.children[8].showSubMenu = 
!this.sideNavList.children[8].showSubMenu;
         return;
       }
-      index = index.split('-')[0] + '-' + index.split('-')[1]; //Prevent 
tertiary menus from appearing(防止出现三级菜单)
-      const activedCellParent = this.sideNavList;
+      // index = index.split('-')[0] + '-' + index.split('-')[1]; //防止出现三级菜单
+      let activedCellParent
+      switch (index) {
+        case '1-8-1':
+          activedCellParent = this.datasourceNavList
+          this.sideNavList.children[6].showSubMenu = false;
+          break;
+        case '1-8-2':
+          activedCellParent = this.datasourceNavList
+          this.sideNavList.children[6].showSubMenu = false;
+          break;
+        case '1-9-1':
+          activedCellParent = this.urmSideNavList
+          this.sideNavList.children[7].showSubMenu = false;
+          break;
+        case '1-9-2':
+          activedCellParent = this.urmSideNavList
+          this.sideNavList.children[7].showSubMenu = false;
+          break;
+        case '1-10-5':
+          activedCellParent = this.basedataNavList
+          this.sideNavList.children[8].showSubMenu = false;
+          break;
+        case '1-10-6':
+          activedCellParent = this.basedataNavList
+          this.sideNavList.children[8].showSubMenu = false;
+          break;
+        default:
+          activedCellParent = this.sideNavList
+          break;
+      }
+      // const activedCellParent = this.navListMap[index] || this.sideNavList;
       this.crrentItem = index;
       const activedCell = activedCellParent.children.find((item) => item.key 
=== index);
       this.breadcrumbFirstName = activedCellParent.name;
@@ -240,8 +277,8 @@ export default {
       });
     } else if ((to.name === 'Console' && from.name === 'Home') || (to.name === 
'Console' && from.name === 'Project') || (to.name === 'Console' && from.name 
=== 'Workflow') || !from.name) {
       const lastActiveConsole = storage.get('lastActiveConsole');
-      // If it is historical details, refresh directly(如果为历史详情则直接刷新)
-      if(to.name === 'viewHistory') return next();
+      // 如果为历史详情则直接刷新
+      if(to.name === 'viewHistory' || to.name === 'codeDetail') return next();
       next((vm) => {
         if (lastActiveConsole) {
           if (lastActiveConsole.key === '1-9-1' || lastActiveConsole.key === 
'1-9-2') {
diff --git a/linkis-web/src/common/i18n/en.json 
b/linkis-web/src/common/i18n/en.json
index d44976fb8..c6476f7c6 100644
--- a/linkis-web/src/common/i18n/en.json
+++ b/linkis-web/src/common/i18n/en.json
@@ -148,7 +148,7 @@
         "formItems": {
           "name": "Funtion Name",
           "createUser": "Creator/Department",
-          "updateTime": "Updated At",
+          "updateTime": "Updated at",
           "useFormat": "Using Format",
           "description": "Funtion Description"
         }
@@ -218,8 +218,8 @@
         "WZJBMC": "Unknown Script Name",
         "ZHJB": "Visualis Script",
         "GZLJB": "Workflow Script",
-        "YQRW": "Engine And Task",
-        "JSYQRW": "Terminate Engine And Tasks",
+        "YQRW": "Engine and Task",
+        "JSYQRW": "Terminate Engine and Tasks",
         "CKJBXX": "View Script Information",
         "FZJBXX": "Copy Script Information",
         "QXZYTJL": "Please choose a record!",
@@ -227,14 +227,14 @@
         "WHQDENGINE": "Failed to get engineInstance, please contact admin for 
investigation or waiting!",
         "YXTS": "Execution Hints",
         "YJTZZXJB": "Stopped Executing Script",
-        "JSYQHRWCG": "Successfully Terminated Engine And Tasks",
+        "JSYQHRWCG": "Successfully Terminated Engine and Tasks",
         "DKCG": "Successfully Open",
         "JBFZDZTRB": "Copied script information to clipboard, please use 
ctrl+v to paste!",
         "XZDL": "Please choose a queue",
         "ZYSYL": "Resource Consumption Rate",
         "H": "Cores",
         "NC": "Memory",
-        "ZYSYPHB": "Ranking Of Resource Consumption",
+        "ZYSYPHB": "Ranking of Resource Consumption",
         "ZW": "No data yet"
       },
       "headerNavBar": {
diff --git a/linkis-web/src/dss/view/layout.vue 
b/linkis-web/src/dss/view/layout.vue
index 1d71aa914..8483dce68 100644
--- a/linkis-web/src/dss/view/layout.vue
+++ b/linkis-web/src/dss/view/layout.vue
@@ -79,7 +79,7 @@ export default {
     setWaterMark() {
       let userNameAndPass = storage.get('saveUserNameAndPass', 'local');
       let watermark = null;
-      const username = userNameAndPass.split('&')[0];
+      const username = userNameAndPass ? userNameAndPass.split('&')[0] : '';
       if (username) {
         watermark = username + ' ' + this.showTime(new Date());
         Vue.prototype.$watermark.set(watermark)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to