feat: harden platform workflows and UI governance

This commit is contained in:
hectorzhao
2026-07-22 14:14:55 +08:00
parent ef957f7daa
commit 0f223f7f91
80 changed files with 4958 additions and 764 deletions
+9 -9
View File
@@ -32,13 +32,16 @@ import {
Users,
UserX,
} from 'lucide-react';
import { Navigate } from 'react-router-dom';
import { adminApi } from '@/api/adminApi';
import { readSession } from '@/api/session';
import type { LoginSession } from '@/api/session';
import { AppShell } from '@/layouts/AppShell';
import { PortalSessionBoundary } from '@/layouts/PortalSessionBoundary';
export function AdminLayout() {
const session = readSession();
return <PortalSessionBoundary portal="admin">{(session) => <AdminAuthenticatedLayout session={session} />}</PortalSessionBoundary>;
}
function AdminAuthenticatedLayout({ session }: { session: LoginSession }) {
const [pendingAudits, setPendingAudits] = useState({ enterpriseCertifications: 0, smsAudits: 0, templates: 0, signatures: 0, drainageInfos: 0 });
const loadPendingAuditCount = useCallback(() => {
adminApi.getDashboard()
@@ -51,7 +54,7 @@ export function AdminLayout() {
}, []);
useEffect(() => {
if (session?.portal !== 'admin') {
if (session.portal !== 'admin' || session.locked) {
return;
}
loadPendingAuditCount();
@@ -65,11 +68,7 @@ export function AdminLayout() {
window.removeEventListener('focus', onFocus);
window.removeEventListener('cmpp-audit-count-refresh', onAuditRefresh);
};
}, [loadPendingAuditCount, session?.portal]);
if (session?.portal !== 'admin') {
return <Navigate to="/admin/login" replace />;
}
}, [loadPendingAuditCount, session.locked, session.portal]);
return (
<AppShell
@@ -77,6 +76,7 @@ export function AdminLayout() {
subtitle="平台运营管理中心"
workspaceName="平台运营工作区"
loginPath="/admin/login"
portal="admin"
userName={session.user.displayName}
userRole="平台管理员"
auditNotifications={[