From 0283662931ff47d6b5d49f91a30c4a002fe1d108 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Feb 2026 12:59:08 +0800 Subject: [PATCH 01/21] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D1panel=20?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=A4=B1=E8=B4=A5=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/pipeline/src/access/api.ts | 12 ++++----- packages/core/pipeline/src/plugin/api.ts | 1 + .../components/plugins/common/api-test.vue | 5 +++- .../plugins/common/remote-auto-complete.vue | 18 +++---------- .../plugins/common/remote-input.vue | 6 ++++- .../plugins/common/remote-select.vue | 17 +++--------- .../plugins/common/remote-tree-select.vue | 4 ++- .../src/components/plugins/common/utils.ts | 26 +++++++++++++++++++ .../src/components/plugins/lib/index.ts | 4 ++- .../user/pipeline/handle-controller.ts | 12 ++++----- .../src/plugins/plugin-plus/1panel/client.ts | 2 +- 11 files changed, 63 insertions(+), 44 deletions(-) create mode 100644 packages/ui/certd-client/src/components/plugins/common/utils.ts diff --git a/packages/core/pipeline/src/access/api.ts b/packages/core/pipeline/src/access/api.ts index 3d8c2f984..7cb5d380c 100644 --- a/packages/core/pipeline/src/access/api.ts +++ b/packages/core/pipeline/src/access/api.ts @@ -4,13 +4,13 @@ import { HttpClient, ILogger, utils } from "@certd/basic"; import * as _ from "lodash-es"; import { PluginRequestHandleReq } from "../plugin/index.js"; -export type AccessRequestHandleReqInput = { - id?: number; - title?: string; - access: T; -}; +// export type AccessRequestHandleReqInput = { +// id?: number; +// title?: string; +// access: T; +// }; -export type AccessRequestHandleReq = PluginRequestHandleReq>; +export type AccessRequestHandleReq = PluginRequestHandleReq; export type AccessInputDefine = FormItemProps & { title: string; diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index fec035cbd..bf5289cac 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -17,6 +17,7 @@ export type PluginRequestHandleReq = { action: string; input: T; data: any; + record: { id: number; type: string; title: string }; }; export type UserInfo = { diff --git a/packages/ui/certd-client/src/components/plugins/common/api-test.vue b/packages/ui/certd-client/src/components/plugins/common/api-test.vue index f82727da0..4a129a4b8 100644 --- a/packages/ui/certd-client/src/components/plugins/common/api-test.vue +++ b/packages/ui/certd-client/src/components/plugins/common/api-test.vue @@ -13,6 +13,7 @@ import { ComponentPropsType, doRequest } from "/@/components/plugins/lib"; import { ref, inject } from "vue"; import { Form } from "ant-design-vue"; +import { getInputFromForm } from "./utils"; defineOptions({ name: "ApiTest", @@ -45,13 +46,15 @@ const doTest = async () => { message.value = ""; hasError.value = false; loading.value = true; + const { input, record } = getInputFromForm(form, pluginType); try { const res = await doRequest( { type: pluginType, typeName: form.type, action: props.action, - input: pluginType === "plugin" ? form.input : form, + input, + record, }, { onError(err: any) { diff --git a/packages/ui/certd-client/src/components/plugins/common/remote-auto-complete.vue b/packages/ui/certd-client/src/components/plugins/common/remote-auto-complete.vue index 114e7705c..d27f652ae 100644 --- a/packages/ui/certd-client/src/components/plugins/common/remote-auto-complete.vue +++ b/packages/ui/certd-client/src/components/plugins/common/remote-auto-complete.vue @@ -16,6 +16,7 @@ import { ComponentPropsType, doRequest } from "/@/components/plugins/lib"; import { defineComponent, inject, ref, useAttrs, watch, Ref } from "vue"; import { PluginDefine } from "@certd/pipeline"; +import { getInputFromForm } from "./utils"; defineOptions({ name: "RemoteAutoComplete", @@ -48,18 +49,6 @@ const message = ref(""); const hasError = ref(false); const loading = ref(false); -function getInputFromForm(form: any, pluginType: string) { - let input: any = {}; - if (pluginType === "plugin") { - input = form?.input || {}; - } else if (pluginType === "access") { - input = form?.access || {}; - } else { - input = form || {}; - } - return input; -} - const getOptions = async () => { if (loading.value) { return; @@ -75,7 +64,7 @@ const getOptions = async () => { } const pluginType = getPluginType(); const { form } = getScope(); - const input = getInputFromForm(form, pluginType); + const { input, record } = getInputFromForm(form, pluginType); for (let key in define.input) { const inWatches = props.watches?.includes(key); const inputDefine = define.input[key]; @@ -99,6 +88,7 @@ const getOptions = async () => { action: props.action, input, data: {}, + record, }, { onError(err: any) { @@ -140,7 +130,7 @@ watch( () => { const pluginType = getPluginType(); const { form, key } = getScope(); - const input = getInputFromForm(form, pluginType); + const { input, record } = getInputFromForm(form, pluginType); const watches: any = {}; if (props.watches && props.watches.length > 0) { for (const key of props.watches) { diff --git a/packages/ui/certd-client/src/components/plugins/common/remote-input.vue b/packages/ui/certd-client/src/components/plugins/common/remote-input.vue index ccc2e4158..43517a78e 100644 --- a/packages/ui/certd-client/src/components/plugins/common/remote-input.vue +++ b/packages/ui/certd-client/src/components/plugins/common/remote-input.vue @@ -9,6 +9,7 @@ import { doRequest } from "/@/components/plugins/lib"; import { inject, ref, useAttrs } from "vue"; import { useFormWrapper } from "@fast-crud/fast-crud"; import { notification } from "ant-design-vue"; +import { getInputFromForm } from "./utils"; defineOptions({ name: "RemoteInput", @@ -71,15 +72,18 @@ const doPluginFormSubmit = async (data: any) => { } loading.value = true; + try { const pluginType = getPluginType(); const { form } = getScope(); + const { input, record } = getInputFromForm(form, pluginType); const res = await doRequest({ type: pluginType, typeName: form.type, action: props.action, - input: pluginType === "plugin" ? form.input : form, + input, data: data, + record, }); //获取返回值 填入到input中 emit("update:modelValue", res); diff --git a/packages/ui/certd-client/src/components/plugins/common/remote-select.vue b/packages/ui/certd-client/src/components/plugins/common/remote-select.vue index 029697ca5..1da86000d 100644 --- a/packages/ui/certd-client/src/components/plugins/common/remote-select.vue +++ b/packages/ui/certd-client/src/components/plugins/common/remote-select.vue @@ -38,6 +38,7 @@ import { ComponentPropsType, doRequest } from "/@/components/plugins/lib"; import { defineComponent, inject, ref, useAttrs, watch, Ref } from "vue"; import { PluginDefine } from "@certd/pipeline"; +import { getInputFromForm } from "./utils"; defineOptions({ name: "RemoteSelect", @@ -79,17 +80,6 @@ const getPluginType: any = inject("get:plugin:type", () => { return "plugin"; }); -function getInputFromForm(form: any, pluginType: string) { - let input: any = {}; - if (pluginType === "plugin") { - input = form?.input || {}; - } else if (pluginType === "access") { - input = form?.access || {}; - } else { - input = form || {}; - } - return input; -} const searchKeyRef = ref(""); const optionsRef = ref([]); const message = ref(""); @@ -115,7 +105,7 @@ const getOptions = async () => { } const pluginType = getPluginType(); const { form } = getScope(); - const input = getInputFromForm(form, pluginType); + const { input, record } = getInputFromForm(form, pluginType); for (let key in define.input) { const inWatches = props.watches?.includes(key); @@ -141,6 +131,7 @@ const getOptions = async () => { typeName: form.type, action: props.action, input, + record, data: { searchKey: props.search ? searchKeyRef.value : "", pageNo, @@ -211,7 +202,7 @@ watch( () => { const pluginType = getPluginType(); const { form, key } = getScope(); - const input = getInputFromForm(form, pluginType); + const { input, record } = getInputFromForm(form, pluginType); const watches: any = {}; if (props.watches && props.watches.length > 0) { for (const key of props.watches) { diff --git a/packages/ui/certd-client/src/components/plugins/common/remote-tree-select.vue b/packages/ui/certd-client/src/components/plugins/common/remote-tree-select.vue index ca039db49..7efafade3 100644 --- a/packages/ui/certd-client/src/components/plugins/common/remote-tree-select.vue +++ b/packages/ui/certd-client/src/components/plugins/common/remote-tree-select.vue @@ -15,6 +15,7 @@ import { ComponentPropsType, doRequest } from "/@/components/plugins/lib"; import { defineComponent, inject, ref, useAttrs, watch, Ref } from "vue"; import { PluginDefine } from "@certd/pipeline"; +import { getInputFromForm } from "./utils"; defineOptions({ name: "RemoteTreeSelect", @@ -67,7 +68,7 @@ const getOptions = async () => { } const pluginType = getPluginType(); const { form } = getScope(); - const input = (pluginType === "plugin" ? form?.input : form) || {}; + const { input, record } = getInputFromForm(form, pluginType); for (let key in define.input) { const inWatches = props.watches?.includes(key); @@ -98,6 +99,7 @@ const getOptions = async () => { pageNo, pageSize, }, + record, }, { onError(err: any) { diff --git a/packages/ui/certd-client/src/components/plugins/common/utils.ts b/packages/ui/certd-client/src/components/plugins/common/utils.ts new file mode 100644 index 000000000..2fd402e4e --- /dev/null +++ b/packages/ui/certd-client/src/components/plugins/common/utils.ts @@ -0,0 +1,26 @@ +import { cloneDeep } from "lodash-es"; + +export function getInputFromForm(form: any, pluginType: string) { + form = cloneDeep(form); + let input: any = {}; + const record: any = form; + if (pluginType === "plugin") { + input = form?.input || {}; + delete form.input; + } else if (pluginType === "access") { + input = form?.access || {}; + delete form.access; + } else if (pluginType === "notification") { + input = form?.body || {}; + delete form.body; + } else if (pluginType === "addon") { + input = form?.body || {}; + delete form.body; + } else { + throw new Error(`pluginType ${pluginType} not support`); + } + return { + input, + record, + }; +} diff --git a/packages/ui/certd-client/src/components/plugins/lib/index.ts b/packages/ui/certd-client/src/components/plugins/lib/index.ts index 922748e21..bf1086ce2 100644 --- a/packages/ui/certd-client/src/components/plugins/lib/index.ts +++ b/packages/ui/certd-client/src/components/plugins/lib/index.ts @@ -12,11 +12,12 @@ export type RequestHandleReq = { action: string; data?: any; input: T; + record?: any; }; export async function doRequest(req: RequestHandleReq, opts: any = {}) { const url = `/pi/handle/${req.type}`; - const { typeName, action, data, input } = req; + const { typeName, action, data, input, record } = req; const res = await request({ url, method: "post", @@ -25,6 +26,7 @@ export async function doRequest(req: RequestHandleReq, opts: any = {}) { action, data, input, + record, }, ...opts, }); diff --git a/packages/ui/certd-server/src/controller/user/pipeline/handle-controller.ts b/packages/ui/certd-server/src/controller/user/pipeline/handle-controller.ts index 2c4eaab53..a8a76ef5e 100644 --- a/packages/ui/certd-server/src/controller/user/pipeline/handle-controller.ts +++ b/packages/ui/certd-server/src/controller/user/pipeline/handle-controller.ts @@ -35,16 +35,16 @@ export class HandleController extends BaseController { @Post('/access', { summary: Constants.per.authOnly }) async accessRequest(@Body(ALL) body: AccessRequestHandleReq) { const userId = this.getUserId(); - let inputAccess = body.input.access; - if (body.input.id > 0) { - const oldEntity = await this.accessService.info(body.input.id); + let inputAccess = body.input; + if (body.record.id > 0) { + const oldEntity = await this.accessService.info(body.record.id); if (oldEntity) { if (oldEntity.userId !== this.getUserId()) { throw new Error('access not found'); } const param: any = { type: body.typeName, - setting: JSON.stringify(body.input.access), + setting: JSON.stringify(body.input), }; this.accessService.encryptSetting(param, oldEntity); inputAccess = this.accessService.decryptAccessEntity(param); @@ -53,7 +53,7 @@ export class HandleController extends BaseController { const accessGetter = new AccessGetter(userId, this.accessService.getById.bind(this.accessService)); const access = await newAccess(body.typeName, inputAccess,accessGetter); - mergeUtils.merge(access, body.input); + // mergeUtils.merge(access, body.input); const res = await access.onRequest(body); return this.ok(res); @@ -61,7 +61,7 @@ export class HandleController extends BaseController { @Post('/notification', { summary: Constants.per.authOnly }) async notificationRequest(@Body(ALL) body: NotificationRequestHandleReq) { - const input = body.input.body; + const input = body.input; const notification = await newNotification(body.typeName, input, { http, diff --git a/packages/ui/certd-server/src/plugins/plugin-plus/1panel/client.ts b/packages/ui/certd-server/src/plugins/plugin-plus/1panel/client.ts index 9cc4e6e2a..7aef0496f 100644 --- a/packages/ui/certd-server/src/plugins/plugin-plus/1panel/client.ts +++ b/packages/ui/certd-server/src/plugins/plugin-plus/1panel/client.ts @@ -125,7 +125,7 @@ export class OnePanelClient { async getAccessToken() { if (this.access.type === "apikey") { - return this.getAccessTokenByApiKey(); + return await this.getAccessTokenByApiKey(); } else { return await this.getAccessTokenByPassword(); } From 61800b23e2be324169990810d1176c18decabb23 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Feb 2026 13:08:20 +0800 Subject: [PATCH 02/21] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=98=BF?= =?UTF-8?q?=E9=87=8C=E4=BA=91dcdn=E4=BD=BF=E7=94=A8=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=88=B0cas=E7=9A=84id=E5=BC=95=E7=94=A8=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugins/plugin-aliyun/plugin/deploy-to-alb/index.ts | 2 ++ .../plugins/plugin-aliyun/plugin/deploy-to-apig/index.ts | 4 +++- .../src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts | 4 +++- .../plugins/plugin-aliyun/plugin/deploy-to-dcdn/index.ts | 5 +++++ .../src/plugins/plugin-aliyun/plugin/deploy-to-esa/index.ts | 4 +++- .../src/plugins/plugin-aliyun/plugin/deploy-to-oss/index.ts | 2 +- .../src/plugins/plugin-aliyun/plugin/deploy-to-waf/index.ts | 6 ++++-- .../plugins/plugin-aliyun/plugin/upload-to-aliyun/index.ts | 2 +- 8 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-alb/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-alb/index.ts index 138268532..c348ed3ca 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-alb/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-alb/index.ts @@ -316,6 +316,8 @@ export class AliyunDeployCertToALB extends AbstractTaskPlugin { certId = certIdRes.certId as any; }else if (casCert.certId){ certId = casCert.certId; + }else{ + throw new Error('证书格式错误'+JSON.stringify(this.cert)); } } diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-apig/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-apig/index.ts index 5093054fc..14e5ac6a1 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-apig/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-apig/index.ts @@ -141,11 +141,13 @@ export class DeployCertToAliyunApig extends AbstractTaskPlugin { const casCert = this.cert as CasCertId; if (casCert.certId) { certId = casCert.certId; - } else { + } else if (certInfo.crt) { certId = await sslClient.uploadCert({ name: this.buildCertName(CertReader.getMainDomain(certInfo.crt)), cert: certInfo, }); + }else{ + throw new Error('证书格式错误'+JSON.stringify(this.cert)); } } diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts index 57689e82a..c5ee7df9b 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts @@ -117,13 +117,15 @@ export class DeployCertToAliyunCDN extends AbstractTaskPlugin { const casCert = this.cert as CasCertId; if (casCert.certId) { certId = casCert.certId; - } else { + } else if (certInfo.crt) { certName = this.buildCertName(CertReader.getMainDomain(certInfo.crt)) const certIdRes = await sslClient.uploadCertificate({ name:certName, cert: certInfo, }); certId = certIdRes.certId as any; + }else{ + throw new Error('证书格式错误'+JSON.stringify(this.cert)); } } diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-dcdn/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-dcdn/index.ts index 13cda1abd..8bc11d2db 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-dcdn/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-dcdn/index.ts @@ -106,6 +106,7 @@ export class DeployCertToAliyunDCDN extends AbstractTaskPlugin { let certId: any = this.cert if (typeof this.cert === 'object') { const certInfo = this.cert as CertInfo; + const casCertId = this.cert as CasCertId; if (certInfo.crt) { this.logger.info('上传证书:', CertName); const cert: any = this.cert; @@ -117,6 +118,10 @@ export class DeployCertToAliyunDCDN extends AbstractTaskPlugin { SSLPub: cert.crt, SSLPri: cert.key, }; + }else if (casCertId.certId){ + certId = casCertId.certId; + }else{ + throw new Error('证书格式错误'+JSON.stringify(this.cert)); } } this.logger.info('使用已上传的证书:', certId); diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-esa/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-esa/index.ts index ad5eac4c9..22c3eb1a9 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-esa/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-esa/index.ts @@ -122,7 +122,7 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin { if (casCert.certId) { certId = casCert.certId; certName = casCert.certName; - } else { + } else if (certInfo.crt) { certName = this.buildCertName(CertReader.getMainDomain(certInfo.crt)); const certIdRes = await sslClient.uploadCertificate({ @@ -131,6 +131,8 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin { }); certId = certIdRes.certId as any; this.logger.info("上传证书成功", certId, certName); + }else{ + throw new Error('证书格式错误'+JSON.stringify(this.cert)); } } return { diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-oss/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-oss/index.ts index 7d9a341dd..5a351ccee 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-oss/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-oss/index.ts @@ -175,7 +175,7 @@ export class DeployCertToAliyunOSS extends AbstractTaskPlugin { ${certInfo.key} ${certInfo.crt} ` - }else{ + }else { const casCert = this.cert as CasCertId; certStr = `${casCert.certIdentifier}` } diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-waf/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-waf/index.ts index baa4e14c4..ce9b91322 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-waf/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-waf/index.ts @@ -153,15 +153,17 @@ export class AliyunDeployCertToWaf extends AbstractTaskPlugin { }); const cert = this.cert as CertInfo; + const casCert = this.cert as CasCertInfo; if (cert.crt) { const certIdRes = await sslClient.uploadCertificate({ name: this.buildCertName(CertReader.getMainDomain(cert.crt)), cert: cert, }); certId = certIdRes.certId as any; - }else { - const casCert = this.cert as CasCertInfo; + } else if (casCert.certId) { certId = casCert.certId; + } else { + throw new Error('证书格式错误'+JSON.stringify(this.cert)); } } diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/upload-to-aliyun/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/upload-to-aliyun/index.ts index 79b655056..98d4017e3 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/upload-to-aliyun/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/upload-to-aliyun/index.ts @@ -101,7 +101,7 @@ export class UploadCertToAliyun extends AbstractTaskPlugin { let certName = "" if (this.name){ certName = this.appendTimeSuffix(this.name) - }else{ + }else { certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)) } const certIdRes = await client.uploadCertificate({ From 4eb940ffe765a0330331bc6af8396315e36d4e4a Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Feb 2026 13:16:16 +0800 Subject: [PATCH 03/21] =?UTF-8?q?perf:=20http=E6=A0=A1=E9=AA=8C=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E6=94=AF=E6=8C=81scp=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/certd-client/src/components/plugins/lib/dicts.ts | 1 + .../ui/certd-server/src/plugins/plugin-lib/oss/factory.ts | 3 +++ .../certd-server/src/plugins/plugin-lib/oss/impls/scp.ts | 7 +++++++ .../certd-server/src/plugins/plugin-lib/oss/impls/sftp.ts | 6 +++++- 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 packages/ui/certd-server/src/plugins/plugin-lib/oss/impls/scp.ts diff --git a/packages/ui/certd-client/src/components/plugins/lib/dicts.ts b/packages/ui/certd-client/src/components/plugins/lib/dicts.ts index 28a3902f0..33eec1dba 100644 --- a/packages/ui/certd-client/src/components/plugins/lib/dicts.ts +++ b/packages/ui/certd-client/src/components/plugins/lib/dicts.ts @@ -20,6 +20,7 @@ export const Dicts = { uploaderTypeDict: dict({ data: [ { label: "SFTP", value: "sftp" }, + { label: "SCP", value: "scp" }, { label: "FTP", value: "ftp" }, { label: "阿里云OSS", value: "alioss" }, { label: "腾讯云COS", value: "tencentcos" }, diff --git a/packages/ui/certd-server/src/plugins/plugin-lib/oss/factory.ts b/packages/ui/certd-server/src/plugins/plugin-lib/oss/factory.ts index e05cabe09..ef7961a88 100644 --- a/packages/ui/certd-server/src/plugins/plugin-lib/oss/factory.ts +++ b/packages/ui/certd-server/src/plugins/plugin-lib/oss/factory.ts @@ -23,6 +23,9 @@ export class OssClientFactory { } else if (type === "s3") { const module = await import("./impls/s3.js"); return module.default; + } else if (type === "scp") { + const module = await import("./impls/scp.js"); + return module.default; } else { throw new Error(`暂不支持此文件上传方式: ${type}`); } diff --git a/packages/ui/certd-server/src/plugins/plugin-lib/oss/impls/scp.ts b/packages/ui/certd-server/src/plugins/plugin-lib/oss/impls/scp.ts new file mode 100644 index 000000000..d1e8af7a7 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-lib/oss/impls/scp.ts @@ -0,0 +1,7 @@ +import SftpOssClientImpl from "./sftp.js"; + +export default class ScpOssClientImpl extends SftpOssClientImpl { + getUploaderType() { + return 'scp'; + } +} diff --git a/packages/ui/certd-server/src/plugins/plugin-lib/oss/impls/sftp.ts b/packages/ui/certd-server/src/plugins/plugin-lib/oss/impls/sftp.ts index 79b80e162..0c7cff8fb 100644 --- a/packages/ui/certd-server/src/plugins/plugin-lib/oss/impls/sftp.ts +++ b/packages/ui/certd-server/src/plugins/plugin-lib/oss/impls/sftp.ts @@ -5,6 +5,9 @@ import fs from "fs"; import { SftpAccess, SshAccess, SshClient } from "../../ssh/index.js"; export default class SftpOssClientImpl extends BaseOssClient { + getUploaderType() { + return 'sftp'; + } async download(fileName: string, savePath: string): Promise { const path = this.join(this.rootDir, fileName); const client = new SshClient(this.logger); @@ -48,6 +51,7 @@ export default class SftpOssClientImpl extends BaseOssClient { const key = this.join(this.rootDir, filePath); try { const client = new SshClient(this.logger); + const uploaderType = this.getUploaderType(); await client.uploadFiles({ connectConf: access, mkdirs: true, @@ -57,7 +61,7 @@ export default class SftpOssClientImpl extends BaseOssClient { remotePath: key, }, ], - uploadType: "sftp", + uploadType: uploaderType, opts: { mode: this.access?.fileMode ?? undefined, }, From 3cd1aaeb035f8af79714030889b2b4dc259b700e Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Feb 2026 13:24:19 +0800 Subject: [PATCH 04/21] =?UTF-8?q?perf:=20=E5=A2=9E=E5=8A=A0=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E8=AF=81=E4=B9=A6=E5=88=B0certd=E6=9C=AC=E8=BA=AB?= =?UTF-8?q?=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugins/plugin-admin/index.ts | 1 + .../plugin-admin/plugin-deploy-to-certd.ts | 76 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 packages/ui/certd-server/src/plugins/plugin-admin/plugin-deploy-to-certd.ts diff --git a/packages/ui/certd-server/src/plugins/plugin-admin/index.ts b/packages/ui/certd-server/src/plugins/plugin-admin/index.ts index 7cb724255..132b274f3 100644 --- a/packages/ui/certd-server/src/plugins/plugin-admin/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-admin/index.ts @@ -1,3 +1,4 @@ export * from './plugin-restart.js'; export * from './plugin-script.js'; export * from './plugin-db-backup.js'; +export * from './plugin-deploy-to-certd.js'; diff --git a/packages/ui/certd-server/src/plugins/plugin-admin/plugin-deploy-to-certd.ts b/packages/ui/certd-server/src/plugins/plugin-admin/plugin-deploy-to-certd.ts new file mode 100644 index 000000000..235fab024 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-admin/plugin-deploy-to-certd.ts @@ -0,0 +1,76 @@ +import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; +import { httpsServer } from '../../modules/auto/https/server.js'; +import { RestartCertdPlugin } from './plugin-restart.js'; +import path from 'path'; +import fs from 'fs'; +import { CertApplyPluginNames, CertInfo, CertReader } from '@certd/plugin-lib'; + +@IsTaskPlugin({ + name: 'DeployToCertd', + title: '部署证书到Certd本身', + icon: 'mdi:restart', + desc: '【仅管理员可用】 部署证书到 certd的https服务,用于更新 Certd 的 ssl 证书,建议将此任务放在流水线的最后一步', + group: pluginGroups.admin.key, + onlyAdmin: true, + default: { + strategy: { + runStrategy: RunStrategy.SkipWhenSucceed, + }, + }, +}) +export class DeployToCertdPlugin extends AbstractTaskPlugin { + + @TaskInput({ + title: '域名证书', + helper: '请选择前置任务输出的域名证书', + component: { + name: 'output-selector', + from: [...CertApplyPluginNames], + }, + required: true, + }) + cert!: CertInfo; + async onInstance() { } + async execute(): Promise { + if (!this.isAdmin()) { + throw new Error('只有管理员才能运行此任务'); + } + + //部署证书 + let crtPath = "ssl/cert.crt"; + let keyPath = "ssl/cert.key"; + + const certReader = new CertReader(this.cert); + const dataDir = "./data"; + const handle = async ({ tmpCrtPath, tmpKeyPath, }) => { + this.logger.info('复制到目标路径'); + if (crtPath) { + crtPath = crtPath.startsWith('/') ? crtPath : path.join(dataDir, crtPath); + this.copyFile(tmpCrtPath, crtPath); + } + if (keyPath) { + keyPath = keyPath.trim(); + keyPath = keyPath.startsWith('/') ? keyPath : path.join(dataDir, keyPath); + this.copyFile(tmpKeyPath, keyPath); + } + }; + + await certReader.readCertFile({ logger: this.logger, handle }); + this.logger.info(`证书已部署到 ${crtPath} 和 ${keyPath}`); + + + this.logger.info('Certd https server 将在 30 秒后重启'); + await this.ctx.utils.sleep(30000); + await httpsServer.restart(); + } + + copyFile(srcFile: string, destFile: string) { + this.logger.info(`复制文件:${srcFile} => ${destFile}`); + const dir = path.dirname(destFile); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.copyFileSync(srcFile, destFile); + } +} +new RestartCertdPlugin(); From 66ac4716f2565d7ee827461b625397ae21599451 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Feb 2026 14:18:50 +0800 Subject: [PATCH 05/21] =?UTF-8?q?perf:=20=E5=A4=87=E4=BB=BD=E6=94=AF?= =?UTF-8?q?=E6=8C=81scp=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugins/plugin-admin/plugin-db-backup.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/ui/certd-server/src/plugins/plugin-admin/plugin-db-backup.ts b/packages/ui/certd-server/src/plugins/plugin-admin/plugin-db-backup.ts index d012702ea..6d54f06cd 100644 --- a/packages/ui/certd-server/src/plugins/plugin-admin/plugin-db-backup.ts +++ b/packages/ui/certd-server/src/plugins/plugin-admin/plugin-db-backup.ts @@ -34,8 +34,8 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { name: "a-select", options: [ { label: "本地复制", value: "local" }, - { label: "ssh上传", value: "ssh" }, - { label: "oss上传", value: "oss" }, + { label: "oss上传(推荐)", value: "oss" }, + { label: "ssh上传(请使用oss上传方式)", value: "ssh", disabled: true }, ], placeholder: "", }, @@ -72,6 +72,7 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { { value: "tencentcos", label: "腾讯云COS" }, { value: "ftp", label: "Ftp" }, { value: "sftp", label: "Sftp" }, + { value: "scp", label: "SCP" }, ], }, mergeScript: ` From a3cabd5f36ed41225ad418098596e9b2c44e31a1 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Feb 2026 14:19:16 +0800 Subject: [PATCH 06/21] =?UTF-8?q?perf:=20=E5=88=97=E8=A1=A8=E4=B8=AD?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=8B=E6=AC=A1=E6=89=A7=E8=A1=8C=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/cron-editor/utils.ts | 2 +- .../src/locales/langs/en-US/certd.ts | 1 + .../src/locales/langs/zh-CN/certd.ts | 1 + .../src/views/certd/pipeline/crud.tsx | 13 +++++++ .../views/certd/pipeline/pipeline/index.vue | 1 + .../src/modules/pipeline/entity/pipeline.ts | 3 ++ .../pipeline/service/pipeline-service.ts | 39 +++++++++++++++++-- 7 files changed, 55 insertions(+), 5 deletions(-) diff --git a/packages/ui/certd-client/src/components/cron-editor/utils.ts b/packages/ui/certd-client/src/components/cron-editor/utils.ts index 7a2be77e0..8b566c3d8 100644 --- a/packages/ui/certd-client/src/components/cron-editor/utils.ts +++ b/packages/ui/certd-client/src/components/cron-editor/utils.ts @@ -9,7 +9,7 @@ export function getCronNextTimes(cron: string, count: number = 1) { const interval = parser.parseExpression(cron); for (let i = 0; i < count; i++) { const next = interval.next().getTime(); - nextTimes.push(dayjs(next).format("YYYY-MM-DD HH:mm:ss")); + nextTimes.push(dayjs(next).valueOf()); } return nextTimes; } 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 161ea6801..1dae3f4bc 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 @@ -160,6 +160,7 @@ export default { updateTime: "Update Time", triggerType: "Trigger Type", pipelineId: "Pipeline Id", + nextRunTime: "Next Run Time", }, pi: { 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 af5ee3a79..8141a89f0 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 @@ -167,6 +167,7 @@ export default { updateTime: "更新时间", triggerType: "触发类型", pipelineId: "流水线Id", + nextRunTime: "下次运行时间", }, pi: { validTime: "流水线有效期", diff --git a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx index 812857aaf..2ac300a1a 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx @@ -352,6 +352,7 @@ export default function ({ crudExpose, context: { selectedRowKeys, openCertApply column: { align: "center", width: 120, + show: false, sorter: true, }, form: { @@ -464,6 +465,18 @@ export default function ({ crudExpose, context: { selectedRowKeys, openCertApply align: "center", }, }, + nextRunTime: { + title: t("certd.fields.nextRunTime"), + type: "datetime", + form: { + show: false, + }, + column: { + sorter: true, + width: 150, + align: "center", + }, + }, disabled: { title: t("certd.fields.enabled"), type: "dict-switch", diff --git a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue index a2eadc6f3..59f973726 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue @@ -885,6 +885,7 @@ export default defineComponent({ saveLoading.value = false; } }; + const edit = () => { pipeline.value = cloneDeep(currentPipeline.value); currentHistory.value = null; diff --git a/packages/ui/certd-server/src/modules/pipeline/entity/pipeline.ts b/packages/ui/certd-server/src/modules/pipeline/entity/pipeline.ts index 4f1d0d4be..1f36ee639 100644 --- a/packages/ui/certd-server/src/modules/pipeline/entity/pipeline.ts +++ b/packages/ui/certd-server/src/modules/pipeline/entity/pipeline.ts @@ -58,6 +58,8 @@ export class PipelineEntity { // 变量 lastVars: any; + nextRunTime: number; + @Column({name: 'order', comment: '排序', nullable: true,}) order: number; @@ -69,4 +71,5 @@ export class PipelineEntity { default: () => 'CURRENT_TIMESTAMP', }) updateTime: Date; + } diff --git a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts index 0e8d3f2c2..2e570ab14 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts @@ -48,7 +48,7 @@ import { TaskServiceBuilder } from "./getter/task-service-getter.js"; import { nanoid } from "nanoid"; import { set } from "lodash-es"; import { executorQueue } from "@certd/lib-server"; - +import parser from "cron-parser"; const runningTasks: Map = new Map(); @@ -141,16 +141,47 @@ export class PipelineService extends BaseService { } // @ts-ignore item.stepCount = stepCount; - if(item.triggerCount == 0 ){ + if (item.triggerCount == 0) { item.triggerCount = pipeline.triggers?.length; } - + + //获取下次执行时间 + if (pipeline.triggers?.length > 0) { + const triggers = pipeline.triggers.filter((item) => item.type === 'timer'); + if (triggers && triggers.length > 0) { + let nextTimes: any = []; + for (const item of triggers) { + if (!item.props?.cron) { + continue; + } + const ret = this.getCronNextTimes(item.props?.cron, 1); + nextTimes.push(...ret); + } + item.nextRunTime = nextTimes[0] + } + + } + delete item.content; } return result; } + getCronNextTimes(cron: string, count: number = 1) { + if (cron == null) { + return []; + } + const nextTimes = []; + const interval = parser.parseExpression(cron); + for (let i = 0; i < count; i++) { + const next = interval.next().getTime(); + nextTimes.push(dayjs(next).format("YYYY-MM-DD HH:mm:ss")); + } + return nextTimes; + } + + private async fillLastVars(records: PipelineEntity[]) { const pipelineIds: number[] = []; const recordMap = {}; @@ -220,7 +251,7 @@ export class PipelineService extends BaseService { //修改 old = await this.info(bean.id); } - if (!old || !old.webhookKey ) { + if (!old || !old.webhookKey) { bean.webhookKey = await this.genWebhookKey(); } From c23d1d11b58a6cdfe431a7e8abbd5d955146c38d Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Feb 2026 14:20:32 +0800 Subject: [PATCH 07/21] =?UTF-8?q?perf:=20=E7=9B=91=E6=8E=A7=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=94=AF=E6=8C=81=E9=80=97=E5=8F=B7=E5=88=86=E5=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../certd-client/src/views/certd/monitor/site/setting/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/certd-client/src/views/certd/monitor/site/setting/index.vue b/packages/ui/certd-client/src/views/certd/monitor/site/setting/index.vue index d5332d173..63af093f1 100644 --- a/packages/ui/certd-client/src/views/certd/monitor/site/setting/index.vue +++ b/packages/ui/certd-client/src/views/certd/monitor/site/setting/index.vue @@ -25,7 +25,7 @@
- +
{{ t("certd.monitor.setting.dnsServerHelper") }}
From 305da86f97d918374819ecd6c50685f09b94ea59 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Feb 2026 14:23:12 +0800 Subject: [PATCH 08/21] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E6=B5=8B=E8=AF=95=E9=A1=B5=E9=9D=A2=EF=BC=8C=E5=A4=9C?= =?UTF-8?q?=E9=97=B4=E6=A8=A1=E5=BC=8F=E6=98=BE=E7=A4=BA=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/certd-client/src/views/sys/nettest/DomainTestCard.vue | 5 ----- .../ui/certd-client/src/views/sys/nettest/ServerInfoCard.vue | 1 - packages/ui/certd-client/src/views/sys/nettest/TestCase.vue | 3 --- packages/ui/certd-client/src/views/sys/nettest/index.vue | 1 - 4 files changed, 10 deletions(-) diff --git a/packages/ui/certd-client/src/views/sys/nettest/DomainTestCard.vue b/packages/ui/certd-client/src/views/sys/nettest/DomainTestCard.vue index 566811ac8..7af3d2eb7 100644 --- a/packages/ui/certd-client/src/views/sys/nettest/DomainTestCard.vue +++ b/packages/ui/certd-client/src/views/sys/nettest/DomainTestCard.vue @@ -221,14 +221,12 @@ onMounted(() => { border: 1px solid #e8e8e8; border-radius: 4px; overflow: hidden; - background-color: #fff; .card-header { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; - background-color: #fafafa; border-bottom: 1px solid #e8e8e8; } @@ -245,13 +243,11 @@ onMounted(() => { .input-form { margin-bottom: 12px; padding: 12px; - background-color: #fafafa; border-radius: 4px; } .domain-info { padding: 5.5px 12px; - background-color: #f0f0f0; border-radius: 4px; display: flex; gap: 16px; @@ -272,7 +268,6 @@ onMounted(() => { .summary { margin-top: 16px; padding: 12px; - background-color: #f8f9fa; border-radius: 4px; .summary-text { } diff --git a/packages/ui/certd-client/src/views/sys/nettest/ServerInfoCard.vue b/packages/ui/certd-client/src/views/sys/nettest/ServerInfoCard.vue index 30f6fdff7..580387342 100644 --- a/packages/ui/certd-client/src/views/sys/nettest/ServerInfoCard.vue +++ b/packages/ui/certd-client/src/views/sys/nettest/ServerInfoCard.vue @@ -110,7 +110,6 @@ onMounted(() => { } .info-item { - background-color: #fafafa; border-radius: 4px; padding: 12px; diff --git a/packages/ui/certd-client/src/views/sys/nettest/TestCase.vue b/packages/ui/certd-client/src/views/sys/nettest/TestCase.vue index 5c4c33664..5aee2efc6 100644 --- a/packages/ui/certd-client/src/views/sys/nettest/TestCase.vue +++ b/packages/ui/certd-client/src/views/sys/nettest/TestCase.vue @@ -138,7 +138,6 @@ const resultError = computed(() => { .port-info { font-size: 12px; color: #999; - background-color: #f0f0f0; padding: 2px 6px; border-radius: 3px; margin-right: 8px; @@ -154,7 +153,6 @@ const resultError = computed(() => { .error-message, .object-result, .text-result { - background-color: #f8f8f8; padding: 8px 10px; border-radius: 3px; overflow-x: auto; @@ -170,7 +168,6 @@ const resultError = computed(() => { } .test-log { - background-color: #f8f8f8; padding: 8px 10px; border-radius: 3px; overflow-x: auto; diff --git a/packages/ui/certd-client/src/views/sys/nettest/index.vue b/packages/ui/certd-client/src/views/sys/nettest/index.vue index c4bc4c348..3cec818ae 100644 --- a/packages/ui/certd-client/src/views/sys/nettest/index.vue +++ b/packages/ui/certd-client/src/views/sys/nettest/index.vue @@ -30,7 +30,6 @@ import ServerInfoCard from "./ServerInfoCard.vue"; .page-sys-nettest { .nettest-container { padding: 16px; - background-color: #fff; } .test-areas { From e55a3a82fc6939b940f0c3be4529d74a625f6f4e Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Feb 2026 14:39:11 +0800 Subject: [PATCH 09/21] =?UTF-8?q?perf:=20=E6=A8=A1=E7=89=88=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E9=A1=B5=E9=9D=A2=EF=BC=8Chover=E5=8F=8D=E8=89=B2?= =?UTF-8?q?=E8=BF=87=E4=BA=AE=E9=97=AE=E9=A2=98=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui/certd-client/src/style/certd.less | 1 + packages/ui/certd-client/src/style/common.less | 1 + packages/ui/certd-client/src/style/dark.less | 7 +++++++ .../src/views/certd/pipeline/template/edit.vue | 2 +- .../src/views/certd/pipeline/template/form.vue | 2 +- 5 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 packages/ui/certd-client/src/style/dark.less diff --git a/packages/ui/certd-client/src/style/certd.less b/packages/ui/certd-client/src/style/certd.less index b5ab166d5..eeb601bce 100644 --- a/packages/ui/certd-client/src/style/certd.less +++ b/packages/ui/certd-client/src/style/certd.less @@ -117,3 +117,4 @@ span.fs-icon-svg { margin: 0 !important; } } + diff --git a/packages/ui/certd-client/src/style/common.less b/packages/ui/certd-client/src/style/common.less index 5af60ac55..96a13462c 100644 --- a/packages/ui/certd-client/src/style/common.less +++ b/packages/ui/certd-client/src/style/common.less @@ -5,6 +5,7 @@ @import "./fix-windicss.less"; @import "./antdv4.less"; @import "./certd.less"; +@import "./dark.less"; html, body { diff --git a/packages/ui/certd-client/src/style/dark.less b/packages/ui/certd-client/src/style/dark.less new file mode 100644 index 000000000..0b167dff0 --- /dev/null +++ b/packages/ui/certd-client/src/style/dark.less @@ -0,0 +1,7 @@ +.dark{ + .fs-page-header{ + .title { + color: #d5d5d5 !important; + } + } +} \ No newline at end of file diff --git a/packages/ui/certd-client/src/views/certd/pipeline/template/edit.vue b/packages/ui/certd-client/src/views/certd/pipeline/template/edit.vue index 06b79cc79..3721cbf65 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/template/edit.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/template/edit.vue @@ -36,7 +36,7 @@
-
+
diff --git a/packages/ui/certd-client/src/views/certd/pipeline/template/form.vue b/packages/ui/certd-client/src/views/certd/pipeline/template/form.vue index 31e0686c1..9c15c38a2 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/template/form.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/template/form.vue @@ -7,7 +7,7 @@