feat(auth): 实现登录注册功能并重构 App 组件
- 新增登录和注册页面组件
- 实现用户认证和权限管理逻辑
- 重构 App 组件,使用 Router 和 AuthProvider
- 添加管理员面板和论坛页面组件
Change-Id: Iaa4502616970e75e3268537f73c75dac8f60e24d
diff --git a/src/routes/PermissionRoute.jsx b/src/routes/PermissionRoute.jsx
index b390011..290c619 100644
--- a/src/routes/PermissionRoute.jsx
+++ b/src/routes/PermissionRoute.jsx
@@ -1,18 +1,48 @@
-import React from 'react';
-import { Navigate } from 'react-router-dom';
+import React from "react";
+import { Navigate, useLocation } from "react-router-dom";
+import { useAuth } from "../features/auth/contexts/AuthContext"; // 更新路径
+import { Spin, Result, Button } from "antd";
-const PermissionRoute = ({ requiredRoles, children }) => {
- // 从localStorage获取用户信息
- const user = JSON.parse(localStorage.getItem('user') || '{}');
- const userRole = user.role || 'guest';
-
- // 检查用户是否有所需角色
- if (requiredRoles.includes(userRole)) {
- return children;
+const PermissionRoute = ({ children, requiredRoles }) => {
+ const { user, isAuthenticated, loading, hasRole } = useAuth();
+ const location = useLocation();
+
+ if (loading) {
+ return (
+ <div className="flex justify-center items-center min-h-screen">
+ <Spin size="large" tip="检查权限中..." />
+ </div>
+ );
}
-
- // 如果没有权限,重定向到未授权页面
- return <Navigate to="/unauthorized" replace />;
+
+ if (!isAuthenticated) {
+ return <Navigate to="/login" state={{ from: location }} replace />;
+ }
+
+ // 角色检查
+ const hasRequiredRoles = requiredRoles
+ ? requiredRoles.some((role) => hasRole(role)) // 满足任一角色即可
+ : true; // 如果没有指定 requiredRoles,则认为通过
+
+ if (hasRequiredRoles) {
+ return children; // 用户有权限,渲染子组件
+ }
+
+ // 用户无权限
+ return (
+ <Result
+ status="403"
+ title="403 - 禁止访问"
+ subTitle="抱歉,您没有权限访问此页面。"
+ extra={
+ <Button type="primary" onClick={() => window.history.back()}>
+ 返回上一页
+ </Button>
+ }
+ />
+ );
+ // 或者重定向到 /unauthorized 页面
+ // return <Navigate to="/unauthorized" state={{ from: location }} replace />;
};
-export default PermissionRoute;
\ No newline at end of file
+export default PermissionRoute;