feat(client): 初始化前端壳与鉴权守卫(P1-5)
- 技术栈:React 18 + TypeScript + Vite + Tailwind - API 层:ApiError + 401 自动刷新 + single-flight 重试 - 鉴权:内存 Access Token + Cookie Refresh + 启动 bootstrap - RBAC:权限映射 + RequireAuth/RequirePermission 路由守卫 - 布局:OA 工作台壳层 + 侧边栏 + 5 个占位页面 - 样式:复用 hyb-web 视觉 token(单向同步) - 文档:新增 client README,补充 server 联调说明
这个提交包含在:
@@ -0,0 +1,23 @@
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
export function ForbiddenPage() {
|
||||
return (
|
||||
<div className="flex min-h-screen items-center justify-center bg-background-light p-6">
|
||||
<div className="card-std max-w-lg text-center">
|
||||
<p className="text-sm font-semibold uppercase tracking-wide text-primary">403</p>
|
||||
<h1 className="mt-2 text-2xl font-bold text-slate-900">无权限访问</h1>
|
||||
<p className="mt-2 text-sm text-secondary">
|
||||
当前账号没有访问该页面的权限,请联系管理员或返回可访问页面。
|
||||
</p>
|
||||
<div className="mt-5 flex justify-center gap-3">
|
||||
<Link className="btn-secondary" to="/dashboard">
|
||||
返回仪表盘
|
||||
</Link>
|
||||
<Link className="btn-primary" to="/settings/profile">
|
||||
查看账号信息
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户