167 lines
7.3 KiB
TypeScript
167 lines
7.3 KiB
TypeScript
import React, { useState, useEffect } from 'react';
|
|
import { Routes, Route, Navigate } from 'react-router-dom';
|
|
import type { User } from '@/types';
|
|
import { AuthContext, AuthContextType } from '@/contexts/AuthContext';
|
|
import { authAPI } from '@/api';
|
|
|
|
// Layouts
|
|
import FrontLayout from '@/components/layout/FrontLayout';
|
|
import AdminLayout from '@/components/layout/AdminLayout';
|
|
|
|
// Front Pages
|
|
import LandingPage from '@/pages/front/LandingPage';
|
|
import LoginPage from '@/pages/front/LoginPage';
|
|
import ChatPage from '@/pages/front/ChatPage';
|
|
import ChannelPage from '@/pages/front/ChannelPage';
|
|
import KnowledgePage from '@/pages/front/KnowledgePage';
|
|
import MarketPage from '@/pages/front/MarketPage';
|
|
import TokenDashboardPage from '@/pages/front/TokenDashboardPage';
|
|
import PricingPage from '@/pages/front/PricingPage';
|
|
import ProfilePage from '@/pages/front/ProfilePage';
|
|
import NotificationPage from '@/pages/front/NotificationPage';
|
|
import AssetsPage from '@/pages/front/AssetsPage';
|
|
import NovelPreviewPage from '@/pages/front/NovelPreviewPage';
|
|
import EvolutionDashboard from '@/pages/front/EvolutionDashboard';
|
|
import WechatBot from '@/pages/front/WechatBot';
|
|
|
|
// Admin Pages
|
|
import AdminDashboard from '@/pages/admin/Dashboard';
|
|
import AdminUsers from '@/pages/admin/Users';
|
|
import AdminModels from '@/pages/admin/Models';
|
|
import AdminSiteSettings from '@/pages/admin/SiteSettings';
|
|
import AdminPayment from '@/pages/admin/Payment';
|
|
import AdminServices from '@/pages/admin/Services';
|
|
import AdminMembership from '@/pages/admin/Membership';
|
|
import AdminAds from '@/pages/admin/Ads';
|
|
import AdminMarket from '@/pages/admin/Market';
|
|
import AdminLogs from '@/pages/admin/Logs';
|
|
import AdminSkills from '@/pages/admin/Skills'
|
|
import AdminAgents from '@/pages/admin/Agents';
|
|
import AdminCodeExec from '@/pages/admin/CodeExec';;
|
|
import DistributionBuilder from '@/pages/admin/DistributionBuilder';
|
|
import PrivacySettings from '@/pages/admin/PrivacySettings';
|
|
import ImBots from '@/pages/admin/ImBots';
|
|
import Promotion from '@/pages/admin/Promotion';
|
|
import Achievement from '@/pages/admin/Achievement';
|
|
import Tenant from '@/pages/admin/Tenant';
|
|
import Billing from '@/pages/admin/Billing';
|
|
import Analytics from '@/pages/admin/Analytics';
|
|
import UserPortal from '@/pages/UserPortal';
|
|
import AdminKnowledge from '@/pages/admin/Knowledge';
|
|
import AdminWorkflow from '@/pages/admin/Workflow';
|
|
import AdminStorage from '@/pages/admin/Storage';
|
|
import AdminDeveloper from '@/pages/admin/Developer';
|
|
import AdminDeveloperTools from '@/pages/admin/DeveloperTools';
|
|
import AdminAutomation from '@/pages/admin/Automation';
|
|
import AdminMcp from '@/pages/admin/Mcp';
|
|
import AdminApps from '@/pages/admin/Apps';
|
|
import AssetCenter from '@/pages/admin/AssetCenter';
|
|
|
|
const App: React.FC = () => {
|
|
const [user, setUser] = useState<User | null>(null);
|
|
const [loading, setLoading] = useState(true);
|
|
|
|
// 初始化:从localStorage恢复登录状态
|
|
useEffect(() => {
|
|
const token = localStorage.getItem('aiflow_token');
|
|
const cachedUser = localStorage.getItem('aiflow_user');
|
|
if (token && cachedUser) {
|
|
try {
|
|
setUser(JSON.parse(cachedUser));
|
|
} catch {
|
|
localStorage.removeItem('aiflow_token');
|
|
localStorage.removeItem('aiflow_user');
|
|
}
|
|
}
|
|
setLoading(false);
|
|
}, []);
|
|
|
|
const login = (u: User) => {
|
|
setUser(u);
|
|
localStorage.setItem('aiflow_user', JSON.stringify(u));
|
|
};
|
|
const logout = () => {
|
|
setUser(null);
|
|
localStorage.removeItem('aiflow_token');
|
|
localStorage.removeItem('aiflow_user');
|
|
};
|
|
const isAdmin = user?.role === 'admin';
|
|
|
|
if (loading) {
|
|
return <div className="loading-screen">加载中...</div>;
|
|
}
|
|
|
|
return (
|
|
<AuthContext.Provider value={{ user, login, logout, isAdmin }}>
|
|
<Routes>
|
|
{/* Login */}
|
|
<Route path="/login" element={
|
|
user ? (isAdmin ? <Navigate to="/admin" /> : <Navigate to="/chat" />) : <LoginPage />
|
|
} />
|
|
|
|
{/* Root - Landing for guests, redirect for authenticated users */}
|
|
<Route path="/" element={
|
|
user ? (isAdmin ? <Navigate to="/admin" /> : <Navigate to="/chat" />) : <LandingPage />
|
|
} />
|
|
|
|
{/* Front Routes (authenticated only) */}
|
|
<Route path="/" element={<FrontLayout />}>
|
|
<Route path="chat" element={<ChatPage />} />
|
|
<Route path="chat/:id" element={<ChatPage />} />
|
|
<Route path="channels" element={<ChannelPage />} />
|
|
<Route path="knowledge" element={<KnowledgePage />} />
|
|
<Route path="market" element={<MarketPage />} />
|
|
<Route path="token" element={<TokenDashboardPage />} />
|
|
<Route path="pricing" element={<PricingPage />} />
|
|
<Route path="profile" element={<ProfilePage />} />
|
|
<Route path="notifications" element={<NotificationPage />} />
|
|
<Route path="assets" element={<AssetsPage />} />
|
|
<Route path="assets/novel/:id" element={<NovelPreviewPage />} />
|
|
<Route path="evolution" element={<EvolutionDashboard />} />
|
|
<Route path="wechat-bot" element={<WechatBot />} />
|
|
</Route>
|
|
|
|
{/* Admin Routes */}
|
|
<Route path="/admin" element={<AdminLayout />}>
|
|
<Route index element={<AdminDashboard />} />
|
|
<Route path="users" element={<AdminUsers />} />
|
|
<Route path="models" element={<AdminModels />} />
|
|
<Route path="settings" element={<AdminSiteSettings />} />
|
|
<Route path="payment" element={<AdminPayment />} />
|
|
<Route path="services" element={<AdminServices />} />
|
|
<Route path="membership" element={<AdminMembership />} />
|
|
<Route path="ads" element={<AdminAds />} />
|
|
<Route path="market" element={<AdminMarket />} />
|
|
<Route path="logs" element={<AdminLogs />} />
|
|
|
|
<Route path="skills" element={<AdminSkills />} />
|
|
<Route path="agents" element={<AdminAgents />} />
|
|
<Route path="code-exec" element={<AdminCodeExec />} />
|
|
<Route path="distributions" element={<DistributionBuilder />} />
|
|
<Route path="im-bots" element={<ImBots />} />
|
|
<Route path="privacy" element={<PrivacySettings />} />
|
|
<Route path="promotion" element={<Promotion />} />
|
|
<Route path="achievement" element={<Achievement />} />
|
|
<Route path="tenant" element={<Tenant />} />
|
|
<Route path="billing" element={<Billing />} />
|
|
<Route path="analytics" element={<Analytics />} />
|
|
<Route path="knowledge" element={<AdminKnowledge />} />
|
|
<Route path="workflow" element={<AdminWorkflow />} />
|
|
<Route path="storage" element={<AdminStorage />} />
|
|
<Route path="developer" element={<AdminDeveloper />} />
|
|
<Route path="developer-tools" element={<AdminDeveloperTools />} />
|
|
<Route path="automation" element={<AdminAutomation />} />
|
|
<Route path="mcp" element={<AdminMcp />} />
|
|
<Route path="apps" element={<AdminApps />} />
|
|
<Route path="assets" element={<AssetCenter />} />
|
|
<Route path="portal" element={<UserPortal />} />
|
|
</Route>
|
|
|
|
<Route path="*" element={<Navigate to="/" />} />
|
|
</Routes>
|
|
</AuthContext.Provider>
|
|
);
|
|
};
|
|
|
|
export default App;
|