feat(*): 添加系统管理面板及相关功能

This commit is contained in:
2026-06-12 13:43:48 +08:00
parent 8934844bd9
commit 181871e0cf
3 changed files with 987 additions and 1 deletions
+5
View File
@@ -0,0 +1,5 @@
import { SystemAdminPanel } from "@/components/admin/SystemAdminPanel";
export default function SystemAdminPage() {
return <SystemAdminPanel />;
}
+46 -1
View File
@@ -8,7 +8,7 @@ import {
} from "@refinedev/mui";
import { SessionProvider, signIn, signOut, useSession } from "next-auth/react";
import { usePathname } from "next/navigation";
import React, { useEffect } from "react";
import React, { useEffect, useState } from "react";
import routerProvider from "@refinedev/nextjs-router";
@@ -16,6 +16,8 @@ import { ColorModeContextProvider } from "@contexts/color-mode";
import { dataProvider } from "@providers/data-provider";
import { ProjectProvider } from "@/contexts/ProjectContext";
import { useAuthStore } from "@/store/authStore";
import { apiFetch } from "@/lib/apiFetch";
import { config } from "@config/config";
import { LiaNetworkWiredSolid } from "react-icons/lia";
import { TbDatabaseEdit, TbLocationPin, TbActivity } from "react-icons/tb";
@@ -23,6 +25,7 @@ import { LuReplace } from "react-icons/lu";
import { AiOutlineSecurityScan } from "react-icons/ai";
import { MdWater, MdOutlineWaterDrop, MdCleaningServices } from "react-icons/md";
import {
ManageAccounts as ManageAccountsIcon,
MyLocation as MyLocationIcon,
Search as SearchIcon,
} from "@mui/icons-material";
@@ -51,11 +54,41 @@ const App = (props: React.PropsWithChildren<AppProps>) => {
const { data, status } = useSession();
const to = usePathname();
const setAccessToken = useAuthStore((state) => state.setAccessToken);
const [isMetadataAdmin, setIsMetadataAdmin] = useState(false);
useEffect(() => {
setAccessToken(typeof data?.accessToken === "string" ? data.accessToken : null);
}, [data?.accessToken, setAccessToken]);
useEffect(() => {
if (status !== "authenticated") {
setIsMetadataAdmin(false);
return;
}
let cancelled = false;
apiFetch(`${config.BACKEND_URL}/api/v1/admin/me`, {
projectHeaderMode: "omit",
skipAuthRedirect: true,
})
.then(async (response) => {
if (cancelled) return;
if (!response.ok) {
setIsMetadataAdmin(false);
return;
}
const payload = await response.json();
setIsMetadataAdmin(Boolean(payload?.is_superuser || payload?.role === "admin"));
})
.catch(() => {
if (!cancelled) setIsMetadataAdmin(false);
});
return () => {
cancelled = true;
};
}, [status]);
if (status === "loading") {
return <span>loading...</span>;
}
@@ -227,6 +260,18 @@ const App = (props: React.PropsWithChildren<AppProps>) => {
label: "管道冲洗",
},
},
...(isMetadataAdmin
? [
{
name: "系统管理",
list: "/system-admin",
meta: {
icon: <ManageAccountsIcon className="w-6 h-6" />,
label: "系统管理",
},
},
]
: []),
]}
options={{
syncWithLocation: true,