- 初始化项目
- 添加登录注册功能

Change-Id: I4ceb5400dca3042f2f31232eaf246df83d57b9be

登录注册

Change-Id: Iee4aca2a0871ab46a95208ece13053e92b615b2e

init main page

Change-Id: I6c59617a37bbe71f115a43beb884c8596fb29c39

init main page, fix bug

Change-Id: I3eba8d45f017bbf303eb7462f305b5ca5661342f

首页

Change-Id: I7f6798780864af433b54f1c73721f631900d87f5

首页

Change-Id: I8368ab349bfa014ab306d0bf4bd4ced0e361cdd5
diff --git a/src/App.js b/src/App.js
index 50fb6da..ce08b7b 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,23 +1,19 @@
-import Navbar from './components/Navbar'; 
-import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
-import AuthPage from './pages/AuthPage';
+import { Route, Switch } from 'wouter'; // Import from wouter
+import AuthPage from './pages/AuthPage/AuthPage';
 import HomePage from './pages/HomePage';
-import ForumPage from './pages/ForumPage';
+import MainPage from './pages/MainPage/MainPage';
 import { UserProvider } from './context/UserContext';
 
 function App() {
   return (
     <UserProvider>
-      <Router>
-        <Navbar /> 
-        <Routes>
-          <Route path="/" element={<HomePage />} />
-          <Route path="/auth" element={<AuthPage />} />
-          <Route path="/forum" element={<ForumPage />} />
-        </Routes>
-      </Router>
+      <Switch>
+        <Route path="/" component={HomePage} />
+        <Route path="/auth" component={AuthPage} />
+        <Route path="/main-page" component={MainPage} />
+      </Switch>
     </UserProvider>
   );
 }
 
-export default App;
\ No newline at end of file
+export default App;
diff --git a/src/App.test.js.text b/src/App.test.js.text
new file mode 100644
index 0000000..178656c
--- /dev/null
+++ b/src/App.test.js.text
@@ -0,0 +1,13 @@
+import { render, screen } from '@testing-library/react';
+import { Router } from 'wouter'; // Use Router from wouter
+import App from './App';
+
+test('renders learn react link', () => {
+  render(
+    <Router>
+      <App />
+    </Router>
+  );
+  const linkElement = screen.getByText(/learn react/i);
+  expect(linkElement).toBeInTheDocument();
+});
diff --git a/src/App.test.js.txt b/src/App.test.js.txt
deleted file mode 100644
index 0e79337..0000000
--- a/src/App.test.js.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// import { render, screen } from '@testing-library/react';
-// import { BrowserRouter } from 'react-router-dom';
-// import App from './App';
-
-
-// test('renders learn react link', () => {
-//   render(
-//     <BrowserRouter>
-//       <App />
-//     </BrowserRouter>
-//   );
-//   const linkElement = screen.getByText(/learn react/i);
-//   expect(linkElement).toBeInTheDocument();
-// });
diff --git a/src/components/Auth/Login.jsx b/src/components/Auth/Login.jsx
index e7495b5..2f43619 100644
--- a/src/components/Auth/Login.jsx
+++ b/src/components/Auth/Login.jsx
@@ -1,5 +1,5 @@
 import React, { useState } from 'react';
-import './Auth.css';
+import '../../pages/AuthPage/AuthPage.css';
 import image from './logo.svg'; // 引入图片
 const Login = ({ onRegisterClick }) => {
   const [formData, setFormData] = useState({
diff --git a/src/components/Auth/Register.jsx b/src/components/Auth/Register.jsx
index 417864f..de32cc2 100644
--- a/src/components/Auth/Register.jsx
+++ b/src/components/Auth/Register.jsx
@@ -1,5 +1,5 @@
 import React, { useState } from 'react';
-import './Auth.css';
+import '../../pages/AuthPage/AuthPage.css';
 import image from './logo.svg'; // 引入图片
 
 const Register = ({ onLoginClick }) => {
diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx
index eed15ec..6986206 100644
--- a/src/components/Navbar.jsx
+++ b/src/components/Navbar.jsx
@@ -1,30 +1,29 @@
-import React from 'react';
-import { useUser } from '../context/UserContext';
-import { Link } from 'react-router-dom';
+// import React from 'react';
+// import { Link } from 'wouter'; // Use wouter's Link component
 
-const Navbar = () => {
-  const { user, logout } = useUser();
+// const Navbar = () => {
+//   const { user, logout } = useUser();
 
-  return (
-    <nav className="navbar">
-      <div className="logo">EchoTorrent</div>
-      <div className="nav-links">
-        {user ? (
-          <>
-            <Link to="/">主页</Link>
-            <Link to="/profile">个人中心</Link>
-            <Link to="/forum">论坛</Link>
-            <button onClick={logout}>退出登录</button>
-          </>
-        ) : (
-          <>
-            <Link to="/auth">登录/注册</Link>
-            <Link to="/forum">论坛</Link>
-          </>
-        )}
-      </div>
-    </nav>
-  );
-};
+//   return (
+//     <nav className="navbar">
+//       <div className="logo">EchoTorrent</div>
+//       <div className="nav-links">
+//         {user ? (
+//           <>
+//             <Link to="/">主页</Link>
+//             <Link to="/profile">个人中心</Link>
+//             <Link to="/forum">论坛</Link>
+//             <button onClick={logout}>退出登录</button>
+//           </>
+//         ) : (
+//           <>
+//             <Link to="/auth">登录/注册</Link>
+//             <Link to="/forum">论坛</Link>
+//           </>
+//         )}
+//       </div>
+//     </nav>
+//   );
+// };
 
-export default Navbar;
\ No newline at end of file
+// export default Navbar;
diff --git a/src/logo.svg b/src/logo.svg
index 38d62ff..7772be2 100644
--- a/src/logo.svg
+++ b/src/logo.svg
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 <svg width="81" height="81" viewBox="0 0 81 81" fill="none" xmlns="http://www.w3.org/2000/svg">
 <path d="M40.5 6.74951V74.2496" stroke="#FBF2E3" stroke-width="4" stroke-linecap="round"/>
 <path d="M57.375 20.2498V60.7498" stroke="#FBF2E3" stroke-width="4" stroke-linecap="round"/>
@@ -22,3 +23,6 @@
 </clipPath>
 </defs>
 </svg>
+=======
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>
+>>>>>>> d820d18 (- 初始化项目)
diff --git a/src/components/Auth/Auth.css b/src/pages/AuthPage/AuthPage.css
similarity index 100%
rename from src/components/Auth/Auth.css
rename to src/pages/AuthPage/AuthPage.css
diff --git a/src/pages/AuthPage.jsx b/src/pages/AuthPage/AuthPage.jsx
similarity index 77%
rename from src/pages/AuthPage.jsx
rename to src/pages/AuthPage/AuthPage.jsx
index e5effe1..4238214 100644
--- a/src/pages/AuthPage.jsx
+++ b/src/pages/AuthPage/AuthPage.jsx
@@ -1,6 +1,6 @@
 import React, { useState } from 'react';
-import Login from '../components/Auth/Login';
-import Register from '../components/Auth/Register';
+import Login from '../../components/Auth/Login';
+import Register from '../../components/Auth/Register';
 
 const AuthPage = () => {
   const [isRegister, setIsRegister] = useState(false);
diff --git a/src/pages/AuthPage.test.jsx b/src/pages/AuthPage/AuthPage.test.jsx
similarity index 100%
rename from src/pages/AuthPage.test.jsx
rename to src/pages/AuthPage/AuthPage.test.jsx
diff --git a/src/pages/MainPage/MainPage.css b/src/pages/MainPage/MainPage.css
new file mode 100644
index 0000000..60f2956
--- /dev/null
+++ b/src/pages/MainPage/MainPage.css
@@ -0,0 +1,88 @@
+.main-page {
+    background-color: #5c3f31;
+    color: white;
+  }
+  .header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 10px;
+  }
+  .logo-and-name {
+    display: flex;
+    align-items: center;
+  }
+  .logo {
+    height: 30px;
+    margin-right: 10px;
+  }
+  .site-name {
+    font-size: 24px;
+  }
+  .user-and-message {
+    display: flex;
+    align-items: center;
+  }
+  .user-avatar {
+    height: 40px;
+    margin-right: 10px;
+  }
+  .message-center {
+    font-size: 16px;
+  }
+  .nav {
+    background-color: #b38867;
+    display: flex;
+    justify-content: center;
+  }
+  .nav-item {
+    color: white;
+    text-decoration: none;
+    padding: 10px 20px;
+  }
+  .active {
+    background-color: #996633;
+  }
+  .content {
+    padding: 20px;
+  }
+  .user-post {
+    border-bottom: 1px solid white;
+    margin-bottom: 20px;
+    padding-bottom: 20px;
+  }
+  .user-info {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+  }
+  .user-avatar-small {
+    height: 30px;
+    margin-right: 10px;
+  }
+  .username {
+    font-size: 16px;
+  }
+  .post-content {
+    margin-bottom: 10px;
+  }
+  .post-actions {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+  }
+  .like-icon,
+  .comment-icon {
+    margin-right: 5px;
+  }
+  .like-count,
+  .comment-count {
+    margin-left: 5px;
+  }
+  .post-image {
+    float: right;
+    width: 150px;
+    height: 150px;
+    background-color: #ddd;
+    margin-left: 10px;
+  }
\ No newline at end of file
diff --git a/src/pages/MainPage/MainPage.jsx b/src/pages/MainPage/MainPage.jsx
new file mode 100644
index 0000000..1dad401
--- /dev/null
+++ b/src/pages/MainPage/MainPage.jsx
@@ -0,0 +1,55 @@
+import React from 'react';
+import './MainPage.css'; // 可创建对应样式文件来完善样式
+import { Link } from 'wouter'; // Use wouter's Link component
+// import '@icon-park/react/styles/index.css';
+// import { GoodTwo, Comment } from '@icon-park/react'; 
+
+const MainPage = () => {
+  return (
+    <div className="main-page">
+      {/* 顶部栏 */}
+      <header className="header">
+        {/* 左侧logo和网站名称 */}
+        <div className="logo-and-name">
+          <img src="logo.png" alt="网站logo" className="logo" />
+          <span className="site-name">Echo</span>
+        </div>
+        {/* 右侧用户头像和消息中心 */}
+        <div className="user-and-message">
+          <img src="user-avatar.png" alt="用户头像" className="user-avatar" />
+          <span className="message-center">消息</span>
+        </div>
+      </header>
+      {/* 导航栏 */}
+      <nav className="nav">
+        <Link to="/friend-moments" className="nav-item active">好友动态</Link>
+        <Link to="/forum" className="nav-item">论坛</Link>
+        <Link to="/interest-groups" className="nav-item">兴趣小组</Link>
+        <Link to="/seed-list" className="nav-item">种子列表</Link>
+        <Link to="/publish-seed" className="nav-item">发布种子</Link>
+      </nav>
+      {/* 好友动态内容区域 */}
+      <div className="content">
+        {/* 用户动态示例,可从后端获取数据循环展示 */}
+        <div className="user-post">
+          <div className="user-info">
+            <img src="user1-avatar.png" alt="用户头像" className="user-avatar-small" />
+            <span className="username">user1</span>
+          </div>
+          <div className="post-content">
+            <p>动态内容...</p>
+          </div>
+          <div className="post-actions">
+            {/* <GoodTwo theme="outline" size="24" fill="#fff" /> */}
+            <span className="like-count">21</span>
+            {/* <Comment theme="outline" size="24" fill="#fff"/> */}
+            <span className="comment-count">2</span>
+          </div>
+          <img src="image1.png" alt="动态图片" className="post-image" />
+        </div>
+      </div>
+    </div>
+  );
+};
+
+export default MainPage;
diff --git a/src/pages/MainPage/MainPage.test.js b/src/pages/MainPage/MainPage.test.js
new file mode 100644
index 0000000..651f9c6
--- /dev/null
+++ b/src/pages/MainPage/MainPage.test.js
@@ -0,0 +1,42 @@
+import { render, screen } from '@testing-library/react';
+import { Router } from 'wouter'; // 使用 wouter 的 Router
+import MainPage from './MainPage'; // 导入 MainPage 组件
+
+test('renders MainPage with logo, navigation links, and user post', () => {
+  render(
+    <Router>
+      <MainPage />
+    </Router>
+  );
+
+  // 检查页面中是否有 Echo 站点名称
+  const siteNameElement = screen.getByText(/Echo/i);
+  expect(siteNameElement).toBeInTheDocument();
+
+  // 检查页面中是否有导航栏中的链接
+  const friendMomentsLink = screen.getByText(/好友动态/i);
+  const forumLink = screen.getByText(/论坛/i);
+  const interestGroupsLink = screen.getByText(/兴趣小组/i);
+  const seedListLink = screen.getByText(/种子列表/i);
+  const publishSeedLink = screen.getByText(/发布种子/i);
+
+  expect(friendMomentsLink).toBeInTheDocument();
+  expect(forumLink).toBeInTheDocument();
+  expect(interestGroupsLink).toBeInTheDocument();
+  expect(seedListLink).toBeInTheDocument();
+  expect(publishSeedLink).toBeInTheDocument();
+
+  // 检查页面中是否有用户动态信息
+  const usernameElement = screen.getByText(/user1/i);
+  expect(usernameElement).toBeInTheDocument();
+
+  const postContentElement = screen.getByText(/动态内容.../i);
+  expect(postContentElement).toBeInTheDocument();
+
+  // 使用更精确的查询来获取喜欢数和评论数
+  const likeCountElement = screen.getByText('21');
+  const commentCountElement = screen.getByText('2');
+
+  expect(likeCountElement).toBeInTheDocument();
+  expect(commentCountElement).toBeInTheDocument();
+});