diff --git a/packages/libs/lib-server/src/system/settings/service/models.ts b/packages/libs/lib-server/src/system/settings/service/models.ts index 3cb7c762e..993ed6b0c 100644 --- a/packages/libs/lib-server/src/system/settings/service/models.ts +++ b/packages/libs/lib-server/src/system/settings/service/models.ts @@ -53,6 +53,8 @@ export class SysPublicSettings extends BaseSettings { //默认到期前更新天数 defaultCertRenewDays?: number; + // 即将到期天数 + defaultWillExpireDays?: number = 15; // 第三方OAuth配置 oauthEnabled?: boolean = false; diff --git a/packages/ui/certd-client/src/components/vip-button/index.vue b/packages/ui/certd-client/src/components/vip-button/index.vue index 450344401..e72457e8d 100644 --- a/packages/ui/certd-client/src/components/vip-button/index.vue +++ b/packages/ui/certd-client/src/components/vip-button/index.vue @@ -445,6 +445,11 @@ function openUpgrade() {
{slots}
+
+ + {t("vip.question")} + +
{t("vip.site_id")}: diff --git a/packages/ui/certd-client/src/locales/langs/en-US/certd.ts b/packages/ui/certd-client/src/locales/langs/en-US/certd.ts index 80c1066f5..b1daa1bf4 100644 --- a/packages/ui/certd-client/src/locales/langs/en-US/certd.ts +++ b/packages/ui/certd-client/src/locales/langs/en-US/certd.ts @@ -330,6 +330,11 @@ export default { certValidDays: "Certificate Valid Days", certValidDaysHelper: "Number of days before expiration to send a notification", }, + cert: { + expired: "Expired", + expiring: "Expiring", + noExpired: "Not Expired", + }, }, checkStatus: { success: "Success", diff --git a/packages/ui/certd-client/src/locales/langs/en-US/vip.ts b/packages/ui/certd-client/src/locales/langs/en-US/vip.ts index 6e03ba2fe..492abed77 100644 --- a/packages/ui/certd-client/src/locales/langs/en-US/vip.ts +++ b/packages/ui/certd-client/src/locales/langs/en-US/vip.ts @@ -100,4 +100,5 @@ export default { confirm: "Confirm", not_effective: "Not effective or duration not sync?", learn_more: "More privileges", + question: "More VIP related questions", }; 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 19f34a730..ab939d28a 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 @@ -337,6 +337,12 @@ export default { certValidDays: "证书到期前天数", certValidDaysHelper: "证书到期前多少天发送通知", }, + + cert: { + expired: "已过期", + expiring: "即将过期", + noExpired: "未过期", + }, }, checkStatus: { success: "成功", diff --git a/packages/ui/certd-client/src/locales/langs/zh-CN/vip.ts b/packages/ui/certd-client/src/locales/langs/zh-CN/vip.ts index 4dd34f8e8..e4edf5782 100644 --- a/packages/ui/certd-client/src/locales/langs/zh-CN/vip.ts +++ b/packages/ui/certd-client/src/locales/langs/zh-CN/vip.ts @@ -99,4 +99,5 @@ export default { confirm: "确认", not_effective: "VIP没有生效/时长未同步?", learn_more: "更多特权(加VIP群等)", + question: "更多VIP相关问题", }; diff --git a/packages/ui/certd-client/src/store/settings/api.basic.ts b/packages/ui/certd-client/src/store/settings/api.basic.ts index 227b54c59..be5736bf1 100644 --- a/packages/ui/certd-client/src/store/settings/api.basic.ts +++ b/packages/ui/certd-client/src/store/settings/api.basic.ts @@ -57,6 +57,8 @@ export type SysPublicSetting = { // 默认到期前更新天数 defaultCertRenewDays?: number; + // 默认即将到期天数 + defaultWillExpireDays?: number; //证书域名添加到监控 certDomainAddToMonitorEnabled?: boolean; diff --git a/packages/ui/certd-client/src/views/certd/monitor/cert/crud.tsx b/packages/ui/certd-client/src/views/certd/monitor/cert/crud.tsx index 1e9e8b69a..88012dd53 100644 --- a/packages/ui/certd-client/src/views/certd/monitor/cert/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/monitor/cert/crud.tsx @@ -4,7 +4,7 @@ import { useI18n } from "/src/locales"; import { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, useFormWrapper, UserPageQuery, UserPageRes } from "@fast-crud/fast-crud"; import { certInfoApi } from "./api"; import dayjs from "dayjs"; -import { useRouter } from "vue-router"; +import { useRoute, useRouter } from "vue-router"; import { useModal } from "/@/use/use-modal"; import { notification } from "ant-design-vue"; import CertView from "/@/views/certd/pipeline/cert-view.vue"; @@ -57,7 +57,14 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat }); }; - const { openUploadCreateDialog, openUpdateCertDialog } = useCertUpload(); + const { openUploadCreateDialog } = useCertUpload(); + + const DEFAULT_WILL_EXPIRE_DAYS = settingStore.sysPublic.defaultWillExpireDays || settingStore.sysPublic.defaultCertRenewDays || 15; + const route = useRoute(); + const expireStatus = route?.query?.expireStatus as string; + const searchInitForm = { + expiresLeft: expireStatus, + }; return { crudOptions: { request: { @@ -66,6 +73,9 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat editRequest, delRequest, }, + search: { + initialForm: searchInitForm, + }, form: { labelCol: { //固定label宽度 @@ -213,7 +223,17 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat expiresLeft: { title: t("certd.validDays"), search: { - show: false, + show: true, + component: { + name: "fs-dict-select", + dict: dict({ + data: [ + { label: t("certd.monitor.cert.expired"), value: "expired" }, + { label: t("certd.monitor.cert.expiring"), value: "expiring" }, + { label: t("certd.monitor.cert.noExpired"), value: "noExpired" }, + ], + }), + }, }, type: "date", form: { @@ -242,9 +262,9 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat // 距离失效时间剩余天数 const leftDays = dayjs(expiresTime).diff(dayjs(), "day"); - const color = leftDays < 20 ? "red" : "#389e0d"; + const color = leftDays < DEFAULT_WILL_EXPIRE_DAYS ? "red" : "#389e0d"; const percent = (leftDays / effectiveDays) * 100; - const textColor = leftDays < 20 ? "red" : leftDays > 60 ? "#389e0d" : ""; + const textColor = leftDays < DEFAULT_WILL_EXPIRE_DAYS ? "red" : leftDays > 60 ? "#389e0d" : ""; const format = () => { return {`${leftDays}${t("certd.days")}`}; }; diff --git a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx index 347fe149c..812857aaf 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx @@ -66,6 +66,8 @@ export default function ({ crudExpose, context: { selectedRowKeys, openCertApply const userStore = useUserStore(); const settingStore = useSettingStore(); + const DEFAULT_WILL_EXPIRE_DAYS = settingStore.sysPublic.defaultWillExpireDays || settingStore.sysPublic.defaultCertRenewDays || 15; + function onDialogOpen(opt: any) { const searchForm = crudExpose.getSearchValidatedFormData(); opt.initialForm = { @@ -389,9 +391,9 @@ export default function ({ crudExpose, context: { selectedRowKeys, openCertApply } // 距离失效时间剩余天数 const leftDays = dayjs(expiresTime).diff(dayjs(), "day"); - const color = leftDays < 20 ? "red" : "#389e0d"; + const color = leftDays < DEFAULT_WILL_EXPIRE_DAYS ? "red" : "#389e0d"; const percent = (leftDays / effectiveDays) * 100; - const textColor = leftDays < 20 ? "red" : leftDays > 60 ? "#389e0d" : ""; + const textColor = leftDays < DEFAULT_WILL_EXPIRE_DAYS ? "red" : leftDays > 60 ? "#389e0d" : ""; const format = () => { return {`${leftDays}${t("certd.days")}`}; }; diff --git a/packages/ui/certd-server/src/controller/user/monitor/cert-info-controller.ts b/packages/ui/certd-server/src/controller/user/monitor/cert-info-controller.ts index d50a156b5..054717f1a 100644 --- a/packages/ui/certd-server/src/controller/user/monitor/cert-info-controller.ts +++ b/packages/ui/certd-server/src/controller/user/monitor/cert-info-controller.ts @@ -1,11 +1,12 @@ import { ALL, Body, Controller, Get, Inject, Post, Provide, Query } from "@midwayjs/core"; -import { CommonException, Constants, CrudController } from "@certd/lib-server"; +import { CommonException, Constants, CrudController, SysSettingsService } from "@certd/lib-server"; import { AuthService } from "../../../modules/sys/authority/service/auth-service.js"; import { CertInfoService } from "../../../modules/monitor/index.js"; import { PipelineService } from "../../../modules/pipeline/service/pipeline-service.js"; import { SelectQueryBuilder } from "typeorm"; import { logger } from "@certd/basic"; import fs from "fs"; +import dayjs from "dayjs"; /** */ @@ -19,6 +20,9 @@ export class CertInfoController extends CrudController { @Inject() pipelineService: PipelineService; + @Inject() + sysSettingService: SysSettingsService; + getService(): CertInfoService { return this.service; } @@ -29,6 +33,12 @@ export class CertInfoController extends CrudController { body.query.userId = this.getUserId(); const domains = body.query?.domains; delete body.query.domains; + + const expiresLeft = body.query?.expiresLeft; + delete body.query.expiresLeft; + + const sysSetting = await this.sysSettingService.getPublicSettings(); + const DEFAULT_WILL_EXPIRE_DAYS = sysSetting?.defaultWillExpireDays || sysSetting?.defaultCertRenewDays || 15; const res = await this.service.page({ query: body.query, page: body.page, @@ -37,6 +47,16 @@ export class CertInfoController extends CrudController { if (domains) { bq.andWhere('domains like :domains', { domains: `%${domains}%` }); } + if (expiresLeft) { + const willExpire = dayjs().add(DEFAULT_WILL_EXPIRE_DAYS, 'day').valueOf(); + if (expiresLeft === "expired") { + bq.andWhere('expires_time < :now', { now: Date.now() }); + } else if (expiresLeft === "expiring") { + bq.andWhere('expires_time <= :willExpire and expires_time > :now', { willExpire, now: Date.now() }); + } else if (expiresLeft === "noExpired") { + bq.andWhere('expires_time > :willExpire', { willExpire }); + } + } } }); diff --git a/packages/ui/certd-server/src/plugins/plugin-cert/plugin/cert-plugin/base-convert.ts b/packages/ui/certd-server/src/plugins/plugin-cert/plugin/cert-plugin/base-convert.ts index 263ebd3e2..a355d1ab3 100644 --- a/packages/ui/certd-server/src/plugins/plugin-cert/plugin/cert-plugin/base-convert.ts +++ b/packages/ui/certd-server/src/plugins/plugin-cert/plugin/cert-plugin/base-convert.ts @@ -13,7 +13,7 @@ export abstract class CertApplyBaseConvertPlugin extends AbstractTaskPlugin { vModel: "value", mode: "tags", // open: false, - placeholder: "请输入证书域名,比如:foo.com / *.foo.com / *.sub.foo.com / *.bar.com", + placeholder: "请输入证书域名,比如:foo.com , *.foo.com , *.sub.foo.com , *.bar.com", tokenSeparators: [",", " ", ",", "、", "|"], search: true, pager:true,