feat(admin): 扩展后台管理与登录安全能力。
- 新增用户、域名、邮箱、别名、邮件、系统设置与模板的管理接口和页面。 - 支持双因素认证、Turnstile、人机验证与管理员 SMTP 测试。 - 增加无人收件/未注册邮件归档、Maildir 同步和数据库迁移支持。 - 更新前端导航、个人中心 2FA 配置以及相关部署示例。
This commit is contained in:
+10
-1
@@ -8,6 +8,7 @@ import { LoginPage } from "@/pages/login"
|
||||
import { MailPage } from "@/pages/mail"
|
||||
import { AdminPage } from "@/pages/admin"
|
||||
import { ProfilePage } from "@/pages/profile"
|
||||
import { useMe } from "@/hooks/use-me"
|
||||
import "./index.css"
|
||||
|
||||
const queryClient = new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false, staleTime: 10_000 } } })
|
||||
@@ -17,10 +18,18 @@ const router = createBrowserRouter([
|
||||
{ index: true, element: <Navigate to="/mail" replace /> },
|
||||
{ path: "mail", element: <MailPage /> },
|
||||
{ path: "profile", element: <ProfilePage /> },
|
||||
{ path: "admin", element: <AdminPage /> },
|
||||
{ path: "admin", element: <AdminOnly><AdminPage /></AdminOnly> },
|
||||
] },
|
||||
])
|
||||
|
||||
function AdminOnly({ children }: { children: React.ReactNode }) {
|
||||
const me = useMe()
|
||||
if (me.isLoading) return null
|
||||
if (!me.data?.user) return <Navigate to="/login" replace />
|
||||
if (me.data.user.role !== "admin") return <Navigate to="/mail" replace />
|
||||
return <>{children}</>
|
||||
}
|
||||
|
||||
ReactDOM.createRoot(document.getElementById("root")!).render(
|
||||
<React.StrictMode>
|
||||
<QueryClientProvider client={queryClient}>
|
||||
|
||||
Reference in New Issue
Block a user