From 3d42bfd479eaacc4a49c401224815a6e2a0204b0 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Wed, 24 Sep 2025 14:14:19 +0800 Subject: [PATCH 001/150] =?UTF-8?q?perf:=20=E6=89=8B=E5=8A=A8=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E8=AF=81=E4=B9=A6=E4=BC=98=E5=8C=96=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=88=B0=E6=9C=9F=E5=89=8D=E6=8A=A5=E9=94=99=E6=8F=90?= =?UTF-8?q?=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/pipeline/src/core/run-history.ts | 5 +- .../src/plugin/cert-plugin/custom/index.ts | 89 ++++++++++++------- 2 files changed, 57 insertions(+), 37 deletions(-) diff --git a/packages/core/pipeline/src/core/run-history.ts b/packages/core/pipeline/src/core/run-history.ts index 040f37abc..20d72ee9b 100644 --- a/packages/core/pipeline/src/core/run-history.ts +++ b/packages/core/pipeline/src/core/run-history.ts @@ -120,10 +120,9 @@ export class RunHistory { delete e.stack; delete e.cause; if (runnable.runnableType === "step") { - this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :`, e, stack, cause); - } else { - this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :`, e.message); + this._loggers[runnable.id].error(stack, cause); } + this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :`, e.message); } finally(runnable: Runnable) { diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/index.ts index 841b8914e..94ed7613a 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/index.ts @@ -6,6 +6,7 @@ import dayjs from "dayjs"; export { CertReader }; export type { CertInfo }; + @IsTaskPlugin({ name: "CertApplyUpload", icon: "ph:certificate", @@ -62,6 +63,19 @@ export type { CertInfo }; }, }) export class CertApplyUploadPlugin extends CertApplyBaseConvertPlugin { + @TaskInput({ + title: "过期前提醒", + value: 10, + component: { + name: "a-input-number", + vModel: "value", + }, + required: true, + order: 100, + helper: "到期前多少天提醒", + }) + renewDays!: number; + @TaskInput({ title: "手动上传证书", component: { @@ -97,6 +111,7 @@ export class CertApplyUploadPlugin extends CertApplyBaseConvertPlugin { this.userContext = this.ctx.userContext; this.lastStatus = this.ctx.lastStatus as Step; } + async onInit(): Promise {} async getCertFromStore() { @@ -107,48 +122,54 @@ export class CertApplyUploadPlugin extends CertApplyBaseConvertPlugin { } catch (e) { this.logger.warn("读取cert失败:", e); } - if (certReader == null) { - certReader = new CertReader(this.uploadCert); - } - if (!certReader.expires || certReader.expires < new Date().getTime()) { - throw new Error("证书已过期,停止部署,请重新上传证书"); - } - return certReader; } - async execute(): Promise { - let certReader = await this.getCertFromStore(); - const crtMd5 = this.ctx.utils.hash.md5(certReader.cert.crt); - - const leftDays = dayjs(certReader.expires).diff(dayjs(), "day"); - this.logger.info(`证书过期时间${dayjs(certReader.expires).format("YYYY-MM-DD HH:mm:ss")},剩余${leftDays}天`); - - if (!this.ctx.inputChanged) { - this.logger.info("输入参数无变化"); - const lastCrtMd5 = this.lastStatus?.status?.output?.certMd5; - this.logger.info("证书MD5", crtMd5); - this.logger.info("上次证书MD5", lastCrtMd5); - if (lastCrtMd5 === crtMd5) { - this.logger.info("证书无变化,跳过"); - //输出证书MD5 - this.certMd5 = crtMd5; - await this.output(certReader, false); - return "skip"; + private checkExpires(certReader: CertReader) { + const renewDays = (this.renewDays ?? 10) * 24 * 60 * 60 * 1000; + if (certReader.expires) { + if (certReader.expires < new Date().getTime()) { + throw new Error("证书已过期,停止部署,请尽快上传新证书"); + } + if (certReader.expires < new Date().getTime() + renewDays) { + throw new Error("证书即将已过期,停止部署,请尽快上传新证书"); + } + } + } + + async execute(): Promise { + const oldCertReader = await this.getCertFromStore(); + if (oldCertReader) { + const leftDays = dayjs(oldCertReader.expires).diff(dayjs(), "day"); + this.logger.info(`证书过期时间${dayjs(oldCertReader.expires).format("YYYY-MM-DD HH:mm:ss")},剩余${leftDays}天`); + this.checkExpires(oldCertReader); + if (!this.ctx.inputChanged) { + this.logger.info("输入参数无变化"); + const lastCrtMd5 = this.lastStatus?.status?.output?.certMd5; + const newCrtMd5 = this.ctx.utils.hash.md5(this.uploadCert.crt); + this.logger.info("证书MD5", newCrtMd5); + this.logger.info("上次证书MD5", lastCrtMd5); + if (lastCrtMd5 === newCrtMd5) { + this.logger.info("证书无变化,跳过"); + //输出证书MD5 + this.certMd5 = newCrtMd5; + await this.output(oldCertReader, false); + return "skip"; + } + this.logger.info("证书有变化,重新部署"); + } else { + this.logger.info("输入参数有变化,重新部署"); } - this.logger.info("证书有变化,重新部署"); - } else { - this.logger.info("输入参数有变化,重新部署"); } - certReader = new CertReader(this.uploadCert); + const newCertReader = new CertReader(this.uploadCert); this.clearLastStatus(); //输出证书MD5 - this.certMd5 = this.ctx.utils.hash.md5(certReader.cert.crt); - const newLeftDays = dayjs(certReader.expires).diff(dayjs(), "day"); - this.logger.info(`新证书过期时间${dayjs(certReader.expires).format("YYYY-MM-DD HH:mm:ss")},剩余${newLeftDays}天`); - - await this.output(certReader, true); + this.certMd5 = this.ctx.utils.hash.md5(newCertReader.cert.crt); + const newLeftDays = dayjs(newCertReader.expires).diff(dayjs(), "day"); + this.logger.info(`新证书过期时间${dayjs(newCertReader.expires).format("YYYY-MM-DD HH:mm:ss")},剩余${newLeftDays}天`); + this.checkExpires(newCertReader); + await this.output(newCertReader, true); //必须output之后执行 await this.emitCertApplySuccess(); From b8b4660563d16aa23bdd6a129c3d0a85992e59ab Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Wed, 24 Sep 2025 23:55:43 +0800 Subject: [PATCH 002/150] chore: 1 --- .gitignore | 2 - .vscode/launch.json | 43 +++++++++++++++ .vscode/settings.json | 4 ++ .vscode/tasks.json | 52 +++++++++++++++++++ .../ui/certd-server/.env.dev-localplus.yaml | 1 - 5 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json diff --git a/.gitignore b/.gitignore index 65958ab51..d81b17c05 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ ./packages/core/lego # IntelliJ project files -.vscode/ node_modules/ npm-debug.log yarn-error.log @@ -30,5 +29,4 @@ test/**/*.js /packages/ui/certd-server/data/db.sqlite /packages/ui/certd-server/data/keys.yaml /packages/pro/ - test.js \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..b9ec56400 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,43 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": "client", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}/packages/ui/certd-client", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + { + "name": "server", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}/packages/ui/certd-server", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + { + "name": "server-local-plus", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}/packages/ui/certd-server", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev-localplus"], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "env": { + "plus_use_prod": "false", + "PLUS_SERVER_BASE_URL": "http://127.0.0.1:11007" + } + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..8f3584587 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "eslint.debug": false, + "eslint.format.enable": true +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..abd3f50e2 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,52 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "启动Client", + "type": "shell", + "command": "npm", + "args": ["run", "dev"], + "options": { + "cwd": "${workspaceFolder}/packages/ui/certd-client" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared" + } + }, + { + "label": "启动Server", + "type": "shell", + "command": "npm", + "args": ["run", "dev"], + "options": { + "cwd": "${workspaceFolder}/packages/ui/certd-server" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared" + } + }, + { + "label": "同时启动Client和Server", + "dependsOn": ["启动Client", "启动Server"], + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/packages/ui/certd-server/.env.dev-localplus.yaml b/packages/ui/certd-server/.env.dev-localplus.yaml index 24dce0e4c..e7d98ea31 100644 --- a/packages/ui/certd-server/.env.dev-localplus.yaml +++ b/packages/ui/certd-server/.env.dev-localplus.yaml @@ -23,7 +23,6 @@ typeorm: database: './data/db-plus-dev-1.sqlite' # plus server: 'http://127.0.0.1:11007' - account: server: baseUrl: 'http://localhost:1017/subject' From 3f67c7c74a750e8c1b109da1302bc92b830fbcd2 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Thu, 25 Sep 2025 22:38:13 +0800 Subject: [PATCH 003/150] =?UTF-8?q?docs:=20=E5=A2=9E=E5=8A=A0=E5=AD=90?= =?UTF-8?q?=E5=9F=9F=E5=90=8D=E6=89=98=E7=AE=A1=E4=B8=8B=E7=9A=84cname?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E9=97=AE=E9=A2=98=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts | 2 +- packages/ui/certd-client/src/locales/langs/zh-CN/certd.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts index 97100fe4c..5b8fa86fd 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts @@ -541,7 +541,7 @@ export class CertApplyPlugin extends CertApplyBasePlugin { const mainDomain = await domainParser.parse(domain); const planSetting: DomainVerifyPlanInput = verifyPlanSetting[mainDomain]; if (planSetting == null) { - throw new Error(`没有找到域名(${domain})的校验计划`); + throw new Error(`没有找到域名(${domain})的校验计划(如果您在流水线创建之后设置了子域名托管,需要重新编辑一下证书申请任务和cname记录的校验状态)`); } if (planSetting.type === "dns") { plan[domain] = await this.createDnsDomainVerifyPlan(planSetting, domain, mainDomain); 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 49fb9d13b..e85e76936 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 @@ -461,7 +461,7 @@ export default { batchDeleteConfirm: "确定要批量删除这{count}条记录吗", selectRecordFirst: "请先勾选记录", subdomainHosted: "托管的子域名", - subdomainHelpText: "如果您不理解什么是子域托管,请不要随意设置,可能导致证书无法申请,可以参考文档", + subdomainHelpText: "如果您不理解什么是子域托管,请不要随意设置(可能导致证书无法申请,以前设置过的cname记录也需要重新配置),可以参考文档", subdomainManagement: "子域管理", isDisabled: "是否禁用", enabled: "启用", From 03f317ffdb6595ce70e8a2302b05f390c52110c8 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 26 Sep 2025 01:20:25 +0800 Subject: [PATCH 004/150] =?UTF-8?q?perf:=20=E6=94=AF=E6=8C=81=E8=85=BE?= =?UTF-8?q?=E8=AE=AF=E4=BA=91=E9=AA=8C=E8=AF=81=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../libs/lib-server/src/user/addon/api/api.ts | 47 ++++++++++++++++++- .../src/user/addon/service/addon-service.ts | 9 +++- .../src/plugin/cert-plugin/index.ts | 12 ++++- 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/packages/libs/lib-server/src/user/addon/api/api.ts b/packages/libs/lib-server/src/user/addon/api/api.ts index 4e65ce86c..3671f790e 100644 --- a/packages/libs/lib-server/src/user/addon/api/api.ts +++ b/packages/libs/lib-server/src/user/addon/api/api.ts @@ -1,6 +1,13 @@ import { HttpClient, ILogger, utils } from "@certd/basic"; import {upperFirst} from "lodash-es"; -import { FormItemProps, PluginRequestHandleReq, Registrable } from "@certd/pipeline"; +import { + accessRegistry, + FormItemProps, + IAccessService, + IServiceGetter, + PluginRequestHandleReq, + Registrable +} from "@certd/pipeline"; export type AddonRequestHandleReqInput = { @@ -48,6 +55,7 @@ export type AddonContext = { http: HttpClient; logger: ILogger; utils: typeof utils; + serviceGetter: IServiceGetter; }; export abstract class BaseAddon implements IAddon { @@ -58,8 +66,45 @@ export abstract class BaseAddon implements IAddon { + // eslint-disable-next-line @typescript-eslint/no-empty-function async onInstance() {} + + + async getAccess(accessId: string | number, isCommon = false) { + if (accessId == null) { + throw new Error("您还没有配置授权"); + } + const accessService = await this.ctx.serviceGetter.get("accessService") + let res: any = null; + if (isCommon) { + res = await accessService.getCommonById(accessId); + } else { + res = await accessService.getById(accessId); + } + if (res == null) { + throw new Error("授权不存在,可能已被删除,请前往任务配置里面重新选择授权"); + } + // @ts-ignore + if (this.logger?.addSecret) { + // 隐藏加密信息,不在日志中输出 + const type = res._type; + const plugin = accessRegistry.get(type); + const define = plugin.define; + // @ts-ignore + const input = define.input; + for (const key in input) { + if (input[key].encrypt && res[key] != null) { + // @ts-ignore + this.logger.addSecret(res[key]); + } + } + } + + return res as T; + } + + setCtx(ctx: AddonContext) { this.ctx = ctx; this.http = ctx.http; diff --git a/packages/libs/lib-server/src/user/addon/service/addon-service.ts b/packages/libs/lib-server/src/user/addon/service/addon-service.ts index d58d2453c..11da789c8 100644 --- a/packages/libs/lib-server/src/user/addon/service/addon-service.ts +++ b/packages/libs/lib-server/src/user/addon/service/addon-service.ts @@ -1,10 +1,11 @@ -import { Provide, Scope, ScopeEnum } from "@midwayjs/core"; +import { Inject, Provide, Scope, ScopeEnum } from "@midwayjs/core"; import { InjectEntityModel } from "@midwayjs/typeorm"; import { In, Repository } from "typeorm"; import { AddonDefine, BaseService, PageReq, PermissionException, ValidateException } from "../../../index.js"; import { addonRegistry, newAddon } from "../api/index.js"; import { AddonEntity } from "../entity/addon.js"; import { http, logger, utils } from "@certd/basic"; +import { TaskServiceBuilder } from "@certd/ui-server/dist/modules/pipeline/service/getter/task-service-getter.js"; /** * Addon @@ -15,6 +16,9 @@ export class AddonService extends BaseService { @InjectEntityModel(AddonEntity) repository: Repository; + @Inject() + private taskServiceBuilder: TaskServiceBuilder; + //@ts-ignore getRepository() { return this.repository; @@ -76,13 +80,14 @@ export class AddonService extends BaseService { } async getAddonById(id: any, checkUserId: boolean, userId?: number): Promise { + const serviceGetter = this.taskServiceBuilder.create({userId:userId??0}) const ctx = { http: http, logger: logger, utils: utils, + serviceGetter }; - if (!id){ //使用图片验证码 return await newAddon("captcha", "image", {},ctx); diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts index 5b8fa86fd..2141495a7 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts @@ -541,7 +541,7 @@ export class CertApplyPlugin extends CertApplyBasePlugin { const mainDomain = await domainParser.parse(domain); const planSetting: DomainVerifyPlanInput = verifyPlanSetting[mainDomain]; if (planSetting == null) { - throw new Error(`没有找到域名(${domain})的校验计划(如果您在流水线创建之后设置了子域名托管,需要重新编辑一下证书申请任务和cname记录的校验状态)`); + throw new Error(`没有找到域名(${domain})的校验计划(如果您在流水线创建之后设置了子域名托管,需要重新编辑证书申请任务和重新校验cname记录的校验状态)`); } if (planSetting.type === "dns") { plan[domain] = await this.createDnsDomainVerifyPlan(planSetting, domain, mainDomain); @@ -630,10 +630,20 @@ export class CertApplyPlugin extends CertApplyBasePlugin { if (cnameRecord == null) { throw new Error(`请先配置${domain}的CNAME记录,并通过校验`); } + if (cnameRecord.status !== "valid") { + throw new Error(`CNAME记录${domain}的校验状态为${cnameRecord.status},请等待校验通过`); + } + + // 主域名异常 + if (cnameRecord.mainDomain !== mainDomain) { + throw new Error(`CNAME记录${domain}的域名与配置的主域名不一致,请确认是否在流水线创建之后修改了子域名托管,您需要重新校验CNAME记录的校验状态`); + } + let dnsProvider = cnameRecord.commonDnsProvider; if (cnameRecord.cnameProvider.id > 0) { dnsProvider = await this.createDnsProvider(cnameRecord.cnameProvider.dnsProviderType, cnameRecord.cnameProvider.access); } + return { type: "cname", domain, From 83e6476408090b741fabb1b542fb458d9a8b4134 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 26 Sep 2025 01:21:01 +0800 Subject: [PATCH 005/150] =?UTF-8?q?perf:=20=E9=AA=8C=E8=AF=81=E7=A0=81?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=B5=8B=E8=AF=95=EF=BC=8C=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=A0=81=E9=9C=80=E8=A6=81=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E5=90=8E=E6=89=8D=E8=83=BD=E5=BC=80=E5=90=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui/certd-client/index.html | 1 + .../captcha/captchas/tencent_captcha.vue | 208 ++++++++++++++++++ .../cert/domains-verify-plan-editor/api.ts | 10 + .../cname-record-info.vue | 13 +- .../src/locales/langs/en-US/certd.ts | 4 +- .../src/locales/langs/zh-CN/certd.ts | 3 +- .../src/views/sys/settings/api.ts | 8 + .../src/views/sys/settings/index.vue | 2 +- .../src/views/sys/settings/tabs/base.vue | 35 +++ .../sys/access/access-controller.ts | 9 +- .../sys/settings/sys-settings-controller.ts | 7 + .../controller/user/addon/addon-controller.ts | 97 ++++---- .../user/cname/cname-record-controller.ts | 10 +- .../src/modules/cname/entity/cname-record.ts | 2 + .../cname/service/cname-record-service.ts | 23 +- .../service/getter/task-service-getter.ts | 8 +- .../src/plugins/plugin-captcha/index.ts | 1 + .../plugins/plugin-captcha/tencent/index.ts | 104 +++++++++ 18 files changed, 485 insertions(+), 60 deletions(-) create mode 100644 packages/ui/certd-client/src/components/captcha/captchas/tencent_captcha.vue create mode 100644 packages/ui/certd-server/src/plugins/plugin-captcha/tencent/index.ts diff --git a/packages/ui/certd-client/index.html b/packages/ui/certd-client/index.html index d760b2f58..e315e60c9 100644 --- a/packages/ui/certd-client/index.html +++ b/packages/ui/certd-client/index.html @@ -24,5 +24,6 @@ + diff --git a/packages/ui/certd-client/src/components/captcha/captchas/tencent_captcha.vue b/packages/ui/certd-client/src/components/captcha/captchas/tencent_captcha.vue new file mode 100644 index 000000000..88f06e177 --- /dev/null +++ b/packages/ui/certd-client/src/components/captcha/captchas/tencent_captcha.vue @@ -0,0 +1,208 @@ + + + diff --git a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/api.ts b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/api.ts index 01ffa5ecf..74ab87abb 100644 --- a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/api.ts +++ b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/api.ts @@ -45,6 +45,16 @@ export async function DoVerify(id: number) { }); } +export async function ResetStatus(id: number) { + return await request({ + url: apiPrefix + "/resetStatus", + method: "post", + data: { + id, + }, + }); +} + export async function ParseDomain(fullDomain: string) { return await request({ url: subDomainApiPrefix + "/parseDomain", diff --git a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-record-info.vue b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-record-info.vue index ebee7a678..9dac4178a 100644 --- a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-record-info.vue +++ b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-record-info.vue @@ -16,6 +16,9 @@ + + +