本项目已集成 JeecgBoot 后台权限系统,支持动态菜单渲染和细粒度的权限控制。
src/
├── contexts/
│ └── AuthContext.tsx # 权限上下文,管理菜单和权限数据
├── hooks/
│ └── usePermission.ts # 权限检查 Hook
├── services/
│ └── api.ts # API 请求封装
├── types/
│ └── menu.ts # 类型定义
├── components/
│ └── common/
│ ├── PermissionButton.tsx # 权限按钮组件
│ └── PermissionWrapper.tsx # 权限包装组件
└── examples/
└── PermissionUsage.tsx # 使用示例
复制 .env.example 为 .env,配置后端 API 地址:
VITE_API_BASE_URL=http://localhost:8080
import { AuthProvider } from "./contexts/AuthContext";
function App() {
return (
<AuthProvider>
{/* 你的应用组件 */}
</AuthProvider>
);
}
import PermissionButton from "@/components/common/PermissionButton";
<PermissionButton menuId="user-management" action="add" variant="primary">
新增用户
</PermissionButton>
import PermissionWrapper from "@/components/common/PermissionWrapper";
<PermissionWrapper menuId="user-management" action="delete">
<Button variant="negative">删除</Button>
</PermissionWrapper>
import { usePermission } from "@/hooks/usePermission";
function MyComponent() {
const permission = usePermission("user-management");
return (
<>
{permission.canAdd && <Button>新增</Button>}
{permission.canEdit && <Button>编辑</Button>}
{permission.canDelete && <Button>删除</Button>}
</>
);
}
系统支持以下标准权限类型:
view - 查看权限add - 新增权限edit - 编辑权限delete - 删除权限export - 导出权限import - 导入权限你也可以使用自定义权限标识:
permission.hasAction("custom-action")
GET /sys/permission/getUserPermissionByToken
返回格式:
[
{
"id": "menu-1",
"name": "user-management",
"path": "/user",
"meta": {
"title": "用户管理",
"icon": "user"
},
"children": []
}
]
GET /sys/permission/getPermissionRuleByUser
返回格式:
[
{
"id": "perm-1",
"menuId": "menu-1",
"actions": ["view", "add", "edit", "delete"]
}
]
建议在配置文件中统一管理菜单 ID:
// src/config/menuIds.ts
export const MENU_IDS = {
USER_MANAGEMENT: "user-management",
ROLE_MANAGEMENT: "role-management",
CONTENT_MANAGEMENT: "content-management",
} as const;
使用时:
import { MENU_IDS } from "@/config/menuIds";
<PermissionButton menuId={MENU_IDS.USER_MANAGEMENT} action="add">
新增用户
</PermissionButton>
import { Navigate } from "react-router-dom";
import { usePermission } from "@/hooks/usePermission";
function ProtectedRoute({ menuId, children }) {
const { canView } = usePermission(menuId);
if (!canView) {
return <Navigate to="/403" />;
}
return children;
}
function TableActions({ record, menuId }) {
const permission = usePermission(menuId);
return (
<>
{permission.canEdit && (
<Button onClick={() => handleEdit(record)}>编辑</Button>
)}
{permission.canDelete && (
<Button onClick={() => handleDelete(record)}>删除</Button>
)}
</>
);
}
refreshAuth() 刷新权限数据如果需要更复杂的权限检查逻辑,可以扩展 hasPermission 函数:
// src/contexts/AuthContext.tsx
const hasPermission = (menuId: string, action: string): boolean => {
// 超级管理员拥有所有权限
if (userRole === "admin") {
return true;
}
const actions = permissions.get(menuId);
return actions ? actions.includes(action) : false;
};