From daaef316e9f7768b7a2097e519dfc0c3e23ce0c8 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Wed, 25 Jun 2025 23:52:44 +0200 Subject: [PATCH] Other translations --- .../src/components/cron-editor/index.vue | 158 +-- .../src/locales/langs/en-US/certd.ts | 89 ++ .../src/locales/langs/en-US/common.json | 22 - .../src/locales/langs/en-US/common.ts | 22 + .../src/locales/langs/en-US/index.ts | 4 +- .../src/locales/langs/zh-CN/certd.ts | 89 ++ .../src/locales/langs/zh-CN/common.json | 22 - .../src/locales/langs/zh-CN/common.ts | 22 + .../src/locales/langs/zh-CN/index.ts | 4 +- .../certd-client/src/router/source/header.ts | 65 +- .../src/router/source/modules/about.tsx | 34 +- .../src/views/certd/monitor/site/crud.tsx | 1000 +++++++++-------- .../src/views/certd/monitor/site/index.vue | 72 +- .../src/views/certd/monitor/site/use.tsx | 71 +- .../notification-selector/index.vue | 180 ++- .../views/certd/pipeline/certd-form/use.tsx | 603 +++++----- .../pi-notification-form-email.vue | 79 +- .../pipeline/component/trigger-form/index.vue | 332 +++--- 18 files changed, 1540 insertions(+), 1328 deletions(-) delete mode 100644 packages/ui/certd-client/src/locales/langs/en-US/common.json create mode 100644 packages/ui/certd-client/src/locales/langs/en-US/common.ts delete mode 100644 packages/ui/certd-client/src/locales/langs/zh-CN/common.json create mode 100644 packages/ui/certd-client/src/locales/langs/zh-CN/common.ts diff --git a/packages/ui/certd-client/src/components/cron-editor/index.vue b/packages/ui/certd-client/src/components/cron-editor/index.vue index 3b2956a23..c411b4de0 100644 --- a/packages/ui/certd-client/src/components/cron-editor/index.vue +++ b/packages/ui/certd-client/src/components/cron-editor/index.vue @@ -1,120 +1,132 @@ + diff --git a/packages/ui/certd-client/src/locales/langs/en-US/certd.ts b/packages/ui/certd-client/src/locales/langs/en-US/certd.ts index 2b17721d7..b28cdb3c7 100644 --- a/packages/ui/certd-client/src/locales/langs/en-US/certd.ts +++ b/packages/ui/certd-client/src/locales/langs/en-US/certd.ts @@ -185,4 +185,93 @@ export default { download: { title: "Download Certificate" }, + source: "Source Code", + github: "GitHub", + gitee: "Gitee", + cron: { + clearTip: "Clear Selection", + nextTrigger: "Next Trigger Time", + tip: "Please set a valid cron expression first" + }, + cronForm: { + title: "Scheduled Script", + helper: "Click the button above to select the time for daily execution.\nIt is recommended to run once a day. Tasks will be skipped if the certificate is not expiring.", + required: "This field is required" + }, + email: { + title: "Recipient Email", + helper: "Enter your recipient email addresses. Multiple addresses are supported.", + required: "This field is required" + }, + plugin: { + selectTitle: "Certificate Apply Plugin", + jsAcme: "JS-ACME: Easy to use, powerful features [Recommended]", + legoAcme: "Lego-ACME: Based on Lego, supports a wide range of DNS providers, suitable for users familiar with Lego" + }, + pipelineForm: { + createTitle: "Create Certificate Pipeline", + moreParams: "More Parameters", + triggerCronTitle: "Scheduled Trigger", + triggerCronHelper: + "Click the button above to choose a daily execution time.\nIt is recommended to trigger once per day. The task will be skipped if the certificate has not expired and will not be executed repeatedly.", + notificationTitle: "Failure Notification", + notificationHelper: "Get real-time alerts when the task fails", + groupIdTitle: "Pipeline Group" + }, + notificationDefault: "Use Default Notification", + monitor: { + title: "Site Certificate Monitoring", + description: "Check website certificates' expiration at 0:00 daily; reminders sent 10 days before expiration (using default notification channel);", + settingLink: "Site Monitoring Settings", + limitInfo: "Basic edition limited to 1, professional and above unlimited, current", + checkAll: "Check All", + confirmTitle: "Confirm", + confirmContent: "Confirm to trigger check for all site certificates?", + checkSubmitted: "Check task submitted", + pleaseRefresh: "Please refresh the page later to see the results", + siteName: "Site Name", + enterSiteName: "Please enter the site name", + domain: "Domain", + enterDomain: "Please enter the domain", + enterValidDomain: "Please enter a valid domain", + httpsPort: "HTTPS Port", + enterPort: "Please enter the port", + certInfo: "Certificate Info", + issuer: "Issuer", + certDomains: "Certificate Domains", + certProvider: "Issuer", + certStatus: "Certificate Status", + status: { + ok: "Valid", + expired: "Expired", + }, + certExpiresTime: "Certificate Expiration", + expired: "expired", + days: "days", + lastCheckTime: "Last Check Time", + disabled: "Enable/Disable", + ipCheck: "Enable IP Check", + selectRequired: "Please select", + ipCheckConfirm: "Are you sure to {status} IP check?", + ipCount: "IP Count", + checkStatus: "Check Status", + pipelineId: "Linked Pipeline ID", + certInfoId: "Certificate ID", + checkSubmittedRefresh: "Check task submitted. Please refresh later to view the result.", + ipManagement: "IP Management", + bulkImport: "Bulk Import", + basicLimitError: "Basic version allows only one monitoring site. Please upgrade to the Pro version.", + limitExceeded: "Sorry, you can only create up to {max} monitoring records. Please purchase or upgrade your plan.", + }, + checkStatus: { + success: "Success", + checking: "Checking", + error: "Error", + }, + domainList: { + title: "Domain List", + helper: "Format: domain:port:name, one per line. Port and name are optional.\nExamples:\nwww.baidu.com:443:Baidu\nwww.taobao.com::Taobao\nwww.google.com", + required: "Please enter domains to import", + placeholder: "www.baidu.com:443:Baidu\nwww.taobao.com::Taobao\nwww.google.com\n", + }, }; diff --git a/packages/ui/certd-client/src/locales/langs/en-US/common.json b/packages/ui/certd-client/src/locales/langs/en-US/common.json deleted file mode 100644 index 440af82b5..000000000 --- a/packages/ui/certd-client/src/locales/langs/en-US/common.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "back": "Back", - "backToHome": "Back To Home", - "login": "Login", - "logout": "Logout", - "prompt": "Prompt", - "cancel": "Cancel", - "confirm": "Confirm", - "reset": "Reset", - "noData": "No Data", - "refresh": "Refresh", - "loadingMenu": "Loading Menu", - "query": "Search", - "search": "Search", - "enabled": "Enabled", - "disabled": "Disabled", - "edit": "Edit", - "delete": "Delete", - "create": "Create", - "yes": "Yes", - "no": "No" -} diff --git a/packages/ui/certd-client/src/locales/langs/en-US/common.ts b/packages/ui/certd-client/src/locales/langs/en-US/common.ts new file mode 100644 index 000000000..011f0b4ae --- /dev/null +++ b/packages/ui/certd-client/src/locales/langs/en-US/common.ts @@ -0,0 +1,22 @@ +export default { + "back": "Back", + "backToHome": "Back To Home", + "login": "Login", + "logout": "Logout", + "prompt": "Prompt", + "cancel": "Cancel", + "confirm": "Confirm", + "reset": "Reset", + "noData": "No Data", + "refresh": "Refresh", + "loadingMenu": "Loading Menu", + "query": "Search", + "search": "Search", + "enabled": "Enabled", + "disabled": "Disabled", + "edit": "Edit", + "delete": "Delete", + "create": "Create", + "yes": "Yes", + "no": "No" +} diff --git a/packages/ui/certd-client/src/locales/langs/en-US/index.ts b/packages/ui/certd-client/src/locales/langs/en-US/index.ts index 61bd35d0c..1630ca982 100644 --- a/packages/ui/certd-client/src/locales/langs/en-US/index.ts +++ b/packages/ui/certd-client/src/locales/langs/en-US/index.ts @@ -5,6 +5,7 @@ import tutorial from './tutorial'; import preferences from './preferences'; import ui from './ui'; import guide from './guide'; +import common from './common'; export default { certd, @@ -13,5 +14,6 @@ export default { ui, tutorial, preferences, - guide + guide, + common }; \ No newline at end of file diff --git a/packages/ui/certd-client/src/locales/langs/zh-CN/certd.ts b/packages/ui/certd-client/src/locales/langs/zh-CN/certd.ts index 412efb934..c7a4a4255 100644 --- a/packages/ui/certd-client/src/locales/langs/zh-CN/certd.ts +++ b/packages/ui/certd-client/src/locales/langs/zh-CN/certd.ts @@ -191,4 +191,93 @@ export default { download: { title: "下载证书" }, + source: "源码", + github: "github", + gitee: "gitee", + cron: { + clearTip: "清除选择", + nextTrigger: "下次触发时间", + tip: "请先设置正确的cron表达式" + }, + cronForm: { + title: "定时脚本", + helper: "点击上面的按钮,选择每天几点定时执行。\n建议设置为每天触发一次,证书未到期之前任务会跳过,不会重复执行", + required: "此项必填" + }, + email: { + title: "收件邮箱", + helper: "输入你的收件邮箱地址,支持多个邮箱", + required: "此项必填" + }, + plugin: { + selectTitle: "证书申请插件", + jsAcme: "JS-ACME:使用简单方便,功能强大【推荐】", + legoAcme: "Lego-ACME:基于Lego实现,支持海量DNS提供商,熟悉LEGO的用户可以使用" + }, + pipelineForm: { + createTitle: "创建证书流水线", + moreParams: "更多参数", + triggerCronTitle: "定时触发", + triggerCronHelper: + "点击上面的按钮,选择每天几点定时执行。\n建议设置为每天触发一次,证书未到期之前任务会跳过,不会重复执行", + notificationTitle: "失败通知", + notificationHelper: "任务执行失败实时提醒", + groupIdTitle: "流水线分组" + }, + notificationDefault: "使用默认通知", + monitor: { + title: "站点证书监控", + description: "每天0点,检查网站证书的过期时间,到期前10天时将发出提醒(使用默认通知渠道);", + settingLink: "站点监控设置", + limitInfo: "基础版限制1条,专业版以上无限制,当前", + checkAll: "检查全部", + confirmTitle: "确认", + confirmContent: "确认触发检查全部站点证书吗?", + checkSubmitted: "检查任务已提交", + pleaseRefresh: "请稍后刷新页面查看结果", + siteName: "站点名称", + enterSiteName: "请输入站点名称", + domain: "网站域名", + enterDomain: "请输入域名", + enterValidDomain: "请输入正确的域名", + httpsPort: "HTTPS端口", + enterPort: "请输入端口", + certInfo: "证书信息", + issuer: "证书颁发机构", + certDomains: "证书域名", + certProvider: "颁发机构", + certStatus: "证书状态", + status: { + ok: "正常", + expired: "过期", + }, + certExpiresTime: "证书到期时间", + expired: "过期", + days: "天", + lastCheckTime: "上次检查时间", + disabled: "禁用启用", + ipCheck: "开启IP检查", + selectRequired: "请选择", + ipCheckConfirm: "确定{status}IP检查?", + ipCount: "IP数量", + checkStatus: "检查状态", + pipelineId: "关联流水线ID", + certInfoId: "证书ID", + checkSubmittedRefresh: "检查任务已提交,请稍后刷新查看结果", + ipManagement: "IP管理", + bulkImport: "批量导入", + basicLimitError: "基础版只能添加一个监控站点,请赞助升级专业版", + limitExceeded: "对不起,您最多只能创建条{max}监控记录,请购买或升级套餐", + }, + checkStatus: { + success: "成功", + checking: "检查中", + error: "异常", + }, + domainList: { + title: "域名列表", + helper: "格式【域名:端口:名称】,一行一个,其中端口、名称可以省略\n比如:\nwww.baidu.com:443:百度\nwww.taobao.com::淘宝\nwww.google.com", + required: "请输入要导入的域名", + placeholder: "www.baidu.com:443:百度\nwww.taobao.com::淘宝\nwww.google.com\n", + }, }; diff --git a/packages/ui/certd-client/src/locales/langs/zh-CN/common.json b/packages/ui/certd-client/src/locales/langs/zh-CN/common.json deleted file mode 100644 index 95ec5f7d5..000000000 --- a/packages/ui/certd-client/src/locales/langs/zh-CN/common.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "back": "返回", - "backToHome": "返回首页", - "login": "登录", - "logout": "退出登录", - "prompt": "提示", - "cancel": "取消", - "confirm": "确认", - "reset": "重置", - "noData": "暂无数据", - "refresh": "刷新", - "loadingMenu": "加载菜单中", - "query": "查询", - "search": "搜索", - "enabled": "已启用", - "disabled": "已禁用", - "edit": "修改", - "delete": "删除", - "create": "新增", - "yes": "是", - "no": "否" -} diff --git a/packages/ui/certd-client/src/locales/langs/zh-CN/common.ts b/packages/ui/certd-client/src/locales/langs/zh-CN/common.ts new file mode 100644 index 000000000..29516ad9c --- /dev/null +++ b/packages/ui/certd-client/src/locales/langs/zh-CN/common.ts @@ -0,0 +1,22 @@ +export default { + "back": "返回", + "backToHome": "返回首页", + "login": "登录", + "logout": "退出登录", + "prompt": "提示", + "cancel": "取消", + "confirm": "确认", + "reset": "重置", + "noData": "暂无数据", + "refresh": "刷新", + "loadingMenu": "加载菜单中", + "query": "查询", + "search": "搜索", + "enabled": "已启用", + "disabled": "已禁用", + "edit": "修改", + "delete": "删除", + "create": "新增", + "yes": "是", + "no": "否" +} diff --git a/packages/ui/certd-client/src/locales/langs/zh-CN/index.ts b/packages/ui/certd-client/src/locales/langs/zh-CN/index.ts index 61bd35d0c..1630ca982 100644 --- a/packages/ui/certd-client/src/locales/langs/zh-CN/index.ts +++ b/packages/ui/certd-client/src/locales/langs/zh-CN/index.ts @@ -5,6 +5,7 @@ import tutorial from './tutorial'; import preferences from './preferences'; import ui from './ui'; import guide from './guide'; +import common from './common'; export default { certd, @@ -13,5 +14,6 @@ export default { ui, tutorial, preferences, - guide + guide, + common }; \ No newline at end of file diff --git a/packages/ui/certd-client/src/router/source/header.ts b/packages/ui/certd-client/src/router/source/header.ts index 26b962207..f7bd939ed 100644 --- a/packages/ui/certd-client/src/router/source/header.ts +++ b/packages/ui/certd-client/src/router/source/header.ts @@ -1,33 +1,36 @@ +import i18n from '/@/locales/i18n'; + export const headerResource = [ - { - title: "文档", - path: "https://certd.docmirror.cn", - meta: { - icon: "ion:document-text-outline" - } - }, - { - title: "源码", - name: "source", - key: "source", - meta: { - icon: "ion:git-branch-outline" - }, - children: [ - { - title: "github", - path: "https://github.com/certd/certd", - meta: { - icon: "ion:logo-github" - } - }, - { - title: "gitee", - path: "https://gitee.com/certd/certd", - meta: { - icon: "ion:logo-octocat" - } - } - ] - } + { + title: i18n.global.t("certd.helpDoc"), + path: "https://certd.docmirror.cn", + meta: { + icon: "ion:document-text-outline" + } + }, + { + title: i18n.global.t("certd.source"), + name: "source", + key: "source", + meta: { + icon: "ion:git-branch-outline" + }, + children: [ + { + title: i18n.global.t("certd.github"), + path: "https://github.com/certd/certd", + meta: { + icon: "ion:logo-github" + } + }, + { + title: i18n.global.t("certd.gitee"), + path: "https://gitee.com/certd/certd", + meta: { + icon: "ion:logo-octocat" + } + } + ] + } ]; + diff --git a/packages/ui/certd-client/src/router/source/modules/about.tsx b/packages/ui/certd-client/src/router/source/modules/about.tsx index a2ca004e8..8056b5480 100644 --- a/packages/ui/certd-client/src/router/source/modules/about.tsx +++ b/packages/ui/certd-client/src/router/source/modules/about.tsx @@ -2,23 +2,25 @@ import { IFrameView } from "/@/vben/layouts"; import { useSettingStore } from "/@/store/settings"; import { computed } from "vue"; import TutorialButton from "/@/components/tutorial/index.vue"; +import i18n from '/@/locales/i18n'; + export const aboutResource = [ - { - title: "文档", - name: "document", - path: "/about/doc", - component: IFrameView, - meta: { - icon: "lucide:book-open-text", - link: "https://certd.docmirror.cn", - title: "文档", - order: 9999, - show: () => { - const settingStore = useSettingStore(); - return !settingStore.isComm; - }, - }, - }, + { + title: i18n.global.t("certd.dashboard.helpDoc"), + name: "document", + path: "/about/doc", + component: IFrameView, + meta: { + icon: "lucide:book-open-text", + link: "https://certd.docmirror.cn", + title: i18n.global.t("certd.dashboard.helpDoc"), + order: 9999, + show: () => { + const settingStore = useSettingStore(); + return !settingStore.isComm; + }, + }, + }, ]; export default aboutResource; diff --git a/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx b/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx index 5607d9c98..27b1fab3a 100644 --- a/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx @@ -11,505 +11,513 @@ import { useSiteIpMonitor } from "./ip/use"; import { useSiteImport } from "/@/views/certd/monitor/site/use"; export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { - const { t } = useI18n(); - const api = siteInfoApi; - const { crudBinding } = crudExpose; - const pageRequest = async (query: UserPageQuery): Promise => { - return await api.GetList(query); - }; - const editRequest = async (req: EditReq) => { - const { form, row } = req; - form.id = row.id; - const res = await api.UpdateObj(form); - return res; - }; - const delRequest = async (req: DelReq) => { - const { row } = req; - return await api.DelObj(row.id); - }; + const { t } = useI18n(); + const api = siteInfoApi; + const { crudBinding } = crudExpose; + const pageRequest = async (query: UserPageQuery): Promise => { + return await api.GetList(query); + }; + const editRequest = async (req: EditReq) => { + const { form, row } = req; + form.id = row.id; + const res = await api.UpdateObj(form); + return res; + }; + const delRequest = async (req: DelReq) => { + const { row } = req; + return await api.DelObj(row.id); + }; - const addRequest = async (req: AddReq) => { - const { form } = req; - const res = await api.AddObj(form); - return res; - }; + const addRequest = async (req: AddReq) => { + const { form } = req; + const res = await api.AddObj(form); + return res; + }; - const settingsStore = useSettingStore(); + const settingsStore = useSettingStore(); - const checkStatusDict = dict({ - data: [ - { label: "成功", value: "ok", color: "green" }, - { label: "检查中", value: "checking", color: "blue" }, - { label: "异常", value: "error", color: "red" }, - ], - }); + const checkStatusDict = dict({ + data: [ + { label: t("checkStatus.success"), value: "ok", color: "green" }, + { label: t("checkStatus.checking"), value: "checking", color: "blue" }, + { label: t("checkStatus.error"), value: "error", color: "red" }, + ], + }); - const { openSiteIpMonitorDialog } = useSiteIpMonitor(); - const { openSiteImportDialog } = useSiteImport(); - return { - crudOptions: { - request: { - pageRequest, - addRequest, - editRequest, - delRequest, - }, - form: { - labelCol: { - //固定label宽度 - span: null, - style: { - width: "100px", - }, - }, - col: { - span: 22, - }, - wrapper: { - width: 600, - }, - }, - actionbar: { - buttons: { - add: { - async click() { - if (!settingsStore.isPlus) { - //非plus - if (crudBinding.value.data.length >= 1) { - notification.error({ - message: "基础版只能添加一个监控站点,请赞助升级专业版", - }); - mitter.emit("openVipModal"); - return; - } - } - //检查是否监控站点数量超出限制 - if (settingsStore.isComm && settingsStore.suiteSetting.enabled) { - //检查数量是否超限 - const suiteDetail = await mySuiteApi.SuiteDetailGet(); - const max = suiteDetail.monitorCount.max; - if (max != -1 && max <= suiteDetail.monitorCount.used) { - notification.error({ - message: `对不起,您最多只能创建条${max}监控记录,请购买或升级套餐`, - }); - return; - } - } - await crudExpose.openAdd({}); - }, - }, - //导入按钮 - import: { - show: true, - text: "批量导入", - type: "primary", - async click() { - openSiteImportDialog({ - afterSubmit() { - crudExpose.doRefresh(); - }, - }); - }, - }, - }, - }, - rowHandle: { - fixed: "right", - width: 240, - buttons: { - check: { - order: 0, - type: "link", - text: null, - tooltip: { - title: "立即检查", - }, - icon: "ion:play-sharp", - click: async ({ row }) => { - await api.DoCheck(row.id); - await crudExpose.doRefresh(); - notification.success({ - message: "检查任务已提交,请稍后刷新查看结果", - }); - }, - }, - ipCheck: { - order: 10, - type: "link", - text: null, - show: compute(({ row }) => { - return row.ipCheck === true; - }), - tooltip: { - title: "IP管理", - }, - icon: "entypo:address", - click: async ({ row }) => { - openSiteIpMonitorDialog({ siteId: row.id }); - }, - }, - }, - }, - tabs: { - name: "disabled", - show: true, - }, - columns: { - id: { - title: "ID", - key: "id", - type: "number", - search: { - show: false, - }, - column: { - width: 80, - align: "center", - }, - form: { - show: false, - }, - }, - name: { - title: "站点名称", - search: { - show: true, - }, - type: "text", - form: { - rules: [{ required: true, message: "请输入站点名称" }], - }, - column: { - width: 160, - }, - }, - domain: { - title: "网站域名", - search: { - show: true, - }, - type: "text", - form: { - rules: [ - { required: true, message: "请输入域名" }, - //@ts-ignore - { type: "domains", message: "请输入正确的域名" }, - ], - }, - column: { - width: 230, - sorter: true, - cellRender({ value, row }) { - const url = `https://${value}:${row.httpsPort}`; - return ( - - - - {value}:{row.httpsPort} - - - - ); - }, - }, - }, - httpsPort: { - title: "HTTPS端口", - search: { - show: false, - }, - type: "number", - form: { - value: 443, - rules: [{ required: true, message: "请输入端口" }], - }, - column: { - width: 100, - show: false, - }, - }, - certInfo: { - title: "证书信息", - type: "text", - form: { show: false }, - column: { - width: 200, - sorter: false, - show: true, - conditionalRender: false, - cellRender({ value, row }) { - const slots = { - content() { - return ( -
-
证书颁发机构:{row.certProvider}
-
证书域名:{row.certDomains}
-
- ); - }, - }; - return ( - - {row.certDomains} - - ); - }, - }, - }, - certDomains: { - title: "证书域名", - search: { - show: true, - }, - type: "text", - form: { - show: false, - }, - column: { - width: 200, - sorter: true, - show: false, - cellRender({ value }) { - return ( - - {value} - - ); - }, - }, - }, - certProvider: { - title: "颁发机构", - search: { - show: false, - }, - type: "text", - form: { - show: false, - }, - column: { - width: 200, - sorter: true, - show: false, - cellRender({ value }) { - return {value}; - }, - }, - }, - certStatus: { - title: "证书状态", - search: { - show: true, - }, - type: "dict-select", - dict: dict({ - data: [ - { label: "正常", value: "ok", color: "green" }, - { label: "过期", value: "expired", color: "red" }, - ], - }), - form: { - show: false, - }, - column: { - width: 100, - sorter: true, - show: true, - align: "center", - }, - }, - certExpiresTime: { - title: "证书到期时间", - search: { - show: false, - }, - type: "date", - form: { - show: false, - }, - column: { - sorter: true, - cellRender({ value }) { - if (!value) { - return "-"; - } - const expireDate = dayjs(value).format("YYYY-MM-DD"); - const leftDays = dayjs(value).diff(dayjs(), "day"); - const color = leftDays < 20 ? "red" : "#389e0d"; - const percent = (leftDays / 90) * 100; - return `${leftDays}天`} />; - }, - }, - }, - lastCheckTime: { - title: "上次检查时间", - search: { - show: false, - }, - type: "datetime", - form: { - show: false, - }, - column: { - sorter: true, - width: 155, - }, - }, - disabled: { - title: "禁用启用", - search: { - show: false, - }, - type: "dict-switch", - dict: dict({ - data: [ - { label: "启用", value: false, color: "green" }, - { label: "禁用", value: true, color: "red" }, - ], - }), - form: { - value: false, - }, - column: { - width: 100, - sorter: true, - align: "center", - component: { - name: "fs-dict-switch", - vModel: "checked", - on: { - async change({ row, $event }) { - await api.DisabledChange(row.id, $event); - await crudExpose.doRefresh(); - }, - }, - }, - }, - }, - ipCheck: { - title: "开启IP检查", - type: "dict-switch", - dict: dict({ - data: [ - { label: "启用", value: true, color: "green" }, - { label: "禁用", value: false, color: "gray" }, - ], - }), - form: { - value: false, - rules: [{ required: true, message: "请选择" }], - }, - column: { - align: "center", - width: 100, - conditionalRender: false, - component: { - name: "fs-dict-switch", - vModel: "checked", - on: { - change({ row, $event }) { - Modal.confirm({ - title: "提示", - content: `确定${$event ? "开启" : "关闭"}IP检查?`, - onOk: async () => { - await api.IpCheckChange(row.id, $event); - await crudExpose.doRefresh(); - if ($event) { - openSiteIpMonitorDialog({ siteId: row.id }); - } - }, - onCancel: async () => { - await crudExpose.doRefresh(); - }, - }); - }, - }, - }, - }, - } as ColumnCompositionProps, - ipCount: { - title: "IP数量", - search: { - show: false, - }, - type: "text", - form: { - show: false, - }, - column: { - width: 100, - sorter: true, - align: "center", - }, - }, - checkStatus: { - title: "检查状态", - search: { - show: false, - }, - type: "dict-select", - dict: checkStatusDict, - form: { - show: false, - }, - column: { - width: 100, - align: "center", - sorter: true, - cellRender({ value, row, key }) { - return ( - - - - ); - }, - }, - }, - // error: { - // title: "错误信息", - // search: { - // show: false - // }, - // type: "text", - // form: { - // show: false - // }, - // column: { - // width: 200, - // sorter: true, - // cellRender({ value }) { - // return {value}; - // } - // } - // }, - pipelineId: { - title: "关联流水线id", - search: { - show: false, - }, - form: { show: false }, - type: "number", - column: { - width: 200, - sorter: true, - show: false, - }, - }, - certInfoId: { - title: "证书id", - search: { - show: false, - }, - type: "number", - form: { show: false }, - column: { - width: 100, - sorter: true, - show: false, - }, - }, - }, - }, - }; + const { openSiteIpMonitorDialog } = useSiteIpMonitor(); + const { openSiteImportDialog } = useSiteImport(); + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + form: { + labelCol: { + //固定label宽度 + span: null, + style: { + width: "100px", + }, + }, + col: { + span: 22, + }, + wrapper: { + width: 600, + }, + }, + actionbar: { + buttons: { + add: { + async click() { + if (!settingsStore.isPlus) { + // 非plus + if (crudBinding.value.data.length >= 1) { + notification.error({ + message: t("certd.monitor.basicLimitError"), + }); + mitter.emit("openVipModal"); + return; + } + } + + + //检查是否监控站点数量超出限制 + if (settingsStore.isComm && settingsStore.suiteSetting.enabled) { + // 检查数量是否超限 + const suiteDetail = await mySuiteApi.SuiteDetailGet(); + const max = suiteDetail.monitorCount.max; + if (max != -1 && max <= suiteDetail.monitorCount.used) { + notification.error({ + message: t("certd.monitor.limitExceeded", { max }), + }); + return; + } + } + + await crudExpose.openAdd({}); + }, + }, + //导入按钮 + import: { + show: true, + text: t("certd.monitor.bulkImport"), + type: "primary", + async click() { + openSiteImportDialog({ + afterSubmit() { + crudExpose.doRefresh(); + }, + }); + }, + }, + }, + }, + rowHandle: { + fixed: "right", + width: 240, + buttons: { + check: { + order: 0, + type: "link", + text: null, + tooltip: { + title: "立即检查", + }, + icon: "ion:play-sharp", + click: async ({ row }) => { + await api.DoCheck(row.id); + await crudExpose.doRefresh(); + notification.success({ + message: t("certd.monitor.checkSubmittedRefresh"), + }); + }, + }, + ipCheck: { + order: 10, + type: "link", + text: null, + show: compute(({ row }) => row.ipCheck === true), + tooltip: { + title: t("certd.monitor.ipManagement"), + }, + icon: "entypo:address", + click: async ({ row }) => { + openSiteIpMonitorDialog({ siteId: row.id }); + }, + }, + }, + }, + tabs: { + name: "disabled", + show: true, + }, + columns: { + id: { + title: "ID", + key: "id", + type: "number", + search: { + show: false, + }, + column: { + width: 80, + align: "center", + }, + form: { + show: false, + }, + }, + name: { + title: t("certd.monitor.siteName"), + search: { + show: true, + }, + type: "text", + form: { + rules: [{ required: true, message: t("certd.monitor.enterSiteName") }], + }, + column: { + width: 160, + }, + }, + domain: { + title: t("certd.monitor.domain"), + search: { + show: true, + }, + type: "text", + form: { + rules: [ + { required: true, message: t("certd.monitor.enterDomain") }, + // @ts-ignore + { type: "domains", message: t("certd.monitor.enterValidDomain") }, + ], + }, + column: { + width: 230, + sorter: true, + cellRender({ value, row }) { + const url = `https://${value}:${row.httpsPort}`; + return ( + + + + {value}:{row.httpsPort} + + + + ); + }, + }, + }, + httpsPort: { + title: t("certd.monitor.httpsPort"), + search: { + show: false, + }, + type: "number", + form: { + value: 443, + rules: [{ required: true, message: t("certd.monitor.enterPort") }], + }, + column: { + width: 100, + show: false, + }, + }, + certInfo: { + title: t("certd.monitor.certInfo"), + type: "text", + form: { show: false }, + column: { + width: 200, + sorter: false, + show: true, + conditionalRender: false, + cellRender({ value, row }) { + const slots = { + content() { + return ( +
+
{t("certd.monitor.issuer")}: {row.certProvider}
+
{t("certd.monitor.certDomains")}: {row.certDomains}
+
+ ); + }, + }; + return ( + + {row.certDomains} + + ); + }, + }, + }, + certDomains: { + title: t("certd.monitor.certDomains"), + search: { + show: true, + }, + type: "text", + form: { + show: false, + }, + column: { + width: 200, + sorter: true, + show: false, + cellRender({ value }) { + return ( + + {value} + + ); + }, + }, + }, + certProvider: { + title: t("certd.monitor.certProvider"), + search: { + show: false, + }, + type: "text", + form: { + show: false, + }, + column: { + width: 200, + sorter: true, + show: false, + cellRender({ value }) { + return {value}; + }, + }, + }, + certStatus: { + title: t("certd.monitor.certStatus"), + search: { + show: true, + }, + type: "dict-select", + dict: dict({ + data: [ + { label: t("certd.monitor.status.ok"), value: "ok", color: "green" }, + { label: t("certd.monitor.status.expired"), value: "expired", color: "red" }, + ], + }), + form: { + show: false, + }, + column: { + width: 100, + sorter: true, + show: true, + align: "center", + }, + }, + certExpiresTime: { + title: t("certd.monitor.certExpiresTime"), + search: { + show: false, + }, + type: "date", + form: { + show: false, + }, + column: { + sorter: true, + cellRender({ value }) { + if (!value) { + return "-"; + } + const expireDate = dayjs(value).format("YYYY-MM-DD"); + const leftDays = dayjs(value).diff(dayjs(), "day"); + const color = leftDays < 20 ? "red" : "#389e0d"; + const percent = (leftDays / 90) * 100; + return ( + `${leftDays}${t("certd.monitor.days")}`} + /> + ); + }, + }, + }, + lastCheckTime: { + title: t("certd.monitor.lastCheckTime"), + search: { + show: false, + }, + type: "datetime", + form: { + show: false, + }, + column: { + sorter: true, + width: 155, + }, + }, + disabled: { + title: t("certd.monitor.disabled"), + search: { + show: false, + }, + type: "dict-switch", + dict: dict({ + data: [ + { label: t("common.enabled"), value: false, color: "green" }, + { label: t("common.disabled"), value: true, color: "red" }, + ], + }), + form: { + value: false, + }, + column: { + width: 100, + sorter: true, + align: "center", + component: { + name: "fs-dict-switch", + vModel: "checked", + on: { + async change({ row, $event }) { + await api.DisabledChange(row.id, $event); + await crudExpose.doRefresh(); + }, + }, + }, + }, + }, + ipCheck: { + title: t("certd.monitor.ipCheck"), + type: "dict-switch", + dict: dict({ + data: [ + { label: t("common.enabled"), value: true, color: "green" }, + { label: t("common.disabled"), value: false, color: "gray" }, + ], + }), + form: { + value: false, + rules: [{ required: true, message: t("certd.monitor.selectRequired") }], + }, + column: { + align: "center", + width: 100, + conditionalRender: false, + component: { + name: "fs-dict-switch", + vModel: "checked", + on: { + change({ row, $event }) { + Modal.confirm({ + title: t("common.confirm"), + content: t("certd.monitor.ipCheckConfirm", { status: $event ? t("common.enabled") : t("common.disabled") }), + onOk: async () => { + await api.IpCheckChange(row.id, $event); + await crudExpose.doRefresh(); + if ($event) { + openSiteIpMonitorDialog({ siteId: row.id }); + } + }, + onCancel: async () => { + await crudExpose.doRefresh(); + }, + }); + }, + }, + }, + } + } as ColumnCompositionProps, + ipCount: { + title: t("certd.monitor.ipCount"), + search: { + show: false, + }, + type: "text", + form: { + show: false, + }, + column: { + width: 100, + sorter: true, + align: "center", + }, + }, + checkStatus: { + title: t("certd.monitor.checkStatus"), + search: { + show: false, + }, + type: "dict-select", + dict: checkStatusDict, + form: { + show: false, + }, + column: { + width: 100, + align: "center", + sorter: true, + cellRender({ value, row }) { + return ( + + + + ); + }, + }, + }, + // error: { + // title: "错误信息", + // search: { + // show: false + // }, + // type: "text", + // form: { + // show: false + // }, + // column: { + // width: 200, + // sorter: true, + // cellRender({ value }) { + // return {value}; + // } + // } + // }, + pipelineId: { + title: t("certd.monitor.pipelineId"), + search: { + show: false, + }, + form: { show: false }, + type: "number", + column: { + width: 200, + sorter: true, + show: false, + }, + }, + certInfoId: { + title: t("certd.monitor.certInfoId"), + search: { + show: false, + }, + type: "number", + form: { show: false }, + column: { + width: 100, + sorter: true, + show: false, + }, + }, + }, + }, + }; } diff --git a/packages/ui/certd-client/src/views/certd/monitor/site/index.vue b/packages/ui/certd-client/src/views/certd/monitor/site/index.vue index b3521df36..1da7404da 100644 --- a/packages/ui/certd-client/src/views/certd/monitor/site/index.vue +++ b/packages/ui/certd-client/src/views/certd/monitor/site/index.vue @@ -1,53 +1,61 @@ + diff --git a/packages/ui/certd-client/src/views/certd/monitor/site/use.tsx b/packages/ui/certd-client/src/views/certd/monitor/site/use.tsx index a4b913b7f..32b0efc3f 100644 --- a/packages/ui/certd-client/src/views/certd/monitor/site/use.tsx +++ b/packages/ui/certd-client/src/views/certd/monitor/site/use.tsx @@ -1,41 +1,44 @@ import { useFormWrapper } from "@fast-crud/fast-crud"; import { siteInfoApi } from "./api"; +import { useI18n } from "vue-i18n"; export function useSiteImport() { - const { openCrudFormDialog } = useFormWrapper(); + const { t } = useI18n(); + const { openCrudFormDialog } = useFormWrapper(); - async function openSiteImportDialog(opts: { afterSubmit: any }) { - const { afterSubmit } = opts; - await openCrudFormDialog({ - crudOptions: { - columns: { - text: { - type: "textarea", - title: "域名列表", - form: { - helper: "格式【域名:端口:名称】,一行一个,其中端口、名称可以省略\n比如:\nwww.baidu.com:443:百度\nwww.taobao.com::淘宝\nwww.google.com", - rules: [{ required: true, message: "请输入要导入的域名" }], - component: { - placeholder: "www.baidu.com:443:百度\nwww.taobao.com::淘宝\nwww.google.com\n", - rows: 8, - }, - col: { - span: 24, - }, - }, - }, - }, - form: { - async doSubmit({ form }) { - return siteInfoApi.Import(form); - }, - afterSubmit, - }, - }, - }); - } + async function openSiteImportDialog(opts: { afterSubmit: any }) { + const { afterSubmit } = opts; + await openCrudFormDialog({ + crudOptions: { + columns: { + text: { + type: "textarea", + title: t("certd.domainList.title"), // 域名列表 + form: { + helper: t("certd.domainList.helper"), + rules: [{ required: true, message: t("certd.domainList.required") }], + component: { + placeholder: t("certd.domainList.placeholder"), + rows: 8, + }, + col: { + span: 24, + }, + }, + }, + }, - return { - openSiteImportDialog, - }; + form: { + async doSubmit({ form }) { + return siteInfoApi.Import(form); + }, + afterSubmit, + }, + }, + }); + } + + return { + openSiteImportDialog, + }; } diff --git a/packages/ui/certd-client/src/views/certd/notification/notification-selector/index.vue b/packages/ui/certd-client/src/views/certd/notification/notification-selector/index.vue index 1ac58c86b..cc10c45bf 100644 --- a/packages/ui/certd-client/src/views/certd/notification/notification-selector/index.vue +++ b/packages/ui/certd-client/src/views/certd/notification/notification-selector/index.vue @@ -1,36 +1,26 @@ diff --git a/packages/ui/certd-client/src/views/certd/pipeline/certd-form/use.tsx b/packages/ui/certd-client/src/views/certd/pipeline/certd-form/use.tsx index 508175d60..341e1b5a5 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/certd-form/use.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/certd-form/use.tsx @@ -11,323 +11,328 @@ import * as api from "../api"; import { PluginGroup, usePluginStore } from "/@/store/plugin"; import { createNotificationApi } from "/@/views/certd/notification/api"; import GroupSelector from "../group/group-selector.vue"; +import { useI18n } from "vue-i18n"; + export function setRunnableIds(pipeline: any) { - const idMap: any = {}; - function createId(oldId: any) { - if (oldId == null) { - return nanoid(); - } - const newId = nanoid(); - idMap[oldId] = newId; - return newId; - } - if (pipeline.stages) { - for (const stage of pipeline.stages) { - stage.id = createId(stage.id); - if (stage.tasks) { - for (const task of stage.tasks) { - task.id = createId(task.id); - if (task.steps) { - for (const step of task.steps) { - step.id = createId(step.id); - } - } - } - } - } - } + const { t } = useI18n(); + const idMap: any = {}; + function createId(oldId: any) { + if (oldId == null) { + return nanoid(); + } + const newId = nanoid(); + idMap[oldId] = newId; + return newId; + } + if (pipeline.stages) { + for (const stage of pipeline.stages) { + stage.id = createId(stage.id); + if (stage.tasks) { + for (const task of stage.tasks) { + task.id = createId(task.id); + if (task.steps) { + for (const step of task.steps) { + step.id = createId(step.id); + } + } + } + } + } + } - for (const trigger of pipeline.triggers) { - trigger.id = nanoid(); - } - for (const notification of pipeline.notifications) { - notification.id = nanoid(); - } + for (const trigger of pipeline.triggers) { + trigger.id = nanoid(); + } + for (const notification of pipeline.notifications) { + notification.id = nanoid(); + } - let content = JSON.stringify(pipeline); - for (const key in idMap) { - content = content.replaceAll(key, idMap[key]); - } - return JSON.parse(content); + let content = JSON.stringify(pipeline); + for (const key in idMap) { + content = content.replaceAll(key, idMap[key]); + } + return JSON.parse(content); } export function useCertPipelineCreator() { - const { openCrudFormDialog } = useFormWrapper(); + const { t } = useI18n(); + const { openCrudFormDialog } = useFormWrapper(); - const pluginStore = usePluginStore(); - const router = useRouter(); + const pluginStore = usePluginStore(); + const router = useRouter(); - function createCrudOptions(certPlugins: any[], getFormData: any, doSubmit: any): CreateCrudOptionsRet { - const inputs: any = {}; - const moreParams = []; - for (const plugin of certPlugins) { - for (const inputKey in plugin.input) { - if (inputs[inputKey]) { - //如果两个插件有的字段,直接显示 - inputs[inputKey].form.show = true; - continue; - } - const inputDefine = cloneDeep(plugin.input[inputKey]); - if (!inputDefine.required && !inputDefine.maybeNeed) { - moreParams.push(inputKey); - // continue; - } - useReference(inputDefine); - inputs[inputKey] = { - title: inputDefine.title, - form: { - ...inputDefine, - show: compute(ctx => { - const form = getFormData(); - if (!form) { - return false; - } + function createCrudOptions(certPlugins: any[], getFormData: any, doSubmit: any): CreateCrudOptionsRet { + const inputs: any = {}; + const moreParams = []; + for (const plugin of certPlugins) { + for (const inputKey in plugin.input) { + if (inputs[inputKey]) { + //如果两个插件有的字段,直接显示 + inputs[inputKey].form.show = true; + continue; + } + const inputDefine = cloneDeep(plugin.input[inputKey]); + if (!inputDefine.required && !inputDefine.maybeNeed) { + moreParams.push(inputKey); + // continue; + } + useReference(inputDefine); + inputs[inputKey] = { + title: inputDefine.title, + form: { + ...inputDefine, + show: compute(ctx => { + const form = getFormData(); + if (!form) { + return false; + } - let inputDefineShow = true; - if (inputDefine.show != null) { - const computeShow = inputDefine.show as any; - if (computeShow === false) { - inputDefineShow = false; - } else if (computeShow && computeShow.computeFn) { - inputDefineShow = computeShow.computeFn({ form }); - } - } - return form?.certApplyPlugin === plugin.name && inputDefineShow; - }), - }, - }; - } - } + let inputDefineShow = true; + if (inputDefine.show != null) { + const computeShow = inputDefine.show as any; + if (computeShow === false) { + inputDefineShow = false; + } else if (computeShow && computeShow.computeFn) { + inputDefineShow = computeShow.computeFn({ form }); + } + } + return form?.certApplyPlugin === plugin.name && inputDefineShow; + }), + }, + }; + } + } - const pluginStore = usePluginStore(); - const randomHour = Math.floor(Math.random() * 6); - const randomMin = Math.floor(Math.random() * 60); + const pluginStore = usePluginStore(); + const randomHour = Math.floor(Math.random() * 6); + const randomMin = Math.floor(Math.random() * 60); - const groupDictRef = dict({ - url: "/pi/pipeline/group/all", - value: "id", - label: "name", - }); + const groupDictRef = dict({ + url: "/pi/pipeline/group/all", + value: "id", + label: "name", + }); - return { - crudOptions: { - form: { - doSubmit, - wrapper: { - width: 1350, - saveRemind: false, - title: "创建证书流水线", - }, - group: { - groups: { - more: { - header: "更多参数", - columns: moreParams, - collapsed: true, - }, - }, - }, - }, - columns: { - certApplyPlugin: { - title: "证书申请插件", - type: "dict-select", - dict: dict({ - data: [ - { value: "CertApply", label: "JS-ACME" }, - { value: "CertApplyLego", label: "Lego-ACME" }, - ], - }), - form: { - order: 0, - value: "CertApply", - helper: { - render: () => { - return ( -
    -
  • JS-ACME:使用简单方便,功能强大【推荐】
  • -
  • Lego-ACME:基于Lego实现,支持海量DNS提供商,熟悉LEGO的用户可以使用
  • -
- ); - }, - }, - valueChange: { - handle: async ({ form, value }) => { - const config = await pluginStore.getPluginConfig({ - name: value, - type: "builtIn", - }); - if (config.sysSetting?.input) { - merge(form, config.sysSetting.input); - } - }, - immediate: true, - }, - }, - }, - ...inputs, - triggerCron: { - title: "定时触发", - type: "text", - form: { - value: `0 ${randomMin} ${randomHour} * * *`, - component: { - name: "cron-editor", - vModel: "modelValue", - placeholder: "0 0 4 * * *", - }, - helper: "点击上面的按钮,选择每天几点定时执行。\n建议设置为每天触发一次,证书未到期之前任务会跳过,不会重复执行", - order: 100, - }, - }, - notification: { - title: "失败通知", - type: "text", - form: { - value: 0, - component: { - name: NotificationSelector, - vModel: "modelValue", - on: { - selectedChange({ $event, form }) { - form.notificationTarget = $event; - }, - }, - }, - order: 101, - helper: "任务执行失败实时提醒", - }, - }, - groupId: { - title: "流水线分组", - type: "dict-select", - dict: groupDictRef, - form: { - component: { - name: GroupSelector, - vModel: "modelValue", - }, - order: 9999, - }, - }, - }, - }, - }; - } + return { + crudOptions: { + form: { + doSubmit, + wrapper: { + width: 1350, + saveRemind: false, + title: t("certd.pipelineForm.createTitle"), + }, + group: { + groups: { + more: { + header: t("certd.pipelineForm.moreParams"), + columns: moreParams, + collapsed: true, + }, + }, + }, + }, + columns: { + certApplyPlugin: { + title: t("certd.plugin.selectTitle"), + type: "dict-select", + dict: dict({ + data: [ + { value: "CertApply", label: "JS-ACME" }, + { value: "CertApplyLego", label: "Lego-ACME" }, + ], + }), + form: { + order: 0, + value: "CertApply", + helper: { + render: () => { + return ( +
    +
  • {t("certd.plugin.jsAcme")}
  • +
  • {t("certd.plugin.legoAcme")}
  • +
+ ); + }, + }, + valueChange: { + handle: async ({ form, value }) => { + const config = await pluginStore.getPluginConfig({ + name: value, + type: "builtIn", + }); + if (config.sysSetting?.input) { + merge(form, config.sysSetting.input); + } + }, + immediate: true, + }, + }, + }, + ...inputs, + triggerCron: { + title: t("certd.pipelineForm.triggerCronTitle"), + type: "text", + form: { + value: `0 ${randomMin} ${randomHour} * * *`, + component: { + name: "cron-editor", + vModel: "modelValue", + placeholder: "0 0 4 * * *", + }, + helper: t("certd.pipelineForm.triggerCronHelper"), + order: 100, + }, + }, + notification: { + title: t("certd.pipelineForm.notificationTitle"), + type: "text", + form: { + value: 0, + component: { + name: NotificationSelector, + vModel: "modelValue", + on: { + selectedChange({ $event, form }) { + form.notificationTarget = $event; + }, + }, + }, + order: 101, + helper: t("certd.pipelineForm.notificationHelper"), + }, + }, + groupId: { + title: t("certd.pipelineForm.groupIdTitle"), + type: "dict-select", + dict: groupDictRef, + form: { + component: { + name: GroupSelector, + vModel: "modelValue", + }, + order: 9999, + }, + } - async function getCertPlugins() { - const pluginGroup = await pluginStore.getGroups(); - const pluginGroups: { [key: string]: PluginGroup } = pluginGroup.groups; - const certPluginGroup = pluginGroups.cert; + }, + }, + }; + } - const certPlugins = []; - for (const plugin of certPluginGroup.plugins) { - const detail: any = await pluginStore.getPluginDefine(plugin.name); - certPlugins.push(detail); - } - return certPlugins; - } + async function getCertPlugins() { + const pluginGroup = await pluginStore.getGroups(); + const pluginGroups: { [key: string]: PluginGroup } = pluginGroup.groups; + const certPluginGroup = pluginGroups.cert; - async function openAddCertdPipelineDialog(req: { defaultGroupId?: number }) { - //检查是否流水线数量超出限制 - await checkPipelineLimit(); + const certPlugins = []; + for (const plugin of certPluginGroup.plugins) { + const detail: any = await pluginStore.getPluginDefine(plugin.name); + certPlugins.push(detail); + } + return certPlugins; + } - const wrapperRef = ref(); - function getFormData() { - if (!wrapperRef.value) { - return null; - } - return wrapperRef.value.getFormData(); - } + async function openAddCertdPipelineDialog(req: { defaultGroupId?: number }) { + //检查是否流水线数量超出限制 + await checkPipelineLimit(); - async function doSubmit({ form }: any) { - // const certDetail = readCertDetail(form.cert.crt); - // 添加certd pipeline - const triggers = []; - if (form.triggerCron) { - triggers.push({ title: "定时触发", type: "timer", props: { cron: form.triggerCron } }); - } - const notifications = []; - if (form.notification != null) { - notifications.push({ - type: "custom", - when: ["error", "turnToSuccess", "success"], - notificationId: form.notification, - title: form.notificationTarget?.name || "自定义通知", - }); - } - const pluginInput = omit(form, ["triggerCron", "notification", "notificationTarget", "certApplyPlugin", "groupId"]); - let pipeline = { - title: form.domains[0] + "证书自动化", - runnableType: "pipeline", - stages: [ - { - title: "证书申请阶段", - maxTaskCount: 1, - runnableType: "stage", - tasks: [ - { - title: "证书申请任务", - runnableType: "task", - steps: [ - { - title: "申请证书", - runnableType: "step", - input: { - renewDays: 35, - ...pluginInput, - }, - strategy: { - runStrategy: 0, // 正常执行 - }, - type: form.certApplyPlugin, - }, - ], - }, - ], - }, - ], - triggers, - notifications, - }; - pipeline = setRunnableIds(pipeline); + const wrapperRef = ref(); + function getFormData() { + if (!wrapperRef.value) { + return null; + } + return wrapperRef.value.getFormData(); + } - /** - * // cert: 证书; backup: 备份; custom:自定义; - * type: string; - * // custom: 自定义; monitor: 监控; - * from: string; - */ - const groupId = form.groupId; - const id = await api.Save({ - title: pipeline.title, - content: JSON.stringify(pipeline), - keepHistoryCount: 30, - type: "cert", - groupId, - }); - if (form.email) { - try { - //创建一个默认的邮件通知 - const notificationApi = createNotificationApi(); - await notificationApi.GetOrCreateDefault({ email: form.email }); - } catch (e) { - console.error(e); - } - } - message.success("创建成功,请添加证书部署任务"); - router.push({ path: "/certd/pipeline/detail", query: { id, editMode: "true" } }); - } - const certPlugins = await getCertPlugins(); - const { crudOptions } = createCrudOptions(certPlugins, getFormData, doSubmit); - //@ts-ignore - crudOptions.columns.groupId.form.value = req.defaultGroupId || undefined; - const wrapper = await openCrudFormDialog({ crudOptions }); - wrapperRef.value = wrapper; - } + async function doSubmit({ form }: any) { + // const certDetail = readCertDetail(form.cert.crt); + // 添加certd pipeline + const triggers = []; + if (form.triggerCron) { + triggers.push({ title: "定时触发", type: "timer", props: { cron: form.triggerCron } }); + } + const notifications = []; + if (form.notification != null) { + notifications.push({ + type: "custom", + when: ["error", "turnToSuccess", "success"], + notificationId: form.notification, + title: form.notificationTarget?.name || "自定义通知", + }); + } + const pluginInput = omit(form, ["triggerCron", "notification", "notificationTarget", "certApplyPlugin", "groupId"]); + let pipeline = { + title: form.domains[0] + "证书自动化", + runnableType: "pipeline", + stages: [ + { + title: "证书申请阶段", + maxTaskCount: 1, + runnableType: "stage", + tasks: [ + { + title: "证书申请任务", + runnableType: "task", + steps: [ + { + title: "申请证书", + runnableType: "step", + input: { + renewDays: 35, + ...pluginInput, + }, + strategy: { + runStrategy: 0, // 正常执行 + }, + type: form.certApplyPlugin, + }, + ], + }, + ], + }, + ], + triggers, + notifications, + }; + pipeline = setRunnableIds(pipeline); - return { - openAddCertdPipelineDialog, - }; + /** + * // cert: 证书; backup: 备份; custom:自定义; + * type: string; + * // custom: 自定义; monitor: 监控; + * from: string; + */ + const groupId = form.groupId; + const id = await api.Save({ + title: pipeline.title, + content: JSON.stringify(pipeline), + keepHistoryCount: 30, + type: "cert", + groupId, + }); + if (form.email) { + try { + //创建一个默认的邮件通知 + const notificationApi = createNotificationApi(); + await notificationApi.GetOrCreateDefault({ email: form.email }); + } catch (e) { + console.error(e); + } + } + message.success("创建成功,请添加证书部署任务"); + router.push({ path: "/certd/pipeline/detail", query: { id, editMode: "true" } }); + } + const certPlugins = await getCertPlugins(); + const { crudOptions } = createCrudOptions(certPlugins, getFormData, doSubmit); + //@ts-ignore + crudOptions.columns.groupId.form.value = req.defaultGroupId || undefined; + const wrapper = await openCrudFormDialog({ crudOptions }); + wrapperRef.value = wrapper; + } + + return { + openAddCertdPipelineDialog, + }; } diff --git a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/notification-form/pi-notification-form-email.vue b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/notification-form/pi-notification-form-email.vue index 63320a853..ae0fd9263 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/notification-form/pi-notification-form-email.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/notification-form/pi-notification-form-email.vue @@ -1,36 +1,37 @@ diff --git a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/trigger-form/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/trigger-form/index.vue index ed97f8e0f..cbd52b98f 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/trigger-form/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/trigger-form/index.vue @@ -1,70 +1,65 @@