From 2a7677e9f8da902831a7b5bd09bcf7fb51080c09 Mon Sep 17 00:00:00 2001 From: engigu Date: Fri, 27 Mar 2026 15:23:32 +0800 Subject: [PATCH] chore: secret web constat define --- web/src/constants/index.ts | 6 +++ web/src/views/environments/Environments.vue | 50 ++++++++++++--------- web/src/views/tasks/TaskDialog.vue | 6 +-- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/web/src/constants/index.ts b/web/src/constants/index.ts index 5c78577..d8f892a 100644 --- a/web/src/constants/index.ts +++ b/web/src/constants/index.ts @@ -45,3 +45,9 @@ export const AGENT_STATUS = { ONLINE: 'online', OFFLINE: 'offline', } as const + +// 环境变量类型 +export const ENV_TYPE = { + NORMAL: 'normal', + SECRET: 'secret', +} as const diff --git a/web/src/views/environments/Environments.vue b/web/src/views/environments/Environments.vue index 9f2e223..eaea4bf 100644 --- a/web/src/views/environments/Environments.vue +++ b/web/src/views/environments/Environments.vue @@ -14,6 +14,7 @@ import { toast } from 'vue-sonner' import { useSiteSettings } from '@/composables/useSiteSettings' import { Switch } from '@/components/ui/switch' import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { ENV_TYPE } from '@/constants' const { pageSize } = useSiteSettings() @@ -35,7 +36,7 @@ let textareaResizeObserver: ResizeObserver | null = null const filterName = ref('') const currentPage = ref(1) const total = ref(0) -const activeTab = ref('normal') +const activeTab = ref(ENV_TYPE.NORMAL) const isSecretSet = ref(true) let searchTimer: ReturnType | null = null @@ -74,8 +75,11 @@ function handleSearch() { }, 300) } -watch(activeTab, () => { +watch(activeTab, (val) => { currentPage.value = 1 + if (val === ENV_TYPE.SECRET) { + checkSecretStatus() + } loadEnvVars() }) @@ -139,10 +143,10 @@ async function saveEnv() { try { if (isEdit.value && editingEnv.value.id) { await api.env.update(editingEnv.value.id, editingEnv.value) - toast.success(editingEnv.value.type === 'secret' ? '机密已更新' : '变量已更新') + toast.success(editingEnv.value.type === ENV_TYPE.SECRET ? '机密已更新' : '变量已更新') } else { await api.env.create(editingEnv.value) - toast.success(editingEnv.value.type === 'secret' ? '机密已创建' : '变量已创建') + toast.success(editingEnv.value.type === ENV_TYPE.SECRET ? '机密已创建' : '变量已创建') } showDialog.value = false loadEnvVars() @@ -175,7 +179,7 @@ async function deleteEnv(force = false) { isDeleting.value = false return } - toast.success(activeTab.value === 'secret' ? '机密已删除' : '变量已删除') + toast.success(activeTab.value === ENV_TYPE.SECRET ? '机密已删除' : '变量已删除') loadEnvVars() showDeleteDialog.value = false } catch { @@ -230,7 +234,9 @@ function maskValue(value: string) { } onMounted(() => { - checkSecretStatus() + if (activeTab.value === ENV_TYPE.SECRET) { + checkSecretStatus() + } loadEnvVars() }) @@ -253,8 +259,8 @@ onBeforeUnmount(() => { - @@ -293,7 +299,7 @@ onBeforeUnmount(() => {
- {{ activeTab === 'secret' ? '暂无机密' : '暂无环境变量' }} + {{ activeTab === ENV_TYPE.SECRET ? '暂无机密' : '暂无环境变量' }}
@@ -334,8 +340,8 @@ onBeforeUnmount(() => { - {{ isEdit ? (editingEnv.type === 'secret' ? '更新机密' : '编辑变量') : (editingEnv.type === 'secret' ? '新建机密' : '新建变量') }} -
+ {{ isEdit ? (editingEnv.type === ENV_TYPE.SECRET ? '更新机密' : '编辑变量') : (editingEnv.type === ENV_TYPE.SECRET ? '新建机密' : '新建变量') }} +

机密会在保存后得到强加密保护,且仅在计划任务定时执行时才会被注入环境。终端命令、调试运行、测试运行均无法获取机密内容。在执行日志内,机密文本会被自动打码。

@@ -343,13 +349,13 @@ onBeforeUnmount(() => {
- - + +
@@ -359,7 +365,7 @@ onBeforeUnmount(() => { ref="valueTextareaRef" v-model="editingEnv.value" rows="5" - :placeholder="editingEnv.type === 'secret' && isEdit ? '' : (editingEnv.type === 'secret' ? '输入机密内容...' : '输入变量内容...')" + :placeholder="editingEnv.type === ENV_TYPE.SECRET && isEdit ? '' : (editingEnv.type === ENV_TYPE.SECRET ? '输入机密内容...' : '输入变量内容...')" class="max-h-40 min-h-16 w-full min-w-0 resize-none overflow-x-hidden bg-transparent pl-2 pr-3 py-2 font-mono placeholder:font-sans text-sm leading-6 break-all whitespace-pre-wrap outline-none" @scroll="syncValueLineNumbers" /> @@ -377,14 +383,14 @@ onBeforeUnmount(() => {
-