chore: 添加 .gitignore 规则,包含前端、pnpm、Node.js 和 AI 工具

This commit is contained in:
2026-03-20 09:14:58 +08:00
parent bf294f9f50
commit 176a727f6e
50 changed files with 6436 additions and 0 deletions

130
src/pages/AdminPage.jsx Normal file
View File

@@ -0,0 +1,130 @@
import { useState, useEffect } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import { FiHome, FiBarChart2, FiUsers, FiList } from 'react-icons/fi';
import Layout from '../components/Layout.jsx';
import OverviewPage from './admin/OverviewPage.jsx';
import DepartmentsPage from './admin/DepartmentsPage.jsx';
import UsersPage from './admin/UsersPage.jsx';
import AdminProjectsPage from './admin/AdminProjectsPage.jsx';
import AddDepartmentPage from './admin/AddDepartmentPage.jsx';
import AddUserPage from './admin/AddUserPage.jsx';
import AddProjectPage from './admin/AddProjectPage.jsx';
function AdminPage() {
const location = useLocation();
const navigate = useNavigate();
const [currentPage, setCurrentPage] = useState(() => {
return localStorage.getItem('admin_currentPage') || 'overview';
});
useEffect(() => {
if (location.state?.fromHome) {
setCurrentPage('overview');
navigate('.', { replace: true, state: {} });
}
}, [location.state, navigate, setCurrentPage]);
useEffect(() => {
localStorage.setItem('admin_currentPage', currentPage);
}, [currentPage]);
const renderPage = () => {
switch (currentPage) {
case 'overview':
return <OverviewPage />;
case 'departments':
return <DepartmentsPage onAdd={() => setCurrentPage('addDepartment')} />;
case 'users':
return <UsersPage onAdd={() => setCurrentPage('addUser')} />;
case 'projects':
return <AdminProjectsPage onAdd={() => setCurrentPage('addProject')} />;
case 'addDepartment':
return <AddDepartmentPage onBack={() => setCurrentPage('departments')} />;
case 'addUser':
return <AddUserPage onBack={() => setCurrentPage('users')} />;
case 'addProject':
return <AddProjectPage onBack={() => setCurrentPage('projects')} />;
default:
return <div>Page not found</div>;
}
};
const getPageTitle = () => {
const titles = {
overview: '总览',
departments: '部门管理',
users: '用户管理',
projects: '项目管理',
addDepartment: '新增部门',
addUser: '新增用户',
addProject: '新增项目'
};
return titles[currentPage] || '';
};
const sidebar = (
<>
<div className="admin-sidebar-header">
<div className="sidebar-brand">
<div className="sidebar-logo-icon">
<span></span>
<span></span>
</div>
<div className="sidebar-brand-text">
<div className="sidebar-logo">GrandClaw</div>
<div className="sidebar-subtitle">运营管理台</div>
</div>
</div>
</div>
<nav className="admin-sidebar-nav">
<div
className={`admin-nav-item ${currentPage === 'overview' ? 'active' : ''}`}
onClick={() => setCurrentPage('overview')}
>
<span className="admin-nav-icon"><FiHome /></span>
<span className="admin-nav-text">总览</span>
</div>
<div
className={`admin-nav-item ${currentPage === 'departments' ? 'active' : ''}`}
onClick={() => setCurrentPage('departments')}
>
<span className="admin-nav-icon"><FiBarChart2 /></span>
<span className="admin-nav-text">部门管理</span>
</div>
<div
className={`admin-nav-item ${currentPage === 'users' ? 'active' : ''}`}
onClick={() => setCurrentPage('users')}
>
<span className="admin-nav-icon"><FiUsers /></span>
<span className="admin-nav-text">用户管理</span>
</div>
<div
className={`admin-nav-item ${currentPage === 'projects' ? 'active' : ''}`}
onClick={() => setCurrentPage('projects')}
>
<span className="admin-nav-icon"><FiList /></span>
<span className="admin-nav-text">项目管理</span>
</div>
</nav>
<div className="admin-sidebar-user">
<div className="user-avatar"></div>
<div className="admin-sidebar-user-info">
<div className="admin-sidebar-user-name">张三</div>
<div className="admin-sidebar-user-role">系统管理员</div>
</div>
</div>
</>
);
return (
<Layout
sidebar={sidebar}
headerTitle={getPageTitle()}
sidebarClassName="admin-sidebar"
>
{renderPage()}
</Layout>
);
}
export default AdminPage;