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

benjobs pushed a commit to branch sync_2.1.3
in repository https://gitbox.apache.org/repos/asf/incubator-streampark.git

commit 545b3ae355f5fe295457eadc31156c4902145d56
Author: benjobs <[email protected]>
AuthorDate: Wed Mar 13 15:46:30 2024 +0800

    [Improve] docker|email check improvements
---
 .../common/conf/InternalConfigHolder.scala         |   3 +
 .../console/core/controller/SettingController.java |   4 +-
 .../console/core/runner/EnvInitializer.java        |   6 +-
 .../src/api/setting/index.ts                       |  71 ++++++++-
 .../src/locales/lang/en/setting/system.ts          |  67 +++++++-
 .../src/locales/lang/zh-CN/setting/system.ts       |  67 +++++++-
 .../src/views/setting/{Alarm => alarm}/View.vue    |   0
 .../{Alarm => alarm}/components/AlertModal.vue     |   0
 .../{Alarm => alarm}/components/AlertTypeInfo.vue  |   0
 .../{Alarm => alarm}/components/DetailModal.vue    |   0
 .../{Alarm => alarm}/components/index.data.ts      |   0
 .../setting/{Alarm => alarm}/components/index.ts   |   0
 .../src/views/setting/system/SettingForm.vue       | 168 +++++++++++++++++++++
 .../setting/{System => system}/SettingList.vue     |  75 ++++++---
 .../src/views/setting/{System => system}/View.vue  |   0
 .../src/views/setting/system/config.ts             | 138 +++++++++++++++++
 .../setting/{YarnQueue => yarnqueue}/View.vue      |   0
 .../{YarnQueue => yarnqueue}/YarnQueueDrawer.vue   |   0
 .../setting/{YarnQueue => yarnqueue}/index.data.ts |   0
 .../useYarnQueueRender.tsx                         |   0
 20 files changed, 567 insertions(+), 32 deletions(-)

diff --git 
a/streampark-common/src/main/scala/org/apache/streampark/common/conf/InternalConfigHolder.scala
 
b/streampark-common/src/main/scala/org/apache/streampark/common/conf/InternalConfigHolder.scala
index d61ac2ee3..764031108 100644
--- 
a/streampark-common/src/main/scala/org/apache/streampark/common/conf/InternalConfigHolder.scala
+++ 
b/streampark-common/src/main/scala/org/apache/streampark/common/conf/InternalConfigHolder.scala
@@ -43,6 +43,9 @@ object InternalConfigHolder extends Logger {
   /** configuration key options storage (key -> ConfigOption) */
   private val confOptions = new ConcurrentHashMap[String, 
InternalOption](initialCapacity)
 
+  /** Initialize the ConfigHub. */
+  Seq(CommonConfig, K8sFlinkConfig)
+
   /** Register the ConfigOption */
   private[conf] def register(@Nonnull conf: InternalOption): Unit = {
     confOptions.put(conf.key, conf)
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
index 6517e7e1e..27b357549 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
@@ -43,7 +43,7 @@ import java.util.List;
 @Slf4j
 @Validated
 @RestController
-@RequestMapping("flink/setting")
+@RequestMapping("setting")
 public class SettingController {
 
   @Autowired private SettingService settingService;
@@ -122,7 +122,7 @@ public class SettingController {
   }
 
   @Operation(summary = "Check hadoop status")
-  @PostMapping("checkHadoop")
+  @PostMapping("check/hadoop")
   public RestResponse checkHadoop() {
     try {
       HadoopUtils.hdfs().getStatus();
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/runner/EnvInitializer.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/runner/EnvInitializer.java
index 032dc9e0c..635c2a465 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/runner/EnvInitializer.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/runner/EnvInitializer.java
@@ -77,6 +77,9 @@ public class EnvInitializer implements ApplicationRunner {
   @SneakyThrows
   @Override
   public void run(ApplicationArguments args) throws Exception {
+
+    checkAppHome();
+
     // init InternalConfig
     initConfig();
 
@@ -101,6 +104,7 @@ public class EnvInitializer implements ApplicationRunner {
               Utils.requireNotNull(config);
               InternalConfigHolder.set(config, env.getProperty(key, 
config.classType()));
             });
+
     InternalConfigHolder.log();
 
     settingService.getMavenConfig().updateConfig();
@@ -118,8 +122,6 @@ public class EnvInitializer implements ApplicationRunner {
 
   public synchronized void storageInitialize(StorageType storageType) {
 
-    checkAppHome();
-
     if (initialized.contains(storageType)) {
       return;
     }
diff --git 
a/streampark-console/streampark-console-webapp/src/api/setting/index.ts 
b/streampark-console/streampark-console-webapp/src/api/setting/index.ts
index 305e1a0ed..c2f771c23 100644
--- a/streampark-console/streampark-console-webapp/src/api/setting/index.ts
+++ b/streampark-console/streampark-console-webapp/src/api/setting/index.ts
@@ -18,11 +18,16 @@ import { SystemSetting } from './types/setting.type';
 import { defHttp } from '/@/utils/http/axios';
 
 enum SETTING_APi {
-  GET = '/flink/setting/get',
-  ALL = '/flink/setting/all',
-  CHECK_HADOOP = '/flink/setting/checkHadoop',
-  SYNC = '/flink/setting/sync',
-  UPDATE = '/flink/setting/update',
+  GET = '/setting/get',
+  GET_DOCKER = '/setting/docker',
+  GET_EMAIL = '/setting/email',
+  ALL = '/setting/all',
+  UPDATE = '/setting/update',
+  CHECK_HADOOP = '/setting/check/hadoop',
+  CHECK_DOCKER = '/setting/check/docker',
+  UPDATE_DOCKER = '/setting/update/docker',
+  CHECK_EMAIL = '/setting/check/email',
+  UPDATE_ALERT = '/setting/update/email',
 }
 /**
  * Get system settings
@@ -58,3 +63,59 @@ export function fetchCheckHadoop(): Promise<boolean> {
     url: SETTING_APi.CHECK_HADOOP,
   });
 }
+
+/**
+ * get docker setting info
+ */
+export function fetchDockerConfig() {
+  return defHttp.post({ url: SETTING_APi.GET_DOCKER });
+}
+
+/**
+ * verify docker setting info
+ */
+export function fetchVerifyDocker(data: Recordable): Promise<boolean> {
+  return defHttp.post({
+    url: SETTING_APi.CHECK_DOCKER,
+    data,
+  });
+}
+
+/**
+ * verify docker setting info
+ */
+export function fetchVerifyEmail(data: Recordable): Promise<boolean> {
+  return defHttp.post({
+    url: SETTING_APi.CHECK_EMAIL,
+    data,
+  });
+}
+
+/**
+ * get alert setting info
+ */
+export function fetchEmailConfig() {
+  return defHttp.post({ url: SETTING_APi.GET_EMAIL });
+}
+
+/**
+ * Update docker setting
+ * @returns {Promise<Boolean>}
+ */
+export function fetchDockerUpdate(data: Recordable): Promise<boolean> {
+  return defHttp.post({
+    url: SETTING_APi.UPDATE_DOCKER,
+    data,
+  });
+}
+
+/**
+ * Update alert setting
+ * @returns {Promise<Boolean>}
+ */
+export function fetchEmailUpdate(data: Recordable): Promise<boolean> {
+  return defHttp.post({
+    url: SETTING_APi.UPDATE_ALERT,
+    data,
+  });
+}
diff --git 
a/streampark-console/streampark-console-webapp/src/locales/lang/en/setting/system.ts
 
b/streampark-console/streampark-console-webapp/src/locales/lang/en/setting/system.ts
index ca20ab348..065cdae1f 100644
--- 
a/streampark-console/streampark-console-webapp/src/locales/lang/en/setting/system.ts
+++ 
b/streampark-console/streampark-console-webapp/src/locales/lang/en/setting/system.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 export default {
-  systemSetting: 'Environment Setting',
+  systemSetting: 'System Setting',
   systemSettingItems: {
     mavenSetting: {
       name: 'Maven Setting',
@@ -34,6 +34,69 @@ export default {
     },
   },
   update: {
-    success: 'setting updated successfully',
+    success: 'Setting updated successfully',
+    dockerNotStart: 'Please make sure your Docker service has been started. 🙂',
+  },
+  title: {
+    mavenSettings: 'Maven Settings File Path',
+    mavenRepository: 'Maven Central Repository',
+    mavenUser: 'Maven Central Repository Auth User',
+    mavenPassword: 'Maven Central Repository Auth Password',
+    docker: 'Docker Setting',
+    email: 'Alert Mailbox Setting',
+    ingress: 'Ingress domain address Setting',
+  },
+  desc: {
+    mavenSettings: 'Specify the full path to the local maven settings.xml',
+    mavenRepository: 'Maven central repository, Specify a repository address 
for maven.',
+    mavenUser: 'Maven central repository authentication username',
+    mavenPassword: 'Maven central repository authentication password',
+    docker: 'Docker container service settings',
+    email: 'Alert Mailbox settings used to sent alert email',
+    ingress: 'Automatically generate an nginx-based ingress by passing in a 
domain name',
+  },
+  docker: {
+    address: {
+      label: 'Docker Address',
+      desc: 'Docker container service address',
+    },
+    namespace: {
+      label: 'Docker namespace',
+      desc: 'Namespace for docker image used in docker building env and target 
image register',
+    },
+    userName: {
+      label: 'Docker Username',
+      desc: 'Docker container service authentication username',
+    },
+    password: {
+      label: 'Docker Password',
+      desc: 'Docker container service authentication password',
+    },
+  },
+  email: {
+    host: {
+      label: 'Smtp Host',
+      desc: 'Alert Mailbox Smtp Host',
+    },
+    port: {
+      label: 'Smtp Port',
+      desc: 'Smtp Port of the mailbox',
+    },
+    from: {
+      label: 'Email Address',
+      desc: 'Your email address used to send alert email',
+    },
+    userName: {
+      label: 'Email Username',
+      desc: 'Authentication username used to send email,generally: your email 
address',
+    },
+    password: {
+      label: 'Email Password',
+      desc: 'Authentication password used to send alert email',
+    },
+    ssl: {
+      label: 'SSL enable',
+      desc: 'Whether to enable SSL in the mailbox that sends the alert',
+    },
   },
 };
diff --git 
a/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/setting/system.ts
 
b/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/setting/system.ts
index 03c138c8e..b1e5232aa 100644
--- 
a/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/setting/system.ts
+++ 
b/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/setting/system.ts
@@ -18,10 +18,10 @@ export default {
   systemSetting: '系统设置',
   systemSettingItems: {
     mavenSetting: {
-      name: 'Maven配置',
+      name: 'Maven 配置',
     },
     dockerSetting: {
-      name: 'Docker环境配置',
+      name: 'Docker 环境配置',
     },
     emailSetting: {
       name: '邮箱配置',
@@ -35,5 +35,68 @@ export default {
   },
   update: {
     success: '设置更新成功!',
+    dockerNotStart: '依赖你本地的Docker服务,请确保本地Docker已启动. 🙂',
+  },
+  title: {
+    mavenSettings: 'Maven Settings 文件路径',
+    mavenRepository: 'Maven 仓库',
+    mavenUser: 'Maven 仓库访问用户',
+    mavenPassword: 'Maven 仓库访问密码',
+    docker: 'Docker 容器服务设置',
+    email: '告警邮箱设置',
+    ingress: 'Ingress 域名设置',
+  },
+  desc: {
+    mavenSettings: '指定本地 maven 的 settings.xml 文件完成路径',
+    mavenRepository: '设置 maven 的仓库地址,可以是 maven 私服的地址或者阿里云等 maven 私服地址',
+    mavenUser: '访问 maven 私服所需的认证用户名(如需要)',
+    mavenPassword: '访问 maven 私服所需的认证密码(如需要)',
+    docker: '设置 docker 容器服务的注册信息',
+    email: '设置用于发送告警的 email 发送者信息',
+    ingress: 'ingress 设置,通过传入域名自动生成基于 nginx 的 ingress',
+  },
+  docker: {
+    address: {
+      label: 'Docker 地址',
+      desc: 'Docker 容器的服务地址',
+    },
+    namespace: {
+      label: 'Docker 命名空间',
+      desc: 'Docker 构建环境和目标镜像注册使用的命名空间',
+    },
+    userName: {
+      label: 'Docker 用户名',
+      desc: 'Docker 容器服务认证用户名',
+    },
+    password: {
+      label: 'Docker 密码',
+      desc: 'Docker 容器服务认证密码',
+    },
+  },
+  email: {
+    host: {
+      label: '发送邮件服务器',
+      desc: '发送告警邮件的服务器 Smtp 主机',
+    },
+    port: {
+      label: '发送邮件Smtp端口',
+      desc: '告警邮箱 Smtp端口',
+    },
+    userName: {
+      label: '邮箱用户名',
+      desc: '发送告警邮件的用户名,一般是你的邮箱地址',
+    },
+    password: {
+      label: '邮箱密码',
+      desc: '用于发送告警邮件的认证密码',
+    },
+    from: {
+      label: '邮箱地址',
+      desc: '用于发送告警的邮箱',
+    },
+    ssl: {
+      label: '开启 SSL',
+      desc: '是否在发送告警邮箱中启用 SSL',
+    },
   },
 };
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/Alarm/View.vue 
b/streampark-console/streampark-console-webapp/src/views/setting/alarm/View.vue
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/Alarm/View.vue
rename to 
streampark-console/streampark-console-webapp/src/views/setting/alarm/View.vue
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/Alarm/components/AlertModal.vue
 
b/streampark-console/streampark-console-webapp/src/views/setting/alarm/components/AlertModal.vue
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/Alarm/components/AlertModal.vue
rename to 
streampark-console/streampark-console-webapp/src/views/setting/alarm/components/AlertModal.vue
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/Alarm/components/AlertTypeInfo.vue
 
b/streampark-console/streampark-console-webapp/src/views/setting/alarm/components/AlertTypeInfo.vue
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/Alarm/components/AlertTypeInfo.vue
rename to 
streampark-console/streampark-console-webapp/src/views/setting/alarm/components/AlertTypeInfo.vue
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/Alarm/components/DetailModal.vue
 
b/streampark-console/streampark-console-webapp/src/views/setting/alarm/components/DetailModal.vue
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/Alarm/components/DetailModal.vue
rename to 
streampark-console/streampark-console-webapp/src/views/setting/alarm/components/DetailModal.vue
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/Alarm/components/index.data.ts
 
b/streampark-console/streampark-console-webapp/src/views/setting/alarm/components/index.data.ts
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/Alarm/components/index.data.ts
rename to 
streampark-console/streampark-console-webapp/src/views/setting/alarm/components/index.data.ts
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/Alarm/components/index.ts
 
b/streampark-console/streampark-console-webapp/src/views/setting/alarm/components/index.ts
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/Alarm/components/index.ts
rename to 
streampark-console/streampark-console-webapp/src/views/setting/alarm/components/index.ts
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/system/SettingForm.vue
 
b/streampark-console/streampark-console-webapp/src/views/setting/system/SettingForm.vue
new file mode 100644
index 000000000..62a859f99
--- /dev/null
+++ 
b/streampark-console/streampark-console-webapp/src/views/setting/system/SettingForm.vue
@@ -0,0 +1,168 @@
+<!--
+  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
+
+      https://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.
+-->
+<script setup lang="ts">
+  import { computed, ref } from 'vue';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import {
+    fetchEmailConfig,
+    fetchEmailUpdate,
+    fetchDockerConfig,
+    fetchDockerUpdate,
+    fetchVerifyDocker,
+    fetchVerifyEmail,
+  } from '/@/api/setting';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { isNullOrUnDef } from '/@/utils/is';
+  import { settingFormSchema } from './config';
+  import { SvgIcon } from '/@/components/Icon';
+  import Swal from 'sweetalert2';
+
+  const emit = defineEmits(['success', 'register']);
+  const { createMessage } = useMessage();
+  const { t } = useI18n();
+  defineOptions({ name: 'DockerSetting' });
+
+  const settingConfig = ref<Recordable>({});
+  const type = ref('docker');
+  const title = computed(() => {
+    if (type.value == 'docker') return 
t('setting.system.systemSettingItems.dockerSetting.name');
+    if (type.value == 'email') return 
t('setting.system.systemSettingItems.emailSetting.name');
+    return '';
+  });
+  const [registerModal, { closeModal, changeLoading }] = useModalInner(async 
(data) => {
+    try {
+      changeLoading(true);
+      await resetFields();
+      type.value = data.type;
+
+      if (data.type === 'docker') {
+        settingConfig.value = await fetchDockerConfig();
+      } else if (data.type === 'email') {
+        settingConfig.value = await fetchEmailConfig();
+      }
+
+      await setFieldsValue(
+        Object.keys(settingConfig.value).reduce((pre, cur) => {
+          if (!isNullOrUnDef(settingConfig.value[cur])) pre[cur] = 
settingConfig.value[cur];
+          return pre;
+        }, {}),
+      );
+    } catch (error) {
+      console.error(error);
+    } finally {
+      changeLoading(false);
+    }
+  });
+  const [registerForm, { validate, setFieldsValue, resetFields }] = useForm({
+    colon: true,
+    labelWidth: 140,
+    name: 'SettingForm',
+    labelCol: { span: 8 },
+    wrapperCol: { span: 14 },
+    baseColProps: { span: 24 },
+    showActionButtonGroup: false,
+  });
+  const formSchemas = computed((): FormSchema[] => {
+    if (Reflect.has(settingFormSchema, type.value)) {
+      return settingFormSchema[type.value];
+    }
+    return Object.keys(settingConfig.value).map((key) => {
+      return {
+        field: key,
+        label: key,
+        component: 'Input',
+      };
+    });
+  });
+  async function handleOk() {
+    try {
+      const formData = await validate();
+      if (type.value === 'docker') {
+        const resp = await fetchVerifyDocker(formData);
+        switch (resp.status) {
+          case 200:
+            await fetchDockerUpdate(formData);
+            break;
+          case 400:
+            Swal.fire({
+              icon: 'error',
+              title: t('setting.system.update.dockerNotStart'),
+              showConfirmButton: true,
+              timer: 3500,
+            });
+            return;
+          case 500:
+            Swal.fire({
+              icon: 'error',
+              title: resp.msg,
+              showConfirmButton: true,
+              timer: 3500,
+            });
+            return;
+          default:
+            break;
+        }
+      }
+      if (type.value === 'email') {
+        const resp = await fetchVerifyEmail(formData);
+        if (resp.status === 200) {
+          await fetchEmailUpdate(formData);
+        } else {
+          Swal.fire({
+            icon: 'error',
+            title: resp.msg,
+            showConfirmButton: true,
+            timer: 3500,
+          });
+          return;
+        }
+      }
+      Swal.fire({
+        icon: 'success',
+        title: t('setting.system.update.success'),
+        showConfirmButton: false,
+        timer: 2000,
+      });
+      closeModal();
+      emit('success');
+    } catch (error) {
+      console.error(error);
+    }
+  }
+  async function afterClose() {
+    settingConfig.value = [];
+  }
+</script>
+
+<template>
+  <BasicModal
+    @register="registerModal"
+    :width="650"
+    @ok="handleOk"
+    :after-close="afterClose"
+    centered
+  >
+    <template #title>
+      <SvgIcon v-if="type === 'docker'" name="docker" size="20" 
class="ml-10px" />
+      <SvgIcon v-if="type === 'email'" name="mail" size="18" class="ml-10px" />
+      {{ title }}
+    </template>
+    <BasicForm @register="registerForm" :schemas="formSchemas" 
style="margin-top: 30px" />
+  </BasicModal>
+</template>
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/System/SettingList.vue
 
b/streampark-console/streampark-console-webapp/src/views/setting/system/SettingList.vue
similarity index 64%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/System/SettingList.vue
rename to 
streampark-console/streampark-console-webapp/src/views/setting/system/SettingList.vue
index f510b09fb..1d67ccf7c 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/setting/System/SettingList.vue
+++ 
b/streampark-console/streampark-console-webapp/src/views/setting/system/SettingList.vue
@@ -16,6 +16,7 @@
 -->
 <script lang="ts">
   import { defineComponent } from 'vue';
+  import { useModal } from '/@/components/Modal';
   export default defineComponent({
     name: 'MavenSetting',
   });
@@ -27,29 +28,43 @@
   import { fetchSystemSettingUpdate } from '/@/api/setting';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { useI18n } from '/@/hooks/web/useI18n';
+  import SettingForm from './SettingForm.vue';
+
+  const { t } = useI18n();
 
   const AvatarMap = {
-    'streampark.maven.settings': 'settings',
+    'streampark.maven.settings': 'settings2',
     'streampark.maven.central.repository': 'maven',
     'streampark.maven.auth.user': 'user',
     'streampark.maven.auth.password': 'mvnpass',
     'docker.register.address': 'docker',
-    'docker.register.namespace': 'namespace',
-    'docker.register.user': 'auth',
-    'docker.register.password': 'password',
-    'alert.email.host': 'host',
-    'alert.email.port': 'port',
     'alert.email.from': 'mail',
-    'alert.email.userName': 'user',
-    'alert.email.password': 'keys',
-    'alert.email.ssl': 'ssl',
-    'ingress.mode.default': 'settings',
+    'ingress.mode.default': 'nginx',
+  };
+
+  const settingTitles = {
+    'streampark.maven.settings': t('setting.system.title.mavenSettings'),
+    'streampark.maven.central.repository': 
t('setting.system.title.mavenRepository'),
+    'streampark.maven.auth.user': t('setting.system.title.mavenUser'),
+    'streampark.maven.auth.password': t('setting.system.title.mavenPassword'),
+    'docker.register.address': t('setting.system.title.docker'),
+    'alert.email.from': t('setting.system.title.email'),
+    'ingress.mode.default': t('setting.system.title.ingress'),
+  };
+
+  const settingDesc = {
+    'streampark.maven.settings': t('setting.system.desc.mavenSettings'),
+    'streampark.maven.central.repository': 
t('setting.system.desc.mavenRepository'),
+    'streampark.maven.auth.user': t('setting.system.desc.mavenUser'),
+    'streampark.maven.auth.password': t('setting.system.desc.mavenPassword'),
+    'docker.register.address': t('setting.system.desc.docker'),
+    'alert.email.from': t('setting.system.desc.email'),
+    'ingress.mode.default': t('setting.system.desc.ingress'),
   };
 
   const ListItem = List.Item;
   const ListItemMeta = ListItem.Meta;
 
-  const { t } = useI18n();
   const emits = defineEmits(['updateValue', 'reload']);
   defineProps({
     data: {
@@ -63,15 +78,26 @@
   });
 
   const { createMessage } = useMessage();
+  const [registerModal, { openModal }] = useModal();
   function handleSwitch(record: SystemSetting) {
     emits('updateValue', record);
   }
   /* edit input */
   function handleEdit(record: SystemSetting) {
-    if (!record.editable) {
-      record.submitting = true;
+    if (record.settingKey.startsWith('docker.register')) {
+      openModal(true, {
+        type: 'docker',
+      });
+    } else if (record.settingKey.startsWith('alert.email')) {
+      openModal(true, {
+        type: 'email',
+      });
+    } else {
+      if (!record.editable) {
+        record.submitting = true;
+      }
+      record.editable = !record.editable;
     }
-    record.editable = !record.editable;
   }
   /* edit commit */
   async function handleSubmit(record: SystemSetting) {
@@ -88,9 +114,15 @@
 
 <template>
   <List>
-    <template v-for="item in data" :key="item.settingKey">
-      <ListItem>
-        <ListItemMeta :title="item.settingName" 
:description="item.description" style="width: 50%">
+    <template v-for="item in data">
+      <ListItem v-if="AvatarMap[item.settingKey]" :key="item.settingKey">
+        <ListItemMeta style="width: 50%">
+          <template #title>
+            {{ settingTitles[item.settingKey] }}
+          </template>
+          <template #description>
+            {{ settingDesc[item.settingKey] }}
+          </template>
           <template #avatar>
             <div class="avatar">
               <SvgIcon :name="AvatarMap[item.settingKey]" />
@@ -127,14 +159,19 @@
         <template #actions>
           <div v-if="item.type === 1" v-auth="'setting:update'">
             <a v-if="!item.submitting" @click="handleEdit(item)">
-              {{ t('common.edit') }}
+              <a-button type="primary" shape="circle">
+                <SvgIcon name="edit" />
+              </a-button>
             </a>
             <a v-else @click="handleSubmit(item)">
-              {{ t('common.submitText') }}
+              <a-button type="primary" shape="circle">
+                <SvgIcon name="save" />
+              </a-button>
             </a>
           </div>
         </template>
       </ListItem>
     </template>
   </List>
+  <SettingForm @register="registerModal" @success="emits('reload')" />
 </template>
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/System/View.vue
 
b/streampark-console/streampark-console-webapp/src/views/setting/system/View.vue
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/System/View.vue
rename to 
streampark-console/streampark-console-webapp/src/views/setting/system/View.vue
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/system/config.ts
 
b/streampark-console/streampark-console-webapp/src/views/setting/system/config.ts
new file mode 100644
index 000000000..f8aa94850
--- /dev/null
+++ 
b/streampark-console/streampark-console-webapp/src/views/setting/system/config.ts
@@ -0,0 +1,138 @@
+/*
+ * 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
+ *
+ *    https://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 { FormSchema } from '/@/components/Form';
+import { useI18n } from '/@/hooks/web/useI18n';
+
+export type SettingType = 'docker' | 'email';
+
+type SettingForm = {
+  [P in SettingType]: FormSchema[];
+};
+
+const { t } = useI18n();
+export const settingFormSchema: SettingForm = {
+  docker: [
+    {
+      field: 'address',
+      label: t('setting.system.docker.address.label'),
+      helpMessage: t('setting.system.docker.address.desc'),
+      component: 'Input',
+      componentProps: {
+        placeholder: t('setting.system.docker.address.label'),
+      },
+      required: true,
+    },
+    {
+      field: 'namespace',
+      label: t('setting.system.docker.namespace.label'),
+      helpMessage: t('setting.system.docker.namespace.desc'),
+      component: 'Input',
+      componentProps: {
+        placeholder: t('setting.system.docker.namespace.label'),
+      },
+      required: true,
+    },
+    {
+      field: 'userName',
+      label: t('setting.system.docker.userName.label'),
+      helpMessage: t('setting.system.docker.userName.desc'),
+      component: 'Input',
+      componentProps: {
+        placeholder: t('setting.system.docker.userName.label'),
+      },
+      required: true,
+    },
+    {
+      field: 'password',
+      label: t('setting.system.docker.password.label'),
+      helpMessage: t('setting.system.docker.password.desc'),
+      component: 'InputPassword',
+      componentProps: {
+        autocomplete: 'new-password',
+        placeholder: t('setting.system.docker.password.label'),
+      },
+      required: true,
+    },
+  ],
+  email: [
+    {
+      field: 'host',
+      label: t('setting.system.email.host.label'),
+      helpMessage: t('setting.system.email.host.desc'),
+      component: 'Input',
+      componentProps: {
+        placeholder: t('setting.system.email.host.label'),
+      },
+      required: true,
+    },
+    {
+      field: 'port',
+      label: t('setting.system.email.port.label'),
+      helpMessage: t('setting.system.email.port.desc'),
+      component: 'InputNumber',
+      componentProps: {
+        class: '!w-full',
+        controls: false,
+        min: 0,
+        max: 65535,
+        placeholder: t('setting.system.email.port.label'),
+      },
+      required: true,
+    },
+    {
+      field: 'from',
+      label: t('setting.system.email.from.label'),
+      helpMessage: t('setting.system.email.from.desc'),
+      component: 'Input',
+      componentProps: {
+        placeholder: t('setting.system.email.from.label'),
+      },
+      required: true,
+    },
+    {
+      field: 'userName',
+      label: t('setting.system.email.userName.label'),
+      helpMessage: t('setting.system.email.userName.desc'),
+      component: 'Input',
+      componentProps: {
+        placeholder: t('setting.system.email.userName.label'),
+      },
+      required: true,
+    },
+    {
+      field: 'password',
+      label: t('setting.system.email.password.label'),
+      helpMessage: t('setting.system.email.password.label'),
+      component: 'InputPassword',
+      componentProps: {
+        autocomplete: 'new-password',
+        placeholder: t('setting.system.email.password.label'),
+      },
+      required: true,
+    },
+    {
+      field: 'ssl',
+      label: t('setting.system.email.ssl.label'),
+      helpMessage: t('setting.system.email.ssl.label'),
+      component: 'Switch',
+      componentProps: {
+        checkedChildren: 'ON',
+        unCheckedChildren: 'OFF',
+      },
+    },
+  ],
+};
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/YarnQueue/View.vue
 
b/streampark-console/streampark-console-webapp/src/views/setting/yarnqueue/View.vue
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/YarnQueue/View.vue
rename to 
streampark-console/streampark-console-webapp/src/views/setting/yarnqueue/View.vue
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/YarnQueue/YarnQueueDrawer.vue
 
b/streampark-console/streampark-console-webapp/src/views/setting/yarnqueue/YarnQueueDrawer.vue
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/YarnQueue/YarnQueueDrawer.vue
rename to 
streampark-console/streampark-console-webapp/src/views/setting/yarnqueue/YarnQueueDrawer.vue
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/YarnQueue/index.data.ts
 
b/streampark-console/streampark-console-webapp/src/views/setting/yarnqueue/index.data.ts
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/YarnQueue/index.data.ts
rename to 
streampark-console/streampark-console-webapp/src/views/setting/yarnqueue/index.data.ts
diff --git 
a/streampark-console/streampark-console-webapp/src/views/setting/YarnQueue/useYarnQueueRender.tsx
 
b/streampark-console/streampark-console-webapp/src/views/setting/yarnqueue/useYarnQueueRender.tsx
similarity index 100%
rename from 
streampark-console/streampark-console-webapp/src/views/setting/YarnQueue/useYarnQueueRender.tsx
rename to 
streampark-console/streampark-console-webapp/src/views/setting/yarnqueue/useYarnQueueRender.tsx

Reply via email to