feat: harden data access and simplify user management

This commit is contained in:
xuelong committed 2026-08-25 21:02:30 -07:00
1 parent 3dd5731751
commit adb780bc82
51 files changed
+3239 -2121

No files matched your search

+21 -16
View File
@@ -23,9 +23,6 @@ import ProjectUserExperiencePanel from "./panels/plaza/ProjectUserExperiencePane
import OntologySchemaPanel from "./panels/modeling/OntologySchemaPanel";
// System panels
import AgentTasksPanel from "./panels/system/AgentTasksPanel";
import LogsPanel from "./panels/system/LogsPanel";
import PermissionsAudit from "./panels/system/PermissionsAudit";
import UserManagement from "./panels/system/UserManagement";
import InterfaceCenterPanel from "./panels/system/InterfaceCenterPanel";
@@ -51,10 +48,7 @@ const MENU_ITEMS = [
]},
{ key: "/system", icon: <SettingOutlined />, label: "系统", children: [
{ key: "/system/interfaces", icon: <ApiOutlined />, label: "接口中心" },
{ key: "/system/agents", label: "Agent 任务" },
{ key: "/system/logs", label: "调用日志" },
{ key: "/system/users", label: "用户管理" },
{ key: "/system/permissions", label: "角色权限" },
]},
];
@@ -62,6 +56,7 @@ export default function App() {
const [authed, setAuthed] = useState(false);
const [checking, setChecking] = useState(true);
const [collapsed, setCollapsed] = useState(false);
const [roles, setRoles] = useState<string[]>([]);
const [projectContext, setProjectContextState] = useState<KgProjectContext>(getProjectContext());
const navigate = useNavigate();
const location = useLocation();
@@ -70,10 +65,12 @@ export default function App() {
const token = localStorage.getItem("token");
if (!token) { setChecking(false); return; }
try {
await whoami();
const { data } = await whoami();
setRoles(Array.isArray(data?.roles) ? data.roles : []);
setAuthed(true);
} catch {
localStorage.removeItem("token");
setRoles([]);
}
setChecking(false);
}, []);
@@ -88,6 +85,7 @@ export default function App() {
const handleLogout = () => {
localStorage.removeItem("token");
setRoles([]);
setAuthed(false);
navigate("/admin/login");
};
@@ -97,8 +95,8 @@ export default function App() {
if (!authed) {
return (
<Routes>
<Route path="/admin/login" element={<AdminLogin onLogin={() => { setAuthed(true); navigate("/admin/projects"); }} />} />
<Route path="/admin/login-v2" element={<AdminLoginV2 onLogin={() => { setAuthed(true); navigate("/admin/projects"); }} />} />
<Route path="/admin/login" element={<AdminLogin onLogin={() => { setAuthed(true); void checkAuth(); navigate("/admin/projects"); }} />} />
<Route path="/admin/login-v2" element={<AdminLoginV2 onLogin={() => { setAuthed(true); void checkAuth(); navigate("/admin/projects"); }} />} />
<Route path="*" element={<Navigate to="/admin/login" />} />
</Routes>
);
@@ -116,6 +114,10 @@ export default function App() {
const openKeys = [selectedKey.split("/").slice(0, 2).join("/")];
const showProjectContextBar = location.pathname === "/admin/projects";
const showDataCenterWorkbench = location.pathname === "/admin/data";
const isDataManager = roles.includes("admin");
const visibleMenuItems = isDataManager
? MENU_ITEMS
: MENU_ITEMS.filter((item) => item.key !== "/system");
return (
<Layout className="admin-layout" style={{ minHeight: "100vh" }}>
@@ -147,7 +149,7 @@ export default function App() {
mode="inline"
selectedKeys={[selectedKey]}
defaultOpenKeys={collapsed ? [] : openKeys}
items={MENU_ITEMS}
items={visibleMenuItems}
onClick={onMenuClick}
style={{ borderRight: 0 }}
/>
@@ -177,7 +179,7 @@ export default function App() {
{showProjectContextBar && <ProjectContextBar />}
<Routes>
<Route path="/admin/projects" element={<ProjectLanding />} />
<Route path="/admin/data" element={<DataCenterPanel />} />
<Route path="/admin/data" element={<DataCenterPanel canManage={isDataManager} />} />
{/* Plaza */}
<Route path="/admin/plaza/overview" element={<PlazaOverview />} />
<Route path="/admin/plaza/user" element={<ProjectUserExperiencePanel />} />
@@ -187,11 +189,14 @@ export default function App() {
<Route path="/admin/modeling/schema" element={<OntologySchemaPanel />} />
{/* System */}
<Route path="/admin/system/interfaces" element={<InterfaceCenterPanel />} />
<Route path="/admin/system/agents" element={<AgentTasksPanel />} />
<Route path="/admin/system/logs" element={<LogsPanel />} />
<Route path="/admin/system/users" element={<UserManagement />} />
<Route path="/admin/system/permissions" element={<PermissionsAudit />} />
<Route
path="/admin/system/interfaces"
element={isDataManager ? <InterfaceCenterPanel /> : <Navigate to="/admin/projects" />}
/>
<Route
path="/admin/system/users"
element={isDataManager ? <UserManagement /> : <Navigate to="/admin/projects" />}
/>
<Route path="/admin/login-v2" element={<AdminLoginV2 onLogin={() => navigate("/admin/projects")} />} />
<Route path="*" element={<Navigate to="/admin/projects" />} />