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() {
{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,