From 3d8a5196a099698f69638a1a2ce26ffd1c87c53f Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 12 Apr 2025 01:21:50 +0800 Subject: [PATCH] =?UTF-8?q?refactor(core):=20=E9=87=8D=E6=9E=84=E8=AE=BF?= =?UTF-8?q?=E9=97=AE=E6=8E=A7=E5=88=B6=E5=92=8C=E6=8F=92=E4=BB=B6=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改访问控制和插件注册方式,使用异步函数统一实例化逻辑 - 更新相关组件和控制器以适应新的异步实例化方式 - 优化 DNS 提供商选择器,增加访问类型支持 --- .../core/pipeline/src/access/decorator.ts | 10 +++++--- packages/core/pipeline/src/core/executor.ts | 10 +++----- .../pipeline/src/notification/decorator.ts | 9 ++++--- .../core/pipeline/src/plugin/decorator.ts | 4 +++- .../core/pipeline/src/registry/registry.ts | 2 +- .../src/user/access/service/access-service.ts | 2 +- .../src/plugin/cert-plugin/index.ts | 14 +++++++++-- .../plugins/cert/dns-provider-selector/api.ts | 2 +- .../cert/dns-provider-selector/index.vue | 24 ++++++++++++++----- .../http-verify-plan.vue | 10 ++++---- .../cert/domains-verify-plan-editor/index.vue | 15 ++++++++++-- .../cert/domains-verify-plan-editor/type.ts | 1 + .../user/pipeline/dns-provider-controller.ts | 2 ++ .../user/pipeline/handle-controller.ts | 4 ++-- .../modules/plugin/service/plugin-service.ts | 9 ++++--- 15 files changed, 79 insertions(+), 39 deletions(-) diff --git a/packages/core/pipeline/src/access/decorator.ts b/packages/core/pipeline/src/access/decorator.ts index b131ecd1..d961131f 100644 --- a/packages/core/pipeline/src/access/decorator.ts +++ b/packages/core/pipeline/src/access/decorator.ts @@ -26,7 +26,9 @@ export function IsAccess(define: AccessDefine): ClassDecorator { target.define = define; accessRegistry.register(define.name, { define, - target, + target: async () => { + return target; + }, }); }; } @@ -39,13 +41,15 @@ export function AccessInput(input?: AccessInputDefine): PropertyDecorator { }; } -export function newAccess(type: string, input: any, ctx?: AccessContext) { +export async function newAccess(type: string, input: any, ctx?: AccessContext) { const register = accessRegistry.get(type); if (register == null) { throw new Error(`access ${type} not found`); } // @ts-ignore - const access = new register.target(); + const accessCls = await register.target(); + // @ts-ignore + const access = new accessCls(); for (const key in input) { access[key] = input[key]; } diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index 0e1b0ded..c79dee66 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -281,13 +281,9 @@ export class Executor { let instance: ITaskPlugin = null; try { //@ts-ignore - if (plugin.target.define) { - //@ts-ignore - instance = new plugin.target(); - } else { - //@ts-ignore - instance = await plugin.target(); - } + const pluginCls = await plugin.target(); + //@ts-ignore + instance = new pluginCls(); } catch (e: any) { currentLogger.error(`实例化插件失败:${e.message}`); throw new Error(`实例化插件失败`, e); diff --git a/packages/core/pipeline/src/notification/decorator.ts b/packages/core/pipeline/src/notification/decorator.ts index b5b9efd2..53ff8cbc 100644 --- a/packages/core/pipeline/src/notification/decorator.ts +++ b/packages/core/pipeline/src/notification/decorator.ts @@ -26,7 +26,9 @@ export function IsNotification(define: NotificationDefine): ClassDecorator { target.define = define; notificationRegistry.register(define.name, { define, - target, + target: async () => { + return target; + }, }); }; } @@ -44,9 +46,10 @@ export async function newNotification(type: string, input: any, ctx: Notificatio if (register == null) { throw new Error(`notification ${type} not found`); } - // @ts-ignore - const plugin = new register.target(); + const pluginCls = await register.target(); + // @ts-ignore + const plugin = new pluginCls(); merge(plugin, input); if (!ctx) { throw new Error("ctx is required"); diff --git a/packages/core/pipeline/src/plugin/decorator.ts b/packages/core/pipeline/src/plugin/decorator.ts index 48024a19..f9a0c8da 100644 --- a/packages/core/pipeline/src/plugin/decorator.ts +++ b/packages/core/pipeline/src/plugin/decorator.ts @@ -65,7 +65,9 @@ export function IsTaskPlugin(define: PluginDefine): ClassDecorator { pluginRegistry.register(define.name, { define, - target, + target: async () => { + return target; + }, }); }; } diff --git a/packages/core/pipeline/src/registry/registry.ts b/packages/core/pipeline/src/registry/registry.ts index 529cec26..4e7c76b6 100644 --- a/packages/core/pipeline/src/registry/registry.ts +++ b/packages/core/pipeline/src/registry/registry.ts @@ -11,7 +11,7 @@ export type Registrable = { export type TargetGetter = () => Promise; export type RegistryItem = { define: Registrable; - target: T | TargetGetter; + target: TargetGetter; }; export type OnRegisterContext = { diff --git a/packages/libs/lib-server/src/user/access/service/access-service.ts b/packages/libs/lib-server/src/user/access/service/access-service.ts index 86ac92b2..b928f04b 100644 --- a/packages/libs/lib-server/src/user/access/service/access-service.ts +++ b/packages/libs/lib-server/src/user/access/service/access-service.ts @@ -140,7 +140,7 @@ export class AccessService extends BaseService { id: entity.id, ...setting, }; - return newAccess(entity.type, input); + return await newAccess(entity.type, input); } async getById(id: any, userId: number): Promise { 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 5923c343..3166e08e 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts @@ -29,6 +29,7 @@ export type DomainVerifyPlanInput = { domain: string; type: "cname" | "dns" | "http"; dnsProviderType?: string; + dnsProviderAccessType?: string; dnsProviderAccessId?: number; cnameVerifyPlan?: Record; httpVerifyPlan?: Record; @@ -99,7 +100,14 @@ HTTP文件验证:不支持泛域名,需要配置网站文件上传`, return { show: ctx.compute(({form})=>{ return form.challengeType === 'dns' - }) + }), + component:{ + on:{ + selectedChange({form,$event}){ + form.dnsProviderAccessType = $event.accessType + } + } + } } `, required: true, @@ -107,6 +115,8 @@ HTTP文件验证:不支持泛域名,需要配置网站文件上传`, }) dnsProviderType!: string; + dnsProviderAccessType!: string; + @TaskInput({ title: "DNS解析授权", component: { @@ -117,7 +127,7 @@ HTTP文件验证:不支持泛域名,需要配置网站文件上传`, mergeScript: `return { component:{ type: ctx.compute(({form})=>{ - return form.dnsProviderType + return form.dnsProviderAccessType || form.dnsProviderType }) }, show: ctx.compute(({form})=>{ diff --git a/packages/ui/certd-client/src/components/plugins/cert/dns-provider-selector/api.ts b/packages/ui/certd-client/src/components/plugins/cert/dns-provider-selector/api.ts index 4f6f98e7..4e564517 100644 --- a/packages/ui/certd-client/src/components/plugins/cert/dns-provider-selector/api.ts +++ b/packages/ui/certd-client/src/components/plugins/cert/dns-provider-selector/api.ts @@ -5,6 +5,6 @@ const apiPrefix = "/pi/dnsProvider"; export async function GetList() { return await request({ url: apiPrefix + "/list", - method: "post" + method: "post", }); } diff --git a/packages/ui/certd-client/src/components/plugins/cert/dns-provider-selector/index.vue b/packages/ui/certd-client/src/components/plugins/cert/dns-provider-selector/index.vue index 65369982..2c5c733c 100644 --- a/packages/ui/certd-client/src/components/plugins/cert/dns-provider-selector/index.vue +++ b/packages/ui/certd-client/src/components/plugins/cert/dns-provider-selector/index.vue @@ -11,10 +11,10 @@ export default { props: { modelValue: { type: String, - default: undefined - } + default: undefined, + }, }, - emits: ["update:modelValue"], + emits: ["update:modelValue", "selected-change"], setup(props: any, ctx: any) { const options = ref([]); @@ -25,24 +25,36 @@ export default { array.push({ value: item.name, label: item.title, - icon: item.icon + icon: item.icon, + accessType: item.accessType, }); } options.value = array; // if (props.modelValue == null && options.value.length > 0) { // ctx.emit("update:modelValue", options.value[0].value); // } + onSelectedChange(props.modelValue); } onCreate(); function onChanged(value: any) { ctx.emit("update:modelValue", value); + onSelectedChange(value); + } + function onSelectedChange(value: any) { + if (value) { + const option = options.value.find(item => item.value == value); + if (option) { + ctx.emit("selected-change", option); + return; + } + } } return { options, - onChanged + onChanged, }; - } + }, }; diff --git a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/http-verify-plan.vue b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/http-verify-plan.vue index 20fda021..624ee671 100644 --- a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/http-verify-plan.vue +++ b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/http-verify-plan.vue @@ -35,7 +35,7 @@ import { HttpRecord } from "/@/components/plugins/cert/domains-verify-plan-edito import { dict } from "@fast-crud/fast-crud"; defineOptions({ - name: "HttpVerifyPlan" + name: "HttpVerifyPlan", }); const emit = defineEmits(["update:modelValue", "change"]); @@ -53,12 +53,12 @@ watch( (value: any) => { if (value) { records.value = { - ...value + ...value, }; } }, { - immediate: true + immediate: true, } ); @@ -75,8 +75,8 @@ const uploaderTypeDict = dict({ { label: "阿里云OSS", value: "alioss" }, { label: "腾讯云COS", value: "tencentcos" }, { label: "七牛OSS", value: "qiniuoss" }, - { label: "SSH(已废弃,请选择SFTP方式)", value: "ssh", disabled: true } - ] + { label: "SSH(已废弃,请选择SFTP方式)", value: "ssh", disabled: true }, + ], }); diff --git a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/index.vue b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/index.vue index c71d0c38..14136eb3 100644 --- a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/index.vue +++ b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/index.vue @@ -32,14 +32,21 @@
DNS类型: - +
DNS授权: - +
@@ -101,6 +108,10 @@ const emit = defineEmits<{ "update:modelValue": any; }>(); +function onDnsProviderChange(item: any, option: any) { + item.dnsProviderAccessType = option.accessType; +} + const fullscreen = ref(false); function fullscreenExit() { if (fullscreen.value) { diff --git a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/type.ts b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/type.ts index bf8a5740..10e03a55 100644 --- a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/type.ts +++ b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/type.ts @@ -12,6 +12,7 @@ export type DomainVerifyPlanInput = { domains: string[]; type: "cname" | "dns" | "http"; dnsProviderType?: string; + dnsProviderAccessType?: string; dnsProviderAccessId?: number; cnameVerifyPlan?: Record; httpVerifyPlan?: Record; diff --git a/packages/ui/certd-server/src/controller/user/pipeline/dns-provider-controller.ts b/packages/ui/certd-server/src/controller/user/pipeline/dns-provider-controller.ts index 0c871fa5..c03a79bf 100644 --- a/packages/ui/certd-server/src/controller/user/pipeline/dns-provider-controller.ts +++ b/packages/ui/certd-server/src/controller/user/pipeline/dns-provider-controller.ts @@ -27,6 +27,8 @@ export class DnsProviderController extends BaseController { dict.push({ value: item.name, label: item.title, + //@ts-ignore + accessType: item.accessType, }); } return this.ok(dict); 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 fd5a9edd..dbdbea9c 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 @@ -49,7 +49,7 @@ export class HandleController extends BaseController { } } - const access = newAccess(body.typeName, inputAccess); + const access = await newAccess(body.typeName, inputAccess); const res = await access.onRequest(body); @@ -76,7 +76,7 @@ export class HandleController extends BaseController { async pluginRequest(@Body(ALL) body: PluginRequestHandleReq) { const userId = this.getUserId(); const pluginDefine = pluginRegistry.get(body.typeName); - const pluginCls = pluginDefine.target; + const pluginCls = await pluginDefine.target(); if (pluginCls == null) { throw new Error(`plugin ${body.typeName} not found`); } diff --git a/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts b/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts index e99a8f7f..047e4609 100644 --- a/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts +++ b/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts @@ -213,10 +213,9 @@ export class PluginService extends BaseService { // const script = await this.compile(plugin.content); const script = plugin.content const getPluginClass = new AsyncFunction(script); - const pluginClass = await getPluginClass({ logger: logger }); - return new pluginClass(); + return await getPluginClass({ logger: logger }); }catch (e) { - logger.error("实例化插件失败:",e) + logger.error("编译插件失败:",e) throw e } @@ -266,8 +265,8 @@ export class PluginService extends BaseService { registry.register(item.name, { define: item, - target: () => { - return this.getPluginTarget(item.name); + target: async () => { + return await this.getPluginTarget(item.name); } }); }