From d345ae7e088a09b2471d363ca5c0b24a276a5d92 Mon Sep 17 00:00:00 2001
From: zxyszx <299979470+zxyszx@users.noreply.github.com>
Date: Fri, 14 Aug 2026 07:28:40 +0800
Subject: [PATCH 1/2] release: prepare v1.2.44
---
.github/release-notes/v1.2.44.md | 5 ++
VERSION | 2 +-
apps/web/src/pages/admin.tsx | 117 ++++++++++++++++++-------------
apps/web/src/pages/profile.tsx | 17 ++++-
4 files changed, 90 insertions(+), 51 deletions(-)
create mode 100644 .github/release-notes/v1.2.44.md
diff --git a/.github/release-notes/v1.2.44.md b/.github/release-notes/v1.2.44.md
new file mode 100644
index 0000000..a218f15
--- /dev/null
+++ b/.github/release-notes/v1.2.44.md
@@ -0,0 +1,5 @@
+- 修复刷新后台仪表盘时,注册、自助申请邮箱等功能在设置读取完成前短暂显示为关闭的问题。
+- 为后台统计、系统状态、域名与列表页面、备份设置和个人中心补充统一加载状态,避免将未加载数据误显示为 0、未配置或暂无数据。
+- 优化受限权限账号的状态展示:无权读取的系统设置明确显示为不可查看,不再误判为关闭或未配置。
+
+**完整更新日志**:[v1.2.43...v1.2.44](https://github.com/zxyszx/NewSzxcn-Email/compare/v1.2.43...v1.2.44)
diff --git a/VERSION b/VERSION
index 7b6476a..8a30807 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.2.43
+1.2.44
diff --git a/apps/web/src/pages/admin.tsx b/apps/web/src/pages/admin.tsx
index 8a14121..0205d65 100644
--- a/apps/web/src/pages/admin.tsx
+++ b/apps/web/src/pages/admin.tsx
@@ -17,6 +17,7 @@ import { ScrollArea } from "@/components/ui/scroll-area"
import { Separator } from "@/components/ui/separator"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Switch } from "@/components/ui/switch"
+import { Skeleton } from "@/components/ui/skeleton"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { Textarea } from "@/components/ui/textarea"
import { ConfirmDialog } from "@/components/confirm-dialog"
@@ -86,11 +87,13 @@ export function AdminPage() {
const canMessagesView = hasPermission(user, "admin.messages.view")
const canSettingsView = hasPermission(user, "admin.settings.view")
const canTemplatesView = hasPermission(user, "admin.templates.view")
+ const canLoadDomains = canUsersView || canDomainsView || canDNSView || canMailboxesView || canAliasesView || canSettingsView || canTemplatesView
+ const canLoadMailboxes = canMailboxesView || canMessagesView || canSettingsView
const overview = useQuery({ queryKey: ["admin", "overview"], queryFn: api.adminOverview, enabled: !!user && canOverview })
const users = useQuery({ queryKey: ["admin", "users"], queryFn: api.users, enabled: !!user && (canUsersView || canMailboxesView) })
const permissionGroups = useQuery({ queryKey: ["admin", "permission-groups"], queryFn: api.permissionGroups, enabled: !!user && (canPermissionGroupsView || canUsersView) })
- const domains = useQuery({ queryKey: ["admin", "domains"], queryFn: api.domains, enabled: !!user && (canUsersView || canDomainsView || canDNSView || canMailboxesView || canAliasesView || canSettingsView || canTemplatesView) })
- const mailboxes = useQuery({ queryKey: ["admin", "mailboxes"], queryFn: api.mailboxes, enabled: !!user && (canMailboxesView || canMessagesView || canSettingsView) })
+ const domains = useQuery({ queryKey: ["admin", "domains"], queryFn: api.domains, enabled: !!user && canLoadDomains })
+ const mailboxes = useQuery({ queryKey: ["admin", "mailboxes"], queryFn: api.mailboxes, enabled: !!user && canLoadMailboxes })
const aliases = useQuery({ queryKey: ["admin", "aliases"], queryFn: api.aliases, enabled: !!user && canAliasesView })
const settings = useQuery({ queryKey: ["admin", "settings"], queryFn: api.systemSettings, enabled: !!user && canSettingsView })
const [params, setParams] = useSearchParams()
@@ -104,14 +107,18 @@ export function AdminPage() {
const visibleSections = sectionKeys.filter((key) => hasAnyPermission(user, sectionPermissions[key]) && (key !== "backups" || user?.role === "admin"))
const rawSection = params.get("section") as Section | null
const section: Section = rawSection && visibleSections.includes(rawSection) ? rawSection : visibleSections[0] || "overview"
- const sectionQuery = section === "overview" ? overview
- : section === "users" ? users
- : section === "permissionGroups" ? permissionGroups
- : section === "domains" ? domains
- : section === "mailboxes" ? mailboxes
- : section === "aliases" ? aliases
- : section === "settings" ? settings
- : null
+ const sectionQueries = section === "overview" ? [overview, ...(canLoadDomains ? [domains] : []), ...(canSettingsView ? [settings] : [])]
+ : section === "users" ? [users, permissionGroups, domains]
+ : section === "permissionGroups" ? [permissionGroups]
+ : section === "domains" ? [domains]
+ : section === "mailboxes" ? [mailboxes, users, domains]
+ : section === "aliases" ? [aliases, domains]
+ : section === "messages" || section === "sendAudit" ? [mailboxes]
+ : section === "settings" ? [domains, ...(canLoadMailboxes ? [mailboxes] : []), ...(canSettingsView ? [settings] : [])]
+ : []
+ const sectionLoading = sectionQueries.some((query) => query.isPending)
+ const sectionError = sectionQueries.find((query) => query.isError)
+ const sectionReady = !sectionLoading && !sectionError
async function refreshAdminPage() {
if (refreshing) return
@@ -130,17 +137,18 @@ export function AdminPage() {
}
}
- const overviewChecklist = setupChecklist(overview.data, domainItems, settings.data).filter((item) => visibleSections.includes(item.section))
+ const overviewChecklist = sectionReady && section === "overview" ? setupChecklist(overview.data, domainItems, settings.data).filter((item) => visibleSections.includes(item.section)) : undefined
const changeSection = (next: Section) => setParams(next === "overview" ? {} : { section: next })
return (
以下为需要在域名 DNS 管理中添加的记录:
- {records.isError ?以下内容可直接填写到常见 DNS 控制台,根域名的主机记录使用 @。
+ {check.isPending &&正在查询最新解析结果,请稍候...
{error.message || "暂时无法查询 DNS,请稍后重新检测。"}
{allPassed ? "所有邮件相关记录均已正确解析,可以正常使用。" : "请处理下面标红的项目,修改 DNS 后再重新检测。"}
+{desc}
} -{desc}
} +{record.name}
-
+ {displayHost}
+
{record.value}
-
+ {displayValue}
+
{record.ttl} 秒
+ {mx.priority}{record.ttl} 秒