diff --git a/ui/src/i18n/locales/en/nls.certificate.json b/ui/src/i18n/locales/en/nls.certificate.json index cca7fdb4..7adce18f 100644 --- a/ui/src/i18n/locales/en/nls.certificate.json +++ b/ui/src/i18n/locales/en/nls.certificate.json @@ -13,6 +13,7 @@ "certificate.props.subject_alt_names": "Name", "certificate.props.validity": "Expiry", "certificate.props.validity.left_days": "{{left}} / {{total}} days left", + "certificate.props.validity.less_than_day": "Expire soon ({{hours}} hours left)", "certificate.props.validity.expired": "Expired", "certificate.props.validity.expiration": "Expire on {{date}}", "certificate.props.validity.filter.expire_soon": "Expire soon", diff --git a/ui/src/i18n/locales/zh/nls.certificate.json b/ui/src/i18n/locales/zh/nls.certificate.json index 3c55e660..bc9f9200 100644 --- a/ui/src/i18n/locales/zh/nls.certificate.json +++ b/ui/src/i18n/locales/zh/nls.certificate.json @@ -13,6 +13,7 @@ "certificate.props.subject_alt_names": "名称", "certificate.props.validity": "有效期限", "certificate.props.validity.left_days": "{{left}} / {{total}} 天", + "certificate.props.validity.less_than_day": "即将过期(剩余 {{hours}} 小时)", "certificate.props.validity.expired": "已到期", "certificate.props.validity.expiration": "{{date}} 到期", "certificate.props.validity.filter.expire_soon": "即将到期", diff --git a/ui/src/pages/certificates/CertificateList.tsx b/ui/src/pages/certificates/CertificateList.tsx index 97eab0ef..52dadf39 100644 --- a/ui/src/pages/certificates/CertificateList.tsx +++ b/ui/src/pages/certificates/CertificateList.tsx @@ -109,11 +109,19 @@ const CertificateList = () => { }, render: (_, record) => { const total = dayjs(record.expireAt).diff(dayjs(record.created), "d") + 1; - const left = dayjs(record.expireAt).diff(dayjs(), "d"); + // 使用 isAfter 更精确地判断是否过期 + const isExpired = dayjs().isAfter(dayjs(record.expireAt)); + const leftDays = dayjs(record.expireAt).diff(dayjs(), "d"); + const leftHours = dayjs(record.expireAt).diff(dayjs(), "h"); + return ( - {left > 0 ? ( - {t("certificate.props.validity.left_days", { left, total })} + {!isExpired ? ( + leftDays > 0 ? ( + {t("certificate.props.validity.left_days", { left: leftDays, total })} + ) : ( + {t("certificate.props.validity.less_than_day", { hours: leftHours > 0 ? leftHours : 1 })} + ) ) : ( {t("certificate.props.validity.expired")} )} diff --git a/ui/src/repository/certificate.ts b/ui/src/repository/certificate.ts index 95b9fb82..486a8e21 100644 --- a/ui/src/repository/certificate.ts +++ b/ui/src/repository/certificate.ts @@ -18,7 +18,7 @@ export const list = async (request: ListRequest) => { filters.push(pb.filter("(subjectAltNames~{:keyword} || serialNumber={:keyword})", { keyword: request.keyword })); } if (request.state === "expireSoon") { - filters.push(pb.filter("expireAt<{:expiredAt}", { expiredAt: dayjs().add(20, "d").toDate() })); + filters.push(pb.filter("expireAt<{:expiredAt} && expireAt>@now", { expiredAt: dayjs().add(20, "d").toDate() })); } else if (request.state === "expired") { filters.push(pb.filter("expireAt<={:expiredAt}", { expiredAt: new Date() })); }