This is an automated email from the ASF dual-hosted git repository.
peacewong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/linkis.git
The following commit(s) were added to refs/heads/master by this push:
new 3f552070ef [linkis-web-next]: Modules refactoring & Bug fixing (#5169)
3f552070ef is described below
commit 3f552070ef05b790690a8291164fbdf328ada7cd
Author: Linhao-Qian <[email protected]>
AuthorDate: Wed Oct 16 02:22:56 2024 -0700
[linkis-web-next]: Modules refactoring & Bug fixing (#5169)
* GlobalHistoryManagement and SideBar modules refactoring & previous bug
fixing
* [Linkis-web-next]: parameterConfig Module Refactor
* [Linkis-web-next]: Add code comments to ParameterConfig Module
* [linkis-web-next]: Refactored Navbar & Login Page
* [linkis-web-next]: 1. TaskResults & TaskDetails Refactoring; 2. Code
Improvement & Bug Fixing;
* [linkis-web-next]: Refactored GlobalVariables Module
* [linkis-web-next]: Add license to newly created file
* [linkis-web-next]: Microservice Management Module Refactoring
* [linkis-web-next]: Resource Management Module Refactoring
* [linkis-web-next]: ECM Management Module Refactoring
* [linkis-web-next]: Base Data Management & Data Source Management & UDF
Function Management Modules Refactoring
* [linkis-web-next]: remove duplicate codes
* [linkis-web-next]: Modify README files
---
linkis-web-next/README.md | 65 +++----
linkis-web-next/README_CN.md | 65 +++----
linkis-web-next/src/components/sidebar/index.vue | 31 +++-
linkis-web-next/src/locales/en.ts | 9 +
linkis-web-next/src/locales/zh.ts | 7 +
.../EnginePluginManagement/index.vue | 28 +++
.../basedataManagement/configManagement/index.vue | 28 +++
.../pages/basedataManagement/errorCode/index.vue | 183 +++++++++++++++++++
.../pages/basedataManagement/errorCode/modal.vue | 141 +++++++++++++++
.../basedataManagement/gatewayAuthToken/index.vue | 28 +++
.../basedataManagement/ipListManagement/index.vue | 28 +++
.../rmExternalResourceProvider/index.vue | 28 +++
.../tenantTagManagement/index.vue | 28 +++
.../dataSourceManagement/index.vue | 28 +++
.../dataSourceManage/datasourceAccess/index.vue | 193 +++++++++++++++++++++
.../dataSourceManage/datasourceAccess/modal.vue | 164 +++++++++++++++++
.../pages/dataSourceManage/datasourceEnv/index.vue | 28 +++
.../dataSourceManage/datasourceType/index.vue | 28 +++
.../dataSourceManage/datasourceTypeKey/index.vue | 28 +++
.../src/pages/resource/manage/index.vue | 2 +-
.../udfFunctionTitle/functionManagement/index.vue | 28 +++
.../udfFunctionTitle/udfFunctionManage/index.vue | 28 +++
.../pages/udfFunctionTitle/udfManager/index.vue | 175 +++++++++++++++++++
.../pages/udfFunctionTitle/udfManager/modal.vue | 98 +++++++++++
.../src/pages/udfFunctionTitle/udfTree/index.vue | 28 +++
linkis-web-next/src/router/index.ts | 193 +++++++++++++++++++++
26 files changed, 1599 insertions(+), 91 deletions(-)
diff --git a/linkis-web-next/README.md b/linkis-web-next/README.md
index 6377bcefb6..d0bde35766 100644
--- a/linkis-web-next/README.md
+++ b/linkis-web-next/README.md
@@ -1,5 +1,5 @@
<h2 align="center">
- Apache Linkis Web
+ Apache Linkis Web Next
</h2>
<p align="center">
@@ -56,7 +56,28 @@
Linkis builds a layer of computation middleware between upper applications
and underlying engines. By using standard interfaces such as REST/WS/JDBC
provided by Linkis, the upper applications can easily access the underlying
engines such as MySQL/Spark/Hive/Presto/Flink, etc., and achieve the
intercommunication of user resources like unified variables, scripts, UDFs,
functions and resource files at the same time.
-Linkis Web provides a management system for easy management of user resources.
+ Linkis Web provides a web management system to facilitate the management of
user resources. However, the original Linkis Web project was developed using
Vue2 and related technologies, but Vue2 has stopped maintenance and lacks
community support. In addition, the file structure of the project itself is
unclear, the module division is unreasonable, the component library used is
also lacking maintenance, and the user experience of the interactive interface
needs to be optimized.
+
+ As mentioned above, still iterating on the original project may leave various
difficult problems. Therefore, we finally considered refactoring the project
under the Linkis Web Next project, upgrading the core technology stack from
Vue2 + Webpack to Vue3 + Vite, obtaining more community support, greatly
improving the project starting and building rate, and solving various
historical problems. Besides, using the internally maintained open-source UI
component library Fes-Design, the proble [...]
+
+The modules that have been refactored are as follows:
+
+| The modules that have been refactored
+| ---------------------------------------
+| Login Page
+| Nav Bar
+| Side Bar
+| Global History Management
+| Parameter Config
+| Global Variables
+| Microservice Management
+| Resource Management
+| ECM Management
+| Base Data Management (SubModule Error Management)
+| Data Source Management (SubModule Data Source Access Permissions)
+| UDF Function Management (SubModule UDF User Management)
+
+Sub-modules in Base Data Management, Data Source Management, and UDF Function
Management will still need to be refactored in the future.
# Start
@@ -70,46 +91,6 @@ npm run dev
npm run build
```
-# File Structure
-
-> ├── README.md
-> ├── README_CN.md
-> ├── index.html
-> ├── node_modules
-> ├── package-lock.json
-> ├── package.json
-> ├── pom.xml
-> ├── public
-> │ ├── favicon.ico`
-> │ ├── sidebar
-> │ └── vite.svg
-> ├── release-docs
-> │ ├── LICENSE
-> │ ├── NOTICE
-> │ └── licenses
-> ├── src
-> │ ├── App.vue
-> │ ├── assets
-> │ ├── components
-> │ ├── config
-> │ ├── dss
-> │ ├── env.d.ts
-> │ ├── helper
-> │ ├── index.d.ts
-> │ ├── layout.vue
-> │ ├── locales
-> │ ├── main.ts
-> │ ├── pages
-> │ ├── router
-> │ ├── scriptis
-> │ ├── service
-> │ ├── style
-> │ ├── util
-> │ └── vite-env.d.ts
-> ├── tsconfig.json
-> ├── tsconfig.node.json
-> └── vite.config.ts
-
# Contributing
Contributions are always welcomed, we need more contributors to build Linkis
together. either code, or doc, or other supports that could help the community.
diff --git a/linkis-web-next/README_CN.md b/linkis-web-next/README_CN.md
index 5779a8e5df..df548ffa56 100644
--- a/linkis-web-next/README_CN.md
+++ b/linkis-web-next/README_CN.md
@@ -1,5 +1,5 @@
<h2 align="center">
- Apache Linkis Web
+ Apache Linkis Web Next
</h2>
<p align="center">
@@ -56,7 +56,28 @@
Linkis 在上层应用程序和底层引擎之间构建了一层计算中间件。通过使用 Linkis 提供的 REST/WebSocket/JDBC 等标准接口,
上层应用可以方便地连接访问 MySQL/Spark/Hive/Presto/Flink
等底层引擎,同时实现变量、脚本、函数和资源文件等用户资源的跨上层应用互通。
-Linkis Web 提供了一个可视化的后台管理系统,便于对用户资源进行管理。
+Linkis Web 提供了一个可视化的后台管理系统,便于对用户资源进行管理。然而,原有的 Linkis Web 项目使用了 Vue2
及相关技术进行开发,而 Vue2
已停止维护,缺乏社区生态支持,并且项目本身文件结构不清晰,模块划分不合理,所使用的组件库也缺乏维护,并且交互界面的用户体验也有待优化。
+
+在此背景下,选择在原有的项目上继续进行迭代可能留下各种难以解决的问题。所以最终考虑在 Linkis Web Next 子项目下重构该项目,将核心技术栈从
Vue2 + Webpack 升级到 Vue3 +
Vite,获得更多的社区生态支持并大大提高项目启动和构建速率,同时解决各种历史遗留问题。再使用内部长期维护的开源组件库
Fes-Design,就能使组件库支持的问题能够得到及时的反馈和修复,保障项目迭代的顺利进行。
+
+当前已重构完成的模块如下所示:
+
+| 已重构完成模块
+| ---------------------------------------
+| Login Page
+| Nav Bar
+| Side Bar
+| Global History Management
+| Parameter Config
+| Global Variables
+| Microservice Management
+| Resource Management
+| ECM Management
+| Base Data Management (SubModule Error Management)
+| Data Source Management (SubModule Data Source Access Permissions)
+| UDF Function Management (SubModule UDF User Management)
+
+后续仍需继续重构Base Data Management、Data Source Management、UDF Function
Management中的子模块。
# 启动
@@ -70,46 +91,6 @@ npm run dev
npm run build
```
-# 文件结构
-
-> ├── README.md
-> ├── README_CN.md
-> ├── index.html
-> ├── node_modules
-> ├── package-lock.json
-> ├── package.json
-> ├── pom.xml
-> ├── public
-> │ ├── favicon.ico`
-> │ ├── sidebar
-> │ └── vite.svg
-> ├── release-docs
-> │ ├── LICENSE
-> │ ├── NOTICE
-> │ └── licenses
-> ├── src
-> │ ├── App.vue
-> │ ├── assets
-> │ ├── components
-> │ ├── config
-> │ ├── dss
-> │ ├── env.d.ts
-> │ ├── helper
-> │ ├── index.d.ts
-> │ ├── layout.vue
-> │ ├── locales
-> │ ├── main.ts
-> │ ├── pages
-> │ ├── router
-> │ ├── scriptis
-> │ ├── service
-> │ ├── style
-> │ ├── util
-> │ └── vite-env.d.ts
-> ├── tsconfig.json
-> ├── tsconfig.node.json
-> └── vite.config.ts
-
# 贡献
我们非常欢迎和期待更多的贡献者参与共建 Linkis, 不论是代码、文档,或是其他能够帮助到社区的贡献形式。
diff --git a/linkis-web-next/src/components/sidebar/index.vue
b/linkis-web-next/src/components/sidebar/index.vue
index 763f78625a..a6d59b7b8e 100644
--- a/linkis-web-next/src/components/sidebar/index.vue
+++ b/linkis-web-next/src/components/sidebar/index.vue
@@ -114,20 +114,39 @@ const menuItemsConfig = [
{
title: 'message.linkis.sideNavList.function.children.dataSourceManage',
icon: '/sidebar/dataSourceManage.svg',
- path: '/xxxx',
- items: [{ title: 'xxx', path: '/xxxx' }],
+ path: '/console/dataSourceManage',
+ items: [
+ { title:
'message.linkis.sideNavList.function.children.dataSourceManage', path:
'/console/dataSourceManage/dataSourceManagement' },
+ { title:
'message.linkis.sideNavList.function.children.datasourceEnv', path:
'/console/dataSourceManage/datasourceEnv' },
+ { title:
'message.linkis.sideNavList.function.children.datasourceType', path:
'/console/dataSourceManage/datasourceType' },
+ { title:
'message.linkis.sideNavList.function.children.datasourceAccess', path:
'/console/dataSourceManage/datasourceAccess' },
+ { title:
'message.linkis.sideNavList.function.children.datasourceTypeKey', path:
'/console/dataSourceManage/datasourceTypeKey' },
+ ],
},
{
title: 'message.linkis.sideNavList.function.children.udfFunctionTitle',
icon: '/sidebar/udfFunctionTitle.svg',
- path: '/xxxxx',
- items: [{ title: 'xxx', path: '/xxxxx' }],
+ path: '/console/udfFunctionTitle',
+ items: [
+ { title:
'message.linkis.sideNavList.function.children.udfFunctionManage', path:
'/console/udfFunctionTitle/udfFunctionManage' },
+ { title:
'message.linkis.sideNavList.function.children.functionManagement', path:
'/console/udfFunctionTitle/functionManagement' },
+ { title:
'message.linkis.sideNavList.function.children.udfManager', path:
'/console/udfFunctionTitle/udfManager' },
+ { title: 'message.linkis.sideNavList.function.children.udfTree',
path: '/console/udfFunctionTitle/udfTree' },
+ ],
},
{
title:
'message.linkis.sideNavList.function.children.basedataManagement',
icon: '/sidebar/basedataManagement.svg',
- path: '/xxxxxx',
- items: [{ title: 'xxx', path: '/xxxxxx' }],
+ path: '/console/basedataManagement',
+ items: [
+ { title:
'message.linkis.sideNavList.function.children.gatewayAuthToken', path:
'/console/basedataManagement/gatewayAuthToken' },
+ { title: 'message.linkis.sideNavList.function.children.errorCode',
path: '/console/basedataManagement/errorCode' },
+ { title:
'message.linkis.sideNavList.function.children.rmExternalResourceProvider',
path: '/console/basedataManagement/rmExternalResourceProvider' },
+ { title:
'message.linkis.sideNavList.function.children.EnginePluginManagement', path:
'/console/basedataManagement/EnginePluginManagement' },
+ { title:
'message.linkis.sideNavList.function.children.tenantTagManagement', path:
'/console/basedataManagement/tenantTagManagement' },
+ { title:
'message.linkis.sideNavList.function.children.ipListManagement', path:
'/console/basedataManagement/ipListManagement' },
+ { title:
'message.linkis.sideNavList.function.children.configManagement', path:
'/console/basedataManagement/configManagement' },
+ ],
},
{
title: 'message.linkis.sideNavList.function.children.codeQuery',
diff --git a/linkis-web-next/src/locales/en.ts
b/linkis-web-next/src/locales/en.ts
index 94b6df48e7..9e481863e1 100644
--- a/linkis-web-next/src/locales/en.ts
+++ b/linkis-web-next/src/locales/en.ts
@@ -41,6 +41,7 @@ export default {
resultList: 'Resultset',
process: 'Execution Time:',
ok: 'OK',
+ add: 'Add',
cancel: 'Cancel',
delete: 'Delete',
failedNotice: 'Invalid items found, please check and then retry!',
@@ -562,6 +563,7 @@ export default {
startTime: 'Start Time',
costTime: 'Time Elapsed',
executeApplicationName: 'Execution Engine',
+ requestApplicationName: 'Application',
creator: 'Created From',
user: 'User',
createdTime: 'Created at',
@@ -604,6 +606,7 @@ export default {
ECMManage: 'ECM Management',
udfFunctionTitle: 'UDF Function',
udfFunctionManage: 'UDF Management',
+ functionManagement: 'Function Management',
dataSourceManage: 'DataSource Management',
userResourceManagement: 'User Resource Management',
tenantTagManagement: 'Tenant Tag Management',
@@ -614,6 +617,7 @@ export default {
'Engine Configuration Template',
rmExternalResourceProvider:
'External Resource Provider Manage',
+ configManagement: 'Config Management',
udfManager: 'UDF User Manage',
udfTree: 'UDF Tree',
datasourceAccess: 'Data source access permissions',
@@ -893,6 +897,11 @@ export default {
search: 'Search',
action: 'Action',
categoryMaxLength: 'The length cannot exceed 100',
+ tableId: 'Table ID',
+ applicationId: 'Application ID',
+ visitor: 'Visitor',
+ field: 'Field',
+ accessTime: 'Access Time',
modal: {
confirm: 'Confirm',
cancel: 'Cancel',
diff --git a/linkis-web-next/src/locales/zh.ts
b/linkis-web-next/src/locales/zh.ts
index 8b741b6967..ba9044efb6 100644
--- a/linkis-web-next/src/locales/zh.ts
+++ b/linkis-web-next/src/locales/zh.ts
@@ -40,6 +40,7 @@ export default {
resultList: '结果集',
process: '任务ID',
ok: '确认',
+ add: '新增',
cancel: '取消',
delete: '删除',
failedNotice: '验证项未通过,请检查后再试!',
@@ -584,6 +585,7 @@ export default {
errorCode: '错误码管理',
gatewayAuthToken: '令牌管理',
rmExternalResourceProvider: '扩展资源管理',
+ configManagement: '配置项管理',
udfManager: '用户管理',
udfTree: 'UDF分类',
datasourceAccess: '数据源权限',
@@ -856,6 +858,11 @@ export default {
search: '搜索',
action: '操作',
categoryMaxLength: '分类名长度不能超过100',
+ tableId: '表ID',
+ applicationId: '应用ID',
+ visitor: '访问者',
+ field: '字段',
+ accessTime: '访问时间',
modal: {
confirm: '确定',
cancel: '取消',
diff --git
a/linkis-web-next/src/pages/basedataManagement/EnginePluginManagement/index.vue
b/linkis-web-next/src/pages/basedataManagement/EnginePluginManagement/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++
b/linkis-web-next/src/pages/basedataManagement/EnginePluginManagement/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/basedataManagement/configManagement/index.vue
b/linkis-web-next/src/pages/basedataManagement/configManagement/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/basedataManagement/configManagement/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git a/linkis-web-next/src/pages/basedataManagement/errorCode/index.vue
b/linkis-web-next/src/pages/basedataManagement/errorCode/index.vue
new file mode 100644
index 0000000000..2ff6fd906d
--- /dev/null
+++ b/linkis-web-next/src/pages/basedataManagement/errorCode/index.vue
@@ -0,0 +1,183 @@
+<!--
+ ~ 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>
+ <FForm layout="inline" :span="4">
+ <FFormItem
+ :label="t('message.linkis.basedataManagement.searchLabel')"
+ :props="t('message.linkis.basedataManagement.searchLabel')"
+ >
+ <FInput
+ v-model="searchName"
+
:placeholder="t('message.linkis.basedataManagement.errorCode.searchPlaceholder')"
+ />
+ </FFormItem>
+ <FFormItem>
+ <div class="btns">
+ <FButton type="primary" @click="() => { search() }">
+ {{ t('message.linkis.find') }}
+ </FButton>
+ <FButton type="info" @click="handleAdd">
+ {{ t('message.common.add') }}
+ </FButton>
+ </div>
+ </FFormItem>
+ </FForm>
+ <f-table
+ :data="dataList"
+ class="table"
+ :rowKey="(row: Record<string, number | string>) => row.id"
+ :emptyText="t('message.linkis.noDataText')"
+ >
+ <template v-for="col in tableColumns" :key="col.label">
+ <f-table-column
+ v-if="col.formatter"
+ :prop="col.prop"
+ :label="col.label"
+ :formatter="col.formatter"
+ />
+ <f-table-column
+ v-else
+ :prop="col.prop"
+ :label="col.label"
+ :action="col.action"
+ />
+ </template>
+ </f-table>
+ <FPagination
+ class="pagination"
+ show-size-changer
+ show-total
+ :total-count="totalSize"
+ v-model:currentPage="currentPage"
+ @change="handleChangePagination"
+ :pageSizeOption="[10, 20, 30, 50, 100]"
+ v-model:pageSize="pageSize"
+ />
+ <Modal ref="modalRef" :handleInitialization="handleInitialization" />
+</template>
+
+<script lang="ts" setup>
+import api from "@/service/api";
+import { FMessage, FModal } from "@fesjs/fes-design";
+import { onMounted, reactive, ref } from "vue";
+import Modal from "./modal.vue";
+import { useI18n } from "vue-i18n";
+
+const { t } = useI18n();
+
+const modalRef = ref();
+const searchName = ref("");
+const dataList = ref();
+const currentPage = ref(1);
+const pageSize = ref(10);
+const totalSize = ref(0);
+
+const handleAdd = () => {
+ modalRef.value?.open();
+};
+
+const handleEdit = (error: any) => {
+ modalRef.value?.open(error);
+};
+
+const handleDelete = (error: any) => {
+ FModal.confirm({
+ title: t("message.linkis.modal.modalTitle"),
+ content: t('message.linkis.modal.modalDeleteRecord'),
+ onOk: () => {
+ api.fetch(`/basedata-manager/error-code/${error.id}`, "delete").then(()
=> {
+
FMessage.success(t("message.linkis.basedataManagement.modal.modalDeleteSuccess"));
+ search();
+ }).catch((err: any) => {
+ window.console.error(err);
+ });
+ }
+ });
+};
+
+const tableColumns = reactive<{ prop?: string, label: string, action?: any,
formatter?: any }[]>([
+ {
+ prop: "id",
+ label: "ID",
+ },
+ {
+ prop: "errorCode",
+ label: t("message.linkis.basedataManagement.errorCode.errorCode"),
+ },
+ {
+ prop: "errorDesc",
+ label: t("message.linkis.basedataManagement.errorCode.errorDesc"),
+ },
+ {
+ prop: "errorRegex",
+ label: t("message.linkis.basedataManagement.errorCode.errorRegex"),
+ },
+ {
+ label:
`\u00A0\u00A0\u00A0\u00A0${t('message.linkis.columns.control.title')}`,
+ action: [
+ {
+ label: t('message.linkis.edit'),
+ func: (access: any) => {
+ handleEdit(access);
+ },
+ },
+ {
+ label: t('message.common.delete'),
+ func: (access: any) => {
+ handleDelete(access);
+ },
+ },
+ ]
+ },
+]);
+
+const search = (currentPage = 1) => {
+ api.fetch("/basedata-manager/error-code", {
+ searchName: searchName.value,
+ currentPage,
+ pageSize: pageSize.value,
+ }, "get").then((res: any) => {
+ dataList.value = [...res.list.list] || [];
+ totalSize.value = res.list.total;
+ });
+};
+
+const handleChangePagination = () => {
+ search(currentPage.value);
+};
+
+const handleInitialization = () => {
+ search();
+};
+
+onMounted(() => {
+ handleInitialization();
+});
+</script>
+
+<style lang="less" scoped>
+.btns {
+ display: flex;
+ gap: 12px;
+}
+.pagination {
+ display: flex;
+ justify-content: flex-end;
+ margin-top: 16px;
+}
+</style>
\ No newline at end of file
diff --git a/linkis-web-next/src/pages/basedataManagement/errorCode/modal.vue
b/linkis-web-next/src/pages/basedataManagement/errorCode/modal.vue
new file mode 100644
index 0000000000..b3738ec431
--- /dev/null
+++ b/linkis-web-next/src/pages/basedataManagement/errorCode/modal.vue
@@ -0,0 +1,141 @@
+<!--
+ ~ 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>
+ <FModal
+ v-model:show="show"
+ displayDirective="if"
+ @ok="handleConfirm"
+ >
+ <template #title>
+ <div class="modal-title">{{ error ? t('message.linkis.edit') :
t('message.common.add') }}</div>
+ </template>
+ <FForm>
+ <FFormItem
+
:label="t('message.linkis.basedataManagement.errorCode.errorCode')"
+
:props="t('message.linkis.basedataManagement.errorCode.errorCode')"
+ :rules="[{
+ required: true,
+ trigger: ['change', 'blur'],
+ // eslint-disable-next-line
@typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ validator: (rule, value, callback) => {
+ if (errorCode.length < 1) {
+ callback(t('message.linkis.keyTip'))
+ }
+ }
+ }]"
+ >
+ <FInput
+ v-model:modelValue="errorCode"
+ :placeholder="t('message.linkis.datasource.pleaseInput')"
+ />
+ </FFormItem>
+ <FFormItem
+
:label="t('message.linkis.basedataManagement.errorCode.errorDesc')"
+
:props="t('message.linkis.basedataManagement.errorCode.errorDesc')"
+ :rules="[{
+ required: true,
+ trigger: ['change', 'blur'],
+ // eslint-disable-next-line
@typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ validator: (rule, value, callback) => {
+ if (errorDesc.length < 1) {
+ callback(t('message.linkis.keyTip'))
+ }
+ }
+ }]"
+ >
+ <FInput
+ v-model:modelValue="errorDesc"
+ :placeholder="t('message.linkis.datasource.pleaseInput')"
+ />
+ </FFormItem>
+ <FFormItem
+
:label="t('message.linkis.basedataManagement.errorCode.errorRegex')"
+
:props="t('message.linkis.basedataManagement.errorCode.errorRegex')"
+ :rules="[{
+ required: true,
+ trigger: ['change', 'blur'],
+ // eslint-disable-next-line
@typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ validator: (rule, value, callback) => {
+ if (errorRegex.length < 1) {
+ callback(t('message.linkis.keyTip'))
+ }
+ }
+ }]"
+ >
+ <FInput
+ v-model:modelValue="errorRegex"
+ :placeholder="t('message.linkis.datasource.pleaseInput')"
+ />
+ </FFormItem>
+ </FForm>
+ </FModal>
+</template>
+
+<script lang="ts" setup>
+import api from '@/service/api';
+import { FMessage } from '@fesjs/fes-design';
+import { ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+const { t } = useI18n();
+
+const props = defineProps<{
+ handleInitialization: Function,
+}>();
+const show = ref(false);
+const errorCode = ref();
+const errorDesc = ref();
+const errorRegex = ref();
+const error = ref();
+
+const handleConfirm = async () => {
+ try {
+ await api.fetch("/basedata-manager/error-code", {
+ id: error.value?.id || '',
+ errorCode: errorCode.value,
+ errorDesc: errorDesc.value,
+ errorRegex: errorRegex.value,
+ }, error.value ? "put" : "post");
+ FMessage.success(error.value ? t("message.linkis.editedSuccess") :
t('message.linkis.basedataManagement.modal.modalAddSuccess'));
+ show.value = false;
+ props.handleInitialization();
+ } catch (error) {
+ window.console.error(error);
+ }
+}
+
+const open = (currentError?: any) => {
+ show.value = true;
+ error.value = currentError;
+ errorCode.value = currentError?.errorCode;
+ errorDesc.value = currentError?.errorDesc;
+ errorRegex.value = currentError?.errorRegex;
+};
+
+defineExpose({
+ open,
+});
+</script>
+
+<style lang="less" scoped>
+.modal-title {
+ font-weight: bold;
+}
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/basedataManagement/gatewayAuthToken/index.vue
b/linkis-web-next/src/pages/basedataManagement/gatewayAuthToken/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/basedataManagement/gatewayAuthToken/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/basedataManagement/ipListManagement/index.vue
b/linkis-web-next/src/pages/basedataManagement/ipListManagement/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/basedataManagement/ipListManagement/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/basedataManagement/rmExternalResourceProvider/index.vue
b/linkis-web-next/src/pages/basedataManagement/rmExternalResourceProvider/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++
b/linkis-web-next/src/pages/basedataManagement/rmExternalResourceProvider/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/basedataManagement/tenantTagManagement/index.vue
b/linkis-web-next/src/pages/basedataManagement/tenantTagManagement/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/basedataManagement/tenantTagManagement/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/dataSourceManage/dataSourceManagement/index.vue
b/linkis-web-next/src/pages/dataSourceManage/dataSourceManagement/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/dataSourceManage/dataSourceManagement/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/dataSourceManage/datasourceAccess/index.vue
b/linkis-web-next/src/pages/dataSourceManage/datasourceAccess/index.vue
new file mode 100644
index 0000000000..9d6fe6c6bc
--- /dev/null
+++ b/linkis-web-next/src/pages/dataSourceManage/datasourceAccess/index.vue
@@ -0,0 +1,193 @@
+<!--
+ ~ 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>
+ <FForm layout="inline" :span="4">
+ <FFormItem
+ :label="t('message.linkis.basedataManagement.searchLabel')"
+ :props="t('message.linkis.basedataManagement.searchLabel')"
+ >
+ <FInput
+ v-model="searchName"
+ :placeholder="t('message.linkis.datasource.pleaseInput')"
+ />
+ </FFormItem>
+ <FFormItem>
+ <div class="btns">
+ <FButton type="primary" @click="() => { search() }">
+ {{ t('message.linkis.find') }}
+ </FButton>
+ <FButton type="info" @click="handleAdd">
+ {{ t('message.common.add') }}
+ </FButton>
+ </div>
+ </FFormItem>
+ </FForm>
+ <f-table
+ :data="dataList"
+ class="table"
+ :rowKey="(row: Record<string, number | string>) => row.id"
+ :emptyText="t('message.linkis.noDataText')"
+ >
+ <template v-for="col in tableColumns" :key="col.label">
+ <f-table-column
+ v-if="col.formatter"
+ :prop="col.prop"
+ :label="col.label"
+ :formatter="col.formatter"
+ />
+ <f-table-column
+ v-else
+ :prop="col.prop"
+ :label="col.label"
+ :action="col.action"
+ />
+ </template>
+ </f-table>
+ <FPagination
+ class="pagination"
+ show-size-changer
+ show-total
+ :total-count="totalSize"
+ v-model:currentPage="currentPage"
+ @change="handleChangePagination"
+ :pageSizeOption="[10, 20, 30, 50, 100]"
+ v-model:pageSize="pageSize"
+ />
+ <Modal ref="modalRef" :handleInitialization="handleInitialization" />
+</template>
+
+<script lang="ts" setup>
+import api from "@/service/api";
+import { FMessage, FModal } from "@fesjs/fes-design";
+import { onMounted, reactive, ref } from "vue";
+import Modal from "./modal.vue";
+import { useI18n } from "vue-i18n";
+import dayjs from "dayjs";
+
+const { t } = useI18n();
+
+const modalRef = ref();
+const searchName = ref("");
+const dataList = ref();
+const currentPage = ref(1);
+const pageSize = ref(10);
+const totalSize = ref(0);
+
+const handleAdd = () => {
+ modalRef.value?.open();
+};
+
+const handleEdit = (access: any) => {
+ modalRef.value?.open(access);
+};
+
+const handleDelete = (access: any) => {
+ FModal.confirm({
+ title: t("message.linkis.modal.modalTitle"),
+ content: t('message.linkis.modal.modalDeleteRecord'),
+ onOk: () => {
+ api.fetch(`/basedata-manager/datasource-access/${access.id}`,
"delete").then(() => {
+
FMessage.success(t("message.linkis.basedataManagement.modal.modalDeleteSuccess"));
+ search();
+ }).catch((err: any) => {
+ window.console.error(err);
+ });
+ }
+ });
+};
+
+const tableColumns = reactive<{ prop?: string, label: string, action?: any,
formatter?: any }[]>([
+ {
+ prop: "id",
+ label: "ID",
+ },
+ {
+ prop: "tableId",
+ label: t("message.linkis.basedataManagement.tableId"),
+ },
+ {
+ prop: "visitor",
+ label: t("message.linkis.basedataManagement.visitor"),
+ },
+ {
+ prop: "fields",
+ label: t("message.linkis.basedataManagement.field"),
+ },
+ {
+ prop: "applicationId",
+ label: t("message.linkis.basedataManagement.applicationId"),
+ },
+ {
+ prop: 'accessTime',
+ label: t('message.linkis.basedataManagement.accessTime'),
+ formatter: ({ row }: { row: { accessTime: number } }) =>
dayjs(row.accessTime).format('YYYY-MM-DD HH:mm:ss'),
+ },
+ {
+ label:
`\u00A0\u00A0\u00A0\u00A0${t('message.linkis.columns.control.title')}`,
+ action: [
+ {
+ label: t('message.linkis.edit'),
+ func: (access: any) => {
+ handleEdit(access);
+ },
+ },
+ {
+ label: t('message.common.delete'),
+ func: (access: any) => {
+ handleDelete(access);
+ },
+ },
+ ]
+ },
+]);
+
+const search = (currentPage = 1) => {
+ api.fetch("/basedata-manager/datasource-access", {
+ searchName: searchName.value,
+ currentPage,
+ pageSize: pageSize.value,
+ }, "get").then((res: any) => {
+ dataList.value = [...res.list.list] || [];
+ totalSize.value = res.list.total;
+ });
+};
+
+const handleChangePagination = () => {
+ search(currentPage.value);
+};
+
+const handleInitialization = () => {
+ search();
+};
+
+onMounted(() => {
+ handleInitialization();
+});
+</script>
+
+<style lang="less" scoped>
+.btns {
+ display: flex;
+ gap: 12px;
+}
+.pagination {
+ display: flex;
+ justify-content: flex-end;
+ margin-top: 16px;
+}
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/dataSourceManage/datasourceAccess/modal.vue
b/linkis-web-next/src/pages/dataSourceManage/datasourceAccess/modal.vue
new file mode 100644
index 0000000000..3f7dadb3df
--- /dev/null
+++ b/linkis-web-next/src/pages/dataSourceManage/datasourceAccess/modal.vue
@@ -0,0 +1,164 @@
+<!--
+ ~ 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>
+ <FModal
+ v-model:show="show"
+ displayDirective="if"
+ @ok="handleConfirm"
+ >
+ <template #title>
+ <div class="modal-title">{{ access ? t('message.linkis.edit') :
t('message.common.add') }}</div>
+ </template>
+ <FForm>
+ <FFormItem
+ :label="t('message.linkis.basedataManagement.tableId')"
+ :props="t('message.linkis.basedataManagement.tableId')"
+ :rules="[{
+ required: true,
+ trigger: ['change', 'blur'],
+ // eslint-disable-next-line
@typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ validator: (rule, value, callback) => {
+ if (tableId.length < 1) {
+ callback(t('message.linkis.keyTip'))
+ }
+ }
+ }]"
+ >
+ <FInput
+ v-model:modelValue="tableId"
+ :placeholder="t('message.linkis.datasource.pleaseInput')"
+ />
+ </FFormItem>
+ <FFormItem
+ :label="t('message.linkis.basedataManagement.visitor')"
+ :props="t('message.linkis.basedataManagement.visitor')"
+ :rules="[{
+ required: true,
+ trigger: ['change', 'blur'],
+ // eslint-disable-next-line
@typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ validator: (rule, value, callback) => {
+ if (visitor.length < 1) {
+ callback(t('message.linkis.keyTip'))
+ }
+ }
+ }]"
+ >
+ <FInput
+ v-model:modelValue="visitor"
+ :placeholder="t('message.linkis.datasource.pleaseInput')"
+ />
+ </FFormItem>
+ <FFormItem
+ :label="t('message.linkis.basedataManagement.field')"
+ :props="t('message.linkis.basedataManagement.field')"
+ :rules="[{
+ required: true,
+ trigger: ['change', 'blur'],
+ // eslint-disable-next-line
@typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ validator: (rule, value, callback) => {
+ if (fields.length < 1) {
+ callback(t('message.linkis.keyTip'))
+ }
+ }
+ }]"
+ >
+ <FInput
+ v-model:modelValue="fields"
+ :placeholder="t('message.linkis.datasource.pleaseInput')"
+ />
+ </FFormItem>
+ <FFormItem
+ :label="t('message.linkis.basedataManagement.applicationId')"
+ :props="t('message.linkis.basedataManagement.applicationId')"
+ :rules="[{
+ required: true,
+ trigger: ['change', 'blur'],
+ // eslint-disable-next-line
@typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ validator: (rule, value, callback) => {
+ if (applicationId.length < 1) {
+ callback(t('message.linkis.keyTip'))
+ }
+ }
+ }]"
+ >
+ <FInput
+ v-model:modelValue="applicationId"
+ :placeholder="t('message.linkis.datasource.pleaseInput')"
+ />
+ </FFormItem>
+ </FForm>
+ </FModal>
+</template>
+
+<script lang="ts" setup>
+import api from '@/service/api';
+import { FMessage } from '@fesjs/fes-design';
+import { ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+const { t } = useI18n();
+
+const props = defineProps<{
+ handleInitialization: Function,
+}>();
+const show = ref(false);
+const tableId = ref();
+const visitor = ref();
+const fields = ref();
+const applicationId = ref();
+const access = ref();
+
+const handleConfirm = async () => {
+ try {
+ await api.fetch("/basedata-manager/datasource-access", {
+ id: access.value?.id || '',
+ tableId: tableId.value,
+ visitor: visitor.value,
+ fields: fields.value,
+ applicationId: applicationId.value,
+ }, access.value ? "put" : "post");
+ FMessage.success(access.value ? t("message.linkis.editedSuccess") :
t('message.linkis.basedataManagement.modal.modalAddSuccess'));
+ show.value = false;
+ props.handleInitialization();
+ } catch (error) {
+ window.console.error(error);
+ }
+}
+
+const open = (currentAccess?: any) => {
+ show.value = true;
+ access.value = currentAccess;
+ tableId.value = currentAccess?.tableId;
+ visitor.value = currentAccess?.visitor;
+ fields.value = currentAccess?.fields;
+ applicationId.value = currentAccess?.applicationId;
+};
+
+defineExpose({
+ open,
+});
+</script>
+
+<style lang="less" scoped>
+.modal-title {
+ font-weight: bold;
+}
+</style>
\ No newline at end of file
diff --git a/linkis-web-next/src/pages/dataSourceManage/datasourceEnv/index.vue
b/linkis-web-next/src/pages/dataSourceManage/datasourceEnv/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/dataSourceManage/datasourceEnv/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/dataSourceManage/datasourceType/index.vue
b/linkis-web-next/src/pages/dataSourceManage/datasourceType/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/dataSourceManage/datasourceType/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/dataSourceManage/datasourceTypeKey/index.vue
b/linkis-web-next/src/pages/dataSourceManage/datasourceTypeKey/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/dataSourceManage/datasourceTypeKey/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git a/linkis-web-next/src/pages/resource/manage/index.vue
b/linkis-web-next/src/pages/resource/manage/index.vue
index 13cb63d4c6..ab71584f88 100644
--- a/linkis-web-next/src/pages/resource/manage/index.vue
+++ b/linkis-web-next/src/pages/resource/manage/index.vue
@@ -54,7 +54,7 @@
</FFormItem>
<FFormItem>
<div class="btns">
- <FButton type="primary" @click="search">
+ <FButton type="primary" @click="() => { search() }">
{{ t('message.linkis.find') }}
</FButton>
<FButton type="danger" @click="handleReset">
diff --git
a/linkis-web-next/src/pages/udfFunctionTitle/functionManagement/index.vue
b/linkis-web-next/src/pages/udfFunctionTitle/functionManagement/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/udfFunctionTitle/functionManagement/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git
a/linkis-web-next/src/pages/udfFunctionTitle/udfFunctionManage/index.vue
b/linkis-web-next/src/pages/udfFunctionTitle/udfFunctionManage/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/udfFunctionTitle/udfFunctionManage/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git a/linkis-web-next/src/pages/udfFunctionTitle/udfManager/index.vue
b/linkis-web-next/src/pages/udfFunctionTitle/udfManager/index.vue
new file mode 100644
index 0000000000..ec1295ae6b
--- /dev/null
+++ b/linkis-web-next/src/pages/udfFunctionTitle/udfManager/index.vue
@@ -0,0 +1,175 @@
+<!--
+ ~ 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>
+ <FForm layout="inline" :span="4">
+ <FFormItem
+ :label="t('message.linkis.userName')"
+ :props="t('message.linkis.userName')"
+ >
+ <FInput
+ v-model="userName"
+ :placeholder="t('message.linkis.datasource.pleaseInput')"
+ />
+ </FFormItem>
+ <FFormItem>
+ <div class="btns">
+ <FButton type="primary" @click="() => { search() }">
+ {{ t('message.linkis.find') }}
+ </FButton>
+ <FButton type="info" @click="handleAdd">
+ {{ t('message.common.add') }}
+ </FButton>
+ </div>
+ </FFormItem>
+ </FForm>
+ <f-table
+ :data="dataList"
+ class="table"
+ :rowKey="(row: Record<string, number | string>) => row.id"
+ :emptyText="t('message.linkis.noDataText')"
+ >
+ <template v-for="col in tableColumns" :key="col.label">
+ <f-table-column
+ v-if="col.formatter"
+ :prop="col.prop"
+ :label="col.label"
+ :formatter="col.formatter"
+ />
+ <f-table-column
+ v-else
+ :prop="col.prop"
+ :label="col.label"
+ :action="col.action"
+ />
+ </template>
+ </f-table>
+ <FPagination
+ class="pagination"
+ show-size-changer
+ show-total
+ :total-count="totalSize"
+ v-model:currentPage="currentPage"
+ @change="handleChangePagination"
+ :pageSizeOption="[10, 20, 30, 50, 100]"
+ v-model:pageSize="pageSize"
+ />
+ <Modal ref="modalRef" :handleInitialization="handleInitialization" />
+</template>
+
+<script lang="ts" setup>
+import api from "@/service/api";
+import { FMessage, FModal } from "@fesjs/fes-design";
+import { onMounted, reactive, ref } from "vue";
+import Modal from "./modal.vue";
+import { useI18n } from "vue-i18n";
+
+const { t } = useI18n();
+
+const modalRef = ref();
+const userName = ref("");
+const dataList = ref();
+const currentPage = ref(1);
+const pageSize = ref(10);
+const totalSize = ref(0);
+
+const handleAdd = () => {
+ modalRef.value?.open();
+};
+
+const handleEdit = (user: any) => {
+ modalRef.value?.open(user);
+};
+
+const handleDelete = (user: any) => {
+ FModal.confirm({
+ title: t("message.linkis.basedataManagement.modal.modalTitle"),
+ content: t('message.linkis.basedataManagement.modal.modalDelete', {name:
user.userName}),
+ onOk: () => {
+ api.fetch(`/basedata-manager/udf-manager/${user.id}`, "delete").then(()
=> {
+
FMessage.success(t("message.linkis.basedataManagement.modal.modalDeleteSuccess"));
+ search();
+ }).catch((err: any) => {
+ window.console.error(err);
+ });
+ }
+ });
+};
+
+const tableColumns = reactive<{ prop?: string, label: string, action?: any,
formatter?: any }[]>([
+ {
+ prop: "id",
+ label: "ID",
+ },
+ {
+ prop: "userName",
+ label: t("message.linkis.userName"),
+ },
+ {
+ label:
`\u00A0\u00A0\u00A0\u00A0${t('message.linkis.columns.control.title')}`,
+ action: [
+ {
+ label: t('message.linkis.edit'),
+ func: (user: any) => {
+ handleEdit(user);
+ },
+ },
+ {
+ label: t('message.common.delete'),
+ func: (user: any) => {
+ handleDelete(user);
+ },
+ },
+ ]
+ },
+]);
+
+const search = (currentPage = 1) => {
+ api.fetch("/basedata-manager/udf-manager", {
+ searchName: userName.value,
+ currentPage,
+ pageSize: pageSize.value,
+ }, "get").then((res: any) => {
+ dataList.value = [...res.list.list] || [];
+ totalSize.value = res.list.total;
+ });
+};
+
+const handleChangePagination = () => {
+ search(currentPage.value);
+};
+
+const handleInitialization = () => {
+ search();
+};
+
+onMounted(() => {
+ handleInitialization();
+});
+</script>
+
+<style lang="less" scoped>
+.btns {
+ display: flex;
+ gap: 12px;
+}
+.pagination {
+ display: flex;
+ justify-content: flex-end;
+ margin-top: 16px;
+}
+</style>
\ No newline at end of file
diff --git a/linkis-web-next/src/pages/udfFunctionTitle/udfManager/modal.vue
b/linkis-web-next/src/pages/udfFunctionTitle/udfManager/modal.vue
new file mode 100644
index 0000000000..0f61c2562c
--- /dev/null
+++ b/linkis-web-next/src/pages/udfFunctionTitle/udfManager/modal.vue
@@ -0,0 +1,98 @@
+<!--
+ ~ 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>
+ <FModal
+ v-model:show="show"
+ displayDirective="if"
+ @ok="handleConfirm"
+ >
+ <template #title>
+ <div class="modal-title">{{ user ? t('message.linkis.edit') :
t('message.linkis.basedataManagement.addUDFAdmin') }}</div>
+ </template>
+ <FForm>
+ <FFormItem
+ :label="t('message.linkis.userName')"
+ :props="t('message.linkis.userName')"
+ :rules="[{
+ required: true,
+ trigger: ['change', 'blur'],
+ // eslint-disable-next-line
@typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ validator: (rule, value, callback) => {
+ if (userName.length < 1) {
+
callback(t('message.linkis.basedataManagement.udfManager.userNameValidate.empty'))
+ }
+ if (userName.length > 20) {
+
callback(t('message.linkis.basedataManagement.udfManager.userNameValidate.size'))
+ }
+ }
+ }]"
+ >
+ <FInput
+ v-model:modelValue="userName"
+ :placeholder="t('message.linkis.datasource.pleaseInput')"
+ />
+ </FFormItem>
+ </FForm>
+ </FModal>
+</template>
+
+<script lang="ts" setup>
+import api from '@/service/api';
+import { FMessage } from '@fesjs/fes-design';
+import { ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+const { t } = useI18n();
+
+const props = defineProps<{
+ handleInitialization: Function,
+}>();
+const show = ref(false);
+const userName = ref();
+const user = ref();
+
+const handleConfirm = async () => {
+ try {
+ await api.fetch("/basedata-manager/udf-manager", {
+ id: user.value?.id || '',
+ userName: userName.value,
+ }, user.value ? "put" : "post");
+ FMessage.success(t("message.linkis.editedSuccess"));
+ show.value = false;
+ props.handleInitialization();
+ } catch (error) {
+ window.console.error(error);
+ }
+}
+
+const open = (currentUser?: any) => {
+ show.value = true;
+ user.value = currentUser;
+ userName.value = currentUser?.userName;
+};
+
+defineExpose({
+ open,
+});
+</script>
+
+<style lang="less" scoped>
+.modal-title {
+ font-weight: bold;
+}
+</style>
\ No newline at end of file
diff --git a/linkis-web-next/src/pages/udfFunctionTitle/udfTree/index.vue
b/linkis-web-next/src/pages/udfFunctionTitle/udfTree/index.vue
new file mode 100644
index 0000000000..d1ebe117c8
--- /dev/null
+++ b/linkis-web-next/src/pages/udfFunctionTitle/udfTree/index.vue
@@ -0,0 +1,28 @@
+<!--
+ ~ 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>
+
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="less" scoped>
+
+</style>
\ No newline at end of file
diff --git a/linkis-web-next/src/router/index.ts
b/linkis-web-next/src/router/index.ts
index 7e3981a500..5f5fb1dc6d 100644
--- a/linkis-web-next/src/router/index.ts
+++ b/linkis-web-next/src/router/index.ts
@@ -130,6 +130,199 @@ const routes: Array<RouteRecordRaw> = [
},
children: [],
},
+ {
+ name: 'dataSourceManage',
+ path: '/console/dataSourceManage',
+ redirect:
'/console/dataSourceManage/dataSourceManagement',
+ meta: {
+ title: 'Data Source Manage',
+ publicPage: true,
+ },
+ children: [
+ {
+ name: 'dataSourceManagement',
+ path:
'/console/dataSourceManage/dataSourceManagement',
+ component: () =>
+
import('@/pages/dataSourceManage/dataSourceManagement/index.vue'),
+ meta: {
+ title: 'Data Source Management',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'datasourceEnv',
+ path:
'/console/dataSourceManage/datasourceEnv',
+ component: () =>
+
import('@/pages/dataSourceManage/datasourceEnv/index.vue'),
+ meta: {
+ title: 'Data Source Env',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'datasourceType',
+ path:
'/console/dataSourceManage/datasourceType',
+ component: () =>
+
import('@/pages/dataSourceManage/datasourceType/index.vue'),
+ meta: {
+ title: 'Data Source Type',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'datasourceAccess',
+ path:
'/console/dataSourceManage/datasourceAccess',
+ component: () =>
+
import('@/pages/dataSourceManage/datasourceAccess/index.vue'),
+ meta: {
+ title: 'Data Source Access',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'datasourceTypeKey',
+ path:
'/console/dataSourceManage/datasourceTypeKey',
+ component: () =>
+
import('@/pages/dataSourceManage/datasourceTypeKey/index.vue'),
+ meta: {
+ title: 'Data Source Type Key',
+ publicPage: true,
+ },
+ },
+ ],
+ },
+ {
+ name: 'udfFunctionTitle',
+ path: '/console/udfFunctionTitle',
+ redirect:
'/console/udfFunctionTitle/udfFunctionManage',
+ meta: {
+ title: 'UDF Function',
+ publicPage: true,
+ },
+ children: [
+ {
+ name: 'udfFunctionManage',
+ path:
'/console/udfFunctionTitle/udfFunctionManage',
+ component: () =>
+
import('@/pages/udfFunctionTitle/udfFunctionManage/index.vue'),
+ meta: {
+ title: 'UDF Management',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'functionManagement',
+ path:
'/console/udfFunctionTitle/functionManagement',
+ component: () =>
+
import('@/pages/udfFunctionTitle/functionManagement/index.vue'),
+ meta: {
+ title: 'Function Management',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'udfManager',
+ path: '/console/udfFunctionTitle/udfManager',
+ component: () =>
+
import('@/pages/udfFunctionTitle/udfManager/index.vue'),
+ meta: {
+ title: 'UDF Manager',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'udfTree',
+ path: '/console/udfFunctionTitle/udfTree',
+ component: () =>
+
import('@/pages/udfFunctionTitle/udfTree/index.vue'),
+ meta: {
+ title: 'UDF Tree',
+ publicPage: true,
+ },
+ },
+ ],
+ },
+ {
+ name: 'basedataManagement',
+ path: '/console/basedataManagement',
+ redirect:
'/console/basedataManagement/gatewayAuthToken',
+ meta: {
+ title: 'Base Data Management',
+ publicPage: true,
+ },
+ children: [
+ {
+ name: 'gatewayAuthToken',
+ path:
'/console/basedataManagement/gatewayAuthToken',
+ component: () =>
+
import('@/pages/basedataManagement/gatewayAuthToken/index.vue'),
+ meta: {
+ title: 'Gateway Auth Token',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'errorCode',
+ path: '/console/basedataManagement/errorCode',
+ component: () =>
+
import('@/pages/basedataManagement/errorCode/index.vue'),
+ meta: {
+ title: 'Error Code',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'rmExternalResourceProvider',
+ path:
'/console/basedataManagement/rmExternalResourceProvider',
+ component: () =>
+
import('@/pages/basedataManagement/rmExternalResourceProvider/index.vue'),
+ meta: {
+ title: 'Rm External Resource Provider',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'EnginePluginManagement',
+ path:
'/console/basedataManagement/EnginePluginManagement',
+ component: () =>
+
import('@/pages/basedataManagement/EnginePluginManagement/index.vue'),
+ meta: {
+ title: 'Engine Plugin Management',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'tenantTagManagement',
+ path:
'/console/basedataManagement/tenantTagManagement',
+ component: () =>
+
import('@/pages/basedataManagement/tenantTagManagement/index.vue'),
+ meta: {
+ title: 'Tenant Tag Management',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'ipListManagement',
+ path:
'/console/basedataManagement/ipListManagement',
+ component: () =>
+
import('@/pages/basedataManagement/ipListManagement/index.vue'),
+ meta: {
+ title: 'Ip List Management',
+ publicPage: true,
+ },
+ },
+ {
+ name: 'configManagement',
+ path:
'/console/basedataManagement/configManagement',
+ component: () =>
+
import('@/pages/basedataManagement/configManagement/index.vue'),
+ meta: {
+ title: 'Config Management',
+ publicPage: true,
+ },
+ },
+ ],
+ },
]
},
],
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]