Files
RiskAgent/web/src/App.tsx
T
freedakgmail 6562208b13 多用户与角色:新增系统管理员 + 用户管理
- 新增 users 表(scrypt 口令哈希)与持久化层,启动兜底种子账号
- 登录改为后端用户表校验账号密码;JWT 带角色;保留无DB演示回退
- 新增系统管理员角色 + 用户管理页(增删改/改角色/启停/重置密码)
- 用户管理端点按 系统管理员 角色强制校验(RBAC)
- 各角色可建任意多个账号(多销售/多风控/多管理)
- 更新登录页快速登录与首屏快照
2026-06-13 17:35:52 +08:00

63 lines
2.5 KiB
TypeScript

/**
* 应用根组件:BrowserRouter + 登录/路由守卫 + AppShell 布局壳 + 页面路由。
*/
import { BrowserRouter, Routes, Route, Navigate, Outlet } from 'react-router-dom';
import { useAuthStore } from './stores/authStore.js';
import { AppShell } from './app/AppShell.js';
import { Dashboard } from './pages/Dashboard.js';
import { NewAssessment } from './pages/NewAssessment.js';
import { AssessmentDetail } from './pages/AssessmentDetail.js';
import { Login } from './pages/Login.js';
import { RateManagement } from './pages/RateManagement.js';
import { RedlineManagement } from './pages/RedlineManagement.js';
import { CustomerManagement } from './pages/CustomerManagement.js';
import { UserManagement } from './pages/UserManagement.js';
/** 路由守卫:未登录重定向到登录页。 */
function ProtectedRoute(): JSX.Element {
const { isAuthenticated } = useAuthStore();
return isAuthenticated ? <Outlet /> : <Navigate to="/login" replace />;
}
/** 角色守卫:当前角色不在允许列表时重定向回首页。 */
function RoleRoute({ allow }: { readonly allow: readonly string[] }): JSX.Element {
const { user } = useAuthStore();
const role = user?.role ?? '';
return allow.includes(role) ? <Outlet /> : <Navigate to="/" replace />;
}
export function App(): JSX.Element {
return (
<BrowserRouter
future={{
v7_startTransition: true,
v7_relativeSplatPath: true,
}}
>
<Routes>
<Route path="/login" element={<Login />} />
<Route element={<ProtectedRoute />}>
<Route element={<AppShell />}>
<Route path="/" element={<Dashboard />} />
<Route path="/new" element={<NewAssessment />} />
<Route path="/assessments/:id" element={<AssessmentDetail />} />
{/* 费率/红线管理:仅管理层 */}
<Route element={<RoleRoute allow={['管理层']} />}>
<Route path="/rates" element={<RateManagement />} />
<Route path="/redlines" element={<RedlineManagement />} />
</Route>
{/* 客户档案:销售 + 管理层 */}
<Route element={<RoleRoute allow={['商务/销售', '管理层']} />}>
<Route path="/customers" element={<CustomerManagement />} />
</Route>
{/* 用户管理:系统管理员 */}
<Route element={<RoleRoute allow={['系统管理员']} />}>
<Route path="/users" element={<UserManagement />} />
</Route>
</Route>
</Route>
</Routes>
</BrowserRouter>
);
}