背景:A2 开卡前完成 H1 权限门,确认权限点目录、特殊权限、SoD 三对、六类数据范围与超管隐式全集口径(ADR-001)。 改动: - shared:30 权限点 / 10 模块目录与元数据、特殊权限 6 编码、SoD 三对、角色与权限树契约;/me 改 dataScopes 多角色并集。 - prisma:expand 迁移新增 permissions / data_scopes;种子按原型口径重写角色权限、数据范围与 8 项特殊授予。 - api:角色 CRUD / 复制 / 停用 / 删除、权限点启动同步、SoD 40304、系统角色保护、六类范围 ScopeContext 与 CustomerDirectory 端口、变更审计与 outbox。 - web:方案 B 主从分栏三角色页面(列表 / 编辑器 / 新建),权限树、范围选择、特殊权限二次确认、保存影响、SoD 冲突、只读态与模板预填。 - 测试:角色集成 13 条 + A2 e2e 1 条;A1 全量回归。 验证:format:check / lint / typecheck / test(306)/ test:int(27)/ A2 e2e(1,复跑通过)/ openapi:export 全绿。
48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import '@douyinfe/semi-ui-19/react19-adapter';
|
|
import '@lingxi/ui/semi.css';
|
|
import '@lingxi/ui/theme/tokens.css';
|
|
import '@lingxi/ui/styles.css';
|
|
import '@/styles/global.css';
|
|
import '@/styles/layout.css';
|
|
import '@/styles/pages.css';
|
|
import '@/styles/users.css';
|
|
import '@/styles/roles.css';
|
|
import '@/styles/role-editor.css';
|
|
|
|
import { LocaleProvider } from '@douyinfe/semi-ui-19';
|
|
import { localeZhCN } from '@lingxi/ui';
|
|
import { QueryClientProvider } from '@tanstack/react-query';
|
|
import { StrictMode } from 'react';
|
|
import { createRoot } from 'react-dom/client';
|
|
import { RouterProvider } from 'react-router';
|
|
|
|
import { setUnauthorizedHandler } from '@/api/client';
|
|
import { queryClient } from '@/api/query-client';
|
|
import { router } from '@/router';
|
|
import { loginPath, ROUTES } from '@/routes';
|
|
|
|
setUnauthorizedHandler(() => {
|
|
const { pathname, search } = router.state.location;
|
|
queryClient.clear();
|
|
if (pathname === ROUTES.login) {
|
|
return;
|
|
}
|
|
void router.navigate(loginPath(`${pathname}${search}`), { replace: true });
|
|
});
|
|
|
|
const container = document.getElementById('root');
|
|
|
|
if (container === null) {
|
|
throw new Error('找不到应用根节点 #root');
|
|
}
|
|
|
|
createRoot(container).render(
|
|
<StrictMode>
|
|
<LocaleProvider locale={localeZhCN}>
|
|
<QueryClientProvider client={queryClient}>
|
|
<RouterProvider router={router} />
|
|
</QueryClientProvider>
|
|
</LocaleProvider>
|
|
</StrictMode>,
|
|
);
|