From 956d68695cf56456f8b99fb918609d73fe7e9765 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 13 Feb 2026 23:51:27 +0800 Subject: [PATCH] chore: project --- .../src/user/access/service/access-service.ts | 2 +- .../src/user/addon/service/addon-service.ts | 4 ++-- .../certd-client/src/locales/langs/zh-CN/certd.ts | 2 ++ .../src/views/certd/monitor/site/crud.tsx | 14 ++++++++++++++ .../db/migration/v10038__admin_mode.sql | 6 ++++++ .../src/controller/basic/login/oauth-controller.ts | 4 ++-- .../src/controller/openapi/v1/cert-controller.ts | 2 +- .../src/modules/basic/service/captcha-service.ts | 2 +- .../src/modules/basic/service/email-service.ts | 4 ++-- .../src/modules/cert/service/domain-service.ts | 6 ++++-- .../modules/cname/service/cname-record-service.ts | 2 +- .../src/modules/monitor/entity/site-info.ts | 3 +++ .../src/modules/monitor/facade/cert-info-facade.ts | 9 +++++---- .../modules/monitor/service/cert-info-service.ts | 7 ++++--- .../pipeline/service/addon-getter-service.ts | 13 +++++++------ .../service/getter/domain-verifier-getter.ts | 6 ++++-- .../pipeline/service/getter/sub-domain-getter.ts | 6 ++++-- .../pipeline/service/getter/task-service-getter.ts | 4 ++-- .../pipeline/service/notification-service.ts | 4 ++-- .../modules/pipeline/service/pipeline-service.ts | 3 ++- .../modules/pipeline/service/sub-domain-service.ts | 10 ++++++---- 21 files changed, 75 insertions(+), 38 deletions(-) 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 950e5f243..f3e1ee29d 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 @@ -196,7 +196,7 @@ export class AccessService extends BaseService { if (ids.length === 0) { return []; } - if (!userId) { + if (userId==null) { return []; } return await this.repository.find({ 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 c152d2fad..38c9636c0 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 @@ -89,7 +89,7 @@ export class AddonService extends BaseService { if (ids.length === 0) { return []; } - if (!userId) { + if (userId==null) { return []; } return await this.repository.find({ @@ -145,7 +145,7 @@ export class AddonService extends BaseService { if (!id) { throw new ValidateException("id不能为空"); } - if (!userId) { + if (userId==null) { throw new ValidateException("userId不能为空"); } await this.repository.update( 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 1b6b2c765..ff7119119 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 @@ -311,6 +311,8 @@ export default { days: "天", lastCheckTime: "上次检查时间", disabled: "禁用启用", + ipAddress: "IP地址", + ipAddressHelper: "填写则固定检查此IP,不从DNS获取域名的IP地址", ipCheck: "开启IP检查", ipCheckHelper: "开启后,会检查IP(或源站)上的证书有效期", ipSyncAuto: "自动同步IP", diff --git a/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx b/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx index e5c8ebf76..e307efd4c 100644 --- a/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx @@ -556,6 +556,20 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat }, }, }, + ipAddress: { + title: t("certd.monitor.ipAddress"), + search: { + show: false, + }, + type: "text", + form: { + helper: t("certd.monitor.ipAddressHelper"), + }, + column: { + width: 150, + sorter: true, + }, + }, groupId: { title: t("certd.fields.group"), type: "dict-select", diff --git a/packages/ui/certd-server/db/migration/v10038__admin_mode.sql b/packages/ui/certd-server/db/migration/v10038__admin_mode.sql index 19e42fc9d..8f81bdb16 100644 --- a/packages/ui/certd-server/db/migration/v10038__admin_mode.sql +++ b/packages/ui/certd-server/db/migration/v10038__admin_mode.sql @@ -66,6 +66,9 @@ CREATE INDEX "index_domain_project_id" ON "cd_domain" ("project_id"); ALTER TABLE user_settings ADD COLUMN project_id integer; CREATE INDEX "index_user_settings_project_id" ON "user_settings" ("project_id"); +ALTER TABLE cd_group ADD COLUMN project_id integer; +CREATE INDEX "index_group_project_id" ON "cd_group" ("project_id"); + @@ -104,3 +107,6 @@ CREATE INDEX "index_audit_log_user_id" ON "cd_audit_log" ("user_id"); CREATE INDEX "index_audit_log_project_id" ON "cd_audit_log" ("project_id"); + +ALTER TABLE cd_site_info ADD COLUMN ip_address varchar(128); + diff --git a/packages/ui/certd-server/src/controller/basic/login/oauth-controller.ts b/packages/ui/certd-server/src/controller/basic/login/oauth-controller.ts index f4de35338..8e89fdeb3 100644 --- a/packages/ui/certd-server/src/controller/basic/login/oauth-controller.ts +++ b/packages/ui/certd-server/src/controller/basic/login/oauth-controller.ts @@ -46,7 +46,7 @@ export class ConnectController extends BaseController { throw new Error(`未配置该OAuth类型:${type}`); } - const addon = await this.addonGetterService.getAddonById(setting.addonId, true, 0); + const addon = await this.addonGetterService.getAddonById(setting.addonId, true, 0,null); if (!addon) { throw new Error("初始化OAuth插件失败"); } @@ -251,7 +251,7 @@ export class ConnectController extends BaseController { provider.addonId = conf.addonId; provider.addonTitle = addonEntity.name; - const addon = await this.addonGetterService.getAddonById(conf.addonId,true,0); + const addon = await this.addonGetterService.getAddonById(conf.addonId,true,0,null); const {logoutUrl} = await addon.buildLogoutUrl(); if (logoutUrl){ provider.logoutUrl = logoutUrl; diff --git a/packages/ui/certd-server/src/controller/openapi/v1/cert-controller.ts b/packages/ui/certd-server/src/controller/openapi/v1/cert-controller.ts index 6824827ba..2136e727a 100644 --- a/packages/ui/certd-server/src/controller/openapi/v1/cert-controller.ts +++ b/packages/ui/certd-server/src/controller/openapi/v1/cert-controller.ts @@ -29,7 +29,7 @@ export class OpenCertController extends BaseOpenController { const openKey: OpenKey = this.ctx.openKey; const userId = openKey.userId; - if (!userId) { + if (userId==null) { throw new CodeException(Constants.res.openKeyError); } const projectId = openKey.projectId; diff --git a/packages/ui/certd-server/src/modules/basic/service/captcha-service.ts b/packages/ui/certd-server/src/modules/basic/service/captcha-service.ts index 76456e117..930980838 100644 --- a/packages/ui/certd-server/src/modules/basic/service/captcha-service.ts +++ b/packages/ui/certd-server/src/modules/basic/service/captcha-service.ts @@ -18,7 +18,7 @@ export class CaptchaService { const settings = await this.sysSettingsService.getPublicSettings(); captchaAddonId = settings.captchaAddonId ?? 0; } - const addon: ICaptchaAddon = await this.addonGetterService.getAddonById(captchaAddonId, true, 0, { + const addon: ICaptchaAddon = await this.addonGetterService.getAddonById(captchaAddonId, true, 0,null, { type: "captcha", name: "image" }); diff --git a/packages/ui/certd-server/src/modules/basic/service/email-service.ts b/packages/ui/certd-server/src/modules/basic/service/email-service.ts index 3b70d600a..84c959592 100644 --- a/packages/ui/certd-server/src/modules/basic/service/email-service.ts +++ b/packages/ui/certd-server/src/modules/basic/service/email-service.ts @@ -160,7 +160,7 @@ export class EmailService implements IEmailService { const emailConf = await this.sysSettingsService.getSetting(SysEmailConf); const template = emailConf?.templates?.[req.type] if (isPlus() && template && template.addonId) { - const addon: ITemplateProvider = await this.addonGetterService.getAddonById(template.addonId, true, 0) + const addon: ITemplateProvider = await this.addonGetterService.getAddonById(template.addonId, true, 0,null) if (addon) { content = await addon.buildContent({ data: req.data }) } @@ -168,7 +168,7 @@ export class EmailService implements IEmailService { if (isPlus() && !content ) { //看看有没有通用模版 if (emailConf?.templates?.common && emailConf?.templates?.common.addonId) { - const addon: ITemplateProvider = await this.addonGetterService.getAddonById(emailConf.templates.common.addonId, true, 0) + const addon: ITemplateProvider = await this.addonGetterService.getAddonById(emailConf.templates.common.addonId, true, 0,null) if (addon) { content = await addon.buildContent({ data: req.data }) } diff --git a/packages/ui/certd-server/src/modules/cert/service/domain-service.ts b/packages/ui/certd-server/src/modules/cert/service/domain-service.ts index c7b41b1c9..b8cf6e4a1 100644 --- a/packages/ui/certd-server/src/modules/cert/service/domain-service.ts +++ b/packages/ui/certd-server/src/modules/cert/service/domain-service.ts @@ -109,10 +109,10 @@ export class DomainService extends BaseService { * @param userId * @param domains //去除* 且去重之后的域名列表 */ - async getDomainVerifiers(userId: number, domains: string[]): Promise { + async getDomainVerifiers(userId: number, projectId: number, domains: string[]): Promise { const mainDomainMap: Record = {} - const taskService = this.taskServiceBuilder.create({ userId: userId }); + const taskService = this.taskServiceBuilder.create({ userId: userId, projectId: projectId }); const subDomainGetter = await taskService.getSubDomainsGetter(); const domainParser = new DomainParser(subDomainGetter) @@ -133,6 +133,7 @@ export class DomainService extends BaseService { where: { domain: In(allDomains), userId, + projectId, disabled: false, } }) @@ -153,6 +154,7 @@ export class DomainService extends BaseService { where: { domain: In(allDomains), userId, + projectId, status: "valid", } }) diff --git a/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts b/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts index cb1764ce2..8207ee687 100644 --- a/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts +++ b/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts @@ -72,7 +72,7 @@ export class CnameRecordService extends BaseService { if (!param.domain) { throw new ValidateException("域名不能为空"); } - if (!param.userId) { + if (param.userId == null) { throw new ValidateException("userId不能为空"); } if (param.domain.startsWith("*.")) { diff --git a/packages/ui/certd-server/src/modules/monitor/entity/site-info.ts b/packages/ui/certd-server/src/modules/monitor/entity/site-info.ts index 4535f49b3..80aae8a10 100644 --- a/packages/ui/certd-server/src/modules/monitor/entity/site-info.ts +++ b/packages/ui/certd-server/src/modules/monitor/entity/site-info.ts @@ -71,6 +71,9 @@ export class SiteInfoEntity { @Column({ name: 'group_id', comment: '分组id' }) groupId: number; + @Column({ name: 'ip_address', comment: 'IP地址', length: 128 }) + ipAddress: string; + @Column({ name: 'project_id', comment: '项目id' }) projectId: number; diff --git a/packages/ui/certd-server/src/modules/monitor/facade/cert-info-facade.ts b/packages/ui/certd-server/src/modules/monitor/facade/cert-info-facade.ts index bea4d24df..d0d63eafb 100644 --- a/packages/ui/certd-server/src/modules/monitor/facade/cert-info-facade.ts +++ b/packages/ui/certd-server/src/modules/monitor/facade/cert-info-facade.ts @@ -40,12 +40,12 @@ export class CertInfoFacade { } const domainArr = domains.split(','); - const matchedList = await this.certInfoService.getMatchCertList({domains:domainArr,userId}) + const matchedList = await this.certInfoService.getMatchCertList({domains:domainArr,userId,projectId}) if (matchedList.length === 0 ) { if(req.autoApply === true){ //自动申请,先创建自动申请流水线 - const pipeline:PipelineEntity = await this.createAutoPipeline({domains:domainArr,userId}) + const pipeline:PipelineEntity = await this.createAutoPipeline({domains:domainArr,userId,projectId}) await this.triggerApplyPipeline({pipelineId:pipeline.id}) }else{ throw new CodeException({ @@ -103,9 +103,9 @@ export class CertInfoFacade { return matched; } - async createAutoPipeline(req:{domains:string[],userId:number}){ + async createAutoPipeline(req:{domains:string[],userId:number,projectId:number}){ - const verifierGetter = new DomainVerifierGetter(req.userId, this.domainService) + const verifierGetter = new DomainVerifierGetter(req.userId, req.projectId, this.domainService) const allDomains = [] for (const item of req.domains) { @@ -133,6 +133,7 @@ export class CertInfoFacade { return await this.pipelineService.createAutoPipeline({ domains: req.domains, email, + projectId: req.projectId, userId: req.userId, from: "OpenAPI" }) diff --git a/packages/ui/certd-server/src/modules/monitor/service/cert-info-service.ts b/packages/ui/certd-server/src/modules/monitor/service/cert-info-service.ts index ff2ef2b65..86b51fc83 100644 --- a/packages/ui/certd-server/src/modules/monitor/service/cert-info-service.ts +++ b/packages/ui/certd-server/src/modules/monitor/service/cert-info-service.ts @@ -32,7 +32,7 @@ export class CertInfoService extends BaseService { } async getUserDomainCount(userId: number) { - if (!userId) { + if (userId==null) { throw new Error('userId is required'); } return await this.repository.sum('domainCount', { @@ -84,8 +84,8 @@ export class CertInfoService extends BaseService { }); } - async getMatchCertList(params: { domains: string[]; userId: number }) { - const { domains, userId } = params; + async getMatchCertList(params: { domains: string[]; userId: number,projectId?:number }) { + const { domains, userId,projectId } = params; if (!domains) { throw new CodeException({ ...Constants.res.openCertNotFound, @@ -102,6 +102,7 @@ export class CertInfoService extends BaseService { }, where: { userId, + projectId, }, order: { id: 'DESC', diff --git a/packages/ui/certd-server/src/modules/pipeline/service/addon-getter-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/addon-getter-service.ts index f31d6fc0f..ba6048aa6 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/addon-getter-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/addon-getter-service.ts @@ -16,9 +16,10 @@ export class AddonGetterService { addonService: AddonService; - async getAddonById(id: any, checkUserId: boolean, userId?: number, defaultAddon?:{type:string,name:string} ): Promise { + async getAddonById(id: any, checkUserId: boolean, userId?: number, projectId?: number, defaultAddon?:{type:string,name:string} ): Promise { const serviceGetter = this.taskServiceBuilder.create({ - userId + userId, + projectId, }); const ctx = { http, @@ -58,13 +59,13 @@ export class AddonGetterService { return await newAddon(entity.addonType, entity.type, input, ctx); } - async getById(id: any, userId: number): Promise { - return await this.getAddonById(id, true, userId); + async getById(id: any, userId: number, projectId?: number): Promise { + return await this.getAddonById(id, true, userId, projectId); } - async getBlank(addonType:string,subType:string){ - return await this.getAddonById(null,false,0,{ + async getBlank(addonType:string,subType:string,projectId?: number){ + return await this.getAddonById(null,false,0,projectId,{ type: addonType, name:subType }) } diff --git a/packages/ui/certd-server/src/modules/pipeline/service/getter/domain-verifier-getter.ts b/packages/ui/certd-server/src/modules/pipeline/service/getter/domain-verifier-getter.ts index 36744759d..251f8003e 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/getter/domain-verifier-getter.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/getter/domain-verifier-getter.ts @@ -3,15 +3,17 @@ import {DomainService} from "../../../cert/service/domain-service.js"; export class DomainVerifierGetter implements IDomainVerifierGetter { private userId: number; + private projectId: number; private domainService: DomainService; - constructor(userId: number, domainService: DomainService) { + constructor(userId: number, projectId: number, domainService: DomainService) { this.userId = userId; + this.projectId = projectId; this.domainService = domainService; } async getVerifiers(domains: string[]): Promise{ - return await this.domainService.getDomainVerifiers(this.userId,domains); + return await this.domainService.getDomainVerifiers(this.userId,this.projectId,domains); } } diff --git a/packages/ui/certd-server/src/modules/pipeline/service/getter/sub-domain-getter.ts b/packages/ui/certd-server/src/modules/pipeline/service/getter/sub-domain-getter.ts index a95a310b4..399a23a9d 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/getter/sub-domain-getter.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/getter/sub-domain-getter.ts @@ -4,17 +4,19 @@ import { DomainService } from "../../../cert/service/domain-service.js"; export class SubDomainsGetter implements ISubDomainsGetter { userId: number; + projectId: number; subDomainService: SubDomainService; domainService: DomainService; - constructor(userId: number, subDomainService: SubDomainService, domainService: DomainService) { + constructor(userId: number, projectId: number, subDomainService: SubDomainService, domainService: DomainService) { this.userId = userId; + this.projectId = projectId; this.subDomainService = subDomainService; this.domainService = domainService; } async getSubDomains() { - return await this.subDomainService.getListByUserId(this.userId) + return await this.subDomainService.getListByUserId(this.userId, this.projectId) } async hasSubDomain(fullDomain: string) { diff --git a/packages/ui/certd-server/src/modules/pipeline/service/getter/task-service-getter.ts b/packages/ui/certd-server/src/modules/pipeline/service/getter/task-service-getter.ts index b99b6bd88..e30a20511 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/getter/task-service-getter.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/getter/task-service-getter.ts @@ -48,7 +48,7 @@ export class TaskServiceGetter implements IServiceGetter{ async getSubDomainsGetter(): Promise { const subDomainsService:SubDomainService = await this.appCtx.getAsync("subDomainService") const domainService:DomainService = await this.appCtx.getAsync("domainService") - return new SubDomainsGetter(this.userId, subDomainsService,domainService) + return new SubDomainsGetter(this.userId,this.projectId, subDomainsService,domainService) } async getAccessService(): Promise { @@ -69,7 +69,7 @@ export class TaskServiceGetter implements IServiceGetter{ async getDomainVerifierGetter(): Promise { const domainService:DomainService = await this.appCtx.getAsync("domainService") - return new DomainVerifierGetter(this.userId, domainService); + return new DomainVerifierGetter(this.userId, this.projectId, domainService); } } @Provide() diff --git a/packages/ui/certd-server/src/modules/pipeline/service/notification-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/notification-service.ts index 14ddd287d..a6504720f 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/notification-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/notification-service.ts @@ -88,7 +88,7 @@ export class NotificationService extends BaseService { if (!id) { throw new ValidateException('id不能为空'); } - if (!userId) { + if (userId==null) { throw new ValidateException('userId不能为空'); } const res = await this.repository.findOne({ @@ -135,7 +135,7 @@ export class NotificationService extends BaseService { if (!id) { throw new ValidateException('id不能为空'); } - if (!userId) { + if (userId==null) { throw new ValidateException('userId不能为空'); } await this.repository.update( 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 3d8f9b2e4..b6dd4a211 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 @@ -1082,7 +1082,7 @@ export class PipelineService extends BaseService { } } - async createAutoPipeline(req: { domains: string[]; email: string; userId: number, from: string }) { + async createAutoPipeline(req: { domains: string[]; email: string; userId: number,projectId?:number, from: string }) { const randomHour = Math.floor(Math.random() * 6); const randomMin = Math.floor(Math.random() * 60); @@ -1162,6 +1162,7 @@ export class PipelineService extends BaseService { bean.type = "cert_auto"; bean.disabled = false bean.keepHistoryCount = 30 + bean.projectId = req.projectId await this.save(bean) diff --git a/packages/ui/certd-server/src/modules/pipeline/service/sub-domain-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/sub-domain-service.ts index 5b37a5841..5f2d6c742 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/sub-domain-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/sub-domain-service.ts @@ -22,13 +22,14 @@ export class SubDomainService extends BaseService { return this.repository; } - async getListByUserId(userId:number):Promise{ - if (!userId) { + async getListByUserId(userId:number, projectId?: number):Promise{ + if (userId==null) { return []; } const list = await this.find({ where: { userId, + projectId, disabled: false, }, }); @@ -37,17 +38,18 @@ export class SubDomainService extends BaseService { } async add(bean: SubDomainEntity) { - const {domain, userId} = bean; + const {domain, userId, projectId} = bean; if (!domain) { throw new Error('域名不能为空'); } - if (!userId) { + if (userId==null) { throw new Error('用户ID不能为空'); } const exist = await this.repository.findOne({ where: { domain, userId, + projectId, }, }); if (exist) {