From 671d273e2f9136d16896536b0ca127cf372f1619 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 25 Jun 2023 23:25:56 +0800 Subject: [PATCH] feat: save files --- packages/core/pipeline/src/core/executor.ts | 28 +++-- packages/core/pipeline/src/core/file-store.ts | 38 ++++++ packages/core/pipeline/src/core/storage.ts | 13 +- packages/core/pipeline/src/d.ts/pipeline.ts | 6 + packages/core/pipeline/src/plugin/api.ts | 60 ++++++++-- .../core/pipeline/src/plugin/decorator.ts | 8 ++ packages/core/pipeline/src/utils/util.file.ts | 16 +++ .../src/plugin/deploy-to-ack-ingress/index.ts | 8 +- .../src/plugin/deploy-to-cdn/index.ts | 14 +-- .../src/plugin/upload-to-aliyun/index.ts | 11 +- .../src/plugin/cert-plugin/index.ts | 24 ++-- packages/plugins/plugin-host/src/lib/ssh.ts | 14 ++- .../src/plugin/host-shell-execute/index.ts | 11 +- .../src/plugin/upload-to-host/index.ts | 15 +-- .../src/plugin/deploy-to-cdn/index.ts | 10 +- .../src/plugin/deploy-to-clb/index.ts | 11 +- .../src/plugin/deploy-to-tke-ingress/index.ts | 13 +- .../src/plugin/upload-to-tencent/index.ts | 11 +- packages/ui/certd-client/package.json | 1 + .../ui/certd-client/public/images/preview.png | Bin 0 -> 49225 bytes packages/ui/certd-client/public/logo.svg | 111 +----------------- .../src/store/modules/resource.ts | 26 ++-- .../src/store/modules/settings.ts | 2 +- .../ui/certd-client/src/utils/util.common.ts | 6 +- .../src/views/certd/access/crud.tsx | 3 + .../views/certd/pipeline/pipeline/index.vue | 6 + .../framework/home/content/image/preview.png | Bin 57168 -> 0 bytes .../views/framework/home/content/index.vue | 3 +- .../authority/controller/user-controller.ts | 3 +- .../modules/basic/service/email-service.ts | 3 +- 30 files changed, 253 insertions(+), 222 deletions(-) create mode 100644 packages/core/pipeline/src/core/file-store.ts create mode 100644 packages/core/pipeline/src/utils/util.file.ts create mode 100644 packages/ui/certd-client/public/images/preview.png delete mode 100644 packages/ui/certd-client/src/views/framework/home/content/image/preview.png diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index 1a629deee..d1e2f7d57 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -1,7 +1,7 @@ import { ConcurrencyStrategy, NotificationWhen, Pipeline, ResultType, Runnable, RunStrategy, Stage, Step, Task } from "../d.ts"; import _ from "lodash"; import { RunHistory, RunnableCollection } from "./run-history"; -import { AbstractTaskPlugin, PluginDefine, pluginRegistry } from "../plugin"; +import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext } from "../plugin"; import { ContextFactory, IContext } from "./context"; import { IStorage } from "./storage"; import { logger } from "../utils/util.log"; @@ -11,6 +11,7 @@ import { IAccessService } from "../access"; import { RegistryItem } from "../registry"; import { Decorator } from "../decorator"; import { IEmailService } from "../service"; +import { FileStore } from "./file-store"; export type ExecutorOptions = { userId: any; @@ -19,6 +20,7 @@ export type ExecutorOptions = { onChanged: (history: RunHistory) => Promise; accessService: IAccessService; emailService: IEmailService; + fileRootDir?: string; }; export class Executor { pipeline: Pipeline; @@ -59,7 +61,7 @@ export class Executor { }); await this.notification("success"); } catch (e) { - await this.notification("error"); + await this.notification("error", e); this.logger.error("pipeline 执行失败", e); } finally { await this.pipelineContext.setObj("lastRuntime", this.runtime); @@ -185,28 +187,38 @@ export class Executor { } }); - const context: any = { + const taskCtx: TaskInstanceContext = { + pipeline: this.pipeline, + step, + lastStatus, + http: request, logger: this.runtime._loggers[step.id], accessService: this.options.accessService, + emailService: this.options.emailService, pipelineContext: this.pipelineContext, - lastStatus, userContext: this.contextFactory.getContext("user", this.options.userId), - http: request, + fileStore: new FileStore({ + scope: this.pipeline.id, + parent: this.runtime.id, + rootDir: this.options.fileRootDir, + }), }; - Decorator.inject(define.autowire, instance, context); + instance.setCtx(taskCtx); await instance.onInstance(); await instance.execute(); - if (instance.result.clearLastStatus) { + if (instance._result.clearLastStatus) { this.lastStatusMap.clear(); } //输出到output context _.forEach(define.output, (item, key) => { - step!.status!.output[key] = instance[key]; + step.status!.output[key] = instance[key]; const stepOutputKey = `step.${step.id}.${key}`; this.runtime.context[stepOutputKey] = instance[key]; }); + + step.status!.files = instance.getFiles(); } async notification(when: NotificationWhen, error?: any) { diff --git a/packages/core/pipeline/src/core/file-store.ts b/packages/core/pipeline/src/core/file-store.ts new file mode 100644 index 000000000..89183ec80 --- /dev/null +++ b/packages/core/pipeline/src/core/file-store.ts @@ -0,0 +1,38 @@ +import { fileUtils } from "../utils/util.file"; +import dayjs from "dayjs"; +import path from "path"; +import fs from "fs"; + +export type FileStoreOptions = { + rootDir?: string; + scope: string; + parent: string; +}; + +export class FileStore { + rootDir: string; + scope: string; + parent: string; + constructor(options?: FileStoreOptions) { + this.rootDir = fileUtils.getFileRootDir(options?.rootDir); + this.scope = options?.scope || "0"; + this.parent = options?.parent || "0"; + } + + readFile(filePath: string) { + if (!fs.existsSync(filePath)) { + return null; + } + return fs.readFileSync(filePath); + } + + writeFile(filename: string, file: Buffer) { + const localPath = this.buildFilePath(filename); + fs.writeFileSync(localPath, file); + return localPath; + } + + private buildFilePath(filename: string) { + return path.join(this.rootDir, this.scope, dayjs().format("YYYY-MM-DD"), this.parent, filename); + } +} diff --git a/packages/core/pipeline/src/core/storage.ts b/packages/core/pipeline/src/core/storage.ts index 409eb23f5..fa0ab1778 100644 --- a/packages/core/pipeline/src/core/storage.ts +++ b/packages/core/pipeline/src/core/storage.ts @@ -1,7 +1,6 @@ import fs from "fs"; import path from "path"; - - +import { fileUtils } from "../utils/util.file"; export interface IStorage { get(scope: string, namespace: string, version: string, key: string): Promise; @@ -12,15 +11,7 @@ export interface IStorage { export class FileStorage implements IStorage { root: string; constructor(rootDir?: string) { - if (rootDir == null) { - const userHome = process.env.HOME || process.env.USERPROFILE; - rootDir = userHome + "/.certd/storage/"; - } - this.root = rootDir; - - if (!fs.existsSync(this.root)) { - fs.mkdirSync(this.root, { recursive: true }); - } + this.root = fileUtils.getFileRootDir(rootDir); } async remove(scope: string, namespace: string, version: string, key: string): Promise { diff --git a/packages/core/pipeline/src/d.ts/pipeline.ts b/packages/core/pipeline/src/d.ts/pipeline.ts index af19c9d42..29b2a2504 100644 --- a/packages/core/pipeline/src/d.ts/pipeline.ts +++ b/packages/core/pipeline/src/d.ts/pipeline.ts @@ -55,6 +55,10 @@ export type Trigger = { type: string; }; +export type FileItem = { + filename: string; + path: string; +}; export type Runnable = { id: string; title: string; @@ -64,6 +68,7 @@ export type Runnable = { default?: { [key: string]: any; }; + files?: FileItem[]; }; export type EmailOptions = { @@ -113,6 +118,7 @@ export type HistoryResultGroup = { export type HistoryResult = { input: any; output: any; + files?: FileItem[]; /** * 任务状态 */ diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 151772698..14d87dfc5 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -1,5 +1,11 @@ import { Registrable } from "../registry"; -import { FormItemProps } from "../d.ts"; +import { FileItem, FormItemProps, Pipeline, Runnable, Step } from "../d.ts"; +import { FileStore } from "../core/file-store"; +import { Logger } from "log4js"; +import { IAccessService } from "../access"; +import { IEmailService } from "../service"; +import { IContext } from "../core"; +import { AxiosInstance } from "axios"; export enum ContextScope { global, @@ -7,16 +13,11 @@ export enum ContextScope { runtime, } -export type Storage = { - scope: ContextScope; - path: string; -}; - export type TaskOutputDefine = { title: string; value?: any; - storage?: Storage; }; + export type TaskInputDefine = FormItemProps; export type PluginDefine = Registrable & { @@ -47,15 +48,56 @@ export type ITaskPlugin = { export type TaskResult = { clearLastStatus?: boolean; + files?: FileItem[]; }; +export type TaskInstanceContext = { + pipeline: Pipeline; + step: Step; + logger: Logger; + accessService: IAccessService; + emailService: IEmailService; + pipelineContext: IContext; + userContext: IContext; + http: AxiosInstance; + fileStore: FileStore; + lastStatus?: Runnable; +}; + export abstract class AbstractTaskPlugin implements ITaskPlugin { - result: TaskResult = {}; + _result: TaskResult = { clearLastStatus: false, files: [] }; + ctx!: TaskInstanceContext; clearLastStatus() { - this.result.clearLastStatus = true; + this._result.clearLastStatus = true; } + + getFiles() { + return this._result.files; + } + + setCtx(ctx: TaskInstanceContext) { + this.ctx = ctx; + } + + saveFile(filename: string, file: Buffer) { + const filePath = this.ctx.fileStore.writeFile(filename, file); + this._result.files!.push({ + filename, + path: filePath, + }); + } + + get pipeline() { + return this.ctx.pipeline; + } + + get step() { + return this.ctx.step; + } + async onInstance(): Promise { return; } + abstract execute(): Promise; } diff --git a/packages/core/pipeline/src/plugin/decorator.ts b/packages/core/pipeline/src/plugin/decorator.ts index f1ba21fe6..a6892795b 100644 --- a/packages/core/pipeline/src/plugin/decorator.ts +++ b/packages/core/pipeline/src/plugin/decorator.ts @@ -61,3 +61,11 @@ export function TaskOutput(output?: TaskOutputDefine): PropertyDecorator { Reflect.defineMetadata(PLUGIN_OUTPUT_KEY, output, target, propertyKey); }; } + +export const PLUGIN_DOWNLOAD_KEY = "pipeline:plugin:download"; +export function TaskDownload(output?: TaskOutputDefine): PropertyDecorator { + return (target, propertyKey) => { + target = Decorator.target(target, propertyKey); + Reflect.defineMetadata(PLUGIN_DOWNLOAD_KEY, output, target, propertyKey); + }; +} diff --git a/packages/core/pipeline/src/utils/util.file.ts b/packages/core/pipeline/src/utils/util.file.ts new file mode 100644 index 000000000..70ef9d6a2 --- /dev/null +++ b/packages/core/pipeline/src/utils/util.file.ts @@ -0,0 +1,16 @@ +import fs from "fs"; +function getFileRootDir(rootDir?: string) { + if (rootDir == null) { + const userHome = process.env.HOME || process.env.USERPROFILE; + rootDir = userHome + "/.certd/storage/"; + } + + if (!fs.existsSync(rootDir)) { + fs.mkdirSync(rootDir, { recursive: true }); + } + return rootDir; +} + +export const fileUtils = { + getFileRootDir, +}; diff --git a/packages/plugins/plugin-aliyun/src/plugin/deploy-to-ack-ingress/index.ts b/packages/plugins/plugin-aliyun/src/plugin/deploy-to-ack-ingress/index.ts index 25f55dc16..e2a95b228 100644 --- a/packages/plugins/plugin-aliyun/src/plugin/deploy-to-ack-ingress/index.ts +++ b/packages/plugins/plugin-aliyun/src/plugin/deploy-to-ack-ingress/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; // @ts-ignore import { ROAClient } from "@alicloud/pop-core"; import { AliyunAccess } from "../../access"; @@ -103,11 +103,13 @@ export class DeployCertToAliyunAckIngressPlugin extends AbstractTaskPlugin { }) accessId!: string; - @Autowire() accessService!: IAccessService; - @Autowire() logger!: ILogger; + async onInstance(): Promise { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { console.log("开始部署证书到阿里云cdn"); const { regionId, ingressClass, clusterId, isPrivateIpAddress, cert } = this; diff --git a/packages/plugins/plugin-aliyun/src/plugin/deploy-to-cdn/index.ts b/packages/plugins/plugin-aliyun/src/plugin/deploy-to-cdn/index.ts index 1d95e0538..d97dcee27 100644 --- a/packages/plugins/plugin-aliyun/src/plugin/deploy-to-cdn/index.ts +++ b/packages/plugins/plugin-aliyun/src/plugin/deploy-to-cdn/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; import dayjs from "dayjs"; import Core from "@alicloud/pop-core"; import RPCClient from "@alicloud/pop-core"; @@ -17,7 +17,7 @@ import { AliyunAccess } from "../../access"; export class DeployCertToAliyunCDN extends AbstractTaskPlugin { @TaskInput({ title: "CDN加速域名", - helper: "你在阿里云上配置的CDN加速域名,比如certd.docmirror.cn", + helper: "你在阿里云上配置的CDN加速域名,比如:certd.docmirror.cn", required: true, }) domainName!: string; @@ -49,13 +49,13 @@ export class DeployCertToAliyunCDN extends AbstractTaskPlugin { }) accessId!: string; - @Autowire() accessService!: IAccessService; - - @Autowire() logger!: ILogger; - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { console.log("开始部署证书到阿里云cdn"); const access = (await this.accessService.getById(this.accessId)) as AliyunAccess; diff --git a/packages/plugins/plugin-aliyun/src/plugin/upload-to-aliyun/index.ts b/packages/plugins/plugin-aliyun/src/plugin/upload-to-aliyun/index.ts index 42716e3c2..890126fec 100644 --- a/packages/plugins/plugin-aliyun/src/plugin/upload-to-aliyun/index.ts +++ b/packages/plugins/plugin-aliyun/src/plugin/upload-to-aliyun/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; import Core from "@alicloud/pop-core"; import { AliyunAccess } from "../../access"; import { appendTimeSuffix, checkRet, ZoneOptions } from "../../utils"; @@ -59,14 +59,13 @@ export class UploadCertToAliyun extends AbstractTaskPlugin { }) aliyunCertId!: string; - @Autowire() accessService!: IAccessService; - - @Autowire() logger!: Logger; - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { console.log("开始部署证书到阿里云cdn"); 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 5d19e8407..f06f48f72 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts @@ -1,9 +1,8 @@ -import { AbstractTaskPlugin, Autowire, HttpClient, IAccessService, IContext, IsTaskPlugin, RunStrategy, Step, TaskInput, TaskOutput } from "@certd/pipeline"; +import { AbstractTaskPlugin, Decorator, HttpClient, IAccessService, IContext, IsTaskPlugin, RunStrategy, Step, TaskInput, TaskOutput } from "@certd/pipeline"; import dayjs from "dayjs"; import { AcmeService, CertInfo } from "./acme"; import _ from "lodash"; import { Logger } from "log4js"; -import { Decorator } from "@certd/pipeline"; import { DnsProviderDefine, dnsProviderRegistry } from "../../dns-provider"; import { CertReader } from "./cert-reader"; @@ -109,22 +108,11 @@ export class CertApplyPlugin extends AbstractTaskPlugin { }) csrInfo: any; - // @ts-ignore - acme: AcmeService; - - @Autowire() + acme!: AcmeService; logger!: Logger; - - @Autowire() userContext!: IContext; - - @Autowire() accessService!: IAccessService; - - @Autowire() http!: HttpClient; - - @Autowire() lastStatus!: Step; @TaskOutput({ @@ -133,13 +121,19 @@ export class CertApplyPlugin extends AbstractTaskPlugin { cert?: CertInfo; async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + this.userContext = this.ctx.userContext; + this.http = this.ctx.http; + this.lastStatus = this.ctx.lastStatus as Step; + this.acme = new AcmeService({ userContext: this.userContext, logger: this.logger }); } async execute(): Promise { const oldCert = await this.condition(); if (oldCert != null) { - return this.output(oldCert); + return this.output(oldCert.toCertInfo()); } const cert = await this.doCertApply(); if (cert != null) { diff --git a/packages/plugins/plugin-host/src/lib/ssh.ts b/packages/plugins/plugin-host/src/lib/ssh.ts index 282575d94..2dfc518e5 100644 --- a/packages/plugins/plugin-host/src/lib/ssh.ts +++ b/packages/plugins/plugin-host/src/lib/ssh.ts @@ -61,6 +61,9 @@ export class SshClient { return new Promise((resolve, reject) => { this.connect({ connectConf, + onError(err: any) { + reject(err); + }, onReady: (conn: any) => { conn.exec(script, (err: Error, stream: any) => { if (err) { @@ -98,6 +101,10 @@ export class SshClient { return new Promise((resolve, reject) => { this.connect({ connectConf, + onError: (err: any) => { + this.logger.error(err); + reject(err); + }, onReady: (conn: any) => { conn.shell((err: Error, stream: any) => { if (err) { @@ -122,10 +129,13 @@ export class SshClient { }); } - connect(options: { connectConf: any; onReady: any }) { - const { connectConf, onReady } = options; + connect(options: { connectConf: any; onReady: any; onError: any }) { + const { connectConf, onReady, onError } = options; const conn = new ssh2.Client(); conn + .on("error", (err: any) => { + onError(err); + }) .on("ready", () => { this.logger.info("Client :: ready"); onReady(conn); diff --git a/packages/plugins/plugin-host/src/plugin/host-shell-execute/index.ts b/packages/plugins/plugin-host/src/plugin/host-shell-execute/index.ts index 58748f325..56bb9edee 100644 --- a/packages/plugins/plugin-host/src/plugin/host-shell-execute/index.ts +++ b/packages/plugins/plugin-host/src/plugin/host-shell-execute/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; import { SshClient } from "../../lib/ssh"; @IsTaskPlugin({ @@ -32,13 +32,12 @@ export class HostShellExecutePlugin extends AbstractTaskPlugin { }) script!: string; - @Autowire() accessService!: IAccessService; - @Autowire() logger!: ILogger; - - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const { script, accessId } = this; const connectConf = await this.accessService.getById(accessId); diff --git a/packages/plugins/plugin-host/src/plugin/upload-to-host/index.ts b/packages/plugins/plugin-host/src/plugin/upload-to-host/index.ts index 782899374..851cb6bdf 100644 --- a/packages/plugins/plugin-host/src/plugin/upload-to-host/index.ts +++ b/packages/plugins/plugin-host/src/plugin/upload-to-host/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; import { SshClient } from "../../lib/ssh"; import { CertInfo, CertReader } from "@certd/plugin-cert"; import * as fs from "fs"; @@ -49,11 +49,6 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin { }) sudo!: boolean; - @Autowire() - accessService!: IAccessService; - @Autowire() - logger!: ILogger; - @TaskOutput({ title: "证书保存路径", }) @@ -64,7 +59,13 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin { }) hostKeyPath!: string; - async onInstance() {} + accessService!: IAccessService; + logger!: ILogger; + + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const { crtPath, keyPath, cert, accessId, sudo } = this; const certReader = new CertReader(cert); diff --git a/packages/plugins/plugin-tencent/src/plugin/deploy-to-cdn/index.ts b/packages/plugins/plugin-tencent/src/plugin/deploy-to-cdn/index.ts index 95d3358be..357922cff 100644 --- a/packages/plugins/plugin-tencent/src/plugin/deploy-to-cdn/index.ts +++ b/packages/plugins/plugin-tencent/src/plugin/deploy-to-cdn/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput } from "@certd/pipeline"; import tencentcloud from "tencentcloud-sdk-nodejs/index"; import { TencentAccess } from "../../access"; import { CertInfo } from "@certd/plugin-cert"; @@ -47,14 +47,14 @@ export class DeployToCdnPlugin extends AbstractTaskPlugin { }) domainName!: string; - @Autowire() accessService!: IAccessService; - @Autowire() logger!: ILogger; - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const accessProvider: TencentAccess = (await this.accessService.getById(this.accessId)) as TencentAccess; diff --git a/packages/plugins/plugin-tencent/src/plugin/deploy-to-clb/index.ts b/packages/plugins/plugin-tencent/src/plugin/deploy-to-clb/index.ts index 8a585c80a..59dadbb18 100644 --- a/packages/plugins/plugin-tencent/src/plugin/deploy-to-clb/index.ts +++ b/packages/plugins/plugin-tencent/src/plugin/deploy-to-clb/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; import tencentcloud from "tencentcloud-sdk-nodejs/index"; import { TencentAccess } from "../../access"; import dayjs from "dayjs"; @@ -71,14 +71,13 @@ export class DeployToClbPlugin extends AbstractTaskPlugin { }) accessId!: string; - @Autowire() accessService!: IAccessService; - - @Autowire() logger!: ILogger; - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const accessProvider = (await this.accessService.getById(this.accessId)) as TencentAccess; const client = this.getClient(accessProvider, this.region); diff --git a/packages/plugins/plugin-tencent/src/plugin/deploy-to-tke-ingress/index.ts b/packages/plugins/plugin-tencent/src/plugin/deploy-to-tke-ingress/index.ts index 244fc68ca..21d36a6c0 100644 --- a/packages/plugins/plugin-tencent/src/plugin/deploy-to-tke-ingress/index.ts +++ b/packages/plugins/plugin-tencent/src/plugin/deploy-to-tke-ingress/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, IsTaskPlugin, RunStrategy, TaskInput, utils } from "@certd/pipeline"; import tencentcloud from "tencentcloud-sdk-nodejs/index"; import { K8sClient } from "@certd/plugin-util"; import dayjs from "dayjs"; @@ -80,15 +80,12 @@ export class DeployCertToTencentTKEIngressPlugin extends AbstractTaskPlugin { }) cert!: any; - @Autowire() logger!: Logger; - - @Autowire() accessService!: IAccessService; - - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} - + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const accessProvider = this.accessService.getById(this.accessId); const tkeClient = this.getTkeClient(accessProvider, this.region); diff --git a/packages/plugins/plugin-tencent/src/plugin/upload-to-tencent/index.ts b/packages/plugins/plugin-tencent/src/plugin/upload-to-tencent/index.ts index 52fcea094..8e9ad086c 100644 --- a/packages/plugins/plugin-tencent/src/plugin/upload-to-tencent/index.ts +++ b/packages/plugins/plugin-tencent/src/plugin/upload-to-tencent/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, Autowire, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IAccessService, ILogger, IsTaskPlugin, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; import tencentcloud from "tencentcloud-sdk-nodejs/index"; import dayjs from "dayjs"; @@ -42,14 +42,13 @@ export class UploadToTencentPlugin extends AbstractTaskPlugin { }) tencentCertId?: string; - @Autowire() accessService!: IAccessService; - - @Autowire() logger!: ILogger; - // eslint-disable-next-line @typescript-eslint/no-empty-function - async onInstance() {} + async onInstance() { + this.accessService = this.ctx.accessService; + this.logger = this.ctx.logger; + } async execute(): Promise { const { accessId, name, cert } = this; diff --git a/packages/ui/certd-client/package.json b/packages/ui/certd-client/package.json index e0156a97a..2a9d3364d 100644 --- a/packages/ui/certd-client/package.json +++ b/packages/ui/certd-client/package.json @@ -63,6 +63,7 @@ "@rollup/plugin-commonjs": "^23.0.4", "@rollup/plugin-node-resolve": "^15.0.1", "@types/chai": "^4.3.4", + "@types/lodash": "^4.14.195", "@types/mocha": "^10.0.1", "@types/node": "^18.11.15", "@typescript-eslint/eslint-plugin": "^5.46.1", diff --git a/packages/ui/certd-client/public/images/preview.png b/packages/ui/certd-client/public/images/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..0545a79d5e68e01b4311db7ffa140f2c8564e24a GIT binary patch literal 49225 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 literal 0 HcmV?d00001 diff --git a/packages/ui/certd-client/public/logo.svg b/packages/ui/certd-client/public/logo.svg index 1b1395a16..edcdefbed 100644 --- a/packages/ui/certd-client/public/logo.svg +++ b/packages/ui/certd-client/public/logo.svg @@ -1,106 +1,7 @@ - - - - - - - - - - - - - - - - - - - + + diff --git a/packages/ui/certd-client/src/store/modules/resource.ts b/packages/ui/certd-client/src/store/modules/resource.ts index 49a0c3a38..54ede0c51 100644 --- a/packages/ui/certd-client/src/store/modules/resource.ts +++ b/packages/ui/certd-client/src/store/modules/resource.ts @@ -30,13 +30,19 @@ export const useResourceStore = defineStore({ currentAsidePath: "" }), getters: { + // @ts-ignore getAsideMenus() { + // @ts-ignore return this.asideMenus; }, + // @ts-ignore getHeaderMenus() { + // @ts-ignore return this.headerMenus; }, + // @ts-ignore getFrameworkMenus() { + // @ts-ignore return this.frameworkMenus; } }, @@ -54,17 +60,17 @@ export const useResourceStore = defineStore({ this.inited = true; const showMenus = _.cloneDeep(frameworkMenus[0].children); - this.frameworkMenus = filterMenus(showMenus, (item) => { + this.frameworkMenus = filterMenus(showMenus, (item: any) => { return item?.meta?.showOnHeader !== false; }); - this.fixedAsideMenus = findMenus(showMenus, (item) => { + this.fixedAsideMenus = findMenus(showMenus, (item: any) => { return item?.meta?.fixedAside === true; }); this.headerMenus = headerMenus; this.setAsideMenu(); }, - setAsideMenu(topMenu?) { + setAsideMenu(topMenu?: any) { if (this.frameworkMenus.length === 0) { return; } @@ -74,13 +80,13 @@ export const useResourceStore = defineStore({ const asideMenus = topMenu?.children || []; this.asideMenus = [...this.fixedAsideMenus, ...asideMenus]; }, - setAsideMenuByCurrentRoute(matched) { + setAsideMenuByCurrentRoute(matched: any) { const menuHeader = this.frameworkMenus; if (matched?.length <= 1) { return; } - function findFromTree(tree, find) { + function findFromTree(tree: any, find: any) { const results: Array = []; for (const item of tree) { if (find(item)) { @@ -88,7 +94,7 @@ export const useResourceStore = defineStore({ return results; } if (item.children && item.children.length > 0) { - const found = findFromTree(item.children, find); + const found: any = findFromTree(item.children, find); if (found) { results.push(item); return results.concat(found); @@ -97,7 +103,7 @@ export const useResourceStore = defineStore({ } } const matchedPath = matched[1].path; - const _side = findFromTree(menuHeader, (menu) => menu.path === matchedPath); + const _side = findFromTree(menuHeader, (menu: any) => menu.path === matchedPath); if (_side?.length > 0) { if (this.currentAsidePath === _side[0]) { return; @@ -106,11 +112,11 @@ export const useResourceStore = defineStore({ this.setAsideMenu(_side[0]); } }, - filterByPermission(permissions) { + filterByPermission(permissions: any) { this.frameworkMenus = this.filterChildrenByPermission(this.frameworkMenus, permissions); }, - filterChildrenByPermission(list, permissions) { - const menus = list.filter((item) => { + filterChildrenByPermission(list: any, permissions: any) { + const menus = list.filter((item: any) => { if (item?.meta?.permission) { return permissions.includes(item.meta.permission); } diff --git a/packages/ui/certd-client/src/store/modules/settings.ts b/packages/ui/certd-client/src/store/modules/settings.ts index c5fc0446c..0b0b39c3b 100644 --- a/packages/ui/certd-client/src/store/modules/settings.ts +++ b/packages/ui/certd-client/src/store/modules/settings.ts @@ -51,7 +51,7 @@ export const useSettingStore = defineStore({ this.persistTheme(); // await changeTheme(this.theme.primaryColor); }, - async setPrimaryColor(color) { + async setPrimaryColor(color: any) { const theme = this.theme; theme.primaryColor = color; await this.setTheme(); diff --git a/packages/ui/certd-client/src/utils/util.common.ts b/packages/ui/certd-client/src/utils/util.common.ts index 27468b30a..7292e7f44 100644 --- a/packages/ui/certd-client/src/utils/util.common.ts +++ b/packages/ui/certd-client/src/utils/util.common.ts @@ -1,13 +1,13 @@ import _ from "lodash"; export default { - arrayToMap(array) { + arrayToMap(array: any) { if (!array) { return {}; } if (!_.isArray(array)) { return array; } - const map = {}; + const map: any = {}; for (const item of array) { if (item.key) { map[item.key] = item; @@ -15,7 +15,7 @@ export default { } return map; }, - mapToArray(map) { + mapToArray(map: any) { if (!map) { return []; } diff --git a/packages/ui/certd-client/src/views/certd/access/crud.tsx b/packages/ui/certd-client/src/views/certd/access/crud.tsx index a7fe92ebe..30a505126 100644 --- a/packages/ui/certd-client/src/views/certd/access/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/access/crud.tsx @@ -57,6 +57,9 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti name: { title: "名称", type: "text", + search: { + show: true + }, form: { rules: [{ required: true, message: "必填项" }] } 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 b2d3396bf..d9e81aa46 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 @@ -2,6 +2,7 @@
+
@@ -588,6 +589,7 @@ export default defineComponent({ pipeline, currentHistory, histories, + goBack, ...useTaskRet, ...useStageRet, ...useTrigger(), @@ -602,6 +604,10 @@ export default defineComponent({ .page-pipeline-edit { .fs-page-header { .title { + display: flex; + .back { + margin-right: 10px; + } .pi-editable { width: 300px; } diff --git a/packages/ui/certd-client/src/views/framework/home/content/image/preview.png b/packages/ui/certd-client/src/views/framework/home/content/image/preview.png deleted file mode 100644 index eab5a642d67285966555992942f0ec99be482740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57168 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 diff --git a/packages/ui/certd-client/src/views/framework/home/content/index.vue b/packages/ui/certd-client/src/views/framework/home/content/index.vue index b6d2422c7..38028404f 100644 --- a/packages/ui/certd-client/src/views/framework/home/content/index.vue +++ b/packages/ui/certd-client/src/views/framework/home/content/index.vue @@ -5,7 +5,7 @@

让你的证书永不过期

- +