import StudyCalendar from './components/StudyCalendar';
import SyncNotifications from './components/SyncNotifications';
import Login from './components/Login';
+import Footer from './components/Footer';
import { isLoggedIn } from './auth';
function App() {
const [loggedIn, setLoggedIn] = useState(isLoggedIn());
- // 未登录:只显示登录页,应用其余部分完全不加载
- if (!loggedIn) {
- return <Login onLogin={() => setLoggedIn(true)} />;
- }
return (
- <Router>
- <SyncNotifications />
- <Routes>
- <Route path="/" element={<Home />} />
- <Route path="/study/:groupId" element={<StudyMode />} />
- <Route path="/test/:groupId" element={<TestMode />} />
- <Route path="/group/:groupId" element={<GroupView />} />
- <Route path="/calendar" element={<StudyCalendar />} />
- </Routes>
- </Router>
+ <div className="app-shell">
+ {loggedIn ? (
+ <Router>
+ <SyncNotifications />
+ <Routes>
+ <Route path="/" element={<Home />} />
+ <Route path="/study/:groupId" element={<StudyMode />} />
+ <Route path="/test/:groupId" element={<TestMode />} />
+ <Route path="/group/:groupId" element={<GroupView />} />
+ <Route path="/calendar" element={<StudyCalendar />} />
+ </Routes>
+ </Router>
+ ) : (
+ // 未登录:只显示登录页,应用其余部分完全不加载
+ <Login onLogin={() => setLoggedIn(true)} />
+ )}
+ <Footer />
+ </div>
);
}
--- /dev/null
+import React from 'react';
+import './Footer.css';
+
+// 页面底部 ICP 备案号(合规要求:中国大陆网站须公开展示备案号并链接到工信部备案查询)
+export default function Footer() {
+ return (
+ <footer className="site-footer">
+ <a href="https://beian.miit.gov.cn" target="_blank" rel="noopener noreferrer">
+ 陕ICP备2026022239号-1
+ </a>
+ </footer>
+ );
+}
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}
+
+/* 全站外壳:纵向 flex,min-height 撑满视口,使页脚自然贴底 */
+.app-shell {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+}