From 8a3841f6382b53ce2343307fb035e74fa5383fef Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Mar 2026 04:17:40 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=94=AF=E6=8C=81=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E8=BD=AC=E7=A7=BB=E6=B5=81=E6=B0=B4=E7=BA=BF=E5=88=B0=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/user/access/entity/access.ts | 4 + .../src/user/access/service/access-service.ts | 35 ++++ .../lib-server/src/user/addon/entity/addon.ts | 2 + .../src/user/addon/service/addon-service.ts | 6 + .../src/views/certd/mine/user-profile.vue | 2 +- .../src/views/certd/pipeline/api.ts | 8 + .../pipeline/components/change-project.vue | 64 +++++++ .../src/views/certd/pipeline/index.vue | 3 + .../db/migration/v10041__access_code.sql | 12 ++ .../user/pipeline/pipeline-controller.ts | 8 + .../modules/pipeline/entity/notification.ts | 3 + .../pipeline/service/notification-service.ts | 3 + .../pipeline/service/pipeline-service.ts | 169 ++++++++++++++---- 13 files changed, 283 insertions(+), 36 deletions(-) create mode 100644 packages/ui/certd-client/src/views/certd/pipeline/components/change-project.vue create mode 100644 packages/ui/certd-server/db/migration/v10041__access_code.sql diff --git a/packages/libs/lib-server/src/user/access/entity/access.ts b/packages/libs/lib-server/src/user/access/entity/access.ts index fa8349370..3bebf7bfa 100644 --- a/packages/libs/lib-server/src/user/access/entity/access.ts +++ b/packages/libs/lib-server/src/user/access/entity/access.ts @@ -7,8 +7,12 @@ import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; export class AccessEntity { @PrimaryGeneratedColumn() id: number; + @Column({ name: 'key_id', comment: 'key_id', length: 100 }) + keyId: string; + @Column({ name: 'user_id', comment: '用户id' }) userId: number; // 0为系统级别, -1为企业,大于1为用户 + @Column({ comment: '名称', length: 100 }) name: string; 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 f3e1ee29d..562b29cf7 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 @@ -5,6 +5,7 @@ import {AccessGetter, BaseService, PageReq, PermissionException, ValidateExcepti import {AccessEntity} from '../entity/access.js'; import {AccessDefine, accessRegistry, newAccess} from '@certd/pipeline'; import {EncryptService} from './encrypt-service.js'; +import { logger, utils } from '@certd/basic'; /** * 授权 @@ -46,6 +47,7 @@ export class AccessService extends BaseService { } delete param._copyFrom this.encryptSetting(param, oldEntity); + param.keyId = "ac_" + utils.id.simpleNanoId(); return await super.add(param); } @@ -117,6 +119,7 @@ export class AccessService extends BaseService { throw new ValidateException('该授权配置不存在,请确认是否已被删除'); } this.encryptSetting(param, oldEntity); + delete param.keyId return await super.update(param); } @@ -215,4 +218,36 @@ export class AccessService extends BaseService { }); } + + /** + * 复制授权到其他项目 + * @param accessId + * @param projectId + */ + async copyTo(accessId: number,projectId?: number) { + const access = await this.info(accessId); + if (access == null) { + throw new Error(`该授权配置不存在,请确认是否已被删除:id=${accessId}`); + } + + const keyId = access.keyId; + //检查目标项目里是否已经有相同keyId的配置 + const existAccess = await this.repository.findOne({ + where: { + keyId, + projectId, + }, + }); + if (existAccess) { + logger.info(`目标项目已存在相同keyId的授权配置,跳过复制:keyId=${keyId}`); + return existAccess.id; + } + const newAccess = { + ...access, + id: undefined, + projectId, + } + await this.add(newAccess); + return newAccess.id; + } } diff --git a/packages/libs/lib-server/src/user/addon/entity/addon.ts b/packages/libs/lib-server/src/user/addon/entity/addon.ts index 438de2237..43513e1aa 100644 --- a/packages/libs/lib-server/src/user/addon/entity/addon.ts +++ b/packages/libs/lib-server/src/user/addon/entity/addon.ts @@ -6,6 +6,8 @@ import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; export class AddonEntity { @PrimaryGeneratedColumn() id: number; + @Column({ name: 'key_id', comment: 'key_id', length: 100 }) + keyId: string; @Column({ name: 'user_id', comment: '用户id' }) userId: number; @Column({ comment: '名称', length: 100 }) 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 38c9636c0..d98d1d02b 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 @@ -4,6 +4,7 @@ import { In, Repository } from "typeorm"; import { AddonDefine, BaseService, PageReq, ValidateException } from "../../../index.js"; import { addonRegistry } from "../api/index.js"; import { AddonEntity } from "../entity/addon.js"; +import { utils } from "@certd/basic"; /** * Addon @@ -43,6 +44,7 @@ export class AddonService extends BaseService { } else { param.isSystem = false; } + param.keyId = "ad_" + utils.id.simpleNanoId(); delete param._copyFrom; return await super.add(param); } @@ -57,6 +59,7 @@ export class AddonService extends BaseService { if (oldEntity == null) { throw new ValidateException("该Addon配置不存在,请确认是否已被删除"); } + delete param.keyId return await super.update(param); } @@ -67,6 +70,7 @@ export class AddonService extends BaseService { } return { id: entity.id, + keyId: entity.keyId, name: entity.name, userId: entity.userId, addonType: entity.addonType, @@ -100,6 +104,7 @@ export class AddonService extends BaseService { }, select: { id: true, + keyId: true, name: true, addonType: true, type: true, @@ -132,6 +137,7 @@ export class AddonService extends BaseService { const setting = JSON.parse(res.setting); return { id: res.id, + keyId: res.keyId, addonType: res.addonType, type: res.type, name: res.name, diff --git a/packages/ui/certd-client/src/views/certd/mine/user-profile.vue b/packages/ui/certd-client/src/views/certd/mine/user-profile.vue index 0776d49c1..55ceccda6 100644 --- a/packages/ui/certd-client/src/views/certd/mine/user-profile.vue +++ b/packages/ui/certd-client/src/views/certd/mine/user-profile.vue @@ -784,7 +784,7 @@ onMounted(async () => { flex-direction: column; align-items: center; justify-content: center; - padding: 40px 20px; + padding: 20px 10px; color: #9ca3af; } diff --git a/packages/ui/certd-client/src/views/certd/pipeline/api.ts b/packages/ui/certd-client/src/views/certd/pipeline/api.ts index 391cbf1b4..1c84a0842 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/api.ts +++ b/packages/ui/certd-client/src/views/certd/pipeline/api.ts @@ -110,6 +110,14 @@ export async function BatchUpdateNotificaiton(pipelineIds: number[], notificatio }); } +export async function BatchUpdateProject(pipelineIds: number[], toProjectId: number): Promise { + return await request({ + url: apiPrefix + "/batchTransfer", + method: "post", + data: { ids: pipelineIds, toProjectId: toProjectId }, + }); +} + export async function BatchDelete(pipelineIds: number[]): Promise { return await request({ url: apiPrefix + "/batchDelete", diff --git a/packages/ui/certd-client/src/views/certd/pipeline/components/change-project.vue b/packages/ui/certd-client/src/views/certd/pipeline/components/change-project.vue new file mode 100644 index 000000000..440e36e83 --- /dev/null +++ b/packages/ui/certd-client/src/views/certd/pipeline/components/change-project.vue @@ -0,0 +1,64 @@ + + diff --git a/packages/ui/certd-client/src/views/certd/pipeline/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/index.vue index 8163471ad..89d734003 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/index.vue @@ -42,6 +42,7 @@ +