前后端登录注册连接成功

Change-Id: Ib5f9282fe7217b3363e542ce5c4e1c0d32619dcb
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
index c4e0ec7..7a728b1 100644
--- a/src/views/HomeView.vue
+++ b/src/views/HomeView.vue
@@ -1,777 +1,665 @@
-<template>
-  <div class="home-page">
-    <div class="home-container">
-      <!-- 用户信息和导航 -->
-      <header class="site-header">
-        <div class="header-content">
-          <div class="logo-section">
-            <h2 class="site-logo">🚀 PT Tracker</h2>
-          </div>
-          <div class="user-section">
-            <div class="user-stats">
-              <div class="stat-item">
-                <span class="stat-label">上传:</span>
-                <span class="stat-value">{{ userStats.uploaded }}</span>
-              </div>
-              <div class="stat-item">
-                <span class="stat-label">下载:</span>
-                <span class="stat-value">{{ userStats.downloaded }}</span>
-              </div>
-              <div class="stat-item">
-                <span class="stat-label">分享率:</span>
-                <span class="stat-value ratio" :class="getRatioClass(userStats.ratio)">
-                  {{ userStats.ratio }}
-                </span>
-              </div>
-            </div>
-            <div class="user-info">
-              <el-avatar :size="40" :icon="UserFilled" />
-              <span class="username">{{ userInfo.username }}</span>
-              <el-dropdown @command="handleUserCommand">
-                <el-icon class="dropdown-icon"><ArrowDown /></el-icon>
-                <template #dropdown>
-                  <el-dropdown-menu>
-                    <el-dropdown-item command="profile">个人资料</el-dropdown-item>
-                    <el-dropdown-item command="settings">设置</el-dropdown-item>
-                    <el-dropdown-item command="logout" divided>退出登录</el-dropdown-item>
-                  </el-dropdown-menu>
-                </template>
-              </el-dropdown>
-            </div>
-          </div>
-        </div>
-      </header>
-
-      <!-- 主要内容区域 -->
-      <main class="main-content">
-        <!-- 统计概览 -->
-        <section class="stats-overview">
-          <div class="stats-grid">
-            <div class="stat-card">
-              <div class="stat-icon">
-                <el-icon size="32" color="#67c23a"><Download /></el-icon>
-              </div>
-              <div class="stat-info">
-                <h3>{{ siteStats.totalTorrents }}</h3>
-                <p>种子总数</p>
-              </div>
-            </div>
-            <div class="stat-card">
-              <div class="stat-icon">
-                <el-icon size="32" color="#409eff"><User /></el-icon>
-              </div>
-              <div class="stat-info">
-                <h3>{{ siteStats.totalUsers }}</h3>
-                <p>注册用户</p>
-              </div>
-            </div>
-            <div class="stat-card">
-              <div class="stat-icon">
-                <el-icon size="32" color="#f56c6c"><Upload /></el-icon>
-              </div>
-              <div class="stat-info">
-                <h3>{{ siteStats.totalSize }}</h3>
-                <p>数据总量</p>
-              </div>
-            </div>
-          </div>
-        </section>
-
-        <!-- 快速操作 -->
-        <section class="quick-actions">
-          <h2 class="section-title">快速操作</h2>
-          <div class="action-grid">
-            <div class="action-card" @click="navigateTo('/torrents')">
-              <el-icon size="48" color="#409eff"><Search /></el-icon>
-              <h3>浏览种子</h3>
-              <p>搜索和浏览所有可用的种子资源</p>
-            </div>
-            <div class="action-card" @click="navigateTo('/upload')">
-              <el-icon size="48" color="#67c23a"><Upload /></el-icon>
-              <h3>上传资源</h3>
-              <p>分享你的资源,为社区做贡献</p>
-            </div>
-            <div class="action-card" @click="navigateTo('/forum')">
-              <el-icon size="48" color="#e6a23c"><ChatDotRound /></el-icon>
-              <h3>论坛交流</h3>
-              <p>与其他用户交流讨论</p>
-            </div>
-            <div class="action-card" @click="navigateTo('/rankings')">
-              <el-icon size="48" color="#f56c6c"><TrophyBase /></el-icon>
-              <h3>排行榜</h3>
-              <p>查看用户和资源排行</p>
-            </div>
-          </div>
-        </section>
-
-        <!-- 最新种子 -->
-        <section class="latest-torrents">
-          <div class="section-header">
-            <h2 class="section-title">最新种子</h2>
-            <el-button type="primary" text @click="navigateTo('/torrents')">
-              查看更多 <el-icon><ArrowRight /></el-icon>
-            </el-button>
-          </div>
-          <div class="torrents-list">
-            <div 
-              v-for="torrent in latestTorrents" 
-              :key="torrent.id" 
-              class="torrent-item"
-              @click="navigateTo(`/torrent/${torrent.id}`)"
-            >
-              <div class="torrent-info">
-                <div class="torrent-category">
-                  <el-tag :type="getCategoryType(torrent.category)" size="small">
-                    {{ torrent.category }}
-                  </el-tag>
-                </div>
-                <h4 class="torrent-title">{{ torrent.title }}</h4>
-                <div class="torrent-meta">
-                  <span class="meta-item">
-                    <el-icon><User /></el-icon>
-                    {{ torrent.uploader }}
-                  </span>
-                  <span class="meta-item">
-                    <el-icon><Clock /></el-icon>
-                    {{ formatTime(torrent.uploadTime) }}
-                  </span>
-                  <span class="meta-item">
-                    <el-icon><Coin /></el-icon>
-                    {{ torrent.size }}
-                  </span>
-                </div>
-              </div>
-              <div class="torrent-stats">
-                <div class="stat-group">
-                  <span class="stat-number seeders">{{ torrent.seeders }}</span>
-                  <span class="stat-label">做种</span>
-                </div>
-                <div class="stat-group">
-                  <span class="stat-number leechers">{{ torrent.leechers }}</span>
-                  <span class="stat-label">下载</span>
-                </div>
-                <div class="stat-group">
-                  <span class="stat-number">{{ torrent.downloads }}</span>
-                  <span class="stat-label">完成</span>
-                </div>
-              </div>
-            </div>
-          </div>
-        </section>
-
-        <!-- 个人活动 -->
-        <section class="user-activity">
-          <h2 class="section-title">我的活动</h2>
-          <div class="activity-grid">
-            <div class="activity-card">
-              <h3>我的种子</h3>
-              <div class="activity-stats">
-                <div class="activity-item">
-                  <span class="activity-label">正在做种:</span>
-                  <span class="activity-value">{{ userActivity.seeding }}</span>
-                </div>
-                <div class="activity-item">
-                  <span class="activity-label">正在下载:</span>
-                  <span class="activity-value">{{ userActivity.downloading }}</span>
-                </div>
-                <div class="activity-item">
-                  <span class="activity-label">已上传:</span>
-                  <span class="activity-value">{{ userActivity.uploaded }}</span>
-                </div>
-              </div>
-              <el-button type="primary" size="small" @click="navigateTo('/my-torrents')">
-                查看详情
-              </el-button>
-            </div>
-            
-            <div class="activity-card">
-              <h3>邀请管理</h3>
-              <div class="activity-stats">
-                <div class="activity-item">
-                  <span class="activity-label">可用邀请:</span>
-                  <span class="activity-value">{{ userActivity.invitations }}</span>
-                </div>
-                <div class="activity-item">
-                  <span class="activity-label">已邀请:</span>
-                  <span class="activity-value">{{ userActivity.invited }}</span>
-                </div>
-              </div>
-              <el-button type="success" size="small" @click="navigateTo('/invitations')">
-                管理邀请
-              </el-button>
-            </div>
-          </div>
-        </section>
-      </main>
-    </div>
-  </div>
-</template>
-
-<script>
-import { ref, onMounted } from 'vue'
-import { useRouter } from 'vue-router'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import {
-  UserFilled,
-  ArrowDown,
-  Download,
-  Upload,
-  ChatDotRound,
-  Search,
-  User,
-  Connection,
-  TrophyBase,
-  ArrowRight,
-  Clock,
-  Coin
-} from '@element-plus/icons-vue'
-
-export default {
-  name: 'HomeView',
-  components: {
-    UserFilled,
-    ArrowDown
-  },
-  setup() {
-    const router = useRouter()
-    
-    const userInfo = ref({
-      username: '',
-      loginTime: ''
-    })
-    
-    const userStats = ref({
-      uploaded: '128.5 GB',
-      downloaded: '45.2 GB',
-      ratio: '2.84'
-    })
-    
-    const siteStats = ref({
-      totalTorrents: '12,458',
-      totalUsers: '8,924',
-      onlineUsers: '342',
-      totalSize: '45.2 TB'
-    })
-    
-    const userActivity = ref({
-      seeding: 15,
-      downloading: 3,
-      uploaded: 8,
-      invitations: 5,
-      invited: 12
-    })
-    
-    const latestTorrents = ref([
-      {
-        id: 1,
-        title: '[4K蓝光原盘] 阿凡达:水之道 Avatar: The Way of Water (2022)',
-        category: '电影',
-        uploader: 'MovieMaster',
-        uploadTime: '2025-06-03T10:30:00',
-        size: '85.6 GB',
-        seeders: 128,
-        leechers: 45,
-        downloads: 892
-      },
-      {
-        id: 2,
-        title: '[FLAC] Taylor Swift - Midnights (Deluxe Edition) [2022]',
-        category: '音乐',
-        uploader: 'MusicLover',
-        uploadTime: '2025-06-03T09:15:00',
-        size: '1.2 GB',
-        seeders: 67,
-        leechers: 12,
-        downloads: 456
-      },
-      {
-        id: 3,
-        title: '[合集] Adobe Creative Suite 2025 完整版',
-        category: '软件',
-        uploader: 'TechGuru',
-        uploadTime: '2025-06-03T08:45:00',
-        size: '12.8 GB',
-        seeders: 234,
-        leechers: 89,
-        downloads: 1205
-      }
-    ])
-    
-    onMounted(() => {
-      userInfo.value = {
-        username: localStorage.getItem('username') || '用户',
-        loginTime: localStorage.getItem('loginTime') || ''
-      }
-      
-      // 模拟获取用户数据
-      fetchUserData()
-    })
-    
-    const fetchUserData = () => {
-      // 这里应该是API调用,现在使用模拟数据
-      console.log('获取用户数据...')
-    }
-    
-    const formatTime = (timeString) => {
-      if (!timeString) return ''
-      const date = new Date(timeString)
-      const now = new Date()
-      const diff = now - date
-      const hours = Math.floor(diff / (1000 * 60 * 60))
-      
-      if (hours < 1) return '刚刚'
-      if (hours < 24) return `${hours}小时前`
-      const days = Math.floor(hours / 24)
-      return `${days}天前`
-    }
-    
-    const getRatioClass = (ratio) => {
-      const r = parseFloat(ratio)
-      if (r >= 2) return 'excellent'
-      if (r >= 1) return 'good'
-      return 'warning'
-    }
-    
-    const getCategoryType = (category) => {
-      const types = {
-        '电影': 'primary',
-        '音乐': 'success',
-        '软件': 'warning',
-        '游戏': 'danger',
-        '电视剧': 'info'
-      }
-      return types[category] || 'default'
-    }
-    
-    const navigateTo = (path) => {
-      router.push(path)
-    }
-    
-    const handleUserCommand = async (command) => {
-      switch (command) {
-        case 'profile':
-          navigateTo('/profile')
-          break
-        case 'settings':
-          navigateTo('/settings')
-          break
-        case 'logout':
-          await handleLogout()
-          break
-      }
-    }
-    
-    const handleLogout = async () => {
-      try {
-        await ElMessageBox.confirm(
-          '确定要退出登录吗?',
-          '提示',
-          {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
-            type: 'warning'
-          }
-        )
-        
-        localStorage.removeItem('isLoggedIn')
-        localStorage.removeItem('username')
-        localStorage.removeItem('loginTime')
-        localStorage.removeItem('rememberLogin')
-        
-        ElMessage.success('已安全退出')
-        router.push('/login')
-        
-      } catch {
-        // 用户取消退出
-      }
-    }
-    
-    return {
-      userInfo,
-      userStats,
-      siteStats,
-      userActivity,
-      latestTorrents,
-      formatTime,
-      getRatioClass,
-      getCategoryType,
-      navigateTo,
-      handleUserCommand,
-      handleLogout,
-      Download,
-      Upload,
-      ChatDotRound,
-      Search,
-      User,
-      Connection,
-      TrophyBase,
-      ArrowRight,
-      Clock,
-      Coin
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.home-page {
-  min-height: 100vh;
-  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-  padding: 0;
-}
-
-.home-container {
-  max-width: 1200px;
-  margin: 0 auto;
-  background: #fff;
-  min-height: 100vh;
-}
-
-// 网站头部
-.site-header {
-  background: #fff;
-  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
-  position: sticky;
-  top: 0;
-  z-index: 100;
-  
-  .header-content {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    padding: 16px 24px;
-    
-    .logo-section {
-      .site-logo {
-        margin: 0;
-        font-size: 24px;
-        font-weight: bold;
-        color: #667eea;
-      }
-    }
-    
-    .user-section {
-      display: flex;
-      align-items: center;
-      gap: 24px;
-      
-      .user-stats {
-        display: flex;
-        gap: 16px;
-        
-        .stat-item {
-          font-size: 14px;
-          
-          .stat-label {
-            color: #909399;
-            margin-right: 4px;
-          }
-          
-          .stat-value {
-            font-weight: 600;
-            color: #2c3e50;
-            
-            &.ratio {
-              &.excellent { color: #67c23a; }
-              &.good { color: #e6a23c; }
-              &.warning { color: #f56c6c; }
-            }
-          }
-        }
-      }
-      
-      .user-info {
-        display: flex;
-        align-items: center;
-        gap: 8px;
-        cursor: pointer;
-        
-        .username {
-          font-weight: 500;
-          color: #2c3e50;
-        }
-        
-        .dropdown-icon {
-          color: #909399;
-          transition: transform 0.3s ease;
-          
-          &:hover {
-            transform: rotate(180deg);
-          }
-        }
-      }
-    }
-  }
-}
-
-// 主要内容
-.main-content {
-  padding: 24px;
-}
-
-.section-title {
-  font-size: 20px;
-  font-weight: 600;
-  color: #2c3e50;
-  margin-bottom: 16px;
-}
-
-.section-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 16px;
-}
-
-// 统计概览
-.stats-overview {
-  margin-bottom: 32px;
-  
-  .stats-grid {
-    display: grid;
-    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
-    gap: 16px;
-    
-    .stat-card {
-      background: #fff;
-      border-radius: 12px;
-      padding: 24px;
-      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-      border: 1px solid #f0f0f0;
-      display: flex;
-      align-items: center;
-      gap: 16px;
-      transition: all 0.3s ease;
-      
-      &:hover {
-        transform: translateY(-2px);
-        box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
-      }
-      
-      .stat-info {
-        h3 {
-          font-size: 24px;
-          font-weight: bold;
-          color: #2c3e50;
-          margin: 0 0 4px 0;
-        }
-        
-        p {
-          font-size: 14px;
-          color: #909399;
-          margin: 0;
-        }
-      }
-    }
-  }
-}
-
-// 快速操作
-.quick-actions {
-  margin-bottom: 32px;
-  
-  .action-grid {
-    display: grid;
-    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
-    gap: 20px;
-    
-    .action-card {
-      background: #fff;
-      border-radius: 12px;
-      padding: 32px 24px;
-      text-align: center;
-      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-      border: 1px solid #f0f0f0;
-      cursor: pointer;
-      transition: all 0.3s ease;
-      
-      &:hover {
-        transform: translateY(-4px);
-        box-shadow: 0 12px 32px rgba(0, 0, 0, 0.15);
-      }
-      
-      h3 {
-        font-size: 18px;
-        font-weight: 600;
-        color: #2c3e50;
-        margin: 16px 0 8px 0;
-      }
-      
-      p {
-        font-size: 14px;
-        color: #7f8c8d;
-        line-height: 1.5;
-        margin: 0;
-      }
-    }
-  }
-}
-
-// 最新种子
-.latest-torrents {
-  margin-bottom: 32px;
-  
-  .torrents-list {
-    background: #fff;
-    border-radius: 12px;
-    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-    border: 1px solid #f0f0f0;
-    overflow: hidden;
-    
-    .torrent-item {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      padding: 20px 24px;
-      border-bottom: 1px solid #f5f5f5;
-      cursor: pointer;
-      transition: background-color 0.3s ease;
-      
-      &:hover {
-        background-color: #f8f9fa;
-      }
-      
-      &:last-child {
-        border-bottom: none;
-      }
-      
-      .torrent-info {
-        flex: 1;
-        
-        .torrent-category {
-          margin-bottom: 8px;
-        }
-        
-        .torrent-title {
-          font-size: 16px;
-          font-weight: 500;
-          color: #2c3e50;
-          margin: 0 0 8px 0;
-          line-height: 1.4;
-        }
-        
-        .torrent-meta {
-          display: flex;
-          gap: 16px;
-          
-          .meta-item {
-            display: flex;
-            align-items: center;
-            gap: 4px;
-            font-size: 12px;
-            color: #909399;
-            
-            .el-icon {
-              font-size: 12px;
-            }
-          }
-        }
-      }
-      
-      .torrent-stats {
-        display: flex;
-        gap: 24px;
-        
-        .stat-group {
-          text-align: center;
-          
-          .stat-number {
-            display: block;
-            font-size: 16px;
-            font-weight: 600;
-            
-            &.seeders { color: #67c23a; }
-            &.leechers { color: #f56c6c; }
-          }
-          
-          .stat-label {
-            font-size: 12px;
-            color: #909399;
-          }
-        }
-      }
-    }
-  }
-}
-
-// 用户活动
-.user-activity {
-  .activity-grid {
-    display: grid;
-    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
-    gap: 20px;
-    
-    .activity-card {
-      background: #fff;
-      border-radius: 12px;
-      padding: 24px;
-      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-      border: 1px solid #f0f0f0;
-      
-      h3 {
-        font-size: 18px;
-        font-weight: 600;
-        color: #2c3e50;
-        margin: 0 0 16px 0;
-      }
-      
-      .activity-stats {
-        margin-bottom: 16px;
-        
-        .activity-item {
-          display: flex;
-          justify-content: space-between;
-          align-items: center;
-          padding: 8px 0;
-          
-          .activity-label {
-            font-size: 14px;
-            color: #7f8c8d;
-          }
-          
-          .activity-value {
-            font-size: 14px;
-            font-weight: 600;
-            color: #2c3e50;
-          }
-        }
-      }
-    }
-  }
-}
-
-// 响应式设计
-@media (max-width: 768px) {
-  .header-content {
-    flex-direction: column;
-    gap: 16px;
-    
-    .user-stats {
-      flex-direction: column;
-      gap: 8px;
-      text-align: center;
-    }
-  }
-  
-  .main-content {
-    padding: 16px;
-  }
-  
-  .stats-grid,
-  .action-grid,
-  .activity-grid {
-    grid-template-columns: 1fr;
-  }
-  
-  .torrent-item {
-    flex-direction: column;
-    align-items: flex-start;
-    gap: 16px;
-    
-    .torrent-stats {
-      width: 100%;
-      justify-content: space-around;
-    }
-  }
-}
+<template>

+  <div class="home-page">

+    <!-- 导航栏 -->

+    <div class="navbar">

+      <router-link to="/home" class="navbar-brand">PT Tracker</router-link>

+      <div class="navbar-nav">

+        <router-link to="/home" class="navbar-item">首页</router-link>

+        <router-link to="/torrents" class="navbar-item">种子</router-link>

+        <router-link to="/forum" class="navbar-item">论坛</router-link>

+        <el-dropdown @command="handleUserCommand">

+          <span class="navbar-user">

+            <el-avatar :size="32" :src="userAvatar">

+              {{ username.charAt(0).toUpperCase() }}

+            </el-avatar>

+            <span class="username">{{ username }}</span>

+            <el-icon><ArrowDown /></el-icon>

+          </span>

+          <template #dropdown>

+            <el-dropdown-menu>

+              <el-dropdown-item command="profile">

+                <el-icon><User /></el-icon>

+                个人资料

+              </el-dropdown-item>

+              <el-dropdown-item command="settings">

+                <el-icon><Setting /></el-icon>

+                设置

+              </el-dropdown-item>

+              <el-dropdown-item divided command="logout">

+                <el-icon><SwitchButton /></el-icon>

+                退出登录

+              </el-dropdown-item>

+            </el-dropdown-menu>

+          </template>

+        </el-dropdown>

+      </div>

+    </div>

+

+    <!-- 主内容区 -->

+    <div class="main-content">

+      <!-- 欢迎卡片 -->

+      <div class="welcome-card">

+        <div class="welcome-header">

+          <h1>欢迎回来,{{ username }}!</h1>

+          <p>当前时间:{{ currentTime }}</p>

+        </div>

+        

+        <!-- 用户统计概览 -->

+        <div class="stats-overview" v-if="userInfo">

+          <div class="stat-item">

+            <div class="stat-icon upload">

+              <el-icon size="24"><Upload /></el-icon>

+            </div>

+            <div class="stat-content">

+              <h3>{{ formatBytes(userInfo.user.uploaded) }}</h3>

+              <p>总上传</p>

+            </div>

+          </div>

+          

+          <div class="stat-item">

+            <div class="stat-icon download">

+              <el-icon size="24"><Download /></el-icon>

+            </div>

+            <div class="stat-content">

+              <h3>{{ formatBytes(userInfo.user.downloaded) }}</h3>

+              <p>总下载</p>

+            </div>

+          </div>

+          

+          <div class="stat-item">

+            <div class="stat-icon ratio">

+              <el-icon size="24"><TrendCharts /></el-icon>

+            </div>

+            <div class="stat-content">

+              <h3>{{ calculateRatio(userInfo.user.uploaded, userInfo.user.downloaded) }}</h3>

+              <p>分享率</p>

+            </div>

+          </div>

+          

+          <div class="stat-item">

+            <div class="stat-icon points">

+              <el-icon size="24"><Star /></el-icon>

+            </div>

+            <div class="stat-content">

+              <h3>{{ userInfo.user.karma || '0' }}</h3>

+              <p>积分</p>

+            </div>

+          </div>

+        </div>

+      </div>

+

+      <!-- 功能快捷入口 -->

+      <div class="quick-actions">

+        <h2>快捷操作</h2>

+        <div class="actions-grid">

+          <div class="action-card" @click="$router.push('/upload')">

+            <el-icon size="32" color="#67c23a"><Upload /></el-icon>

+            <h3>上传种子</h3>

+            <p>分享你的资源</p>

+          </div>

+          

+          <div class="action-card" @click="$router.push('/torrents')">

+            <el-icon size="32" color="#409eff"><Search /></el-icon>

+            <h3>浏览种子</h3>

+            <p>发现新内容</p>

+          </div>

+          

+          <div class="action-card" @click="$router.push('/forum')">

+            <el-icon size="32" color="#e6a23c"><ChatDotRound /></el-icon>

+            <h3>社区论坛</h3>

+            <p>交流讨论</p>

+          </div>

+          

+          <div class="action-card" @click="$router.push('/profile')">

+            <el-icon size="32" color="#f56c6c"><User /></el-icon>

+            <h3>个人中心</h3>

+            <p>管理账户</p>

+          </div>

+        </div>

+      </div>

+

+      <!-- API连接状态测试 -->

+      <div class="api-status-card">

+        <h2>API连接状态</h2>

+        <div class="status-items">

+          <div class="status-item">

+            <el-icon :color="loginStatusColor"><CircleCheck /></el-icon>

+            <span>登录状态:{{ loginStatusText }}</span>

+            <el-button size="small" @click="checkLoginStatus">检查状态</el-button>

+          </div>

+          

+          <div class="status-item">

+            <el-icon :color="userInfoStatusColor"><User /></el-icon>

+            <span>用户信息:{{ userInfoStatusText }}</span>

+            <el-button size="small" @click="refreshUserInfo">刷新信息</el-button>

+          </div>

+        </div>

+        

+        <!-- 用户详细信息展示 -->

+        <div class="user-details" v-if="userInfo">

+          <h3>用户详细信息</h3>

+          <div class="details-grid">

+            <div class="detail-item">

+              <label>用户ID:</label>

+              <span>{{ userInfo.user.id }}</span>

+            </div>

+            <div class="detail-item">

+              <label>用户名:</label>

+              <span>{{ userInfo.user.username }}</span>

+            </div>

+            <div class="detail-item">

+              <label>邮箱:</label>

+              <span>{{ userInfo.user.email }}</span>

+            </div>

+            <div class="detail-item">

+              <label>用户组:</label>

+              <span>{{ userInfo.user.group?.displayName || '未知' }}</span>

+            </div>

+            <div class="detail-item">

+              <label>注册时间:</label>

+              <span>{{ formatDate(userInfo.user.createdAt) }}</span>

+            </div>

+            <div class="detail-item">

+              <label>个性签名:</label>

+              <span>{{ userInfo.user.signature || '这个用户很懒,还没有个性签名' }}</span>

+            </div>

+          </div>

+        </div>

+      </div>

+    </div>

+  </div>

+</template>

+

+<script>

+import { ref, computed, onMounted, onUnmounted } from 'vue'

+import { useRouter } from 'vue-router'

+import { useStore } from 'vuex'

+import { ElMessage, ElMessageBox } from 'element-plus'

+import {

+  ArrowDown,

+  User,

+  Setting,

+  SwitchButton,

+  Upload,

+  Download,

+  TrendCharts,

+  Star,

+  Search,

+  ChatDotRound,

+  CircleCheck

+} from '@element-plus/icons-vue'

+

+export default {

+  name: 'HomeView',

+  components: {

+    ArrowDown,

+    User,

+    Setting,

+    SwitchButton,

+    Upload,

+    Download,

+    TrendCharts,

+    Star,

+    Search,

+    ChatDotRound,

+    CircleCheck

+  },

+  setup() {

+    const router = useRouter()

+    const store = useStore()

+    

+    const currentTime = ref('')

+    const timeInterval = ref(null)

+    

+    // 从store获取用户信息

+    const userInfo = computed(() => store.getters['auth/userInfo'])

+    const username = computed(() => store.getters['auth/username'])

+    const userAvatar = computed(() => store.getters['auth/avatar'])

+    const isAuthenticated = computed(() => store.getters['auth/isAuthenticated'])

+    

+    // API状态

+    const loginStatusColor = computed(() => isAuthenticated.value ? '#67c23a' : '#f56c6c')

+    const loginStatusText = computed(() => isAuthenticated.value ? '已登录' : '未登录')

+    

+    const userInfoStatusColor = computed(() => userInfo.value ? '#67c23a' : '#f56c6c')

+    const userInfoStatusText = computed(() => userInfo.value ? '已获取' : '未获取')

+    

+    // 更新当前时间

+    const updateCurrentTime = () => {

+      currentTime.value = new Date().toLocaleString('zh-CN')

+    }

+    

+    // 格式化字节数

+    const formatBytes = (bytes) => {

+      if (!bytes || bytes === 0) return '0 B'

+      

+      const sizes = ['B', 'KB', 'MB', 'GB', 'TB']

+      const i = Math.floor(Math.log(bytes) / Math.log(1024))

+      const size = (bytes / Math.pow(1024, i)).toFixed(2)

+      

+      return `${size} ${sizes[i]}`

+    }

+    

+    // 计算分享率

+    const calculateRatio = (uploaded, downloaded) => {

+      if (!uploaded || !downloaded || downloaded === 0) {

+        return uploaded > 0 ? '∞' : '0.00'

+      }

+      return (uploaded / downloaded).toFixed(2)

+    }

+    

+    // 格式化日期

+    const formatDate = (timestamp) => {

+      if (!timestamp) return '未知'

+      return new Date(timestamp).toLocaleDateString('zh-CN')

+    }

+    

+    // 检查登录状态

+    const checkLoginStatus = async () => {

+      try {

+        await store.dispatch('auth/checkLoginStatus')

+        ElMessage.success('登录状态检查完成')

+      } catch (error) {

+        console.error('检查登录状态失败:', error)

+        ElMessage.error('检查登录状态失败')

+      }

+    }

+    

+    // 刷新用户信息

+    const refreshUserInfo = async () => {

+      try {

+        await store.dispatch('auth/checkLoginStatus')

+        ElMessage.success('用户信息刷新成功')

+      } catch (error) {

+        console.error('刷新用户信息失败:', error)

+        ElMessage.error('刷新用户信息失败')

+      }

+    }

+    

+    // 处理用户菜单命令

+    const handleUserCommand = async (command) => {

+      switch (command) {

+        case 'profile':

+          router.push('/profile')

+          break

+        case 'settings':

+          ElMessage.info('设置功能开发中...')

+          break

+        case 'logout':

+          try {

+            await ElMessageBox.confirm('确定要退出登录吗?', '提示', {

+              confirmButtonText: '确定',

+              cancelButtonText: '取消',

+              type: 'warning'

+            })

+            

+            await store.dispatch('auth/logout')

+            router.push('/login')

+          } catch (error) {

+            // 用户取消操作

+            if (error !== 'cancel') {

+              console.error('退出登录失败:', error)

+            }

+          }

+          break

+      }

+    }

+    

+    onMounted(() => {

+      // 开始时间更新

+      updateCurrentTime()

+      timeInterval.value = setInterval(updateCurrentTime, 1000)

+      

+      // 检查登录状态

+      if (!isAuthenticated.value) {

+        checkLoginStatus()

+      }

+    })

+    

+    onUnmounted(() => {

+      // 清理定时器

+      if (timeInterval.value) {

+        clearInterval(timeInterval.value)

+      }

+    })

+    

+    return {

+      currentTime,

+      userInfo,

+      username,

+      userAvatar,

+      isAuthenticated,

+      loginStatusColor,

+      loginStatusText,

+      userInfoStatusColor,

+      userInfoStatusText,

+      formatBytes,

+      calculateRatio,

+      formatDate,

+      checkLoginStatus,

+      refreshUserInfo,

+      handleUserCommand

+    }

+  }

+}

+</script>

+

+<style lang="scss" scoped>

+.home-page {

+  min-height: 100vh;

+  background: #f5f5f5;

+}

+

+.navbar {

+  background: #fff;

+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);

+  height: 60px;

+  display: flex;

+  align-items: center;

+  justify-content: space-between;

+  padding: 0 24px;

+  position: sticky;

+  top: 0;

+  z-index: 1000;

+}

+

+.navbar-brand {

+  font-size: 20px;

+  font-weight: 700;

+  color: #409eff;

+  text-decoration: none;

+}

+

+.navbar-nav {

+  display: flex;

+  align-items: center;

+  gap: 24px;

+}

+

+.navbar-item {

+  color: #606266;

+  text-decoration: none;

+  font-weight: 500;

+  transition: color 0.3s;

+  

+  &:hover {

+    color: #409eff;

+  }

+}

+

+.navbar-user {

+  display: flex;

+  align-items: center;

+  gap: 8px;

+  cursor: pointer;

+  padding: 8px;

+  border-radius: 6px;

+  transition: background-color 0.3s;

+  

+  &:hover {

+    background-color: #f5f7fa;

+  }

+  

+  .username {

+    font-weight: 500;

+    color: #303133;

+  }

+}

+

+.main-content {

+  max-width: 1200px;

+  margin: 0 auto;

+  padding: 24px;

+}

+

+.welcome-card {

+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);

+  color: white;

+  border-radius: 12px;

+  padding: 32px;

+  margin-bottom: 24px;

+  

+  .welcome-header {

+    text-align: center;

+    margin-bottom: 24px;

+    

+    h1 {

+      font-size: 28px;

+      margin-bottom: 8px;

+    }

+    

+    p {

+      opacity: 0.9;

+      font-size: 14px;

+    }

+  }

+  

+  .stats-overview {

+    display: grid;

+    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));

+    gap: 16px;

+    

+    .stat-item {

+      background: rgba(255, 255, 255, 0.1);

+      backdrop-filter: blur(10px);

+      border-radius: 8px;

+      padding: 20px;

+      display: flex;

+      align-items: center;

+      gap: 16px;

+      

+      .stat-icon {

+        width: 48px;

+        height: 48px;

+        border-radius: 50%;

+        background: rgba(255, 255, 255, 0.2);

+        display: flex;

+        align-items: center;

+        justify-content: center;

+      }

+      

+      .stat-content {

+        h3 {

+          font-size: 20px;

+          font-weight: 600;

+          margin: 0 0 4px 0;

+        }

+        

+        p {

+          font-size: 14px;

+          opacity: 0.8;

+          margin: 0;

+        }

+      }

+    }

+  }

+}

+

+.quick-actions {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  h2 {

+    font-size: 20px;

+    color: #303133;

+    margin: 0 0 20px 0;

+  }

+  

+  .actions-grid {

+    display: grid;

+    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));

+    gap: 16px;

+    

+    .action-card {

+      background: #f8f9fa;

+      border-radius: 8px;

+      padding: 24px;

+      text-align: center;

+      cursor: pointer;

+      transition: all 0.3s;

+      border: 2px solid transparent;

+      

+      &:hover {

+        transform: translateY(-2px);

+        box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);

+        border-color: #409eff;

+      }

+      

+      h3 {

+        font-size: 16px;

+        color: #303133;

+        margin: 12px 0 8px 0;

+      }

+      

+      p {

+        font-size: 14px;

+        color: #909399;

+        margin: 0;

+      }

+    }

+  }

+}

+

+.api-status-card {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  h2 {

+    font-size: 20px;

+    color: #303133;

+    margin: 0 0 20px 0;

+  }

+  

+  .status-items {

+    margin-bottom: 24px;

+    

+    .status-item {

+      display: flex;

+      align-items: center;

+      gap: 12px;

+      padding: 12px 0;

+      border-bottom: 1px solid #ebeef5;

+      

+      &:last-child {

+        border-bottom: none;

+      }

+      

+      span {

+        flex: 1;

+        font-size: 14px;

+        color: #606266;

+      }

+    }

+  }

+  

+  .user-details {

+    border-top: 1px solid #ebeef5;

+    padding-top: 20px;

+    

+    h3 {

+      font-size: 16px;

+      color: #303133;

+      margin: 0 0 16px 0;

+    }

+    

+    .details-grid {

+      display: grid;

+      grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));

+      gap: 12px;

+      

+      .detail-item {

+        display: flex;

+        align-items: center;

+        padding: 8px 0;

+        

+        label {

+          font-weight: 500;

+          color: #909399;

+          min-width: 80px;

+          font-size: 14px;

+        }

+        

+        span {

+          color: #606266;

+          font-size: 14px;

+        }

+      }

+    }

+  }

+}

+

+@media (max-width: 768px) {

+  .navbar {

+    padding: 0 16px;

+    

+    .navbar-nav {

+      gap: 16px;

+    }

+    

+    .navbar-user .username {

+      display: none;

+    }

+  }

+  

+  .main-content {

+    padding: 16px;

+  }

+  

+  .welcome-card {

+    padding: 24px 16px;

+    

+    .welcome-header h1 {

+      font-size: 24px;

+    }

+    

+    .stats-overview {

+      grid-template-columns: repeat(2, 1fr);

+      gap: 12px;

+      

+      .stat-item {

+        padding: 16px;

+        

+        .stat-content h3 {

+          font-size: 16px;

+        }

+      }

+    }

+  }

+  

+  .actions-grid {

+    grid-template-columns: repeat(2, 1fr);

+    gap: 12px;

+    

+    .action-card {

+      padding: 16px;

+      

+      h3 {

+        font-size: 14px;

+      }

+      

+      p {

+        font-size: 12px;

+      }

+    }

+  }

+  

+  .details-grid {

+    grid-template-columns: 1fr;

+  }

+}

+

+@media (max-width: 480px) {

+  .stats-overview {

+    grid-template-columns: 1fr;

+  }

+  

+  .actions-grid {

+    grid-template-columns: 1fr;

+  }

+}

 </style>
\ No newline at end of file
diff --git a/src/views/auth/LoginView.vue b/src/views/auth/LoginView.vue
index fb85c70..8ab8577 100644
--- a/src/views/auth/LoginView.vue
+++ b/src/views/auth/LoginView.vue
@@ -1,343 +1,183 @@
-<template>
-  <div class="login-page">
-    <!-- 背景装饰 -->
-    <div class="bg-decoration">
-      <div class="shape shape-1"></div>
-      <div class="shape shape-2"></div>
-      <div class="shape shape-3"></div>
-    </div>
-    
-    <!-- 登录表单容器 -->
-    <div class="login-container">
-      <div class="login-card">
-        <!-- 头部信息 -->
-        <div class="login-header">
-          <div class="logo">
-            <el-icon size="48" color="#667eea"><Operation /></el-icon>
-          </div>
-          <h1 class="title">PT Tracker</h1>
-          <p class="subtitle">私有种子分享社区</p>
-        </div>
-        
-        <!-- 登录表单 -->
-        <el-form
-          ref="loginFormRef"
-          :model="loginForm"
-          :rules="loginRules"
-          class="login-form"
-          size="large"
-        >
-          <el-form-item prop="username">
-            <el-input
-              v-model="loginForm.username"
-              placeholder="请输入用户名或邮箱"
-              clearable
-              :prefix-icon="User"
-            />
-          </el-form-item>
-          
-          <el-form-item prop="password">
-            <el-input
-              v-model="loginForm.password"
-              type="password"
-              placeholder="请输入密码"
-              show-password
-              :prefix-icon="Lock"
-              @keyup.enter="handleLogin"
-            />
-          </el-form-item>
-          
-          <el-form-item>
-            <div class="login-options">
-              <el-checkbox v-model="rememberMe">记住登录</el-checkbox>
-              <el-link type="primary" :underline="false">忘记密码?</el-link>
-            </div>
-          </el-form-item>
-          
-          <el-form-item>
-            <el-button
-              type="primary"
-              :loading="loading"
-              style="width: 100%"
-              @click="handleLogin"
-            >
-              <span v-if="!loading">登录</span>
-              <span v-else>登录中...</span>
-            </el-button>
-          </el-form-item>
-        </el-form>
-        
-        <!-- 底部链接 -->
-        <div class="login-footer">
-          <span class="footer-text">还没有账号?</span>
-          <el-link 
-            type="primary" 
-            :underline="false"
-            @click="$router.push('/register')"
-          >
-            立即注册
-          </el-link>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { ref, reactive } from 'vue'
-import { useRouter } from 'vue-router'
-import { ElMessage } from 'element-plus'
-import { User, Lock, Operation } from '@element-plus/icons-vue'
-
-export default {
-  name: 'LoginView',
-  components: {
-    Operation
-  },
-  setup() {
-    const router = useRouter()
-    const loginFormRef = ref()
-    const loading = ref(false)
-    const rememberMe = ref(false)
-    
-    // 表单数据
-    const loginForm = reactive({
-      username: '',
-      password: ''
-    })
-    
-    // 验证规则
-    const loginRules = {
-      username: [
-        { required: true, message: '请输入用户名或邮箱', trigger: 'blur' },
-        { min: 3, message: '用户名至少3个字符', trigger: 'blur' }
-      ],
-      password: [
-        { required: true, message: '请输入密码', trigger: 'blur' },
-        { min: 6, message: '密码至少6个字符', trigger: 'blur' }
-      ]
-    }
-    
-    // 登录处理
-    const handleLogin = async () => {
-      try {
-        // 表单验证
-        const valid = await loginFormRef.value.validate()
-        if (!valid) return
-        
-        loading.value = true
-        
-        // 模拟登录API请求
-        await new Promise(resolve => setTimeout(resolve, 1000))
-        
-        // 简单的登录验证(实际项目中应该调用后端API)
-        if (loginForm.username === 'admin' && loginForm.password === '123456') {
-          // 登录成功
-          localStorage.setItem('isLoggedIn', 'true')
-          localStorage.setItem('username', loginForm.username)
-          localStorage.setItem('loginTime', new Date().toISOString())
-          
-          if (rememberMe.value) {
-            localStorage.setItem('rememberLogin', 'true')
-          }
-          
-          ElMessage.success('登录成功!欢迎回来')
-          router.push('/home')
-        } else {
-          ElMessage.error('用户名或密码错误,请重试')
-        }
-        
-      } catch (error) {
-        console.error('登录失败:', error)
-        ElMessage.error('登录失败,请稍后重试')
-      } finally {
-        loading.value = false
-      }
-    }
-    
-    return {
-      loginFormRef,
-      loginForm,
-      loginRules,
-      loading,
-      rememberMe,
-      handleLogin,
-      User,
-      Lock
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.login-page {
-  min-height: 100vh;
-  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-  position: relative;
-  overflow: hidden;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  padding: 20px;
-}
-
-// 背景装饰
-.bg-decoration {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  z-index: 1;
-  
-  .shape {
-    position: absolute;
-    border-radius: 50%;
-    background: rgba(255, 255, 255, 0.1);
-    animation: float 6s ease-in-out infinite;
-    
-    &.shape-1 {
-      width: 200px;
-      height: 200px;
-      top: 10%;
-      left: 10%;
-      animation-delay: 0s;
-    }
-    
-    &.shape-2 {
-      width: 150px;
-      height: 150px;
-      top: 60%;
-      right: 10%;
-      animation-delay: -2s;
-    }
-    
-    &.shape-3 {
-      width: 100px;
-      height: 100px;
-      bottom: 20%;
-      left: 20%;
-      animation-delay: -4s;
-    }
-  }
-}
-
-@keyframes float {
-  0%, 100% {
-    transform: translateY(0px) rotate(0deg);
-  }
-  50% {
-    transform: translateY(-20px) rotate(180deg);
-  }
-}
-
-// 登录容器
-.login-container {
-  position: relative;
-  z-index: 10;
-  width: 100%;
-  max-width: 420px;
-}
-
-.login-card {
-  background: rgba(255, 255, 255, 0.95);
-  backdrop-filter: blur(10px);
-  border-radius: 16px;
-  padding: 40px;
-  box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
-  border: 1px solid rgba(255, 255, 255, 0.2);
-  
-  .login-header {
-    text-align: center;
-    margin-bottom: 32px;
-    
-    .logo {
-      margin-bottom: 16px;
-    }
-    
-    .title {
-      font-size: 32px;
-      font-weight: 700;
-      color: #2c3e50;
-      margin-bottom: 8px;
-      letter-spacing: -0.5px;
-    }
-    
-    .subtitle {
-      font-size: 15px;
-      color: #7f8c8d;
-      margin: 0;
-      font-weight: 400;
-    }
-  }
-  
-  .login-form {
-    .el-form-item {
-      margin-bottom: 24px;
-      
-      &:last-child {
-        margin-bottom: 0;
-      }
-    }
-    
-    .login-options {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      width: 100%;
-      
-      .el-checkbox {
-        :deep(.el-checkbox__label) {
-          font-size: 14px;
-          color: #606266;
-        }
-      }
-      
-      .el-link {
-        font-size: 14px;
-      }
-    }
-    
-    .el-button {
-      font-size: 16px;
-      font-weight: 500;
-      height: 48px;
-      border-radius: 8px;
-    }
-  }
-  
-  .login-footer {
-    text-align: center;
-    margin-top: 24px;
-    padding-top: 24px;
-    border-top: 1px solid #ebeef5;
-    
-    .footer-text {
-      color: #909399;
-      font-size: 14px;
-      margin-right: 8px;
-    }
-    
-    .el-link {
-      font-size: 14px;
-      font-weight: 500;
-    }
-  }
-}
-
-// 响应式设计
-@media (max-width: 768px) {
-  .login-page {
-    padding: 16px;
-  }
-  
-  .login-card {
-    padding: 32px 24px;
-    
-    .login-header .title {
-      font-size: 28px;
-    }
-  }
-}
-</style>
+<template>

+  <div class="login-page">

+    <!-- 背景装饰 -->

+    <div class="bg-decoration">

+      <div class="shape shape-1"></div>

+      <div class="shape shape-2"></div>

+      <div class="shape shape-3"></div>

+    </div>

+    

+    <!-- 登录表单容器 -->

+    <div class="login-container">

+      <div class="login-card">

+        <!-- 头部信息 -->

+        <div class="login-header">

+          <div class="logo">

+            <el-icon size="48" color="#667eea"><Operation /></el-icon>

+          </div>

+          <h1 class="title">PT Tracker</h1>

+          <p class="subtitle">私有种子分享社区</p>

+        </div>

+        

+        <!-- 登录表单 -->

+        <el-form

+          ref="loginFormRef"

+          :model="loginForm"

+          :rules="loginRules"

+          class="login-form"

+          size="large"

+        >

+          <el-form-item prop="user">

+            <el-input

+              v-model="loginForm.user"

+              placeholder="请输入用户名或邮箱"

+              clearable

+              :prefix-icon="User"

+              @keyup.enter="handleLogin"

+            />

+          </el-form-item>

+          

+          <el-form-item prop="password">

+            <el-input

+              v-model="loginForm.password"

+              type="password"

+              placeholder="请输入密码"

+              show-password

+              :prefix-icon="Lock"

+              @keyup.enter="handleLogin"

+            />

+          </el-form-item>

+          

+          <el-form-item>

+            <div class="login-options">

+              <el-checkbox v-model="rememberMe">记住登录</el-checkbox>

+              <el-link type="primary" :underline="false">忘记密码?</el-link>

+            </div>

+          </el-form-item>

+          

+          <el-form-item>

+            <el-button

+              type="primary"

+              :loading="loginLoading"

+              style="width: 100%"

+              @click="handleLogin"

+            >

+              <span v-if="!loginLoading">登录</span>

+              <span v-else>登录中...</span>

+            </el-button>

+          </el-form-item>

+        </el-form>

+        

+        <!-- 底部链接 -->

+        <div class="login-footer">

+          <span class="footer-text">还没有账号?</span>

+          <el-link 

+            type="primary" 

+            :underline="false"

+            @click="$router.push('/register')"

+          >

+            立即注册

+          </el-link>

+        </div>

+      </div>

+    </div>

+  </div>

+</template>

+

+<script>

+import { ref, reactive, computed } from 'vue'

+import { useRouter } from 'vue-router'

+import { useStore } from 'vuex'

+import { ElMessage } from 'element-plus'

+import { User, Lock, Operation } from '@element-plus/icons-vue'

+

+export default {

+  name: 'LoginView',

+  components: {

+    Operation

+  },

+  setup() {

+    const router = useRouter()

+    const store = useStore()

+    const loginFormRef = ref()

+    const rememberMe = ref(false)

+    

+    // 安全地从store获取登录加载状态,添加防护检查

+    const loginLoading = computed(() => {

+      try {

+        return store?.getters?.['auth/loginLoading'] || false

+      } catch (error) {

+        console.warn('获取 loginLoading 状态失败:', error)

+        return false

+      }

+    })

+    

+    // 表单数据

+    const loginForm = reactive({

+      user: '',

+      password: ''

+    })

+    

+    // 验证规则

+    const loginRules = {

+      user: [

+        { required: true, message: '请输入用户名或邮箱', trigger: 'blur' },

+        { min: 3, message: '用户名至少3个字符', trigger: 'blur' }

+      ],

+      password: [

+        { required: true, message: '请输入密码', trigger: 'blur' },

+        { min: 6, message: '密码至少6个字符', trigger: 'blur' }

+      ]

+    }

+    

+    // 登录处理

+    const handleLogin = async () => {

+      try {

+        // 表单验证

+        if (!loginFormRef.value) {

+          ElMessage.error('表单未准备就绪')

+          return

+        }

+        

+        const valid = await loginFormRef.value.validate()

+        if (!valid) return

+        

+        // 检查 store 是否可用

+        if (!store) {

+          ElMessage.error('系统初始化失败,请刷新页面重试')

+          return

+        }

+        

+        // 调用store的登录action

+        await store.dispatch('auth/login', {

+          user: loginForm.user,

+          password: loginForm.password

+        })

+        

+        // 如果选择记住登录,设置localStorage标记

+        if (rememberMe.value) {

+          localStorage.setItem('rememberLogin', 'true')

+        }

+        

+        // 登录成功,跳转到首页

+        router.push('/home')

+        

+      } catch (error) {

+        console.error('登录失败:', error)

+        ElMessage.error(error.message || '登录失败,请重试')

+      }

+    }

+    

+    return {

+      loginFormRef,

+      loginForm,

+      loginRules,

+      loginLoading,

+      rememberMe,

+      handleLogin,

+      User,

+      Lock

+    }

+  }

+}

+</script>
\ No newline at end of file
diff --git a/src/views/auth/ProfileView.vue b/src/views/auth/ProfileView.vue
index e1e2544..5d11acc 100644
--- a/src/views/auth/ProfileView.vue
+++ b/src/views/auth/ProfileView.vue
@@ -1,1343 +1,1343 @@
-<template>
-  <div class="profile-page">
-    <div class="page-container">
-      <!-- 个人信息卡片 -->
-      <div class="profile-header">
-        <div class="user-avatar-section">
-          <div class="avatar-container">
-            <el-avatar :size="120" :src="userProfile.avatar">
-              {{ userProfile.username.charAt(0).toUpperCase() }}
-            </el-avatar>
-            <el-button 
-              type="primary" 
-              size="small" 
-              class="change-avatar-btn"
-              @click="showAvatarDialog = true"
-            >
-              更换头像
-            </el-button>
-          </div>
-          
-          <div class="user-basic-info">
-            <h1 class="username">{{ userProfile.username }}</h1>
-            <div class="user-title">
-              <el-tag :type="getUserTitleType(userProfile.userLevel)" size="large">
-                {{ userProfile.userTitle }}
-              </el-tag>
-            </div>
-            <div class="join-info">
-              <el-icon><Calendar /></el-icon>
-              <span>加入时间:{{ formatDate(userProfile.joinDate) }}</span>
-            </div>
-            <div class="last-login">
-              <el-icon><Clock /></el-icon>
-              <span>最后登录:{{ formatTime(userProfile.lastLogin) }}</span>
-            </div>
-          </div>
-        </div>
-        
-        <div class="user-stats-overview">
-          <div class="stats-grid">
-            <div class="stat-card">
-              <div class="stat-icon upload">
-                <el-icon size="32"><Upload /></el-icon>
-              </div>
-              <div class="stat-info">
-                <h3>{{ userProfile.stats.uploaded }}</h3>
-                <p>上传量</p>
-              </div>
-            </div>
-            
-            <div class="stat-card">
-              <div class="stat-icon download">
-                <el-icon size="32"><Download /></el-icon>
-              </div>
-              <div class="stat-info">
-                <h3>{{ userProfile.stats.downloaded }}</h3>
-                <p>下载量</p>
-              </div>
-            </div>
-            
-            <div class="stat-card">
-              <div class="stat-icon ratio" :class="getRatioClass(userProfile.stats.ratio)">
-                <el-icon size="32"><TrendCharts /></el-icon>
-              </div>
-              <div class="stat-info">
-                <h3>{{ userProfile.stats.ratio }}</h3>
-                <p>分享率</p>
-              </div>
-            </div>
-            
-            <div class="stat-card">
-              <div class="stat-icon points">
-                <el-icon size="32"><Star /></el-icon>
-              </div>
-              <div class="stat-info">
-                <h3>{{ userProfile.stats.points }}</h3>
-                <p>积分</p>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <!-- 详细信息选项卡 -->
-      <div class="profile-content">
-        <el-tabs v-model="activeTab" type="border-card">
-          <!-- 个人信息 -->
-          <el-tab-pane label="个人信息" name="info">
-            <div class="info-section">
-              <el-form
-                ref="profileFormRef"
-                :model="editProfile"
-                :rules="profileRules"
-                label-width="120px"
-                size="large"
-              >
-                <div class="form-section">
-                  <h3>基本信息</h3>
-                  <el-form-item label="用户名">
-                    <el-input v-model="editProfile.username" disabled>
-                      <template #suffix>
-                        <el-tooltip content="用户名不可修改">
-                          <el-icon><QuestionFilled /></el-icon>
-                        </el-tooltip>
-                      </template>
-                    </el-input>
-                  </el-form-item>
-                  
-                  <el-form-item label="邮箱地址" prop="email">
-                    <el-input v-model="editProfile.email" type="email" />
-                  </el-form-item>
-                  
-                  <el-form-item label="真实姓名" prop="realName">
-                    <el-input v-model="editProfile.realName" placeholder="可选填写" />
-                  </el-form-item>
-                  
-                  <el-form-item label="所在地区">
-                    <el-cascader
-                      v-model="editProfile.location"
-                      :options="locationOptions"
-                      placeholder="请选择地区"
-                      clearable
-                    />
-                  </el-form-item>
-                </div>
-                
-                <div class="form-section">
-                  <h3>个人介绍</h3>
-                  <el-form-item label="个人签名">
-                    <el-input
-                      v-model="editProfile.signature"
-                      type="textarea"
-                      :rows="3"
-                      maxlength="200"
-                      show-word-limit
-                      placeholder="介绍一下自己吧..."
-                    />
-                  </el-form-item>
-                  
-                  <el-form-item label="个人网站">
-                    <el-input v-model="editProfile.website" placeholder="https://" />
-                  </el-form-item>
-                  
-                  <el-form-item label="兴趣爱好">
-                    <div class="interests-input">
-                      <el-tag
-                        v-for="interest in editProfile.interests"
-                        :key="interest"
-                        closable
-                        @close="removeInterest(interest)"
-                        class="interest-tag"
-                      >
-                        {{ interest }}
-                      </el-tag>
-                      <el-input
-                        v-if="interestInputVisible"
-                        ref="interestInputRef"
-                        v-model="interestInputValue"
-                        size="small"
-                        @keyup.enter="addInterest"
-                        @blur="addInterest"
-                        style="width: 120px;"
-                      />
-                      <el-button
-                        v-else
-                        size="small"
-                        @click="showInterestInput"
-                      >
-                        + 添加兴趣
-                      </el-button>
-                    </div>
-                  </el-form-item>
-                </div>
-                
-                <div class="form-section">
-                  <h3>隐私设置</h3>
-                  <el-form-item label="邮箱公开">
-                    <el-switch v-model="editProfile.emailPublic" />
-                    <span class="setting-tip">是否在个人资料中显示邮箱</span>
-                  </el-form-item>
-                  
-                  <el-form-item label="统计公开">
-                    <el-switch v-model="editProfile.statsPublic" />
-                    <span class="setting-tip">是否公开上传下载统计</span>
-                  </el-form-item>
-                  
-                  <el-form-item label="活动记录">
-                    <el-switch v-model="editProfile.activityPublic" />
-                    <span class="setting-tip">是否公开活动记录</span>
-                  </el-form-item>
-                </div>
-                
-                <div class="form-actions">
-                  <el-button @click="resetProfile">重置</el-button>
-                  <el-button type="primary" @click="saveProfile" :loading="saving">
-                    保存修改
-                  </el-button>
-                </div>
-              </el-form>
-            </div>
-          </el-tab-pane>
-          
-          <!-- 数据统计 -->
-          <el-tab-pane label="数据统计" name="stats">
-            <div class="stats-section">
-              <div class="stats-overview">
-                <div class="overview-grid">
-                  <div class="overview-card">
-                    <h3>上传统计</h3>
-                    <div class="stat-details">
-                      <div class="detail-item">
-                        <span class="label">总上传量:</span>
-                        <span class="value">{{ userProfile.detailedStats.totalUploaded }}</span>
-                      </div>
-                      <div class="detail-item">
-                        <span class="label">上传种子:</span>
-                        <span class="value">{{ userProfile.detailedStats.uploadedTorrents }} 个</span>
-                      </div>
-                      <div class="detail-item">
-                        <span class="label">平均大小:</span>
-                        <span class="value">{{ userProfile.detailedStats.avgUploadSize }}</span>
-                      </div>
-                    </div>
-                  </div>
-                  
-                  <div class="overview-card">
-                    <h3>下载统计</h3>
-                    <div class="stat-details">
-                      <div class="detail-item">
-                        <span class="label">总下载量:</span>
-                        <span class="value">{{ userProfile.detailedStats.totalDownloaded }}</span>
-                      </div>
-                      <div class="detail-item">
-                        <span class="label">下载种子:</span>
-                        <span class="value">{{ userProfile.detailedStats.downloadedTorrents }} 个</span>
-                      </div>
-                      <div class="detail-item">
-                        <span class="label">完成种子:</span>
-                        <span class="value">{{ userProfile.detailedStats.completedTorrents }} 个</span>
-                      </div>
-                    </div>
-                  </div>
-                  
-                  <div class="overview-card">
-                    <h3>做种统计</h3>
-                    <div class="stat-details">
-                      <div class="detail-item">
-                        <span class="label">正在做种:</span>
-                        <span class="value">{{ userProfile.detailedStats.seeding }} 个</span>
-                      </div>
-                      <div class="detail-item">
-                        <span class="label">做种时间:</span>
-                        <span class="value">{{ userProfile.detailedStats.seedingTime }}</span>
-                      </div>
-                      <div class="detail-item">
-                        <span class="label">做种排名:</span>
-                        <span class="value">第 {{ userProfile.detailedStats.seedingRank }} 名</span>
-                      </div>
-                    </div>
-                  </div>
-                  
-                  <div class="overview-card">
-                    <h3>积分记录</h3>
-                    <div class="stat-details">
-                      <div class="detail-item">
-                        <span class="label">当前积分:</span>
-                        <span class="value">{{ userProfile.stats.points }}</span>
-                      </div>
-                      <div class="detail-item">
-                        <span class="label">累计获得:</span>
-                        <span class="value">{{ userProfile.detailedStats.totalEarnedPoints }}</span>
-                      </div>
-                      <div class="detail-item">
-                        <span class="label">累计消费:</span>
-                        <span class="value">{{ userProfile.detailedStats.totalSpentPoints }}</span>
-                      </div>
-                    </div>
-                  </div>
-                </div>
-              </div>
-              
-              <!-- 数据图表 -->
-              <div class="charts-section">
-                <div class="chart-card">
-                  <h3>上传下载趋势</h3>
-                  <div class="chart-placeholder">
-                    <el-icon size="48" color="#e4e7ed"><TrendCharts /></el-icon>
-                    <p>图表功能开发中...</p>
-                  </div>
-                </div>
-              </div>
-            </div>
-          </el-tab-pane>
-          
-          <!-- 我的种子 -->
-          <el-tab-pane label="我的种子" name="torrents">
-            <div class="torrents-section">
-              <div class="section-header">
-                <h3>我上传的种子</h3>
-                <el-button type="primary" :icon="Upload" @click="$router.push('/upload')">
-                  上传新种子
-                </el-button>
-              </div>
-              
-              <el-table :data="userTorrents" stripe>
-                <el-table-column label="种子名称" min-width="300">
-                  <template #default="{ row }">
-                    <div class="torrent-info">
-                      <el-tag :type="getCategoryType(row.category)" size="small">
-                        {{ getCategoryName(row.category) }}
-                      </el-tag>
-                      <span class="torrent-title">{{ row.title }}</span>
-                    </div>
-                  </template>
-                </el-table-column>
-                
-                <el-table-column label="大小" prop="size" width="100" />
-                <el-table-column label="做种" prop="seeders" width="80" align="center" />
-                <el-table-column label="下载" prop="leechers" width="80" align="center" />
-                <el-table-column label="完成" prop="downloads" width="80" align="center" />
-                <el-table-column label="上传时间" width="120">
-                  <template #default="{ row }">
-                    {{ formatDate(row.uploadTime) }}
-                  </template>
-                </el-table-column>
-                
-                <el-table-column label="操作" width="120" align="center">
-                  <template #default="{ row }">
-                    <el-button 
-                      type="primary" 
-                      size="small" 
-                      @click="$router.push(`/torrent/${row.id}`)"
-                    >
-                      查看
-                    </el-button>
-                  </template>
-                </el-table-column>
-              </el-table>
-              
-              <div class="pagination-wrapper">
-                <el-pagination
-                  v-model:current-page="torrentsPage"
-                  :page-size="10"
-                  :total="userTorrents.length"
-                  layout="prev, pager, next"
-                  small
-                />
-              </div>
-            </div>
-          </el-tab-pane>
-          
-          <!-- 活动记录 -->
-          <el-tab-pane label="活动记录" name="activity">
-            <div class="activity-section">
-              <div class="activity-filters">
-                <el-select v-model="activityFilter" placeholder="活动类型">
-                  <el-option label="全部活动" value="" />
-                  <el-option label="上传种子" value="upload" />
-                  <el-option label="下载种子" value="download" />
-                  <el-option label="论坛发帖" value="post" />
-                  <el-option label="积分变动" value="points" />
-                </el-select>
-              </div>
-              
-              <div class="activity-timeline">
-                <el-timeline>
-                  <el-timeline-item
-                    v-for="activity in filteredActivities"
-                    :key="activity.id"
-                    :timestamp="formatTime(activity.time)"
-                    :type="getActivityType(activity.type)"
-                  >
-                    <div class="activity-content">
-                      <div class="activity-header">
-                        <el-icon>
-                          <component :is="getActivityIcon(activity.type)" />
-                        </el-icon>
-                        <span class="activity-title">{{ activity.title }}</span>
-                      </div>
-                      <div class="activity-description">{{ activity.description }}</div>
-                    </div>
-                  </el-timeline-item>
-                </el-timeline>
-              </div>
-            </div>
-          </el-tab-pane>
-          
-          <!-- 安全设置 -->
-          <el-tab-pane label="安全设置" name="security">
-            <div class="security-section">
-              <div class="security-card">
-                <h3>修改密码</h3>
-                <el-form
-                  ref="passwordFormRef"
-                  :model="passwordForm"
-                  :rules="passwordRules"
-                  label-width="120px"
-                >
-                  <el-form-item label="当前密码" prop="currentPassword">
-                    <el-input
-                      v-model="passwordForm.currentPassword"
-                      type="password"
-                      show-password
-                      placeholder="请输入当前密码"
-                    />
-                  </el-form-item>
-                  
-                  <el-form-item label="新密码" prop="newPassword">
-                    <el-input
-                      v-model="passwordForm.newPassword"
-                      type="password"
-                      show-password
-                      placeholder="请输入新密码"
-                    />
-                  </el-form-item>
-                  
-                  <el-form-item label="确认密码" prop="confirmPassword">
-                    <el-input
-                      v-model="passwordForm.confirmPassword"
-                      type="password"
-                      show-password
-                      placeholder="请再次输入新密码"
-                    />
-                  </el-form-item>
-                  
-                  <el-form-item>
-                    <el-button type="primary" @click="changePassword" :loading="changingPassword">
-                      修改密码
-                    </el-button>
-                  </el-form-item>
-                </el-form>
-              </div>
-              
-              <div class="security-card">
-                <h3>登录记录</h3>
-                <el-table :data="loginHistory" stripe>
-                  <el-table-column label="登录时间" width="180">
-                    <template #default="{ row }">
-                      {{ formatDateTime(row.time) }}
-                    </template>
-                  </el-table-column>
-                  <el-table-column label="IP地址" prop="ip" width="150" />
-                  <el-table-column label="设备信息" prop="device" />
-                  <el-table-column label="登录结果" width="100">
-                    <template #default="{ row }">
-                      <el-tag :type="row.success ? 'success' : 'danger'" size="small">
-                        {{ row.success ? '成功' : '失败' }}
-                      </el-tag>
-                    </template>
-                  </el-table-column>
-                </el-table>
-              </div>
-            </div>
-          </el-tab-pane>
-        </el-tabs>
-      </div>
-    </div>
-
-    <!-- 更换头像对话框 -->
-    <el-dialog v-model="showAvatarDialog" title="更换头像" width="400px">
-      <div class="avatar-upload">
-        <el-upload
-          ref="avatarUploadRef"
-          :auto-upload="false"
-          :limit="1"
-          accept="image/*"
-          :on-change="handleAvatarChange"
-          list-type="picture-card"
-          class="avatar-uploader"
-        >
-          <el-icon><Plus /></el-icon>
-        </el-upload>
-        <div class="upload-tips">
-          <p>支持 JPG、PNG 格式</p>
-          <p>建议尺寸 200x200 像素</p>
-          <p>文件大小不超过 2MB</p>
-        </div>
-      </div>
-      
-      <template #footer>
-        <el-button @click="showAvatarDialog = false">取消</el-button>
-        <el-button type="primary" @click="uploadAvatar" :loading="uploadingAvatar">
-          上传头像
-        </el-button>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import { ref, reactive, computed, onMounted, nextTick } from 'vue'
-import { useRouter } from 'vue-router'
-import { ElMessage } from 'element-plus'
-import {
-  Calendar,
-  Clock,
-  Upload,
-  Download,
-  TrendCharts,
-  Star,
-  QuestionFilled,
-  Plus,
-  ChatDotRound,
-  Flag,
-  Coin
-} from '@element-plus/icons-vue'
-
-export default {
-  name: 'ProfileView',
-  setup() {
-    const router = useRouter()
-    const profileFormRef = ref(null)
-    const passwordFormRef = ref(null)
-    const avatarUploadRef = ref(null)
-    const interestInputRef = ref(null)
-    
-    const activeTab = ref('info')
-    const showAvatarDialog = ref(false)
-    const saving = ref(false)
-    const changingPassword = ref(false)
-    const uploadingAvatar = ref(false)
-    const interestInputVisible = ref(false)
-    const interestInputValue = ref('')
-    const activityFilter = ref('')
-    const torrentsPage = ref(1)
-    
-    const userProfile = ref({
-      username: 'MovieExpert',
-      email: 'movieexpert@example.com',
-      realName: '',
-      avatar: '',
-      userLevel: 5,
-      userTitle: '资深会员',
-      joinDate: '2023-01-15T10:00:00',
-      lastLogin: '2025-06-03T14:30:00',
-      location: ['北京市', '朝阳区'],
-      signature: '热爱电影,分享快乐!',
-      website: 'https://movieblog.com',
-      interests: ['电影', '音乐', '科技', '摄影'],
-      emailPublic: false,
-      statsPublic: true,
-      activityPublic: true,
-      stats: {
-        uploaded: '256.8 GB',
-        downloaded: '89.6 GB',
-        ratio: '2.87',
-        points: '15,680'
-      },
-      detailedStats: {
-        totalUploaded: '256.8 GB',
-        uploadedTorrents: 45,
-        avgUploadSize: '5.7 GB',
-        totalDownloaded: '89.6 GB',
-        downloadedTorrents: 123,
-        completedTorrents: 118,
-        seeding: 32,
-        seedingTime: '1,245 小时',
-        seedingRank: 86,
-        totalEarnedPoints: '28,940',
-        totalSpentPoints: '13,260'
-      }
-    })
-    
-    const editProfile = reactive({
-      username: '',
-      email: '',
-      realName: '',
-      location: [],
-      signature: '',
-      website: '',
-      interests: [],
-      emailPublic: false,
-      statsPublic: true,
-      activityPublic: true
-    })
-    
-    const passwordForm = reactive({
-      currentPassword: '',
-      newPassword: '',
-      confirmPassword: ''
-    })
-    
-    const profileRules = {
-      email: [
-        { required: true, message: '请输入邮箱地址', trigger: 'blur' },
-        { type: 'email', message: '请输入正确的邮箱格式', trigger: 'blur' }
-      ]
-    }
-    
-    const passwordRules = {
-      currentPassword: [
-        { required: true, message: '请输入当前密码', trigger: 'blur' }
-      ],
-      newPassword: [
-        { required: true, message: '请输入新密码', trigger: 'blur' },
-        { min: 6, message: '密码长度至少6个字符', trigger: 'blur' }
-      ],
-      confirmPassword: [
-        { required: true, message: '请确认新密码', trigger: 'blur' },
-        {
-          validator: (rule, value, callback) => {
-            if (value !== passwordForm.newPassword) {
-              callback(new Error('两次输入的密码不一致'))
-            } else {
-              callback()
-            }
-          },
-          trigger: 'blur'
-        }
-      ]
-    }
-    
-    const locationOptions = [
-      {
-        value: '北京市',
-        label: '北京市',
-        children: [
-          { value: '朝阳区', label: '朝阳区' },
-          { value: '海淀区', label: '海淀区' },
-          { value: '丰台区', label: '丰台区' }
-        ]
-      },
-      {
-        value: '上海市',
-        label: '上海市',
-        children: [
-          { value: '浦东新区', label: '浦东新区' },
-          { value: '黄浦区', label: '黄浦区' },
-          { value: '静安区', label: '静安区' }
-        ]
-      }
-    ]
-    
-    const userTorrents = ref([
-      {
-        id: 1,
-        title: '[4K蓝光原盘] 阿凡达:水之道',
-        category: 'movie',
-        size: '85.6 GB',
-        seeders: 45,
-        leechers: 12,
-        downloads: 234,
-        uploadTime: '2025-05-15T10:00:00'
-      },
-      {
-        id: 2,
-        title: '[FLAC] 古典音乐合集',
-        category: 'music',
-        size: '2.3 GB',
-        seeders: 23,
-        leechers: 5,
-        downloads: 89,
-        uploadTime: '2025-04-20T15:30:00'
-      }
-    ])
-    
-    const activities = ref([
-      {
-        id: 1,
-        type: 'upload',
-        title: '上传种子',
-        description: '上传了《阿凡达:水之道》4K蓝光原盘',
-        time: '2025-06-03T10:30:00'
-      },
-      {
-        id: 2,
-        type: 'download',
-        title: '下载种子',
-        description: '下载了《星际穿越》IMAX版本',
-        time: '2025-06-02T14:20:00'
-      },
-      {
-        id: 3,
-        type: 'post',
-        title: '发布主题',
-        description: '在电影讨论区发布了新主题',
-        time: '2025-06-01T16:45:00'
-      },
-      {
-        id: 4,
-        type: 'points',
-        title: '积分变动',
-        description: '做种奖励获得 +50 积分',
-        time: '2025-05-31T09:15:00'
-      }
-    ])
-    
-    const loginHistory = ref([
-      {
-        time: '2025-06-03T14:30:00',
-        ip: '192.168.1.100',
-        device: 'Windows 11 / Chrome 120',
-        success: true
-      },
-      {
-        time: '2025-06-02T09:15:00',
-        ip: '192.168.1.100',
-        device: 'Windows 11 / Chrome 120',
-        success: true
-      },
-      {
-        time: '2025-06-01T22:30:00',
-        ip: '192.168.1.100',
-        device: 'Android / Chrome Mobile',
-        success: true
-      }
-    ])
-    
-    const filteredActivities = computed(() => {
-      if (!activityFilter.value) return activities.value
-      return activities.value.filter(activity => activity.type === activityFilter.value)
-    })
-    
-    onMounted(() => {
-      loadUserProfile()
-    })
-    
-    const loadUserProfile = () => {
-      // 加载用户资料到编辑表单
-      Object.assign(editProfile, {
-        username: userProfile.value.username,
-        email: userProfile.value.email,
-        realName: userProfile.value.realName,
-        location: userProfile.value.location,
-        signature: userProfile.value.signature,
-        website: userProfile.value.website,
-        interests: [...userProfile.value.interests],
-        emailPublic: userProfile.value.emailPublic,
-        statsPublic: userProfile.value.statsPublic,
-        activityPublic: userProfile.value.activityPublic
-      })
-    }
-    
-    const formatDate = (dateString) => {
-      const date = new Date(dateString)
-      return date.toLocaleDateString('zh-CN')
-    }
-    
-    const formatTime = (timeString) => {
-      const date = new Date(timeString)
-      const now = new Date()
-      const diff = now - date
-      const hours = Math.floor(diff / (1000 * 60 * 60))
-      
-      if (hours < 1) return '刚刚'
-      if (hours < 24) return `${hours}小时前`
-      const days = Math.floor(hours / 24)
-      if (days < 7) return `${days}天前`
-      
-      return date.toLocaleDateString('zh-CN')
-    }
-    
-    const formatDateTime = (dateString) => {
-      const date = new Date(dateString)
-      return date.toLocaleString('zh-CN')
-    }
-    
-    const getUserTitleType = (level) => {
-      if (level >= 8) return 'danger'  // 管理员
-      if (level >= 6) return 'warning' // 资深会员
-      if (level >= 4) return 'success' // 正式会员
-      if (level >= 2) return 'info'    // 初级会员
-      return 'default' // 新手
-    }
-    
-    const getRatioClass = (ratio) => {
-      const r = parseFloat(ratio)
-      if (r >= 2) return 'excellent'
-      if (r >= 1) return 'good'
-      return 'warning'
-    }
-    
-    const getCategoryType = (category) => {
-      const types = {
-        'movie': 'primary',
-        'tv': 'info',
-        'music': 'success',
-        'software': 'warning',
-        'game': 'danger'
-      }
-      return types[category] || 'default'
-    }
-    
-    const getCategoryName = (category) => {
-      const names = {
-        'movie': '电影',
-        'tv': '电视剧',
-        'music': '音乐',
-        'software': '软件',
-        'game': '游戏'
-      }
-      return names[category] || category
-    }
-    
-    const getActivityType = (type) => {
-      const types = {
-        'upload': 'success',
-        'download': 'primary',
-        'post': 'warning',
-        'points': 'info'
-      }
-      return types[type] || 'primary'
-    }
-    
-    const getActivityIcon = (type) => {
-      const icons = {
-        'upload': 'Upload',
-        'download': 'Download',
-        'post': 'ChatDotRound',
-        'points': 'Coin'
-      }
-      return icons[type] || 'Star'
-    }
-    
-    const showInterestInput = () => {
-      interestInputVisible.value = true
-      nextTick(() => {
-        interestInputRef.value?.focus()
-      })
-    }
-    
-    const addInterest = () => {
-      const interest = interestInputValue.value.trim()
-      if (interest && !editProfile.interests.includes(interest)) {
-        editProfile.interests.push(interest)
-      }
-      interestInputVisible.value = false
-      interestInputValue.value = ''
-    }
-    
-    const removeInterest = (interest) => {
-      const index = editProfile.interests.indexOf(interest)
-      if (index > -1) {
-        editProfile.interests.splice(index, 1)
-      }
-    }
-    
-    const saveProfile = async () => {
-      try {
-        await profileFormRef.value?.validate()
-        
-        saving.value = true
-        
-        // 模拟保存过程
-        await new Promise(resolve => setTimeout(resolve, 1500))
-        
-        // 更新用户资料
-        Object.assign(userProfile.value, editProfile)
-        
-        ElMessage.success('个人资料保存成功')
-        
-      } catch (error) {
-        console.error('表单验证失败:', error)
-      } finally {
-        saving.value = false
-      }
-    }
-    
-    const resetProfile = () => {
-      loadUserProfile()
-      ElMessage.info('已重置为原始数据')
-    }
-    
-    const changePassword = async () => {
-      try {
-        await passwordFormRef.value?.validate()
-        
-        changingPassword.value = true
-        
-        // 模拟密码修改过程
-        await new Promise(resolve => setTimeout(resolve, 1500))
-        
-        // 重置表单
-        passwordFormRef.value?.resetFields()
-        Object.assign(passwordForm, {
-          currentPassword: '',
-          newPassword: '',
-          confirmPassword: ''
-        })
-        
-        ElMessage.success('密码修改成功')
-        
-      } catch (error) {
-        console.error('表单验证失败:', error)
-      } finally {
-        changingPassword.value = false
-      }
-    }
-    
-    const handleAvatarChange = (file) => {
-      const isImage = file.raw.type.startsWith('image/')
-      const isLt2M = file.raw.size / 1024 / 1024 < 2
-      
-      if (!isImage) {
-        ElMessage.error('只能上传图片文件!')
-        return false
-      }
-      if (!isLt2M) {
-        ElMessage.error('图片大小不能超过 2MB!')
-        return false
-      }
-      
-      return true
-    }
-    
-    const uploadAvatar = async () => {
-      const files = avatarUploadRef.value?.uploadFiles
-      if (!files || files.length === 0) {
-        ElMessage.warning('请选择头像文件')
-        return
-      }
-      
-      uploadingAvatar.value = true
-      try {
-        // 模拟上传过程
-        await new Promise(resolve => setTimeout(resolve, 2000))
-        
-        // 更新头像URL
-        userProfile.value.avatar = URL.createObjectURL(files[0].raw)
-        
-        ElMessage.success('头像上传成功')
-        showAvatarDialog.value = false
-        avatarUploadRef.value?.clearFiles()
-        
-      } catch (error) {
-        ElMessage.error('头像上传失败')
-      } finally {
-        uploadingAvatar.value = false
-      }
-    }
-    
-    return {
-      activeTab,
-      showAvatarDialog,
-      saving,
-      changingPassword,
-      uploadingAvatar,
-      interestInputVisible,
-      interestInputValue,
-      activityFilter,
-      torrentsPage,
-      userProfile,
-      editProfile,
-      passwordForm,
-      profileRules,
-      passwordRules,
-      locationOptions,
-      userTorrents,
-      filteredActivities,
-      loginHistory,
-      profileFormRef,
-      passwordFormRef,
-      avatarUploadRef,
-      interestInputRef,
-      formatDate,
-      formatTime,
-      formatDateTime,
-      getUserTitleType,
-      getRatioClass,
-      getCategoryType,
-      getCategoryName,
-      getActivityType,
-      getActivityIcon,
-      showInterestInput,
-      addInterest,
-      removeInterest,
-      saveProfile,
-      resetProfile,
-      changePassword,
-      handleAvatarChange,
-      uploadAvatar,
-      Calendar,
-      Clock,
-      Upload,
-      Download,
-      TrendCharts,
-      Star,
-      QuestionFilled,
-      Plus,
-      ChatDotRound,
-      Flag,
-      Coin
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.profile-page {
-  max-width: 1200px;
-  margin: 0 auto;
-  padding: 24px;
-  background: #f5f5f5;
-  min-height: 100vh;
-}
-
-.profile-header {
-  background: #fff;
-  border-radius: 12px;
-  padding: 32px;
-  margin-bottom: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  display: grid;
-  grid-template-columns: 1fr 1fr;
-  gap: 32px;
-  
-  .user-avatar-section {
-    display: flex;
-    gap: 24px;
-    
-    .avatar-container {
-      text-align: center;
-      
-      .change-avatar-btn {
-        margin-top: 12px;
-      }
-    }
-    
-    .user-basic-info {
-      flex: 1;
-      
-      .username {
-        font-size: 28px;
-        font-weight: 600;
-        color: #2c3e50;
-        margin: 0 0 12px 0;
-      }
-      
-      .user-title {
-        margin-bottom: 16px;
-      }
-      
-      .join-info, .last-login {
-        display: flex;
-        align-items: center;
-        gap: 8px;
-        font-size: 14px;
-        color: #7f8c8d;
-        margin-bottom: 8px;
-      }
-    }
-  }
-  
-  .user-stats-overview {
-    .stats-grid {
-      display: grid;
-      grid-template-columns: repeat(2, 1fr);
-      gap: 16px;
-      
-      .stat-card {
-        background: #f8f9fa;
-        border-radius: 8px;
-        padding: 20px;
-        display: flex;
-        align-items: center;
-        gap: 16px;
-        
-        .stat-icon {
-          width: 48px;
-          height: 48px;
-          border-radius: 50%;
-          display: flex;
-          align-items: center;
-          justify-content: center;
-          
-          &.upload { background: rgba(103, 194, 58, 0.1); color: #67c23a; }
-          &.download { background: rgba(64, 158, 255, 0.1); color: #409eff; }
-          &.ratio {
-            &.excellent { background: rgba(103, 194, 58, 0.1); color: #67c23a; }
-            &.good { background: rgba(230, 162, 60, 0.1); color: #e6a23c; }
-            &.warning { background: rgba(245, 108, 108, 0.1); color: #f56c6c; }
-          }
-          &.points { background: rgba(245, 108, 108, 0.1); color: #f56c6c; }
-        }
-        
-        .stat-info {
-          h3 {
-            font-size: 20px;
-            font-weight: 600;
-            color: #2c3e50;
-            margin: 0 0 4px 0;
-          }
-          
-          p {
-            font-size: 14px;
-            color: #7f8c8d;
-            margin: 0;
-          }
-        }
-      }
-    }
-  }
-}
-
-.profile-content {
-  background: #fff;
-  border-radius: 12px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  :deep(.el-tabs__content) {
-    padding: 24px;
-  }
-}
-
-.info-section {
-  .form-section {
-    margin-bottom: 32px;
-    
-    h3 {
-      font-size: 18px;
-      font-weight: 600;
-      color: #2c3e50;
-      margin: 0 0 20px 0;
-      padding-bottom: 8px;
-      border-bottom: 2px solid #f0f0f0;
-    }
-  }
-  
-  .interests-input {
-    display: flex;
-    flex-wrap: wrap;
-    gap: 8px;
-    align-items: center;
-    
-    .interest-tag {
-      margin: 0;
-    }
-  }
-  
-  .setting-tip {
-    margin-left: 12px;
-    font-size: 12px;
-    color: #909399;
-  }
-  
-  .form-actions {
-    text-align: center;
-    margin-top: 32px;
-    
-    .el-button {
-      margin: 0 8px;
-      min-width: 100px;
-    }
-  }
-}
-
-.stats-section {
-  .stats-overview {
-    margin-bottom: 32px;
-    
-    .overview-grid {
-      display: grid;
-      grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
-      gap: 20px;
-      
-      .overview-card {
-        background: #f8f9fa;
-        border-radius: 8px;
-        padding: 24px;
-        
-        h3 {
-          font-size: 16px;
-          font-weight: 600;
-          color: #2c3e50;
-          margin: 0 0 16px 0;
-        }
-        
-        .stat-details {
-          .detail-item {
-            display: flex;
-            justify-content: space-between;
-            align-items: center;
-            margin-bottom: 12px;
-            
-            .label {
-              font-size: 14px;
-              color: #7f8c8d;
-            }
-            
-            .value {
-              font-size: 14px;
-              font-weight: 600;
-              color: #2c3e50;
-            }
-          }
-        }
-      }
-    }
-  }
-  
-  .charts-section {
-    .chart-card {
-      background: #f8f9fa;
-      border-radius: 8px;
-      padding: 24px;
-      
-      h3 {
-        font-size: 16px;
-        font-weight: 600;
-        color: #2c3e50;
-        margin: 0 0 20px 0;
-      }
-      
-      .chart-placeholder {
-        text-align: center;
-        padding: 60px 0;
-        color: #909399;
-        
-        p {
-          margin: 12px 0 0 0;
-        }
-      }
-    }
-  }
-}
-
-.torrents-section {
-  .section-header {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: 20px;
-    
-    h3 {
-      font-size: 18px;
-      font-weight: 600;
-      color: #2c3e50;
-      margin: 0;
-    }
-  }
-  
-  .torrent-info {
-    display: flex;
-    align-items: center;
-    gap: 12px;
-    
-    .torrent-title {
-      font-weight: 500;
-    }
-  }
-  
-  .pagination-wrapper {
-    margin-top: 16px;
-    text-align: center;
-  }
-}
-
-.activity-section {
-  .activity-filters {
-    margin-bottom: 24px;
-    
-    .el-select {
-      width: 150px;
-    }
-  }
-  
-  .activity-timeline {
-    .activity-content {
-      .activity-header {
-        display: flex;
-        align-items: center;
-        gap: 8px;
-        margin-bottom: 8px;
-        
-        .activity-title {
-          font-weight: 600;
-          color: #2c3e50;
-        }
-      }
-      
-      .activity-description {
-        font-size: 14px;
-        color: #7f8c8d;
-        line-height: 1.5;
-      }
-    }
-  }
-}
-
-.security-section {
-  .security-card {
-    background: #f8f9fa;
-    border-radius: 8px;
-    padding: 24px;
-    margin-bottom: 24px;
-    
-    h3 {
-      font-size: 18px;
-      font-weight: 600;
-      color: #2c3e50;
-      margin: 0 0 20px 0;
-    }
-  }
-}
-
-.avatar-upload {
-  text-align: center;
-  
-  .avatar-uploader {
-    margin-bottom: 16px;
-  }
-  
-  .upload-tips {
-    font-size: 12px;
-    color: #909399;
-    
-    p {
-      margin: 4px 0;
-    }
-  }
-}
-
-@media (max-width: 768px) {
-  .profile-page {
-    padding: 16px;
-  }
-  
-  .profile-header {
-    grid-template-columns: 1fr;
-    gap: 24px;
-    
-    .user-avatar-section {
-      flex-direction: column;
-      text-align: center;
-    }
-    
-    .user-stats-overview .stats-grid {
-      grid-template-columns: 1fr;
-    }
-  }
-  
-  .stats-overview .overview-grid {
-    grid-template-columns: 1fr;
-  }
-  
-  .torrents-section .section-header {
-    flex-direction: column;
-    gap: 16px;
-    align-items: flex-start;
-  }
-}
+<template>

+  <div class="profile-page">

+    <div class="page-container">

+      <!-- 个人信息卡片 -->

+      <div class="profile-header">

+        <div class="user-avatar-section">

+          <div class="avatar-container">

+            <el-avatar :size="120" :src="userProfile.avatar">

+              {{ userProfile.username.charAt(0).toUpperCase() }}

+            </el-avatar>

+            <el-button 

+              type="primary" 

+              size="small" 

+              class="change-avatar-btn"

+              @click="showAvatarDialog = true"

+            >

+              更换头像

+            </el-button>

+          </div>

+          

+          <div class="user-basic-info">

+            <h1 class="username">{{ userProfile.username }}</h1>

+            <div class="user-title">

+              <el-tag :type="getUserTitleType(userProfile.userLevel)" size="large">

+                {{ userProfile.userTitle }}

+              </el-tag>

+            </div>

+            <div class="join-info">

+              <el-icon><Calendar /></el-icon>

+              <span>加入时间:{{ formatDate(userProfile.joinDate) }}</span>

+            </div>

+            <div class="last-login">

+              <el-icon><Clock /></el-icon>

+              <span>最后登录:{{ formatTime(userProfile.lastLogin) }}</span>

+            </div>

+          </div>

+        </div>

+        

+        <div class="user-stats-overview">

+          <div class="stats-grid">

+            <div class="stat-card">

+              <div class="stat-icon upload">

+                <el-icon size="32"><Upload /></el-icon>

+              </div>

+              <div class="stat-info">

+                <h3>{{ userProfile.stats.uploaded }}</h3>

+                <p>上传量</p>

+              </div>

+            </div>

+            

+            <div class="stat-card">

+              <div class="stat-icon download">

+                <el-icon size="32"><Download /></el-icon>

+              </div>

+              <div class="stat-info">

+                <h3>{{ userProfile.stats.downloaded }}</h3>

+                <p>下载量</p>

+              </div>

+            </div>

+            

+            <div class="stat-card">

+              <div class="stat-icon ratio" :class="getRatioClass(userProfile.stats.ratio)">

+                <el-icon size="32"><TrendCharts /></el-icon>

+              </div>

+              <div class="stat-info">

+                <h3>{{ userProfile.stats.ratio }}</h3>

+                <p>分享率</p>

+              </div>

+            </div>

+            

+            <div class="stat-card">

+              <div class="stat-icon points">

+                <el-icon size="32"><Star /></el-icon>

+              </div>

+              <div class="stat-info">

+                <h3>{{ userProfile.stats.points }}</h3>

+                <p>积分</p>

+              </div>

+            </div>

+          </div>

+        </div>

+      </div>

+

+      <!-- 详细信息选项卡 -->

+      <div class="profile-content">

+        <el-tabs v-model="activeTab" type="border-card">

+          <!-- 个人信息 -->

+          <el-tab-pane label="个人信息" name="info">

+            <div class="info-section">

+              <el-form

+                ref="profileFormRef"

+                :model="editProfile"

+                :rules="profileRules"

+                label-width="120px"

+                size="large"

+              >

+                <div class="form-section">

+                  <h3>基本信息</h3>

+                  <el-form-item label="用户名">

+                    <el-input v-model="editProfile.username" disabled>

+                      <template #suffix>

+                        <el-tooltip content="用户名不可修改">

+                          <el-icon><QuestionFilled /></el-icon>

+                        </el-tooltip>

+                      </template>

+                    </el-input>

+                  </el-form-item>

+                  

+                  <el-form-item label="邮箱地址" prop="email">

+                    <el-input v-model="editProfile.email" type="email" />

+                  </el-form-item>

+                  

+                  <el-form-item label="真实姓名" prop="realName">

+                    <el-input v-model="editProfile.realName" placeholder="可选填写" />

+                  </el-form-item>

+                  

+                  <el-form-item label="所在地区">

+                    <el-cascader

+                      v-model="editProfile.location"

+                      :options="locationOptions"

+                      placeholder="请选择地区"

+                      clearable

+                    />

+                  </el-form-item>

+                </div>

+                

+                <div class="form-section">

+                  <h3>个人介绍</h3>

+                  <el-form-item label="个人签名">

+                    <el-input

+                      v-model="editProfile.signature"

+                      type="textarea"

+                      :rows="3"

+                      maxlength="200"

+                      show-word-limit

+                      placeholder="介绍一下自己吧..."

+                    />

+                  </el-form-item>

+                  

+                  <el-form-item label="个人网站">

+                    <el-input v-model="editProfile.website" placeholder="https://" />

+                  </el-form-item>

+                  

+                  <el-form-item label="兴趣爱好">

+                    <div class="interests-input">

+                      <el-tag

+                        v-for="interest in editProfile.interests"

+                        :key="interest"

+                        closable

+                        @close="removeInterest(interest)"

+                        class="interest-tag"

+                      >

+                        {{ interest }}

+                      </el-tag>

+                      <el-input

+                        v-if="interestInputVisible"

+                        ref="interestInputRef"

+                        v-model="interestInputValue"

+                        size="small"

+                        @keyup.enter="addInterest"

+                        @blur="addInterest"

+                        style="width: 120px;"

+                      />

+                      <el-button

+                        v-else

+                        size="small"

+                        @click="showInterestInput"

+                      >

+                        + 添加兴趣

+                      </el-button>

+                    </div>

+                  </el-form-item>

+                </div>

+                

+                <div class="form-section">

+                  <h3>隐私设置</h3>

+                  <el-form-item label="邮箱公开">

+                    <el-switch v-model="editProfile.emailPublic" />

+                    <span class="setting-tip">是否在个人资料中显示邮箱</span>

+                  </el-form-item>

+                  

+                  <el-form-item label="统计公开">

+                    <el-switch v-model="editProfile.statsPublic" />

+                    <span class="setting-tip">是否公开上传下载统计</span>

+                  </el-form-item>

+                  

+                  <el-form-item label="活动记录">

+                    <el-switch v-model="editProfile.activityPublic" />

+                    <span class="setting-tip">是否公开活动记录</span>

+                  </el-form-item>

+                </div>

+                

+                <div class="form-actions">

+                  <el-button @click="resetProfile">重置</el-button>

+                  <el-button type="primary" @click="saveProfile" :loading="saving">

+                    保存修改

+                  </el-button>

+                </div>

+              </el-form>

+            </div>

+          </el-tab-pane>

+          

+          <!-- 数据统计 -->

+          <el-tab-pane label="数据统计" name="stats">

+            <div class="stats-section">

+              <div class="stats-overview">

+                <div class="overview-grid">

+                  <div class="overview-card">

+                    <h3>上传统计</h3>

+                    <div class="stat-details">

+                      <div class="detail-item">

+                        <span class="label">总上传量:</span>

+                        <span class="value">{{ userProfile.detailedStats.totalUploaded }}</span>

+                      </div>

+                      <div class="detail-item">

+                        <span class="label">上传种子:</span>

+                        <span class="value">{{ userProfile.detailedStats.uploadedTorrents }} 个</span>

+                      </div>

+                      <div class="detail-item">

+                        <span class="label">平均大小:</span>

+                        <span class="value">{{ userProfile.detailedStats.avgUploadSize }}</span>

+                      </div>

+                    </div>

+                  </div>

+                  

+                  <div class="overview-card">

+                    <h3>下载统计</h3>

+                    <div class="stat-details">

+                      <div class="detail-item">

+                        <span class="label">总下载量:</span>

+                        <span class="value">{{ userProfile.detailedStats.totalDownloaded }}</span>

+                      </div>

+                      <div class="detail-item">

+                        <span class="label">下载种子:</span>

+                        <span class="value">{{ userProfile.detailedStats.downloadedTorrents }} 个</span>

+                      </div>

+                      <div class="detail-item">

+                        <span class="label">完成种子:</span>

+                        <span class="value">{{ userProfile.detailedStats.completedTorrents }} 个</span>

+                      </div>

+                    </div>

+                  </div>

+                  

+                  <div class="overview-card">

+                    <h3>做种统计</h3>

+                    <div class="stat-details">

+                      <div class="detail-item">

+                        <span class="label">正在做种:</span>

+                        <span class="value">{{ userProfile.detailedStats.seeding }} 个</span>

+                      </div>

+                      <div class="detail-item">

+                        <span class="label">做种时间:</span>

+                        <span class="value">{{ userProfile.detailedStats.seedingTime }}</span>

+                      </div>

+                      <div class="detail-item">

+                        <span class="label">做种排名:</span>

+                        <span class="value">第 {{ userProfile.detailedStats.seedingRank }} 名</span>

+                      </div>

+                    </div>

+                  </div>

+                  

+                  <div class="overview-card">

+                    <h3>积分记录</h3>

+                    <div class="stat-details">

+                      <div class="detail-item">

+                        <span class="label">当前积分:</span>

+                        <span class="value">{{ userProfile.stats.points }}</span>

+                      </div>

+                      <div class="detail-item">

+                        <span class="label">累计获得:</span>

+                        <span class="value">{{ userProfile.detailedStats.totalEarnedPoints }}</span>

+                      </div>

+                      <div class="detail-item">

+                        <span class="label">累计消费:</span>

+                        <span class="value">{{ userProfile.detailedStats.totalSpentPoints }}</span>

+                      </div>

+                    </div>

+                  </div>

+                </div>

+              </div>

+              

+              <!-- 数据图表 -->

+              <div class="charts-section">

+                <div class="chart-card">

+                  <h3>上传下载趋势</h3>

+                  <div class="chart-placeholder">

+                    <el-icon size="48" color="#e4e7ed"><TrendCharts /></el-icon>

+                    <p>图表功能开发中...</p>

+                  </div>

+                </div>

+              </div>

+            </div>

+          </el-tab-pane>

+          

+          <!-- 我的种子 -->

+          <el-tab-pane label="我的种子" name="torrents">

+            <div class="torrents-section">

+              <div class="section-header">

+                <h3>我上传的种子</h3>

+                <el-button type="primary" :icon="Upload" @click="$router.push('/upload')">

+                  上传新种子

+                </el-button>

+              </div>

+              

+              <el-table :data="userTorrents" stripe>

+                <el-table-column label="种子名称" min-width="300">

+                  <template #default="{ row }">

+                    <div class="torrent-info">

+                      <el-tag :type="getCategoryType(row.category)" size="small">

+                        {{ getCategoryName(row.category) }}

+                      </el-tag>

+                      <span class="torrent-title">{{ row.title }}</span>

+                    </div>

+                  </template>

+                </el-table-column>

+                

+                <el-table-column label="大小" prop="size" width="100" />

+                <el-table-column label="做种" prop="seeders" width="80" align="center" />

+                <el-table-column label="下载" prop="leechers" width="80" align="center" />

+                <el-table-column label="完成" prop="downloads" width="80" align="center" />

+                <el-table-column label="上传时间" width="120">

+                  <template #default="{ row }">

+                    {{ formatDate(row.uploadTime) }}

+                  </template>

+                </el-table-column>

+                

+                <el-table-column label="操作" width="120" align="center">

+                  <template #default="{ row }">

+                    <el-button 

+                      type="primary" 

+                      size="small" 

+                      @click="$router.push(`/torrent/${row.id}`)"

+                    >

+                      查看

+                    </el-button>

+                  </template>

+                </el-table-column>

+              </el-table>

+              

+              <div class="pagination-wrapper">

+                <el-pagination

+                  v-model:current-page="torrentsPage"

+                  :page-size="10"

+                  :total="userTorrents.length"

+                  layout="prev, pager, next"

+                  small

+                />

+              </div>

+            </div>

+          </el-tab-pane>

+          

+          <!-- 活动记录 -->

+          <el-tab-pane label="活动记录" name="activity">

+            <div class="activity-section">

+              <div class="activity-filters">

+                <el-select v-model="activityFilter" placeholder="活动类型">

+                  <el-option label="全部活动" value="" />

+                  <el-option label="上传种子" value="upload" />

+                  <el-option label="下载种子" value="download" />

+                  <el-option label="论坛发帖" value="post" />

+                  <el-option label="积分变动" value="points" />

+                </el-select>

+              </div>

+              

+              <div class="activity-timeline">

+                <el-timeline>

+                  <el-timeline-item

+                    v-for="activity in filteredActivities"

+                    :key="activity.id"

+                    :timestamp="formatTime(activity.time)"

+                    :type="getActivityType(activity.type)"

+                  >

+                    <div class="activity-content">

+                      <div class="activity-header">

+                        <el-icon>

+                          <component :is="getActivityIcon(activity.type)" />

+                        </el-icon>

+                        <span class="activity-title">{{ activity.title }}</span>

+                      </div>

+                      <div class="activity-description">{{ activity.description }}</div>

+                    </div>

+                  </el-timeline-item>

+                </el-timeline>

+              </div>

+            </div>

+          </el-tab-pane>

+          

+          <!-- 安全设置 -->

+          <el-tab-pane label="安全设置" name="security">

+            <div class="security-section">

+              <div class="security-card">

+                <h3>修改密码</h3>

+                <el-form

+                  ref="passwordFormRef"

+                  :model="passwordForm"

+                  :rules="passwordRules"

+                  label-width="120px"

+                >

+                  <el-form-item label="当前密码" prop="currentPassword">

+                    <el-input

+                      v-model="passwordForm.currentPassword"

+                      type="password"

+                      show-password

+                      placeholder="请输入当前密码"

+                    />

+                  </el-form-item>

+                  

+                  <el-form-item label="新密码" prop="newPassword">

+                    <el-input

+                      v-model="passwordForm.newPassword"

+                      type="password"

+                      show-password

+                      placeholder="请输入新密码"

+                    />

+                  </el-form-item>

+                  

+                  <el-form-item label="确认密码" prop="confirmPassword">

+                    <el-input

+                      v-model="passwordForm.confirmPassword"

+                      type="password"

+                      show-password

+                      placeholder="请再次输入新密码"

+                    />

+                  </el-form-item>

+                  

+                  <el-form-item>

+                    <el-button type="primary" @click="changePassword" :loading="changingPassword">

+                      修改密码

+                    </el-button>

+                  </el-form-item>

+                </el-form>

+              </div>

+              

+              <div class="security-card">

+                <h3>登录记录</h3>

+                <el-table :data="loginHistory" stripe>

+                  <el-table-column label="登录时间" width="180">

+                    <template #default="{ row }">

+                      {{ formatDateTime(row.time) }}

+                    </template>

+                  </el-table-column>

+                  <el-table-column label="IP地址" prop="ip" width="150" />

+                  <el-table-column label="设备信息" prop="device" />

+                  <el-table-column label="登录结果" width="100">

+                    <template #default="{ row }">

+                      <el-tag :type="row.success ? 'success' : 'danger'" size="small">

+                        {{ row.success ? '成功' : '失败' }}

+                      </el-tag>

+                    </template>

+                  </el-table-column>

+                </el-table>

+              </div>

+            </div>

+          </el-tab-pane>

+        </el-tabs>

+      </div>

+    </div>

+

+    <!-- 更换头像对话框 -->

+    <el-dialog v-model="showAvatarDialog" title="更换头像" width="400px">

+      <div class="avatar-upload">

+        <el-upload

+          ref="avatarUploadRef"

+          :auto-upload="false"

+          :limit="1"

+          accept="image/*"

+          :on-change="handleAvatarChange"

+          list-type="picture-card"

+          class="avatar-uploader"

+        >

+          <el-icon><Plus /></el-icon>

+        </el-upload>

+        <div class="upload-tips">

+          <p>支持 JPG、PNG 格式</p>

+          <p>建议尺寸 200x200 像素</p>

+          <p>文件大小不超过 2MB</p>

+        </div>

+      </div>

+      

+      <template #footer>

+        <el-button @click="showAvatarDialog = false">取消</el-button>

+        <el-button type="primary" @click="uploadAvatar" :loading="uploadingAvatar">

+          上传头像

+        </el-button>

+      </template>

+    </el-dialog>

+  </div>

+</template>

+

+<script>

+import { ref, reactive, computed, onMounted, nextTick } from 'vue'

+import { useRouter } from 'vue-router'

+import { ElMessage } from 'element-plus'

+import {

+  Calendar,

+  Clock,

+  Upload,

+  Download,

+  TrendCharts,

+  Star,

+  QuestionFilled,

+  Plus,

+  ChatDotRound,

+  Flag,

+  Coin

+} from '@element-plus/icons-vue'

+

+export default {

+  name: 'ProfileView',

+  setup() {

+    const router = useRouter()

+    const profileFormRef = ref(null)

+    const passwordFormRef = ref(null)

+    const avatarUploadRef = ref(null)

+    const interestInputRef = ref(null)

+    

+    const activeTab = ref('info')

+    const showAvatarDialog = ref(false)

+    const saving = ref(false)

+    const changingPassword = ref(false)

+    const uploadingAvatar = ref(false)

+    const interestInputVisible = ref(false)

+    const interestInputValue = ref('')

+    const activityFilter = ref('')

+    const torrentsPage = ref(1)

+    

+    const userProfile = ref({

+      username: 'MovieExpert',

+      email: 'movieexpert@example.com',

+      realName: '',

+      avatar: '',

+      userLevel: 5,

+      userTitle: '资深会员',

+      joinDate: '2023-01-15T10:00:00',

+      lastLogin: '2025-06-03T14:30:00',

+      location: ['北京市', '朝阳区'],

+      signature: '热爱电影,分享快乐!',

+      website: 'https://movieblog.com',

+      interests: ['电影', '音乐', '科技', '摄影'],

+      emailPublic: false,

+      statsPublic: true,

+      activityPublic: true,

+      stats: {

+        uploaded: '256.8 GB',

+        downloaded: '89.6 GB',

+        ratio: '2.87',

+        points: '15,680'

+      },

+      detailedStats: {

+        totalUploaded: '256.8 GB',

+        uploadedTorrents: 45,

+        avgUploadSize: '5.7 GB',

+        totalDownloaded: '89.6 GB',

+        downloadedTorrents: 123,

+        completedTorrents: 118,

+        seeding: 32,

+        seedingTime: '1,245 小时',

+        seedingRank: 86,

+        totalEarnedPoints: '28,940',

+        totalSpentPoints: '13,260'

+      }

+    })

+    

+    const editProfile = reactive({

+      username: '',

+      email: '',

+      realName: '',

+      location: [],

+      signature: '',

+      website: '',

+      interests: [],

+      emailPublic: false,

+      statsPublic: true,

+      activityPublic: true

+    })

+    

+    const passwordForm = reactive({

+      currentPassword: '',

+      newPassword: '',

+      confirmPassword: ''

+    })

+    

+    const profileRules = {

+      email: [

+        { required: true, message: '请输入邮箱地址', trigger: 'blur' },

+        { type: 'email', message: '请输入正确的邮箱格式', trigger: 'blur' }

+      ]

+    }

+    

+    const passwordRules = {

+      currentPassword: [

+        { required: true, message: '请输入当前密码', trigger: 'blur' }

+      ],

+      newPassword: [

+        { required: true, message: '请输入新密码', trigger: 'blur' },

+        { min: 6, message: '密码长度至少6个字符', trigger: 'blur' }

+      ],

+      confirmPassword: [

+        { required: true, message: '请确认新密码', trigger: 'blur' },

+        {

+          validator: (rule, value, callback) => {

+            if (value !== passwordForm.newPassword) {

+              callback(new Error('两次输入的密码不一致'))

+            } else {

+              callback()

+            }

+          },

+          trigger: 'blur'

+        }

+      ]

+    }

+    

+    const locationOptions = [

+      {

+        value: '北京市',

+        label: '北京市',

+        children: [

+          { value: '朝阳区', label: '朝阳区' },

+          { value: '海淀区', label: '海淀区' },

+          { value: '丰台区', label: '丰台区' }

+        ]

+      },

+      {

+        value: '上海市',

+        label: '上海市',

+        children: [

+          { value: '浦东新区', label: '浦东新区' },

+          { value: '黄浦区', label: '黄浦区' },

+          { value: '静安区', label: '静安区' }

+        ]

+      }

+    ]

+    

+    const userTorrents = ref([

+      {

+        id: 1,

+        title: '[4K蓝光原盘] 阿凡达:水之道',

+        category: 'movie',

+        size: '85.6 GB',

+        seeders: 45,

+        leechers: 12,

+        downloads: 234,

+        uploadTime: '2025-05-15T10:00:00'

+      },

+      {

+        id: 2,

+        title: '[FLAC] 古典音乐合集',

+        category: 'music',

+        size: '2.3 GB',

+        seeders: 23,

+        leechers: 5,

+        downloads: 89,

+        uploadTime: '2025-04-20T15:30:00'

+      }

+    ])

+    

+    const activities = ref([

+      {

+        id: 1,

+        type: 'upload',

+        title: '上传种子',

+        description: '上传了《阿凡达:水之道》4K蓝光原盘',

+        time: '2025-06-03T10:30:00'

+      },

+      {

+        id: 2,

+        type: 'download',

+        title: '下载种子',

+        description: '下载了《星际穿越》IMAX版本',

+        time: '2025-06-02T14:20:00'

+      },

+      {

+        id: 3,

+        type: 'post',

+        title: '发布主题',

+        description: '在电影讨论区发布了新主题',

+        time: '2025-06-01T16:45:00'

+      },

+      {

+        id: 4,

+        type: 'points',

+        title: '积分变动',

+        description: '做种奖励获得 +50 积分',

+        time: '2025-05-31T09:15:00'

+      }

+    ])

+    

+    const loginHistory = ref([

+      {

+        time: '2025-06-03T14:30:00',

+        ip: '192.168.1.100',

+        device: 'Windows 11 / Chrome 120',

+        success: true

+      },

+      {

+        time: '2025-06-02T09:15:00',

+        ip: '192.168.1.100',

+        device: 'Windows 11 / Chrome 120',

+        success: true

+      },

+      {

+        time: '2025-06-01T22:30:00',

+        ip: '192.168.1.100',

+        device: 'Android / Chrome Mobile',

+        success: true

+      }

+    ])

+    

+    const filteredActivities = computed(() => {

+      if (!activityFilter.value) return activities.value

+      return activities.value.filter(activity => activity.type === activityFilter.value)

+    })

+    

+    onMounted(() => {

+      loadUserProfile()

+    })

+    

+    const loadUserProfile = () => {

+      // 加载用户资料到编辑表单

+      Object.assign(editProfile, {

+        username: userProfile.value.username,

+        email: userProfile.value.email,

+        realName: userProfile.value.realName,

+        location: userProfile.value.location,

+        signature: userProfile.value.signature,

+        website: userProfile.value.website,

+        interests: [...userProfile.value.interests],

+        emailPublic: userProfile.value.emailPublic,

+        statsPublic: userProfile.value.statsPublic,

+        activityPublic: userProfile.value.activityPublic

+      })

+    }

+    

+    const formatDate = (dateString) => {

+      const date = new Date(dateString)

+      return date.toLocaleDateString('zh-CN')

+    }

+    

+    const formatTime = (timeString) => {

+      const date = new Date(timeString)

+      const now = new Date()

+      const diff = now - date

+      const hours = Math.floor(diff / (1000 * 60 * 60))

+      

+      if (hours < 1) return '刚刚'

+      if (hours < 24) return `${hours}小时前`

+      const days = Math.floor(hours / 24)

+      if (days < 7) return `${days}天前`

+      

+      return date.toLocaleDateString('zh-CN')

+    }

+    

+    const formatDateTime = (dateString) => {

+      const date = new Date(dateString)

+      return date.toLocaleString('zh-CN')

+    }

+    

+    const getUserTitleType = (level) => {

+      if (level >= 8) return 'danger'  // 管理员

+      if (level >= 6) return 'warning' // 资深会员

+      if (level >= 4) return 'success' // 正式会员

+      if (level >= 2) return 'info'    // 初级会员

+      return 'default' // 新手

+    }

+    

+    const getRatioClass = (ratio) => {

+      const r = parseFloat(ratio)

+      if (r >= 2) return 'excellent'

+      if (r >= 1) return 'good'

+      return 'warning'

+    }

+    

+    const getCategoryType = (category) => {

+      const types = {

+        'movie': 'primary',

+        'tv': 'info',

+        'music': 'success',

+        'software': 'warning',

+        'game': 'danger'

+      }

+      return types[category] || 'default'

+    }

+    

+    const getCategoryName = (category) => {

+      const names = {

+        'movie': '电影',

+        'tv': '电视剧',

+        'music': '音乐',

+        'software': '软件',

+        'game': '游戏'

+      }

+      return names[category] || category

+    }

+    

+    const getActivityType = (type) => {

+      const types = {

+        'upload': 'success',

+        'download': 'primary',

+        'post': 'warning',

+        'points': 'info'

+      }

+      return types[type] || 'primary'

+    }

+    

+    const getActivityIcon = (type) => {

+      const icons = {

+        'upload': 'Upload',

+        'download': 'Download',

+        'post': 'ChatDotRound',

+        'points': 'Coin'

+      }

+      return icons[type] || 'Star'

+    }

+    

+    const showInterestInput = () => {

+      interestInputVisible.value = true

+      nextTick(() => {

+        interestInputRef.value?.focus()

+      })

+    }

+    

+    const addInterest = () => {

+      const interest = interestInputValue.value.trim()

+      if (interest && !editProfile.interests.includes(interest)) {

+        editProfile.interests.push(interest)

+      }

+      interestInputVisible.value = false

+      interestInputValue.value = ''

+    }

+    

+    const removeInterest = (interest) => {

+      const index = editProfile.interests.indexOf(interest)

+      if (index > -1) {

+        editProfile.interests.splice(index, 1)

+      }

+    }

+    

+    const saveProfile = async () => {

+      try {

+        await profileFormRef.value?.validate()

+        

+        saving.value = true

+        

+        // 模拟保存过程

+        await new Promise(resolve => setTimeout(resolve, 1500))

+        

+        // 更新用户资料

+        Object.assign(userProfile.value, editProfile)

+        

+        ElMessage.success('个人资料保存成功')

+        

+      } catch (error) {

+        console.error('表单验证失败:', error)

+      } finally {

+        saving.value = false

+      }

+    }

+    

+    const resetProfile = () => {

+      loadUserProfile()

+      ElMessage.info('已重置为原始数据')

+    }

+    

+    const changePassword = async () => {

+      try {

+        await passwordFormRef.value?.validate()

+        

+        changingPassword.value = true

+        

+        // 模拟密码修改过程

+        await new Promise(resolve => setTimeout(resolve, 1500))

+        

+        // 重置表单

+        passwordFormRef.value?.resetFields()

+        Object.assign(passwordForm, {

+          currentPassword: '',

+          newPassword: '',

+          confirmPassword: ''

+        })

+        

+        ElMessage.success('密码修改成功')

+        

+      } catch (error) {

+        console.error('表单验证失败:', error)

+      } finally {

+        changingPassword.value = false

+      }

+    }

+    

+    const handleAvatarChange = (file) => {

+      const isImage = file.raw.type.startsWith('image/')

+      const isLt2M = file.raw.size / 1024 / 1024 < 2

+      

+      if (!isImage) {

+        ElMessage.error('只能上传图片文件!')

+        return false

+      }

+      if (!isLt2M) {

+        ElMessage.error('图片大小不能超过 2MB!')

+        return false

+      }

+      

+      return true

+    }

+    

+    const uploadAvatar = async () => {

+      const files = avatarUploadRef.value?.uploadFiles

+      if (!files || files.length === 0) {

+        ElMessage.warning('请选择头像文件')

+        return

+      }

+      

+      uploadingAvatar.value = true

+      try {

+        // 模拟上传过程

+        await new Promise(resolve => setTimeout(resolve, 2000))

+        

+        // 更新头像URL

+        userProfile.value.avatar = URL.createObjectURL(files[0].raw)

+        

+        ElMessage.success('头像上传成功')

+        showAvatarDialog.value = false

+        avatarUploadRef.value?.clearFiles()

+        

+      } catch (error) {

+        ElMessage.error('头像上传失败')

+      } finally {

+        uploadingAvatar.value = false

+      }

+    }

+    

+    return {

+      activeTab,

+      showAvatarDialog,

+      saving,

+      changingPassword,

+      uploadingAvatar,

+      interestInputVisible,

+      interestInputValue,

+      activityFilter,

+      torrentsPage,

+      userProfile,

+      editProfile,

+      passwordForm,

+      profileRules,

+      passwordRules,

+      locationOptions,

+      userTorrents,

+      filteredActivities,

+      loginHistory,

+      profileFormRef,

+      passwordFormRef,

+      avatarUploadRef,

+      interestInputRef,

+      formatDate,

+      formatTime,

+      formatDateTime,

+      getUserTitleType,

+      getRatioClass,

+      getCategoryType,

+      getCategoryName,

+      getActivityType,

+      getActivityIcon,

+      showInterestInput,

+      addInterest,

+      removeInterest,

+      saveProfile,

+      resetProfile,

+      changePassword,

+      handleAvatarChange,

+      uploadAvatar,

+      Calendar,

+      Clock,

+      Upload,

+      Download,

+      TrendCharts,

+      Star,

+      QuestionFilled,

+      Plus,

+      ChatDotRound,

+      Flag,

+      Coin

+    }

+  }

+}

+</script>

+

+<style lang="scss" scoped>

+.profile-page {

+  max-width: 1200px;

+  margin: 0 auto;

+  padding: 24px;

+  background: #f5f5f5;

+  min-height: 100vh;

+}

+

+.profile-header {

+  background: #fff;

+  border-radius: 12px;

+  padding: 32px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  display: grid;

+  grid-template-columns: 1fr 1fr;

+  gap: 32px;

+  

+  .user-avatar-section {

+    display: flex;

+    gap: 24px;

+    

+    .avatar-container {

+      text-align: center;

+      

+      .change-avatar-btn {

+        margin-top: 12px;

+      }

+    }

+    

+    .user-basic-info {

+      flex: 1;

+      

+      .username {

+        font-size: 28px;

+        font-weight: 600;

+        color: #2c3e50;

+        margin: 0 0 12px 0;

+      }

+      

+      .user-title {

+        margin-bottom: 16px;

+      }

+      

+      .join-info, .last-login {

+        display: flex;

+        align-items: center;

+        gap: 8px;

+        font-size: 14px;

+        color: #7f8c8d;

+        margin-bottom: 8px;

+      }

+    }

+  }

+  

+  .user-stats-overview {

+    .stats-grid {

+      display: grid;

+      grid-template-columns: repeat(2, 1fr);

+      gap: 16px;

+      

+      .stat-card {

+        background: #f8f9fa;

+        border-radius: 8px;

+        padding: 20px;

+        display: flex;

+        align-items: center;

+        gap: 16px;

+        

+        .stat-icon {

+          width: 48px;

+          height: 48px;

+          border-radius: 50%;

+          display: flex;

+          align-items: center;

+          justify-content: center;

+          

+          &.upload { background: rgba(103, 194, 58, 0.1); color: #67c23a; }

+          &.download { background: rgba(64, 158, 255, 0.1); color: #409eff; }

+          &.ratio {

+            &.excellent { background: rgba(103, 194, 58, 0.1); color: #67c23a; }

+            &.good { background: rgba(230, 162, 60, 0.1); color: #e6a23c; }

+            &.warning { background: rgba(245, 108, 108, 0.1); color: #f56c6c; }

+          }

+          &.points { background: rgba(245, 108, 108, 0.1); color: #f56c6c; }

+        }

+        

+        .stat-info {

+          h3 {

+            font-size: 20px;

+            font-weight: 600;

+            color: #2c3e50;

+            margin: 0 0 4px 0;

+          }

+          

+          p {

+            font-size: 14px;

+            color: #7f8c8d;

+            margin: 0;

+          }

+        }

+      }

+    }

+  }

+}

+

+.profile-content {

+  background: #fff;

+  border-radius: 12px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  :deep(.el-tabs__content) {

+    padding: 24px;

+  }

+}

+

+.info-section {

+  .form-section {

+    margin-bottom: 32px;

+    

+    h3 {

+      font-size: 18px;

+      font-weight: 600;

+      color: #2c3e50;

+      margin: 0 0 20px 0;

+      padding-bottom: 8px;

+      border-bottom: 2px solid #f0f0f0;

+    }

+  }

+  

+  .interests-input {

+    display: flex;

+    flex-wrap: wrap;

+    gap: 8px;

+    align-items: center;

+    

+    .interest-tag {

+      margin: 0;

+    }

+  }

+  

+  .setting-tip {

+    margin-left: 12px;

+    font-size: 12px;

+    color: #909399;

+  }

+  

+  .form-actions {

+    text-align: center;

+    margin-top: 32px;

+    

+    .el-button {

+      margin: 0 8px;

+      min-width: 100px;

+    }

+  }

+}

+

+.stats-section {

+  .stats-overview {

+    margin-bottom: 32px;

+    

+    .overview-grid {

+      display: grid;

+      grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));

+      gap: 20px;

+      

+      .overview-card {

+        background: #f8f9fa;

+        border-radius: 8px;

+        padding: 24px;

+        

+        h3 {

+          font-size: 16px;

+          font-weight: 600;

+          color: #2c3e50;

+          margin: 0 0 16px 0;

+        }

+        

+        .stat-details {

+          .detail-item {

+            display: flex;

+            justify-content: space-between;

+            align-items: center;

+            margin-bottom: 12px;

+            

+            .label {

+              font-size: 14px;

+              color: #7f8c8d;

+            }

+            

+            .value {

+              font-size: 14px;

+              font-weight: 600;

+              color: #2c3e50;

+            }

+          }

+        }

+      }

+    }

+  }

+  

+  .charts-section {

+    .chart-card {

+      background: #f8f9fa;

+      border-radius: 8px;

+      padding: 24px;

+      

+      h3 {

+        font-size: 16px;

+        font-weight: 600;

+        color: #2c3e50;

+        margin: 0 0 20px 0;

+      }

+      

+      .chart-placeholder {

+        text-align: center;

+        padding: 60px 0;

+        color: #909399;

+        

+        p {

+          margin: 12px 0 0 0;

+        }

+      }

+    }

+  }

+}

+

+.torrents-section {

+  .section-header {

+    display: flex;

+    justify-content: space-between;

+    align-items: center;

+    margin-bottom: 20px;

+    

+    h3 {

+      font-size: 18px;

+      font-weight: 600;

+      color: #2c3e50;

+      margin: 0;

+    }

+  }

+  

+  .torrent-info {

+    display: flex;

+    align-items: center;

+    gap: 12px;

+    

+    .torrent-title {

+      font-weight: 500;

+    }

+  }

+  

+  .pagination-wrapper {

+    margin-top: 16px;

+    text-align: center;

+  }

+}

+

+.activity-section {

+  .activity-filters {

+    margin-bottom: 24px;

+    

+    .el-select {

+      width: 150px;

+    }

+  }

+  

+  .activity-timeline {

+    .activity-content {

+      .activity-header {

+        display: flex;

+        align-items: center;

+        gap: 8px;

+        margin-bottom: 8px;

+        

+        .activity-title {

+          font-weight: 600;

+          color: #2c3e50;

+        }

+      }

+      

+      .activity-description {

+        font-size: 14px;

+        color: #7f8c8d;

+        line-height: 1.5;

+      }

+    }

+  }

+}

+

+.security-section {

+  .security-card {

+    background: #f8f9fa;

+    border-radius: 8px;

+    padding: 24px;

+    margin-bottom: 24px;

+    

+    h3 {

+      font-size: 18px;

+      font-weight: 600;

+      color: #2c3e50;

+      margin: 0 0 20px 0;

+    }

+  }

+}

+

+.avatar-upload {

+  text-align: center;

+  

+  .avatar-uploader {

+    margin-bottom: 16px;

+  }

+  

+  .upload-tips {

+    font-size: 12px;

+    color: #909399;

+    

+    p {

+      margin: 4px 0;

+    }

+  }

+}

+

+@media (max-width: 768px) {

+  .profile-page {

+    padding: 16px;

+  }

+  

+  .profile-header {

+    grid-template-columns: 1fr;

+    gap: 24px;

+    

+    .user-avatar-section {

+      flex-direction: column;

+      text-align: center;

+    }

+    

+    .user-stats-overview .stats-grid {

+      grid-template-columns: 1fr;

+    }

+  }

+  

+  .stats-overview .overview-grid {

+    grid-template-columns: 1fr;

+  }

+  

+  .torrents-section .section-header {

+    flex-direction: column;

+    gap: 16px;

+    align-items: flex-start;

+  }

+}

 </style>
\ No newline at end of file
diff --git a/src/views/auth/RegisterView.vue b/src/views/auth/RegisterView.vue
index ad3461d..67a262f 100644
--- a/src/views/auth/RegisterView.vue
+++ b/src/views/auth/RegisterView.vue
@@ -1,375 +1,207 @@
-<template>
-  <div class="register-page">
-    <!-- 背景装饰 -->
-    <div class="bg-decoration">
-      <div class="shape shape-1"></div>
-      <div class="shape shape-2"></div>
-      <div class="shape shape-3"></div>
-    </div>
-    
-    <!-- 注册表单容器 -->
-    <div class="register-container">
-      <div class="register-card">
-        <!-- 头部信息 -->
-        <div class="register-header">
-          <div class="logo">
-            <el-icon size="48" color="#a8edea"><UserFilled /></el-icon>
-          </div>
-          <h1 class="title">加入 PT Tracker</h1>
-          <p class="subtitle">开始你的资源分享之旅</p>
-        </div>
-        
-        <!-- 注册表单 -->
-        <el-form
-          ref="registerFormRef"
-          :model="registerForm"
-          :rules="registerRules"
-          class="register-form"
-          size="large"
-        >
-          <el-form-item prop="username">
-            <el-input
-              v-model="registerForm.username"
-              placeholder="请输入用户名"
-              clearable
-              :prefix-icon="User"
-            />
-          </el-form-item>
-          
-          <el-form-item prop="email">
-            <el-input
-              v-model="registerForm.email"
-              placeholder="请输入邮箱地址"
-              clearable
-              :prefix-icon="Message"
-            />
-          </el-form-item>
-          
-          <el-form-item prop="password">
-            <el-input
-              v-model="registerForm.password"
-              type="password"
-              placeholder="请输入密码"
-              show-password
-              :prefix-icon="Lock"
-            />
-          </el-form-item>
-          
-          <el-form-item prop="confirmPassword">
-            <el-input
-              v-model="registerForm.confirmPassword"
-              type="password"
-              placeholder="请确认密码"
-              show-password
-              :prefix-icon="Lock"
-            />
-          </el-form-item>
-          
-          <el-form-item prop="agreement">
-            <el-checkbox v-model="registerForm.agreement">
-              我已阅读并同意
-              <el-link type="primary" :underline="false">《用户协议》</el-link>
-              和
-              <el-link type="primary" :underline="false">《隐私政策》</el-link>
-            </el-checkbox>
-          </el-form-item>
-          
-          <el-form-item>
-            <el-button
-              type="primary"
-              :loading="loading"
-              style="width: 100%"
-              @click="handleRegister"
-            >
-              <span v-if="!loading">注册</span>
-              <span v-else>注册中...</span>
-            </el-button>
-          </el-form-item>
-        </el-form>
-        
-        <!-- 底部链接 -->
-        <div class="register-footer">
-          <span class="footer-text">已有账号?</span>
-          <el-link 
-            type="primary" 
-            :underline="false"
-            @click="$router.push('/login')"
-          >
-            立即登录
-          </el-link>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { ref, reactive } from 'vue'
-import { useRouter } from 'vue-router'
-import { ElMessage } from 'element-plus'
-import { User, Lock, Message, UserFilled } from '@element-plus/icons-vue'
-
-export default {
-  name: 'RegisterView',
-  components: {
-    UserFilled
-  },
-  setup() {
-    const router = useRouter()
-    const registerFormRef = ref()
-    const loading = ref(false)
-    
-    // 表单数据
-    const registerForm = reactive({
-      username: '',
-      email: '',
-      password: '',
-      confirmPassword: '',
-      agreement: false
-    })
-    
-    // 自定义验证规则
-    const validateConfirmPassword = (rule, value, callback) => {
-      if (value === '') {
-        callback(new Error('请再次输入密码'))
-      } else if (value !== registerForm.password) {
-        callback(new Error('两次输入密码不一致'))
-      } else {
-        callback()
-      }
-    }
-    
-    const validateAgreement = (rule, value, callback) => {
-      if (!value) {
-        callback(new Error('请先同意用户协议和隐私政策'))
-      } else {
-        callback()
-      }
-    }
-    
-    // 验证规则
-    const registerRules = {
-      username: [
-        { required: true, message: '请输入用户名', trigger: 'blur' },
-        { min: 3, max: 20, message: '用户名长度在3到20个字符', trigger: 'blur' },
-        { pattern: /^[a-zA-Z0-9_]+$/, message: '用户名只能包含字母、数字和下划线', trigger: 'blur' }
-      ],
-      email: [
-        { required: true, message: '请输入邮箱地址', trigger: 'blur' },
-        { type: 'email', message: '请输入正确的邮箱格式', trigger: 'blur' }
-      ],
-      password: [
-        { required: true, message: '请输入密码', trigger: 'blur' },
-        { min: 6, max: 20, message: '密码长度在6到20个字符', trigger: 'blur' },
-        { pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]/, message: '密码必须包含大小写字母和数字', trigger: 'blur' }
-      ],
-      confirmPassword: [
-        { required: true, validator: validateConfirmPassword, trigger: 'blur' }
-      ],
-      agreement: [
-        { required: true, validator: validateAgreement, trigger: 'change' }
-      ]
-    }
-    
-    // 注册处理
-    const handleRegister = async () => {
-      try {
-        // 表单验证
-        const valid = await registerFormRef.value.validate()
-        if (!valid) return
-        
-        loading.value = true
-        
-        // 模拟注册API请求
-        await new Promise(resolve => setTimeout(resolve, 1500))
-        
-        // 模拟注册成功
-        ElMessage.success('注册成功!请登录您的账号')
-        
-        // 跳转到登录页
-        router.push('/login')
-        
-      } catch (error) {
-        console.error('注册失败:', error)
-        ElMessage.error('注册失败,请稍后重试')
-      } finally {
-        loading.value = false
-      }
-    }
-    
-    return {
-      registerFormRef,
-      registerForm,
-      registerRules,
-      loading,
-      handleRegister,
-      User,
-      Lock,
-      Message
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.register-page {
-  min-height: 100vh;
-  background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
-  position: relative;
-  overflow: hidden;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  padding: 20px;
-}
-
-// 背景装饰(与登录页相同的动画效果)
-.bg-decoration {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  z-index: 1;
-  
-  .shape {
-    position: absolute;
-    border-radius: 50%;
-    background: rgba(255, 255, 255, 0.15);
-    animation: float 8s ease-in-out infinite;
-    
-    &.shape-1 {
-      width: 180px;
-      height: 180px;
-      top: 15%;
-      left: 15%;
-      animation-delay: 0s;
-    }
-    
-    &.shape-2 {
-      width: 120px;
-      height: 120px;
-      top: 50%;
-      right: 15%;
-      animation-delay: -3s;
-    }
-    
-    &.shape-3 {
-      width: 90px;
-      height: 90px;
-      bottom: 25%;
-      left: 25%;
-      animation-delay: -6s;
-    }
-  }
-}
-
-@keyframes float {
-  0%, 100% {
-    transform: translateY(0px) rotate(0deg);
-  }
-  50% {
-    transform: translateY(-15px) rotate(180deg);
-  }
-}
-
-// 注册容器
-.register-container {
-  position: relative;
-  z-index: 10;
-  width: 100%;
-  max-width: 420px;
-}
-
-.register-card {
-  background: rgba(255, 255, 255, 0.95);
-  backdrop-filter: blur(10px);
-  border-radius: 16px;
-  padding: 40px;
-  box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
-  border: 1px solid rgba(255, 255, 255, 0.2);
-  
-  .register-header {
-    text-align: center;
-    margin-bottom: 32px;
-    
-    .logo {
-      margin-bottom: 16px;
-    }
-    
-    .title {
-      font-size: 32px;
-      font-weight: 700;
-      color: #2c3e50;
-      margin-bottom: 8px;
-      letter-spacing: -0.5px;
-    }
-    
-    .subtitle {
-      font-size: 15px;
-      color: #7f8c8d;
-      margin: 0;
-      font-weight: 400;
-    }
-  }
-  
-  .register-form {
-    .el-form-item {
-      margin-bottom: 20px;
-      
-      &:last-child {
-        margin-bottom: 0;
-      }
-    }
-    
-    .el-checkbox {
-      :deep(.el-checkbox__label) {
-        font-size: 14px;
-        color: #606266;
-        line-height: 1.5;
-      }
-    }
-    
-    .el-button {
-      font-size: 16px;
-      font-weight: 500;
-      height: 48px;
-      border-radius: 8px;
-    }
-  }
-  
-  .register-footer {
-    text-align: center;
-    margin-top: 24px;
-    padding-top: 24px;
-    border-top: 1px solid #ebeef5;
-    
-    .footer-text {
-      color: #909399;
-      font-size: 14px;
-      margin-right: 8px;
-    }
-    
-    .el-link {
-      font-size: 14px;
-      font-weight: 500;
-    }
-  }
-}
-
-// 响应式设计
-@media (max-width: 768px) {
-  .register-page {
-    padding: 16px;
-  }
-  
-  .register-card {
-    padding: 32px 24px;
-    
-    .register-header .title {
-      font-size: 28px;
-    }
-  }
-}
-</style>
\ No newline at end of file
+<template>

+  <div class="register-page">

+    <div class="bg-decoration">

+      <div class="shape shape-1"></div>

+      <div class="shape shape-2"></div>

+      <div class="shape shape-3"></div>

+    </div>

+    

+    <div class="register-container">

+      <div class="register-card">

+        <div class="register-header">

+          <div class="logo">

+            <el-icon size="48" color="#a8edea"><UserFilled /></el-icon>

+          </div>

+          <h1 class="title">加入 PT Tracker</h1>

+          <p class="subtitle">开始你的资源分享之旅</p>

+        </div>

+        

+        <!-- 注册表单 -->

+        <el-form

+          ref="registerFormRef"

+          :model="registerForm"

+          :rules="registerRules"

+          class="register-form"

+          size="large"

+        >

+          <el-form-item prop="username">

+            <el-input

+              v-model="registerForm.username"

+              placeholder="请输入用户名"

+              clearable

+              :prefix-icon="User"

+            />

+          </el-form-item>

+          

+          <el-form-item prop="email">

+            <el-input

+              v-model="registerForm.email"

+              placeholder="请输入邮箱地址"

+              clearable

+              :prefix-icon="Message"

+            />

+          </el-form-item>

+          

+          <el-form-item prop="password">

+            <el-input

+              v-model="registerForm.password"

+              type="password"

+              placeholder="请输入密码"

+              show-password

+              :prefix-icon="Lock"

+            />

+          </el-form-item>

+          

+          <el-form-item prop="confirmPassword">

+            <el-input

+              v-model="registerForm.confirmPassword"

+              type="password"

+              placeholder="请确认密码"

+              show-password

+              :prefix-icon="Lock"

+            />

+          </el-form-item>

+          

+          <el-form-item prop="agreement">

+            <el-checkbox v-model="registerForm.agreement">

+              我已阅读并同意

+              <el-link type="primary" :underline="false">《用户协议》</el-link>

+              和

+              <el-link type="primary" :underline="false">《隐私政策》</el-link>

+            </el-checkbox>

+          </el-form-item>

+          

+          <el-form-item>

+            <el-button

+              type="primary"

+              :loading="registerLoading"

+              style="width: 100%"

+              @click="handleRegister"

+            >

+              <span v-if="!registerLoading">注册</span>

+              <span v-else>注册中...</span>

+            </el-button>

+          </el-form-item>

+        </el-form>

+        

+        <div class="register-footer">

+          <span class="footer-text">已有账号?</span>

+          <el-link 

+            type="primary" 

+            :underline="false"

+            @click="$router.push('/login')"

+          >

+            立即登录

+          </el-link>

+        </div>

+      </div>

+    </div>

+  </div>

+</template>

+

+<script>

+import { ref, reactive, computed } from 'vue'

+import { useRouter } from 'vue-router'

+import { useStore } from 'vuex'

+import { User, Lock, Message, UserFilled } from '@element-plus/icons-vue'

+

+export default {

+  name: 'RegisterView',

+  components: {

+    UserFilled

+  },

+  setup() {

+    const router = useRouter()

+    const store = useStore()

+    const registerFormRef = ref()

+    

+    // 从store获取登录加载状态(注册和登录共用同一个loading状态)

+    const registerLoading = computed(() => store.getters['auth/loginLoading'])

+    

+    // 表单数据

+    const registerForm = reactive({

+      username: '',

+      email: '',

+      password: '',

+      confirmPassword: '',

+      agreement: false

+    })

+    

+    // 自定义验证规则

+    const validateConfirmPassword = (rule, value, callback) => {

+      if (value === '') {

+        callback(new Error('请再次输入密码'))

+      } else if (value !== registerForm.password) {

+        callback(new Error('两次输入密码不一致'))

+      } else {

+        callback()

+      }

+    }

+    

+    const validateAgreement = (rule, value, callback) => {

+      if (!value) {

+        callback(new Error('请先同意用户协议和隐私政策'))

+      } else {

+        callback()

+      }

+    }

+    

+    // 验证规则

+    const registerRules = {

+      username: [

+        { required: true, message: '请输入用户名', trigger: 'blur' },

+        { min: 3, max: 20, message: '用户名长度在3到20个字符', trigger: 'blur' },

+        { pattern: /^[a-zA-Z0-9_]+$/, message: '用户名只能包含字母、数字和下划线', trigger: 'blur' }

+      ],

+      email: [

+        { required: true, message: '请输入邮箱地址', trigger: 'blur' },

+        { type: 'email', message: '请输入正确的邮箱格式', trigger: 'blur' }

+      ],

+      password: [

+        { required: true, message: '请输入密码', trigger: 'blur' },

+        { min: 6, max: 20, message: '密码长度在6到20个字符', trigger: 'blur' }

+      ],

+      confirmPassword: [

+        { required: true, validator: validateConfirmPassword, trigger: 'blur' }

+      ],

+      agreement: [

+        { required: true, validator: validateAgreement, trigger: 'change' }

+      ]

+    }

+    

+    // 注册处理

+    const handleRegister = async () => {

+      try {

+        // 表单验证

+        const valid = await registerFormRef.value.validate()

+        if (!valid) return

+        

+        // 调用store的注册action

+        await store.dispatch('auth/register', {

+          username: registerForm.username,

+          email: registerForm.email,

+          password: registerForm.password

+        })

+        

+        // 注册成功,跳转到首页

+        router.push('/home')

+        

+      } catch (error) {

+        console.error('注册失败:', error)

+        // 错误信息已经在store中通过ElMessage显示了

+      }

+    }

+    

+    return {

+      registerFormRef,

+      registerForm,

+      registerRules,

+      registerLoading,

+      handleRegister,

+      User,

+      Lock,

+      Message

+    }

+  }

+}

+</script>
\ No newline at end of file
diff --git a/src/views/forum/ForumSectionView.vue b/src/views/forum/ForumSectionView.vue
index a8e7306..d0b42ec 100644
--- a/src/views/forum/ForumSectionView.vue
+++ b/src/views/forum/ForumSectionView.vue
@@ -1,1008 +1,1008 @@
-<template>
-  <div class="section-page">
-    <div class="page-container">
-      <!-- 面包屑导航 -->
-      <div class="breadcrumb">
-        <el-breadcrumb separator="/">
-          <el-breadcrumb-item :to="{ path: '/forum' }">论坛首页</el-breadcrumb-item>
-          <el-breadcrumb-item>{{ sectionInfo.name }}</el-breadcrumb-item>
-        </el-breadcrumb>
-      </div>
-
-      <!-- 版块信息 -->
-      <div class="section-header">
-        <div class="section-info">
-          <div class="section-icon">
-            <el-icon size="48" :color="sectionInfo.color">
-              <component :is="sectionInfo.icon" />
-            </el-icon>
-          </div>
-          <div class="section-details">
-            <h1 class="section-name">{{ sectionInfo.name }}</h1>
-            <p class="section-description">{{ sectionInfo.description }}</p>
-            <div class="section-stats">
-              <div class="stat-item">
-                <el-icon><ChatDotRound /></el-icon>
-                <span>{{ sectionInfo.topics }} 主题</span>
-              </div>
-              <div class="stat-item">
-                <el-icon><Comment /></el-icon>
-                <span>{{ sectionInfo.replies }} 回复</span>
-              </div>
-              <div class="stat-item">
-                <el-icon><User /></el-icon>
-                <span>{{ sectionInfo.members }} 成员</span>
-              </div>
-            </div>
-          </div>
-        </div>
-        
-        <div class="section-actions">
-          <el-button type="primary" :icon="Edit" @click="showNewTopicDialog = true">
-            发布新主题
-          </el-button>
-        </div>
-      </div>
-
-      <!-- 筛选和搜索 -->
-      <div class="filter-section">
-        <div class="filter-left">
-          <el-input
-            v-model="searchQuery"
-            placeholder="搜索主题..."
-            :prefix-icon="Search"
-            @keyup.enter="handleSearch"
-            clearable
-            style="width: 300px;"
-          />
-          <el-button type="primary" @click="handleSearch">搜索</el-button>
-        </div>
-        
-        <div class="filter-right">
-          <el-select v-model="sortBy" placeholder="排序方式" @change="handleFilter">
-            <el-option label="最新回复" value="last_reply" />
-            <el-option label="发布时间" value="create_time" />
-            <el-option label="回复数量" value="replies" />
-            <el-option label="浏览次数" value="views" />
-          </el-select>
-          
-          <el-select v-model="filterType" placeholder="主题类型" @change="handleFilter">
-            <el-option label="全部主题" value="" />
-            <el-option label="置顶主题" value="pinned" />
-            <el-option label="热门主题" value="hot" />
-            <el-option label="精华主题" value="featured" />
-          </el-select>
-        </div>
-      </div>
-
-      <!-- 置顶主题 -->
-      <div v-if="pinnedTopics.length > 0" class="pinned-topics">
-        <h3 class="section-title">置顶主题</h3>
-        <div class="topics-list">
-          <div
-            v-for="topic in pinnedTopics"
-            :key="topic.id"
-            class="topic-item pinned"
-            @click="navigateToTopic(topic.id)"
-          >
-            <div class="topic-status">
-              <el-icon class="pin-icon"><Top /></el-icon>
-            </div>
-            
-            <div class="topic-content">
-              <div class="topic-header">
-                <h4 class="topic-title">{{ topic.title }}</h4>
-                <div class="topic-tags">
-                  <el-tag type="warning" size="small">置顶</el-tag>
-                  <el-tag v-if="topic.hot" type="danger" size="small">热门</el-tag>
-                  <el-tag v-if="topic.featured" type="success" size="small">精华</el-tag>
-                </div>
-              </div>
-              
-              <div class="topic-meta">
-                <div class="author-info">
-                  <el-avatar :size="24">{{ topic.author.charAt(0) }}</el-avatar>
-                  <span class="author-name">{{ topic.author }}</span>
-                  <span class="create-time">{{ formatTime(topic.createTime) }}</span>
-                </div>
-                
-                <div class="topic-stats">
-                  <span class="stat-item">
-                    <el-icon><View /></el-icon>
-                    {{ topic.views }}
-                  </span>
-                  <span class="stat-item">
-                    <el-icon><Comment /></el-icon>
-                    {{ topic.replies }}
-                  </span>
-                </div>
-              </div>
-            </div>
-            
-            <div class="last-reply">
-              <div v-if="topic.lastReply" class="reply-info">
-                <div class="reply-author">{{ topic.lastReply.author }}</div>
-                <div class="reply-time">{{ formatTime(topic.lastReply.time) }}</div>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <!-- 普通主题列表 -->
-      <div class="normal-topics">
-        <div class="section-header">
-          <h3 class="section-title">主题列表</h3>
-          <div class="results-info">
-            共 {{ totalTopics }} 个主题
-          </div>
-        </div>
-        
-        <div class="topics-list" v-loading="loading">
-          <div
-            v-for="topic in topics"
-            :key="topic.id"
-            class="topic-item"
-            @click="navigateToTopic(topic.id)"
-          >
-            <div class="topic-status">
-              <el-icon v-if="topic.hasNewReplies" class="new-icon" color="#f56c6c">
-                <ChatDotRound />
-              </el-icon>
-              <el-icon v-else class="normal-icon" color="#909399">
-                <ChatLineRound />
-              </el-icon>
-            </div>
-            
-            <div class="topic-content">
-              <div class="topic-header">
-                <h4 class="topic-title">{{ topic.title }}</h4>
-                <div class="topic-tags">
-                  <el-tag v-if="topic.hot" type="danger" size="small">热门</el-tag>
-                  <el-tag v-if="topic.featured" type="success" size="small">精华</el-tag>
-                  <el-tag v-if="topic.closed" type="info" size="small">已关闭</el-tag>
-                </div>
-              </div>
-              
-              <div class="topic-meta">
-                <div class="author-info">
-                  <el-avatar :size="24">{{ topic.author.charAt(0) }}</el-avatar>
-                  <span class="author-name">{{ topic.author }}</span>
-                  <span class="create-time">{{ formatTime(topic.createTime) }}</span>
-                </div>
-                
-                <div class="topic-stats">
-                  <span class="stat-item">
-                    <el-icon><View /></el-icon>
-                    {{ topic.views }}
-                  </span>
-                  <span class="stat-item">
-                    <el-icon><Comment /></el-icon>
-                    {{ topic.replies }}
-                  </span>
-                </div>
-              </div>
-            </div>
-            
-            <div class="last-reply">
-              <div v-if="topic.lastReply" class="reply-info">
-                <div class="reply-author">{{ topic.lastReply.author }}</div>
-                <div class="reply-time">{{ formatTime(topic.lastReply.time) }}</div>
-              </div>
-              <div v-else class="no-reply">暂无回复</div>
-            </div>
-          </div>
-          
-          <div v-if="topics.length === 0 && !loading" class="no-topics">
-            暂无主题,快来发布第一个主题吧!
-          </div>
-        </div>
-        
-        <!-- 分页 -->
-        <div class="pagination-wrapper">
-          <el-pagination
-            v-model:current-page="currentPage"
-            v-model:page-size="pageSize"
-            :page-sizes="[20, 50, 100]"
-            :total="totalTopics"
-            layout="total, sizes, prev, pager, next, jumper"
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-          />
-        </div>
-      </div>
-    </div>
-
-    <!-- 发布新主题对话框 -->
-    <el-dialog
-      v-model="showNewTopicDialog"
-      title="发布新主题"
-      width="600px"
-      :before-close="handleCloseDialog"
-    >
-      <el-form
-        ref="topicFormRef"
-        :model="newTopic"
-        :rules="topicRules"
-        label-width="80px"
-      >
-        <el-form-item label="主题标题" prop="title">
-          <el-input
-            v-model="newTopic.title"
-            placeholder="请输入主题标题"
-            maxlength="100"
-            show-word-limit
-          />
-        </el-form-item>
-        
-        <el-form-item label="主题标签">
-          <div class="tags-input">
-            <el-tag
-              v-for="tag in newTopic.tags"
-              :key="tag"
-              closable
-              @close="removeTopicTag(tag)"
-            >
-              {{ tag }}
-            </el-tag>
-            <el-input
-              v-if="tagInputVisible"
-              ref="tagInputRef"
-              v-model="tagInputValue"
-              size="small"
-              @keyup.enter="addTopicTag"
-              @blur="addTopicTag"
-              style="width: 100px;"
-            />
-            <el-button
-              v-else
-              size="small"
-              @click="showTagInput"
-            >
-              + 添加标签
-            </el-button>
-          </div>
-        </el-form-item>
-        
-        <el-form-item label="主题内容" prop="content">
-          <el-input
-            v-model="newTopic.content"
-            type="textarea"
-            :rows="8"
-            placeholder="请输入主题内容..."
-            maxlength="5000"
-            show-word-limit
-          />
-        </el-form-item>
-        
-        <el-form-item label="主题选项">
-          <el-checkbox-group v-model="newTopic.options">
-            <el-checkbox label="hot">申请热门</el-checkbox>
-            <el-checkbox label="featured">申请精华</el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-      </el-form>
-      
-      <template #footer>
-        <el-button @click="handleCloseDialog">取消</el-button>
-        <el-button type="primary" @click="submitNewTopic" :loading="submitting">
-          发布主题
-        </el-button>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import { ref, reactive, onMounted, nextTick } from 'vue'
-import { useRoute, useRouter } from 'vue-router'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import {
-  Edit,
-  Search,
-  ChatDotRound,
-  Comment,
-  User,
-  View,
-  Top,
-  ChatLineRound,
-  Film,
-  Headphones,
-  Monitor,
-  GamePad,
-  Bell,
-  QuestionFilled
-} from '@element-plus/icons-vue'
-
-export default {
-  name: 'ForumSectionView',
-  setup() {
-    const route = useRoute()
-    const router = useRouter()
-    const topicFormRef = ref(null)
-    const tagInputRef = ref(null)
-    
-    const loading = ref(false)
-    const showNewTopicDialog = ref(false)
-    const submitting = ref(false)
-    const tagInputVisible = ref(false)
-    const tagInputValue = ref('')
-    
-    const searchQuery = ref('')
-    const sortBy = ref('last_reply')
-    const filterType = ref('')
-    const currentPage = ref(1)
-    const pageSize = ref(20)
-    const totalTopics = ref(0)
-    
-    const sectionInfo = ref({
-      id: 1,
-      name: '电影讨论',
-      description: '分享和讨论电影资源,交流观影心得',
-      icon: 'Film',
-      color: '#409eff',
-      topics: 3256,
-      replies: 18934,
-      members: 1234
-    })
-    
-    const newTopic = reactive({
-      title: '',
-      content: '',
-      tags: [],
-      options: []
-    })
-    
-    const topicRules = {
-      title: [
-        { required: true, message: '请输入标题', trigger: 'blur' },
-        { min: 5, max: 100, message: '标题长度在 5 到 100 个字符', trigger: 'blur' }
-      ],
-      content: [
-        { required: true, message: '请输入内容', trigger: 'blur' },
-        { min: 10, max: 5000, message: '内容长度在 10 到 5000 个字符', trigger: 'blur' }
-      ]
-    }
-    
-    const pinnedTopics = ref([
-      {
-        id: 1,
-        title: '【公告】本版块发帖规则和注意事项',
-        author: 'Admin',
-        createTime: '2025-05-01T10:00:00',
-        views: 5678,
-        replies: 23,
-        hot: false,
-        featured: true,
-        lastReply: {
-          author: 'User123',
-          time: '2025-06-02T15:30:00'
-        }
-      }
-    ])
-    
-    const topics = ref([
-      {
-        id: 2,
-        title: '2024年度最佳科幻电影推荐榜单',
-        author: 'SciFiFan',
-        createTime: '2025-06-03T10:30:00',
-        views: 1234,
-        replies: 45,
-        hot: true,
-        featured: false,
-        closed: false,
-        hasNewReplies: true,
-        lastReply: {
-          author: 'MovieLover',
-          time: '2025-06-03T14:25:00'
-        }
-      },
-      {
-        id: 3,
-        title: '阿凡达2:水之道 观影感受分享',
-        author: 'Avatar2Fan',
-        createTime: '2025-06-02T16:45:00',
-        views: 892,
-        replies: 67,
-        hot: false,
-        featured: true,
-        closed: false,
-        hasNewReplies: false,
-        lastReply: {
-          author: 'CinemaExpert',
-          time: '2025-06-03T12:10:00'
-        }
-      },
-      {
-        id: 4,
-        title: '求推荐几部好看的悬疑电影',
-        author: 'SuspenseLover',
-        createTime: '2025-06-01T09:20:00',
-        views: 456,
-        replies: 23,
-        hot: false,
-        featured: false,
-        closed: false,
-        hasNewReplies: true,
-        lastReply: {
-          author: 'ThrillerFan',
-          time: '2025-06-03T11:45:00'
-        }
-      }
-    ])
-    
-    onMounted(() => {
-      const sectionId = route.params.id
-      fetchSectionData(sectionId)
-    })
-    
-    const fetchSectionData = async (id) => {
-      loading.value = true
-      try {
-        // 模拟API调用
-        console.log('获取版块数据:', id)
-        
-        // 根据版块ID设置不同的版块信息
-        const sections = {
-          1: { name: '电影讨论', description: '分享和讨论电影资源,交流观影心得', icon: 'Film', color: '#409eff' },
-          2: { name: '音乐分享', description: '音乐资源分享,音乐制作技术交流', icon: 'Headphones', color: '#67c23a' },
-          3: { name: '软件技术', description: '软件资源分享,技术问题讨论', icon: 'Monitor', color: '#e6a23c' },
-          4: { name: '游戏天地', description: '游戏资源分享,游戏攻略讨论', icon: 'GamePad', color: '#f56c6c' },
-          5: { name: '站务公告', description: '网站公告,规则说明,意见建议', icon: 'Bell', color: '#909399' },
-          6: { name: '新手求助', description: '新手问题解答,使用教程分享', icon: 'QuestionFilled', color: '#606266' }
-        }
-        
-        const sectionData = sections[id] || sections[1]
-        sectionInfo.value = {
-          id: parseInt(id),
-          ...sectionData,
-          topics: 3256,
-          replies: 18934,
-          members: 1234
-        }
-        
-        totalTopics.value = 156
-        
-      } catch (error) {
-        ElMessage.error('获取版块数据失败')
-      } finally {
-        loading.value = false
-      }
-    }
-    
-    const formatTime = (timeString) => {
-      const date = new Date(timeString)
-      const now = new Date()
-      const diff = now - date
-      const hours = Math.floor(diff / (1000 * 60 * 60))
-      
-      if (hours < 1) return '刚刚'
-      if (hours < 24) return `${hours}小时前`
-      const days = Math.floor(hours / 24)
-      if (days < 7) return `${days}天前`
-      
-      return date.toLocaleDateString('zh-CN', {
-        month: '2-digit',
-        day: '2-digit',
-        hour: '2-digit',
-        minute: '2-digit'
-      })
-    }
-    
-    const navigateToTopic = (topicId) => {
-      router.push(`/forum/topic/${topicId}`)
-    }
-    
-    const handleSearch = () => {
-      currentPage.value = 1
-      fetchTopics()
-    }
-    
-    const handleFilter = () => {
-      currentPage.value = 1
-      fetchTopics()
-    }
-    
-    const fetchTopics = async () => {
-      loading.value = true
-      try {
-        // 模拟API调用
-        await new Promise(resolve => setTimeout(resolve, 500))
-        console.log('获取主题列表:', { searchQuery: searchQuery.value, sortBy: sortBy.value, filterType: filterType.value })
-      } catch (error) {
-        ElMessage.error('获取主题列表失败')
-      } finally {
-        loading.value = false
-      }
-    }
-    
-    const handleSizeChange = (size) => {
-      pageSize.value = size
-      currentPage.value = 1
-      fetchTopics()
-    }
-    
-    const handleCurrentChange = (page) => {
-      currentPage.value = page
-      fetchTopics()
-    }
-    
-    const showTagInput = () => {
-      tagInputVisible.value = true
-      nextTick(() => {
-        tagInputRef.value?.focus()
-      })
-    }
-    
-    const addTopicTag = () => {
-      const tag = tagInputValue.value.trim()
-      if (tag && !newTopic.tags.includes(tag)) {
-        newTopic.tags.push(tag)
-      }
-      tagInputVisible.value = false
-      tagInputValue.value = ''
-    }
-    
-    const removeTopicTag = (tag) => {
-      const index = newTopic.tags.indexOf(tag)
-      if (index > -1) {
-        newTopic.tags.splice(index, 1)
-      }
-    }
-    
-    const handleCloseDialog = () => {
-      if (newTopic.title || newTopic.content) {
-        ElMessageBox.confirm(
-          '确定要关闭吗?未保存的内容将会丢失。',
-          '提示',
-          {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
-            type: 'warning'
-          }
-        ).then(() => {
-          resetForm()
-          showNewTopicDialog.value = false
-        }).catch(() => {
-          // 用户取消
-        })
-      } else {
-        resetForm()
-        showNewTopicDialog.value = false
-      }
-    }
-    
-    const submitNewTopic = async () => {
-      try {
-        await topicFormRef.value?.validate()
-        
-        submitting.value = true
-        
-        // 模拟提交过程
-        await new Promise(resolve => setTimeout(resolve, 1500))
-        
-        ElMessage.success('主题发布成功!')
-        resetForm()
-        showNewTopicDialog.value = false
-        
-        // 刷新主题列表
-        fetchTopics()
-        
-      } catch (error) {
-        console.error('表单验证失败:', error)
-      } finally {
-        submitting.value = false
-      }
-    }
-    
-    const resetForm = () => {
-      topicFormRef.value?.resetFields()
-      newTopic.title = ''
-      newTopic.content = ''
-      newTopic.tags = []
-      newTopic.options = []
-    }
-    
-    return {
-      loading,
-      showNewTopicDialog,
-      submitting,
-      tagInputVisible,
-      tagInputValue,
-      searchQuery,
-      sortBy,
-      filterType,
-      currentPage,
-      pageSize,
-      totalTopics,
-      sectionInfo,
-      pinnedTopics,
-      topics,
-      newTopic,
-      topicRules,
-      topicFormRef,
-      tagInputRef,
-      formatTime,
-      navigateToTopic,
-      handleSearch,
-      handleFilter,
-      handleSizeChange,
-      handleCurrentChange,
-      showTagInput,
-      addTopicTag,
-      removeTopicTag,
-      handleCloseDialog,
-      submitNewTopic,
-      Edit,
-      Search,
-      ChatDotRound,
-      Comment,
-      User,
-      View,
-      Top,
-      ChatLineRound,
-      Film,
-      Headphones,
-      Monitor,
-      GamePad,
-      Bell,
-      QuestionFilled
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.section-page {
-  max-width: 1200px;
-  margin: 0 auto;
-  padding: 24px;
-  background: #f5f5f5;
-  min-height: 100vh;
-}
-
-.breadcrumb {
-  margin-bottom: 16px;
-}
-
-.section-header {
-  background: #fff;
-  border-radius: 12px;
-  padding: 32px;
-  margin-bottom: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  gap: 24px;
-  
-  .section-info {
-    display: flex;
-    align-items: center;
-    gap: 20px;
-    flex: 1;
-    
-    .section-details {
-      .section-name {
-        font-size: 28px;
-        font-weight: 600;
-        color: #2c3e50;
-        margin: 0 0 8px 0;
-      }
-      
-      .section-description {
-        font-size: 16px;
-        color: #7f8c8d;
-        margin: 0 0 16px 0;
-      }
-      
-      .section-stats {
-        display: flex;
-        gap: 24px;
-        
-        .stat-item {
-          display: flex;
-          align-items: center;
-          gap: 8px;
-          font-size: 14px;
-          color: #606266;
-        }
-      }
-    }
-  }
-  
-  .section-actions {
-    flex-shrink: 0;
-  }
-}
-
-.filter-section {
-  background: #fff;
-  border-radius: 12px;
-  padding: 20px 24px;
-  margin-bottom: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  gap: 20px;
-  
-  .filter-left {
-    display: flex;
-    align-items: center;
-    gap: 12px;
-  }
-  
-  .filter-right {
-    display: flex;
-    align-items: center;
-    gap: 12px;
-    
-    .el-select {
-      width: 120px;
-    }
-  }
-}
-
-.pinned-topics, .normal-topics {
-  background: #fff;
-  border-radius: 12px;
-  padding: 24px;
-  margin-bottom: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  .section-header {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: 20px;
-    background: none;
-    padding: 0;
-    box-shadow: none;
-    
-    .section-title {
-      font-size: 18px;
-      font-weight: 600;
-      color: #2c3e50;
-      margin: 0;
-    }
-    
-    .results-info {
-      font-size: 14px;
-      color: #909399;
-    }
-  }
-}
-
-.topics-list {
-  .topic-item {
-    display: flex;
-    align-items: center;
-    gap: 16px;
-    padding: 16px;
-    border: 1px solid #f0f0f0;
-    border-radius: 8px;
-    margin-bottom: 12px;
-    cursor: pointer;
-    transition: all 0.3s ease;
-    
-    &:hover {
-      background: #f8f9fa;
-      border-color: #409eff;
-      transform: translateX(2px);
-    }
-    
-    &.pinned {
-      background: linear-gradient(90deg, #fff7e6 0%, #fff 100%);
-      border-color: #e6a23c;
-    }
-    
-    .topic-status {
-      width: 32px;
-      text-align: center;
-      
-      .pin-icon {
-        color: #e6a23c;
-      }
-      
-      .new-icon {
-        animation: pulse 2s infinite;
-      }
-    }
-    
-    .topic-content {
-      flex: 1;
-      
-      .topic-header {
-        display: flex;
-        align-items: center;
-        gap: 12px;
-        margin-bottom: 8px;
-        
-        .topic-title {
-          font-size: 16px;
-          font-weight: 500;
-          color: #2c3e50;
-          margin: 0;
-          flex: 1;
-          
-          &:hover {
-            color: #409eff;
-          }
-        }
-        
-        .topic-tags {
-          .el-tag {
-            margin-left: 4px;
-          }
-        }
-      }
-      
-      .topic-meta {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        
-        .author-info {
-          display: flex;
-          align-items: center;
-          gap: 8px;
-          
-          .author-name {
-            font-size: 14px;
-            font-weight: 500;
-            color: #606266;
-          }
-          
-          .create-time {
-            font-size: 12px;
-            color: #909399;
-          }
-        }
-        
-        .topic-stats {
-          display: flex;
-          gap: 16px;
-          
-          .stat-item {
-            display: flex;
-            align-items: center;
-            gap: 4px;
-            font-size: 12px;
-            color: #909399;
-          }
-        }
-      }
-    }
-    
-    .last-reply {
-      width: 150px;
-      text-align: right;
-      
-      .reply-info {
-        .reply-author {
-          font-size: 14px;
-          font-weight: 500;
-          color: #606266;
-          margin-bottom: 4px;
-        }
-        
-        .reply-time {
-          font-size: 12px;
-          color: #909399;
-        }
-      }
-      
-      .no-reply {
-        font-size: 12px;
-        color: #c0c4cc;
-      }
-    }
-  }
-  
-  .no-topics {
-    text-align: center;
-    color: #909399;
-    padding: 60px 0;
-    font-size: 16px;
-  }
-}
-
-.pagination-wrapper {
-  margin-top: 24px;
-  text-align: center;
-}
-
-.tags-input {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 8px;
-  align-items: center;
-  
-  .el-tag {
-    margin: 0;
-  }
-}
-
-@keyframes pulse {
-  0% {
-    transform: scale(1);
-  }
-  50% {
-    transform: scale(1.1);
-  }
-  100% {
-    transform: scale(1);
-  }
-}
-
-@media (max-width: 768px) {
-  .section-page {
-    padding: 16px;
-  }
-  
-  .section-header {
-    flex-direction: column;
-    align-items: flex-start;
-    gap: 16px;
-    
-    .section-info {
-      flex-direction: column;
-      text-align: center;
-      
-      .section-stats {
-        justify-content: center;
-      }
-    }
-    
-    .section-actions {
-      width: 100%;
-      text-align: center;
-    }
-  }
-  
-  .filter-section {
-    flex-direction: column;
-    gap: 16px;
-    
-    .filter-left, .filter-right {
-      width: 100%;
-      justify-content: center;
-    }
-    
-    .filter-right {
-      .el-select {
-        width: 140px;
-      }
-    }
-  }
-  
-  .topic-item {
-    flex-direction: column;
-    align-items: flex-start;
-    gap: 12px;
-    
-    .topic-status {
-      align-self: flex-start;
-    }
-    
-    .topic-content {
-      width: 100%;
-      
-      .topic-meta {
-        flex-direction: column;
-        align-items: flex-start;
-        gap: 8px;
-      }
-    }
-    
-    .last-reply {
-      width: 100%;
-      text-align: left;
-    }
-  }
-}
+<template>

+  <div class="section-page">

+    <div class="page-container">

+      <!-- 面包屑导航 -->

+      <div class="breadcrumb">

+        <el-breadcrumb separator="/">

+          <el-breadcrumb-item :to="{ path: '/forum' }">论坛首页</el-breadcrumb-item>

+          <el-breadcrumb-item>{{ sectionInfo.name }}</el-breadcrumb-item>

+        </el-breadcrumb>

+      </div>

+

+      <!-- 版块信息 -->

+      <div class="section-header">

+        <div class="section-info">

+          <div class="section-icon">

+            <el-icon size="48" :color="sectionInfo.color">

+              <component :is="sectionInfo.icon" />

+            </el-icon>

+          </div>

+          <div class="section-details">

+            <h1 class="section-name">{{ sectionInfo.name }}</h1>

+            <p class="section-description">{{ sectionInfo.description }}</p>

+            <div class="section-stats">

+              <div class="stat-item">

+                <el-icon><ChatDotRound /></el-icon>

+                <span>{{ sectionInfo.topics }} 主题</span>

+              </div>

+              <div class="stat-item">

+                <el-icon><Comment /></el-icon>

+                <span>{{ sectionInfo.replies }} 回复</span>

+              </div>

+              <div class="stat-item">

+                <el-icon><User /></el-icon>

+                <span>{{ sectionInfo.members }} 成员</span>

+              </div>

+            </div>

+          </div>

+        </div>

+        

+        <div class="section-actions">

+          <el-button type="primary" :icon="Edit" @click="showNewTopicDialog = true">

+            发布新主题

+          </el-button>

+        </div>

+      </div>

+

+      <!-- 筛选和搜索 -->

+      <div class="filter-section">

+        <div class="filter-left">

+          <el-input

+            v-model="searchQuery"

+            placeholder="搜索主题..."

+            :prefix-icon="Search"

+            @keyup.enter="handleSearch"

+            clearable

+            style="width: 300px;"

+          />

+          <el-button type="primary" @click="handleSearch">搜索</el-button>

+        </div>

+        

+        <div class="filter-right">

+          <el-select v-model="sortBy" placeholder="排序方式" @change="handleFilter">

+            <el-option label="最新回复" value="last_reply" />

+            <el-option label="发布时间" value="create_time" />

+            <el-option label="回复数量" value="replies" />

+            <el-option label="浏览次数" value="views" />

+          </el-select>

+          

+          <el-select v-model="filterType" placeholder="主题类型" @change="handleFilter">

+            <el-option label="全部主题" value="" />

+            <el-option label="置顶主题" value="pinned" />

+            <el-option label="热门主题" value="hot" />

+            <el-option label="精华主题" value="featured" />

+          </el-select>

+        </div>

+      </div>

+

+      <!-- 置顶主题 -->

+      <div v-if="pinnedTopics.length > 0" class="pinned-topics">

+        <h3 class="section-title">置顶主题</h3>

+        <div class="topics-list">

+          <div

+            v-for="topic in pinnedTopics"

+            :key="topic.id"

+            class="topic-item pinned"

+            @click="navigateToTopic(topic.id)"

+          >

+            <div class="topic-status">

+              <el-icon class="pin-icon"><Top /></el-icon>

+            </div>

+            

+            <div class="topic-content">

+              <div class="topic-header">

+                <h4 class="topic-title">{{ topic.title }}</h4>

+                <div class="topic-tags">

+                  <el-tag type="warning" size="small">置顶</el-tag>

+                  <el-tag v-if="topic.hot" type="danger" size="small">热门</el-tag>

+                  <el-tag v-if="topic.featured" type="success" size="small">精华</el-tag>

+                </div>

+              </div>

+              

+              <div class="topic-meta">

+                <div class="author-info">

+                  <el-avatar :size="24">{{ topic.author.charAt(0) }}</el-avatar>

+                  <span class="author-name">{{ topic.author }}</span>

+                  <span class="create-time">{{ formatTime(topic.createTime) }}</span>

+                </div>

+                

+                <div class="topic-stats">

+                  <span class="stat-item">

+                    <el-icon><View /></el-icon>

+                    {{ topic.views }}

+                  </span>

+                  <span class="stat-item">

+                    <el-icon><Comment /></el-icon>

+                    {{ topic.replies }}

+                  </span>

+                </div>

+              </div>

+            </div>

+            

+            <div class="last-reply">

+              <div v-if="topic.lastReply" class="reply-info">

+                <div class="reply-author">{{ topic.lastReply.author }}</div>

+                <div class="reply-time">{{ formatTime(topic.lastReply.time) }}</div>

+              </div>

+            </div>

+          </div>

+        </div>

+      </div>

+

+      <!-- 普通主题列表 -->

+      <div class="normal-topics">

+        <div class="section-header">

+          <h3 class="section-title">主题列表</h3>

+          <div class="results-info">

+            共 {{ totalTopics }} 个主题

+          </div>

+        </div>

+        

+        <div class="topics-list" v-loading="loading">

+          <div

+            v-for="topic in topics"

+            :key="topic.id"

+            class="topic-item"

+            @click="navigateToTopic(topic.id)"

+          >

+            <div class="topic-status">

+              <el-icon v-if="topic.hasNewReplies" class="new-icon" color="#f56c6c">

+                <ChatDotRound />

+              </el-icon>

+              <el-icon v-else class="normal-icon" color="#909399">

+                <ChatLineRound />

+              </el-icon>

+            </div>

+            

+            <div class="topic-content">

+              <div class="topic-header">

+                <h4 class="topic-title">{{ topic.title }}</h4>

+                <div class="topic-tags">

+                  <el-tag v-if="topic.hot" type="danger" size="small">热门</el-tag>

+                  <el-tag v-if="topic.featured" type="success" size="small">精华</el-tag>

+                  <el-tag v-if="topic.closed" type="info" size="small">已关闭</el-tag>

+                </div>

+              </div>

+              

+              <div class="topic-meta">

+                <div class="author-info">

+                  <el-avatar :size="24">{{ topic.author.charAt(0) }}</el-avatar>

+                  <span class="author-name">{{ topic.author }}</span>

+                  <span class="create-time">{{ formatTime(topic.createTime) }}</span>

+                </div>

+                

+                <div class="topic-stats">

+                  <span class="stat-item">

+                    <el-icon><View /></el-icon>

+                    {{ topic.views }}

+                  </span>

+                  <span class="stat-item">

+                    <el-icon><Comment /></el-icon>

+                    {{ topic.replies }}

+                  </span>

+                </div>

+              </div>

+            </div>

+            

+            <div class="last-reply">

+              <div v-if="topic.lastReply" class="reply-info">

+                <div class="reply-author">{{ topic.lastReply.author }}</div>

+                <div class="reply-time">{{ formatTime(topic.lastReply.time) }}</div>

+              </div>

+              <div v-else class="no-reply">暂无回复</div>

+            </div>

+          </div>

+          

+          <div v-if="topics.length === 0 && !loading" class="no-topics">

+            暂无主题,快来发布第一个主题吧!

+          </div>

+        </div>

+        

+        <!-- 分页 -->

+        <div class="pagination-wrapper">

+          <el-pagination

+            v-model:current-page="currentPage"

+            v-model:page-size="pageSize"

+            :page-sizes="[20, 50, 100]"

+            :total="totalTopics"

+            layout="total, sizes, prev, pager, next, jumper"

+            @size-change="handleSizeChange"

+            @current-change="handleCurrentChange"

+          />

+        </div>

+      </div>

+    </div>

+

+    <!-- 发布新主题对话框 -->

+    <el-dialog

+      v-model="showNewTopicDialog"

+      title="发布新主题"

+      width="600px"

+      :before-close="handleCloseDialog"

+    >

+      <el-form

+        ref="topicFormRef"

+        :model="newTopic"

+        :rules="topicRules"

+        label-width="80px"

+      >

+        <el-form-item label="主题标题" prop="title">

+          <el-input

+            v-model="newTopic.title"

+            placeholder="请输入主题标题"

+            maxlength="100"

+            show-word-limit

+          />

+        </el-form-item>

+        

+        <el-form-item label="主题标签">

+          <div class="tags-input">

+            <el-tag

+              v-for="tag in newTopic.tags"

+              :key="tag"

+              closable

+              @close="removeTopicTag(tag)"

+            >

+              {{ tag }}

+            </el-tag>

+            <el-input

+              v-if="tagInputVisible"

+              ref="tagInputRef"

+              v-model="tagInputValue"

+              size="small"

+              @keyup.enter="addTopicTag"

+              @blur="addTopicTag"

+              style="width: 100px;"

+            />

+            <el-button

+              v-else

+              size="small"

+              @click="showTagInput"

+            >

+              + 添加标签

+            </el-button>

+          </div>

+        </el-form-item>

+        

+        <el-form-item label="主题内容" prop="content">

+          <el-input

+            v-model="newTopic.content"

+            type="textarea"

+            :rows="8"

+            placeholder="请输入主题内容..."

+            maxlength="5000"

+            show-word-limit

+          />

+        </el-form-item>

+        

+        <el-form-item label="主题选项">

+          <el-checkbox-group v-model="newTopic.options">

+            <el-checkbox label="hot">申请热门</el-checkbox>

+            <el-checkbox label="featured">申请精华</el-checkbox>

+          </el-checkbox-group>

+        </el-form-item>

+      </el-form>

+      

+      <template #footer>

+        <el-button @click="handleCloseDialog">取消</el-button>

+        <el-button type="primary" @click="submitNewTopic" :loading="submitting">

+          发布主题

+        </el-button>

+      </template>

+    </el-dialog>

+  </div>

+</template>

+

+<script>

+import { ref, reactive, onMounted, nextTick } from 'vue'

+import { useRoute, useRouter } from 'vue-router'

+import { ElMessage, ElMessageBox } from 'element-plus'

+import {

+  Edit,

+  Search,

+  ChatDotRound,

+  Comment,

+  User,

+  View,

+  Top,

+  ChatLineRound,

+  Film,

+  Headphones,

+  Monitor,

+  GamePad,

+  Bell,

+  QuestionFilled

+} from '@element-plus/icons-vue'

+

+export default {

+  name: 'ForumSectionView',

+  setup() {

+    const route = useRoute()

+    const router = useRouter()

+    const topicFormRef = ref(null)

+    const tagInputRef = ref(null)

+    

+    const loading = ref(false)

+    const showNewTopicDialog = ref(false)

+    const submitting = ref(false)

+    const tagInputVisible = ref(false)

+    const tagInputValue = ref('')

+    

+    const searchQuery = ref('')

+    const sortBy = ref('last_reply')

+    const filterType = ref('')

+    const currentPage = ref(1)

+    const pageSize = ref(20)

+    const totalTopics = ref(0)

+    

+    const sectionInfo = ref({

+      id: 1,

+      name: '电影讨论',

+      description: '分享和讨论电影资源,交流观影心得',

+      icon: 'Film',

+      color: '#409eff',

+      topics: 3256,

+      replies: 18934,

+      members: 1234

+    })

+    

+    const newTopic = reactive({

+      title: '',

+      content: '',

+      tags: [],

+      options: []

+    })

+    

+    const topicRules = {

+      title: [

+        { required: true, message: '请输入标题', trigger: 'blur' },

+        { min: 5, max: 100, message: '标题长度在 5 到 100 个字符', trigger: 'blur' }

+      ],

+      content: [

+        { required: true, message: '请输入内容', trigger: 'blur' },

+        { min: 10, max: 5000, message: '内容长度在 10 到 5000 个字符', trigger: 'blur' }

+      ]

+    }

+    

+    const pinnedTopics = ref([

+      {

+        id: 1,

+        title: '【公告】本版块发帖规则和注意事项',

+        author: 'Admin',

+        createTime: '2025-05-01T10:00:00',

+        views: 5678,

+        replies: 23,

+        hot: false,

+        featured: true,

+        lastReply: {

+          author: 'User123',

+          time: '2025-06-02T15:30:00'

+        }

+      }

+    ])

+    

+    const topics = ref([

+      {

+        id: 2,

+        title: '2024年度最佳科幻电影推荐榜单',

+        author: 'SciFiFan',

+        createTime: '2025-06-03T10:30:00',

+        views: 1234,

+        replies: 45,

+        hot: true,

+        featured: false,

+        closed: false,

+        hasNewReplies: true,

+        lastReply: {

+          author: 'MovieLover',

+          time: '2025-06-03T14:25:00'

+        }

+      },

+      {

+        id: 3,

+        title: '阿凡达2:水之道 观影感受分享',

+        author: 'Avatar2Fan',

+        createTime: '2025-06-02T16:45:00',

+        views: 892,

+        replies: 67,

+        hot: false,

+        featured: true,

+        closed: false,

+        hasNewReplies: false,

+        lastReply: {

+          author: 'CinemaExpert',

+          time: '2025-06-03T12:10:00'

+        }

+      },

+      {

+        id: 4,

+        title: '求推荐几部好看的悬疑电影',

+        author: 'SuspenseLover',

+        createTime: '2025-06-01T09:20:00',

+        views: 456,

+        replies: 23,

+        hot: false,

+        featured: false,

+        closed: false,

+        hasNewReplies: true,

+        lastReply: {

+          author: 'ThrillerFan',

+          time: '2025-06-03T11:45:00'

+        }

+      }

+    ])

+    

+    onMounted(() => {

+      const sectionId = route.params.id

+      fetchSectionData(sectionId)

+    })

+    

+    const fetchSectionData = async (id) => {

+      loading.value = true

+      try {

+        // 模拟API调用

+        console.log('获取版块数据:', id)

+        

+        // 根据版块ID设置不同的版块信息

+        const sections = {

+          1: { name: '电影讨论', description: '分享和讨论电影资源,交流观影心得', icon: 'Film', color: '#409eff' },

+          2: { name: '音乐分享', description: '音乐资源分享,音乐制作技术交流', icon: 'Headphones', color: '#67c23a' },

+          3: { name: '软件技术', description: '软件资源分享,技术问题讨论', icon: 'Monitor', color: '#e6a23c' },

+          4: { name: '游戏天地', description: '游戏资源分享,游戏攻略讨论', icon: 'GamePad', color: '#f56c6c' },

+          5: { name: '站务公告', description: '网站公告,规则说明,意见建议', icon: 'Bell', color: '#909399' },

+          6: { name: '新手求助', description: '新手问题解答,使用教程分享', icon: 'QuestionFilled', color: '#606266' }

+        }

+        

+        const sectionData = sections[id] || sections[1]

+        sectionInfo.value = {

+          id: parseInt(id),

+          ...sectionData,

+          topics: 3256,

+          replies: 18934,

+          members: 1234

+        }

+        

+        totalTopics.value = 156

+        

+      } catch (error) {

+        ElMessage.error('获取版块数据失败')

+      } finally {

+        loading.value = false

+      }

+    }

+    

+    const formatTime = (timeString) => {

+      const date = new Date(timeString)

+      const now = new Date()

+      const diff = now - date

+      const hours = Math.floor(diff / (1000 * 60 * 60))

+      

+      if (hours < 1) return '刚刚'

+      if (hours < 24) return `${hours}小时前`

+      const days = Math.floor(hours / 24)

+      if (days < 7) return `${days}天前`

+      

+      return date.toLocaleDateString('zh-CN', {

+        month: '2-digit',

+        day: '2-digit',

+        hour: '2-digit',

+        minute: '2-digit'

+      })

+    }

+    

+    const navigateToTopic = (topicId) => {

+      router.push(`/forum/topic/${topicId}`)

+    }

+    

+    const handleSearch = () => {

+      currentPage.value = 1

+      fetchTopics()

+    }

+    

+    const handleFilter = () => {

+      currentPage.value = 1

+      fetchTopics()

+    }

+    

+    const fetchTopics = async () => {

+      loading.value = true

+      try {

+        // 模拟API调用

+        await new Promise(resolve => setTimeout(resolve, 500))

+        console.log('获取主题列表:', { searchQuery: searchQuery.value, sortBy: sortBy.value, filterType: filterType.value })

+      } catch (error) {

+        ElMessage.error('获取主题列表失败')

+      } finally {

+        loading.value = false

+      }

+    }

+    

+    const handleSizeChange = (size) => {

+      pageSize.value = size

+      currentPage.value = 1

+      fetchTopics()

+    }

+    

+    const handleCurrentChange = (page) => {

+      currentPage.value = page

+      fetchTopics()

+    }

+    

+    const showTagInput = () => {

+      tagInputVisible.value = true

+      nextTick(() => {

+        tagInputRef.value?.focus()

+      })

+    }

+    

+    const addTopicTag = () => {

+      const tag = tagInputValue.value.trim()

+      if (tag && !newTopic.tags.includes(tag)) {

+        newTopic.tags.push(tag)

+      }

+      tagInputVisible.value = false

+      tagInputValue.value = ''

+    }

+    

+    const removeTopicTag = (tag) => {

+      const index = newTopic.tags.indexOf(tag)

+      if (index > -1) {

+        newTopic.tags.splice(index, 1)

+      }

+    }

+    

+    const handleCloseDialog = () => {

+      if (newTopic.title || newTopic.content) {

+        ElMessageBox.confirm(

+          '确定要关闭吗?未保存的内容将会丢失。',

+          '提示',

+          {

+            confirmButtonText: '确定',

+            cancelButtonText: '取消',

+            type: 'warning'

+          }

+        ).then(() => {

+          resetForm()

+          showNewTopicDialog.value = false

+        }).catch(() => {

+          // 用户取消

+        })

+      } else {

+        resetForm()

+        showNewTopicDialog.value = false

+      }

+    }

+    

+    const submitNewTopic = async () => {

+      try {

+        await topicFormRef.value?.validate()

+        

+        submitting.value = true

+        

+        // 模拟提交过程

+        await new Promise(resolve => setTimeout(resolve, 1500))

+        

+        ElMessage.success('主题发布成功!')

+        resetForm()

+        showNewTopicDialog.value = false

+        

+        // 刷新主题列表

+        fetchTopics()

+        

+      } catch (error) {

+        console.error('表单验证失败:', error)

+      } finally {

+        submitting.value = false

+      }

+    }

+    

+    const resetForm = () => {

+      topicFormRef.value?.resetFields()

+      newTopic.title = ''

+      newTopic.content = ''

+      newTopic.tags = []

+      newTopic.options = []

+    }

+    

+    return {

+      loading,

+      showNewTopicDialog,

+      submitting,

+      tagInputVisible,

+      tagInputValue,

+      searchQuery,

+      sortBy,

+      filterType,

+      currentPage,

+      pageSize,

+      totalTopics,

+      sectionInfo,

+      pinnedTopics,

+      topics,

+      newTopic,

+      topicRules,

+      topicFormRef,

+      tagInputRef,

+      formatTime,

+      navigateToTopic,

+      handleSearch,

+      handleFilter,

+      handleSizeChange,

+      handleCurrentChange,

+      showTagInput,

+      addTopicTag,

+      removeTopicTag,

+      handleCloseDialog,

+      submitNewTopic,

+      Edit,

+      Search,

+      ChatDotRound,

+      Comment,

+      User,

+      View,

+      Top,

+      ChatLineRound,

+      Film,

+      Headphones,

+      Monitor,

+      GamePad,

+      Bell,

+      QuestionFilled

+    }

+  }

+}

+</script>

+

+<style lang="scss" scoped>

+.section-page {

+  max-width: 1200px;

+  margin: 0 auto;

+  padding: 24px;

+  background: #f5f5f5;

+  min-height: 100vh;

+}

+

+.breadcrumb {

+  margin-bottom: 16px;

+}

+

+.section-header {

+  background: #fff;

+  border-radius: 12px;

+  padding: 32px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  display: flex;

+  justify-content: space-between;

+  align-items: center;

+  gap: 24px;

+  

+  .section-info {

+    display: flex;

+    align-items: center;

+    gap: 20px;

+    flex: 1;

+    

+    .section-details {

+      .section-name {

+        font-size: 28px;

+        font-weight: 600;

+        color: #2c3e50;

+        margin: 0 0 8px 0;

+      }

+      

+      .section-description {

+        font-size: 16px;

+        color: #7f8c8d;

+        margin: 0 0 16px 0;

+      }

+      

+      .section-stats {

+        display: flex;

+        gap: 24px;

+        

+        .stat-item {

+          display: flex;

+          align-items: center;

+          gap: 8px;

+          font-size: 14px;

+          color: #606266;

+        }

+      }

+    }

+  }

+  

+  .section-actions {

+    flex-shrink: 0;

+  }

+}

+

+.filter-section {

+  background: #fff;

+  border-radius: 12px;

+  padding: 20px 24px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  display: flex;

+  justify-content: space-between;

+  align-items: center;

+  gap: 20px;

+  

+  .filter-left {

+    display: flex;

+    align-items: center;

+    gap: 12px;

+  }

+  

+  .filter-right {

+    display: flex;

+    align-items: center;

+    gap: 12px;

+    

+    .el-select {

+      width: 120px;

+    }

+  }

+}

+

+.pinned-topics, .normal-topics {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  .section-header {

+    display: flex;

+    justify-content: space-between;

+    align-items: center;

+    margin-bottom: 20px;

+    background: none;

+    padding: 0;

+    box-shadow: none;

+    

+    .section-title {

+      font-size: 18px;

+      font-weight: 600;

+      color: #2c3e50;

+      margin: 0;

+    }

+    

+    .results-info {

+      font-size: 14px;

+      color: #909399;

+    }

+  }

+}

+

+.topics-list {

+  .topic-item {

+    display: flex;

+    align-items: center;

+    gap: 16px;

+    padding: 16px;

+    border: 1px solid #f0f0f0;

+    border-radius: 8px;

+    margin-bottom: 12px;

+    cursor: pointer;

+    transition: all 0.3s ease;

+    

+    &:hover {

+      background: #f8f9fa;

+      border-color: #409eff;

+      transform: translateX(2px);

+    }

+    

+    &.pinned {

+      background: linear-gradient(90deg, #fff7e6 0%, #fff 100%);

+      border-color: #e6a23c;

+    }

+    

+    .topic-status {

+      width: 32px;

+      text-align: center;

+      

+      .pin-icon {

+        color: #e6a23c;

+      }

+      

+      .new-icon {

+        animation: pulse 2s infinite;

+      }

+    }

+    

+    .topic-content {

+      flex: 1;

+      

+      .topic-header {

+        display: flex;

+        align-items: center;

+        gap: 12px;

+        margin-bottom: 8px;

+        

+        .topic-title {

+          font-size: 16px;

+          font-weight: 500;

+          color: #2c3e50;

+          margin: 0;

+          flex: 1;

+          

+          &:hover {

+            color: #409eff;

+          }

+        }

+        

+        .topic-tags {

+          .el-tag {

+            margin-left: 4px;

+          }

+        }

+      }

+      

+      .topic-meta {

+        display: flex;

+        justify-content: space-between;

+        align-items: center;

+        

+        .author-info {

+          display: flex;

+          align-items: center;

+          gap: 8px;

+          

+          .author-name {

+            font-size: 14px;

+            font-weight: 500;

+            color: #606266;

+          }

+          

+          .create-time {

+            font-size: 12px;

+            color: #909399;

+          }

+        }

+        

+        .topic-stats {

+          display: flex;

+          gap: 16px;

+          

+          .stat-item {

+            display: flex;

+            align-items: center;

+            gap: 4px;

+            font-size: 12px;

+            color: #909399;

+          }

+        }

+      }

+    }

+    

+    .last-reply {

+      width: 150px;

+      text-align: right;

+      

+      .reply-info {

+        .reply-author {

+          font-size: 14px;

+          font-weight: 500;

+          color: #606266;

+          margin-bottom: 4px;

+        }

+        

+        .reply-time {

+          font-size: 12px;

+          color: #909399;

+        }

+      }

+      

+      .no-reply {

+        font-size: 12px;

+        color: #c0c4cc;

+      }

+    }

+  }

+  

+  .no-topics {

+    text-align: center;

+    color: #909399;

+    padding: 60px 0;

+    font-size: 16px;

+  }

+}

+

+.pagination-wrapper {

+  margin-top: 24px;

+  text-align: center;

+}

+

+.tags-input {

+  display: flex;

+  flex-wrap: wrap;

+  gap: 8px;

+  align-items: center;

+  

+  .el-tag {

+    margin: 0;

+  }

+}

+

+@keyframes pulse {

+  0% {

+    transform: scale(1);

+  }

+  50% {

+    transform: scale(1.1);

+  }

+  100% {

+    transform: scale(1);

+  }

+}

+

+@media (max-width: 768px) {

+  .section-page {

+    padding: 16px;

+  }

+  

+  .section-header {

+    flex-direction: column;

+    align-items: flex-start;

+    gap: 16px;

+    

+    .section-info {

+      flex-direction: column;

+      text-align: center;

+      

+      .section-stats {

+        justify-content: center;

+      }

+    }

+    

+    .section-actions {

+      width: 100%;

+      text-align: center;

+    }

+  }

+  

+  .filter-section {

+    flex-direction: column;

+    gap: 16px;

+    

+    .filter-left, .filter-right {

+      width: 100%;

+      justify-content: center;

+    }

+    

+    .filter-right {

+      .el-select {

+        width: 140px;

+      }

+    }

+  }

+  

+  .topic-item {

+    flex-direction: column;

+    align-items: flex-start;

+    gap: 12px;

+    

+    .topic-status {

+      align-self: flex-start;

+    }

+    

+    .topic-content {

+      width: 100%;

+      

+      .topic-meta {

+        flex-direction: column;

+        align-items: flex-start;

+        gap: 8px;

+      }

+    }

+    

+    .last-reply {

+      width: 100%;

+      text-align: left;

+    }

+  }

+}

 </style>
\ No newline at end of file
diff --git a/src/views/forum/ForumTopicView.vue b/src/views/forum/ForumTopicView.vue
index 027083f..e65b297 100644
--- a/src/views/forum/ForumTopicView.vue
+++ b/src/views/forum/ForumTopicView.vue
@@ -1,933 +1,933 @@
-<template>
-  <div class="topic-detail-page">
-    <div class="page-container">
-      <!-- 面包屑导航 -->
-      <div class="breadcrumb">
-        <el-breadcrumb separator="/">
-          <el-breadcrumb-item :to="{ path: '/forum' }">论坛首页</el-breadcrumb-item>
-          <el-breadcrumb-item :to="{ path: `/forum/section/${topic.sectionId}` }">
-            {{ topic.sectionName }}
-          </el-breadcrumb-item>
-          <el-breadcrumb-item>{{ topic.title }}</el-breadcrumb-item>
-        </el-breadcrumb>
-      </div>
-
-      <!-- 主题信息 -->
-      <div class="topic-header">
-        <div class="topic-info">
-          <div class="topic-title-row">
-            <h1 class="topic-title">{{ topic.title }}</h1>
-            <div class="topic-status">
-              <el-tag v-if="topic.pinned" type="warning" size="small">置顶</el-tag>
-              <el-tag v-if="topic.hot" type="danger" size="small">热门</el-tag>
-              <el-tag v-if="topic.closed" type="info" size="small">已关闭</el-tag>
-            </div>
-          </div>
-          
-          <div class="topic-tags">
-            <el-tag
-              v-for="tag in topic.tags"
-              :key="tag"
-              size="small"
-              type="info"
-              effect="plain"
-            >
-              {{ tag }}
-            </el-tag>
-          </div>
-          
-          <div class="topic-meta">
-            <div class="author-info">
-              <el-avatar :size="32">{{ topic.author.charAt(0) }}</el-avatar>
-              <div class="author-details">
-                <span class="author-name">{{ topic.author }}</span>
-                <span class="post-time">发表于 {{ formatDateTime(topic.createTime) }}</span>
-              </div>
-            </div>
-            
-            <div class="topic-stats">
-              <div class="stat-item">
-                <el-icon><View /></el-icon>
-                <span>{{ topic.views }} 浏览</span>
-              </div>
-              <div class="stat-item">
-                <el-icon><Comment /></el-icon>
-                <span>{{ topic.replies }} 回复</span>
-              </div>
-            </div>
-          </div>
-        </div>
-        
-        <div class="topic-actions">
-          <el-button 
-            v-if="!topic.closed" 
-            type="primary" 
-            :icon="Edit" 
-            @click="showReplyDialog = true"
-          >
-            回复主题
-          </el-button>
-          <el-dropdown @command="handleTopicAction">
-            <el-button :icon="More">
-              更多 <el-icon class="el-icon--right"><ArrowDown /></el-icon>
-            </el-button>
-            <template #dropdown>
-              <el-dropdown-menu>
-                <el-dropdown-item command="favorite">
-                  {{ isFavorited ? '取消收藏' : '收藏主题' }}
-                </el-dropdown-item>
-                <el-dropdown-item command="share">分享主题</el-dropdown-item>
-                <el-dropdown-item command="report" divided>举报主题</el-dropdown-item>
-              </el-dropdown-menu>
-            </template>
-          </el-dropdown>
-        </div>
-      </div>
-
-      <!-- 主题内容和回复列表 -->
-      <div class="posts-container">
-        <!-- 主楼 -->
-        <div class="post-item main-post">
-          <div class="post-header">
-            <div class="floor-number">#1</div>
-            <div class="post-author">
-              <el-avatar :size="48">{{ topic.author.charAt(0) }}</el-avatar>
-              <div class="author-info">
-                <span class="author-name">{{ topic.author }}</span>
-                <span class="author-title">{{ topic.authorTitle || '会员' }}</span>
-                <div class="author-stats">
-                  <span>帖子: {{ topic.authorPosts || 0 }}</span>
-                  <span>声望: {{ topic.authorReputation || 0 }}</span>
-                </div>
-              </div>
-            </div>
-            <div class="post-time">
-              {{ formatDateTime(topic.createTime) }}
-            </div>
-          </div>
-          
-          <div class="post-content">
-            <div class="content-text" v-html="formatContent(topic.content)"></div>
-          </div>
-          
-          <div class="post-actions">
-            <el-button type="text" size="small" @click="likePost(topic.id)">
-              <el-icon><Like /></el-icon>
-              {{ topic.likes || 0 }}
-            </el-button>
-            <el-button type="text" size="small" @click="quotePost(topic)">
-              <el-icon><ChatDotRound /></el-icon>
-              引用
-            </el-button>
-            <el-button type="text" size="small" @click="reportPost(topic.id)">
-              <el-icon><Flag /></el-icon>
-              举报
-            </el-button>
-          </div>
-        </div>
-
-        <!-- 回复列表 -->
-        <div
-          v-for="(reply, index) in replies"
-          :key="reply.id"
-          class="post-item reply-post"
-        >
-          <div class="post-header">
-            <div class="floor-number">#{{ index + 2 }}</div>
-            <div class="post-author">
-              <el-avatar :size="48">{{ reply.author.charAt(0) }}</el-avatar>
-              <div class="author-info">
-                <span class="author-name">{{ reply.author }}</span>
-                <span class="author-title">{{ reply.authorTitle || '会员' }}</span>
-                <div class="author-stats">
-                  <span>帖子: {{ reply.authorPosts || 0 }}</span>
-                  <span>声望: {{ reply.authorReputation || 0 }}</span>
-                </div>
-              </div>
-            </div>
-            <div class="post-time">
-              {{ formatDateTime(reply.createTime) }}
-            </div>
-          </div>
-          
-          <div class="post-content">
-            <div v-if="reply.quotedPost" class="quoted-content">
-              <div class="quote-header">
-                <el-icon><ChatDotRound /></el-icon>
-                <span>{{ reply.quotedPost.author }} 发表于 {{ formatDateTime(reply.quotedPost.time) }}</span>
-              </div>
-              <div class="quote-text">{{ reply.quotedPost.content }}</div>
-            </div>
-            <div class="content-text" v-html="formatContent(reply.content)"></div>
-          </div>
-          
-          <div class="post-actions">
-            <el-button type="text" size="small" @click="likePost(reply.id)">
-              <el-icon><Like /></el-icon>
-              {{ reply.likes || 0 }}
-            </el-button>
-            <el-button type="text" size="small" @click="quotePost(reply)">
-              <el-icon><ChatDotRound /></el-icon>
-              引用
-            </el-button>
-            <el-button type="text" size="small" @click="reportPost(reply.id)">
-              <el-icon><Flag /></el-icon>
-              举报
-            </el-button>
-          </div>
-        </div>
-      </div>
-
-      <!-- 分页 -->
-      <div class="pagination-wrapper">
-        <el-pagination
-          v-model:current-page="currentPage"
-          v-model:page-size="pageSize"
-          :page-sizes="[10, 20, 50]"
-          :total="totalReplies"
-          layout="total, sizes, prev, pager, next, jumper"
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-        />
-      </div>
-
-      <!-- 快速回复 -->
-      <div v-if="!topic.closed" class="quick-reply">
-        <h3>快速回复</h3>
-        <el-input
-          v-model="quickReplyContent"
-          type="textarea"
-          :rows="4"
-          placeholder="输入你的回复..."
-          maxlength="2000"
-          show-word-limit
-        />
-        <div class="quick-reply-actions">
-          <el-button @click="clearQuickReply">清空</el-button>
-          <el-button type="primary" @click="submitQuickReply" :loading="submittingReply">
-            发表回复
-          </el-button>
-        </div>
-      </div>
-    </div>
-
-    <!-- 回复对话框 -->
-    <el-dialog
-      v-model="showReplyDialog"
-      title="回复主题"
-      width="700px"
-      :before-close="handleCloseReplyDialog"
-    >
-      <el-form
-        ref="replyFormRef"
-        :model="replyForm"
-        :rules="replyRules"
-        label-width="80px"
-      >
-        <el-form-item v-if="quotedContent" label="引用内容">
-          <div class="quoted-preview">
-            <div class="quote-header">
-              <span>{{ quotedContent.author }}</span>
-            </div>
-            <div class="quote-content">{{ quotedContent.content }}</div>
-            <el-button type="text" size="small" @click="clearQuote">
-              清除引用
-            </el-button>
-          </div>
-        </el-form-item>
-        
-        <el-form-item label="回复内容" prop="content">
-          <el-input
-            v-model="replyForm.content"
-            type="textarea"
-            :rows="8"
-            placeholder="请输入回复内容..."
-            maxlength="5000"
-            show-word-limit
-          />
-        </el-form-item>
-      </el-form>
-      
-      <template #footer>
-        <el-button @click="handleCloseReplyDialog">取消</el-button>
-        <el-button type="primary" @click="submitReply" :loading="submittingReply">
-          发表回复
-        </el-button>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import { ref, reactive, onMounted } from 'vue'
-import { useRoute, useRouter } from 'vue-router'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import {
-  Edit,
-  More,
-  View,
-  Comment,
-  Like,
-  ChatDotRound,
-  Flag,
-  ArrowDown
-} from '@element-plus/icons-vue'
-
-export default {
-  name: 'ForumTopicView',
-  setup() {
-    const route = useRoute()
-    const router = useRouter()
-    const replyFormRef = ref(null)
-    
-    const showReplyDialog = ref(false)
-    const submittingReply = ref(false)
-    const isFavorited = ref(false)
-    const currentPage = ref(1)
-    const pageSize = ref(20)
-    const totalReplies = ref(0)
-    const quickReplyContent = ref('')
-    const quotedContent = ref(null)
-    
-    const topic = ref({
-      id: 1,
-      title: '2024年度最佳PT站点推荐与对比分析',
-      sectionId: 1,
-      sectionName: '站务讨论',
-      author: 'PTExpert',
-      authorTitle: '资深会员',
-      authorPosts: 1256,
-      authorReputation: 2890,
-      createTime: '2025-06-01T10:30:00',
-      content: `
-        <p>大家好,作为一个使用PT站点多年的老用户,我想和大家分享一下2024年各大PT站点的使用体验和对比分析。</p>
-        
-        <h3>评测标准</h3>
-        <ul>
-          <li>资源丰富度:种子数量、更新速度、稀有资源</li>
-          <li>用户体验:界面设计、功能完善度、响应速度</li>
-          <li>社区氛围:用户活跃度、互帮互助程度</li>
-          <li>规则友好性:考核难度、分享率要求、保种要求</li>
-        </ul>
-        
-        <h3>推荐站点</h3>
-        <p>经过综合评测,以下几个站点值得推荐:</p>
-        <ol>
-          <li><strong>站点A</strong>:资源最全,更新最快,适合影视爱好者</li>
-          <li><strong>站点B</strong>:音乐资源丰富,无损居多,音质发烧友首选</li>
-          <li><strong>站点C</strong>:软件资源全面,更新及时,开发者必备</li>
-        </ol>
-        
-        <p>具体的详细评测报告我会在后续回复中逐一介绍,欢迎大家讨论和补充!</p>
-      `,
-      views: 2856,
-      replies: 147,
-      likes: 89,
-      tags: ['PT站点', '推荐', '对比'],
-      pinned: true,
-      hot: true,
-      closed: false
-    })
-    
-    const replies = ref([
-      {
-        id: 2,
-        author: 'MovieLover88',
-        authorTitle: '影视达人',
-        authorPosts: 567,
-        authorReputation: 1234,
-        createTime: '2025-06-01T11:15:00',
-        content: '感谢楼主的详细分析!特别期待站点A的详细评测,最近正在寻找好的影视资源站点。',
-        likes: 12
-      },
-      {
-        id: 3,
-        author: 'TechGuru',
-        authorTitle: '技术专家',
-        authorPosts: 890,
-        authorReputation: 2156,
-        createTime: '2025-06-01T12:30:00',
-        content: '站点C确实不错,软件资源很全面。不过楼主能不能也评测一下游戏类的PT站点?',
-        likes: 8,
-        quotedPost: {
-          author: 'PTExpert',
-          time: '2025-06-01T10:30:00',
-          content: '站点C:软件资源全面,更新及时,开发者必备'
-        }
-      }
-    ])
-    
-    const replyForm = reactive({
-      content: ''
-    })
-    
-    const replyRules = {
-      content: [
-        { required: true, message: '请输入回复内容', trigger: 'blur' },
-        { min: 5, max: 5000, message: '内容长度在 5 到 5000 个字符', trigger: 'blur' }
-      ]
-    }
-    
-    onMounted(() => {
-      const topicId = route.params.id
-      fetchTopicDetail(topicId)
-    })
-    
-    const fetchTopicDetail = async (id) => {
-      try {
-        console.log('获取主题详情:', id)
-        totalReplies.value = 147
-      } catch (error) {
-        ElMessage.error('获取主题详情失败')
-        router.back()
-      }
-    }
-    
-    const formatDateTime = (dateString) => {
-      const date = new Date(dateString)
-      return date.toLocaleString('zh-CN', {
-        year: 'numeric',
-        month: '2-digit',
-        day: '2-digit',
-        hour: '2-digit',
-        minute: '2-digit'
-      })
-    }
-    
-    const formatContent = (content) => {
-      return content.replace(/\n/g, '<br>')
-    }
-    
-    const handleTopicAction = (command) => {
-      switch (command) {
-        case 'favorite':
-          isFavorited.value = !isFavorited.value
-          ElMessage.success(isFavorited.value ? '已收藏' : '已取消收藏')
-          break
-        case 'share':
-          navigator.clipboard.writeText(window.location.href)
-          ElMessage.success('链接已复制到剪贴板')
-          break
-        case 'report':
-          reportPost(topic.value.id)
-          break
-      }
-    }
-    
-    const likePost = (postId) => {
-      if (postId === topic.value.id) {
-        topic.value.likes = (topic.value.likes || 0) + 1
-      } else {
-        const reply = replies.value.find(r => r.id === postId)
-        if (reply) {
-          reply.likes = (reply.likes || 0) + 1
-        }
-      }
-      ElMessage.success('点赞成功')
-    }
-    
-    const quotePost = (post) => {
-      quotedContent.value = {
-        author: post.author,
-        content: post.content.replace(/<[^>]*>/g, '').substring(0, 100) + '...',
-        time: post.createTime
-      }
-      showReplyDialog.value = true
-    }
-    
-    const reportPost = async (postId) => {
-      try {
-        await ElMessageBox.prompt('请说明举报原因', '举报内容', {
-          confirmButtonText: '提交举报',
-          cancelButtonText: '取消',
-          inputType: 'textarea',
-          inputPlaceholder: '请详细说明举报原因...'
-        })
-        
-        ElMessage.success('举报已提交,我们会尽快处理')
-      } catch {
-        // 用户取消
-      }
-    }
-    
-    const clearQuote = () => {
-      quotedContent.value = null
-    }
-    
-    const handleCloseReplyDialog = () => {
-      if (replyForm.content) {
-        ElMessageBox.confirm(
-          '确定要关闭吗?未保存的内容将会丢失。',
-          '提示',
-          {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
-            type: 'warning'
-          }
-        ).then(() => {
-          resetReplyForm()
-          showReplyDialog.value = false
-        }).catch(() => {
-          // 用户取消
-        })
-      } else {
-        resetReplyForm()
-        showReplyDialog.value = false
-      }
-    }
-    
-    const submitReply = async () => {
-      try {
-        await replyFormRef.value?.validate()
-        
-        submittingReply.value = true
-        
-        await new Promise(resolve => setTimeout(resolve, 1500))
-        
-        const newReply = {
-          id: Date.now(),
-          author: localStorage.getItem('username') || '用户',
-          authorTitle: '会员',
-          authorPosts: 0,
-          authorReputation: 0,
-          createTime: new Date().toISOString(),
-          content: replyForm.content,
-          likes: 0,
-          quotedPost: quotedContent.value
-        }
-        
-        replies.value.push(newReply)
-        topic.value.replies += 1
-        
-        ElMessage.success('回复发表成功!')
-        resetReplyForm()
-        showReplyDialog.value = false
-        
-      } catch (error) {
-        console.error('表单验证失败:', error)
-      } finally {
-        submittingReply.value = false
-      }
-    }
-    
-    const submitQuickReply = async () => {
-      if (!quickReplyContent.value.trim()) {
-        ElMessage.warning('请输入回复内容')
-        return
-      }
-      
-      submittingReply.value = true
-      try {
-        await new Promise(resolve => setTimeout(resolve, 1000))
-        
-        const newReply = {
-          id: Date.now(),
-          author: localStorage.getItem('username') || '用户',
-          authorTitle: '会员',
-          authorPosts: 0,
-          authorReputation: 0,
-          createTime: new Date().toISOString(),
-          content: quickReplyContent.value,
-          likes: 0
-        }
-        
-        replies.value.push(newReply)
-        topic.value.replies += 1
-        quickReplyContent.value = ''
-        
-        ElMessage.success('回复发表成功!')
-      } catch (error) {
-        ElMessage.error('发表回复失败')
-      } finally {
-        submittingReply.value = false
-      }
-    }
-    
-    const clearQuickReply = () => {
-      quickReplyContent.value = ''
-    }
-    
-    const resetReplyForm = () => {
-      replyFormRef.value?.resetFields()
-      replyForm.content = ''
-      quotedContent.value = null
-    }
-    
-    const handleSizeChange = (size) => {
-      pageSize.value = size
-      currentPage.value = 1
-    }
-    
-    const handleCurrentChange = (page) => {
-      currentPage.value = page
-    }
-    
-    return {
-      showReplyDialog,
-      submittingReply,
-      isFavorited,
-      currentPage,
-      pageSize,
-      totalReplies,
-      quickReplyContent,
-      quotedContent,
-      topic,
-      replies,
-      replyForm,
-      replyRules,
-      replyFormRef,
-      formatDateTime,
-      formatContent,
-      handleTopicAction,
-      likePost,
-      quotePost,
-      reportPost,
-      clearQuote,
-      handleCloseReplyDialog,
-      submitReply,
-      submitQuickReply,
-      clearQuickReply,
-      handleSizeChange,
-      handleCurrentChange,
-      Edit,
-      More,
-      View,
-      Comment,
-      Like,
-      ChatDotRound,
-      Flag,
-      ArrowDown
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.topic-detail-page {
-  max-width: 1000px;
-  margin: 0 auto;
-  padding: 24px;
-  background: #f5f5f5;
-  min-height: 100vh;
-}
-
-.breadcrumb {
-  margin-bottom: 16px;
-}
-
-.topic-header {
-  background: #fff;
-  border-radius: 12px;
-  padding: 24px;
-  margin-bottom: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  display: flex;
-  justify-content: space-between;
-  align-items: flex-start;
-  gap: 24px;
-  
-  .topic-info {
-    flex: 1;
-    
-    .topic-title-row {
-      display: flex;
-      align-items: center;
-      gap: 12px;
-      margin-bottom: 12px;
-      
-      .topic-title {
-        font-size: 24px;
-        font-weight: 600;
-        color: #2c3e50;
-        margin: 0;
-        flex: 1;
-      }
-      
-      .topic-status {
-        .el-tag {
-          margin-left: 8px;
-        }
-      }
-    }
-    
-    .topic-tags {
-      margin-bottom: 16px;
-      
-      .el-tag {
-        margin-right: 8px;
-      }
-    }
-    
-    .topic-meta {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      
-      .author-info {
-        display: flex;
-        align-items: center;
-        gap: 12px;
-        
-        .author-details {
-          .author-name {
-            display: block;
-            font-weight: 600;
-            color: #2c3e50;
-            font-size: 14px;
-          }
-          
-          .post-time {
-            display: block;
-            font-size: 12px;
-            color: #909399;
-          }
-        }
-      }
-      
-      .topic-stats {
-        display: flex;
-        gap: 16px;
-        
-        .stat-item {
-          display: flex;
-          align-items: center;
-          gap: 4px;
-          font-size: 14px;
-          color: #7f8c8d;
-        }
-      }
-    }
-  }
-  
-  .topic-actions {
-    display: flex;
-    gap: 12px;
-    flex-shrink: 0;
-  }
-}
-
-.posts-container {
-  .post-item {
-    background: #fff;
-    border-radius: 12px;
-    margin-bottom: 16px;
-    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-    overflow: hidden;
-    
-    &.main-post {
-      border-left: 4px solid #409eff;
-    }
-    
-    .post-header {
-      background: #f8f9fa;
-      padding: 16px 24px;
-      display: flex;
-      align-items: center;
-      gap: 16px;
-      border-bottom: 1px solid #f0f0f0;
-      
-      .floor-number {
-        background: #409eff;
-        color: white;
-        padding: 4px 8px;
-        border-radius: 4px;
-        font-size: 12px;
-        font-weight: 600;
-        min-width: 32px;
-        text-align: center;
-      }
-      
-      .post-author {
-        display: flex;
-        align-items: center;
-        gap: 12px;
-        flex: 1;
-        
-        .author-info {
-          .author-name {
-            display: block;
-            font-weight: 600;
-            color: #2c3e50;
-            font-size: 14px;
-          }
-          
-          .author-title {
-            display: block;
-            font-size: 12px;
-            color: #67c23a;
-            margin-bottom: 4px;
-          }
-          
-          .author-stats {
-            font-size: 11px;
-            color: #909399;
-            
-            span {
-              margin-right: 12px;
-            }
-          }
-        }
-      }
-      
-      .post-time {
-        font-size: 12px;
-        color: #909399;
-      }
-    }
-    
-    .post-content {
-      padding: 24px;
-      
-      .quoted-content {
-        background: #f5f7fa;
-        border-left: 4px solid #e4e7ed;
-        padding: 12px 16px;
-        margin-bottom: 16px;
-        border-radius: 0 4px 4px 0;
-        
-        .quote-header {
-          display: flex;
-          align-items: center;
-          gap: 8px;
-          font-size: 12px;
-          color: #909399;
-          margin-bottom: 8px;
-        }
-        
-        .quote-text {
-          font-size: 14px;
-          color: #606266;
-          line-height: 1.5;
-        }
-      }
-      
-      .content-text {
-        line-height: 1.6;
-        color: #2c3e50;
-        
-        :deep(h3) {
-          color: #2c3e50;
-          font-size: 18px;
-          font-weight: 600;
-          margin: 20px 0 12px 0;
-        }
-        
-        :deep(p) {
-          margin-bottom: 12px;
-        }
-        
-        :deep(ul), :deep(ol) {
-          margin: 12px 0;
-          padding-left: 20px;
-          
-          li {
-            margin-bottom: 8px;
-          }
-        }
-      }
-    }
-    
-    .post-actions {
-      padding: 12px 24px;
-      border-top: 1px solid #f0f0f0;
-      background: #fafafa;
-      
-      .el-button {
-        margin-right: 16px;
-        
-        .el-icon {
-          margin-right: 4px;
-        }
-      }
-    }
-  }
-}
-
-.pagination-wrapper {
-  text-align: center;
-  margin: 24px 0;
-}
-
-.quick-reply {
-  background: #fff;
-  border-radius: 12px;
-  padding: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  h3 {
-    font-size: 18px;
-    font-weight: 600;
-    color: #2c3e50;
-    margin: 0 0 16px 0;
-  }
-  
-  .quick-reply-actions {
-    margin-top: 12px;
-    text-align: right;
-    
-    .el-button {
-      margin-left: 12px;
-    }
-  }
-}
-
-.quoted-preview {
-  background: #f5f7fa;
-  border: 1px solid #e4e7ed;
-  border-radius: 4px;
-  padding: 12px;
-  
-  .quote-header {
-    font-size: 12px;
-    color: #909399;
-    margin-bottom: 8px;
-  }
-  
-  .quote-content {
-    font-size: 14px;
-    color: #606266;
-    margin-bottom: 8px;
-    line-height: 1.5;
-  }
-}
-
-@media (max-width: 768px) {
-  .topic-detail-page {
-    padding: 16px;
-  }
-  
-  .topic-header {
-    flex-direction: column;
-    align-items: flex-start;
-    
-    .topic-actions {
-      width: 100%;
-      justify-content: flex-end;
-    }
-  }
-  
-  .post-header {
-    flex-direction: column;
-    align-items: flex-start;
-    gap: 12px;
-    
-    .floor-number {
-      align-self: flex-start;
-    }
-  }
-  
-  .post-content {
-    padding: 16px;
-  }
-  
-  .post-actions {
-    padding: 12px 16px;
-    
-    .el-button {
-      margin-right: 8px;
-      margin-bottom: 8px;
-    }
-  }
-}
+<template>

+  <div class="topic-detail-page">

+    <div class="page-container">

+      <!-- 面包屑导航 -->

+      <div class="breadcrumb">

+        <el-breadcrumb separator="/">

+          <el-breadcrumb-item :to="{ path: '/forum' }">论坛首页</el-breadcrumb-item>

+          <el-breadcrumb-item :to="{ path: `/forum/section/${topic.sectionId}` }">

+            {{ topic.sectionName }}

+          </el-breadcrumb-item>

+          <el-breadcrumb-item>{{ topic.title }}</el-breadcrumb-item>

+        </el-breadcrumb>

+      </div>

+

+      <!-- 主题信息 -->

+      <div class="topic-header">

+        <div class="topic-info">

+          <div class="topic-title-row">

+            <h1 class="topic-title">{{ topic.title }}</h1>

+            <div class="topic-status">

+              <el-tag v-if="topic.pinned" type="warning" size="small">置顶</el-tag>

+              <el-tag v-if="topic.hot" type="danger" size="small">热门</el-tag>

+              <el-tag v-if="topic.closed" type="info" size="small">已关闭</el-tag>

+            </div>

+          </div>

+          

+          <div class="topic-tags">

+            <el-tag

+              v-for="tag in topic.tags"

+              :key="tag"

+              size="small"

+              type="info"

+              effect="plain"

+            >

+              {{ tag }}

+            </el-tag>

+          </div>

+          

+          <div class="topic-meta">

+            <div class="author-info">

+              <el-avatar :size="32">{{ topic.author.charAt(0) }}</el-avatar>

+              <div class="author-details">

+                <span class="author-name">{{ topic.author }}</span>

+                <span class="post-time">发表于 {{ formatDateTime(topic.createTime) }}</span>

+              </div>

+            </div>

+            

+            <div class="topic-stats">

+              <div class="stat-item">

+                <el-icon><View /></el-icon>

+                <span>{{ topic.views }} 浏览</span>

+              </div>

+              <div class="stat-item">

+                <el-icon><Comment /></el-icon>

+                <span>{{ topic.replies }} 回复</span>

+              </div>

+            </div>

+          </div>

+        </div>

+        

+        <div class="topic-actions">

+          <el-button 

+            v-if="!topic.closed" 

+            type="primary" 

+            :icon="Edit" 

+            @click="showReplyDialog = true"

+          >

+            回复主题

+          </el-button>

+          <el-dropdown @command="handleTopicAction">

+            <el-button :icon="More">

+              更多 <el-icon class="el-icon--right"><ArrowDown /></el-icon>

+            </el-button>

+            <template #dropdown>

+              <el-dropdown-menu>

+                <el-dropdown-item command="favorite">

+                  {{ isFavorited ? '取消收藏' : '收藏主题' }}

+                </el-dropdown-item>

+                <el-dropdown-item command="share">分享主题</el-dropdown-item>

+                <el-dropdown-item command="report" divided>举报主题</el-dropdown-item>

+              </el-dropdown-menu>

+            </template>

+          </el-dropdown>

+        </div>

+      </div>

+

+      <!-- 主题内容和回复列表 -->

+      <div class="posts-container">

+        <!-- 主楼 -->

+        <div class="post-item main-post">

+          <div class="post-header">

+            <div class="floor-number">#1</div>

+            <div class="post-author">

+              <el-avatar :size="48">{{ topic.author.charAt(0) }}</el-avatar>

+              <div class="author-info">

+                <span class="author-name">{{ topic.author }}</span>

+                <span class="author-title">{{ topic.authorTitle || '会员' }}</span>

+                <div class="author-stats">

+                  <span>帖子: {{ topic.authorPosts || 0 }}</span>

+                  <span>声望: {{ topic.authorReputation || 0 }}</span>

+                </div>

+              </div>

+            </div>

+            <div class="post-time">

+              {{ formatDateTime(topic.createTime) }}

+            </div>

+          </div>

+          

+          <div class="post-content">

+            <div class="content-text" v-html="formatContent(topic.content)"></div>

+          </div>

+          

+          <div class="post-actions">

+            <el-button type="text" size="small" @click="likePost(topic.id)">

+              <el-icon><Like /></el-icon>

+              {{ topic.likes || 0 }}

+            </el-button>

+            <el-button type="text" size="small" @click="quotePost(topic)">

+              <el-icon><ChatDotRound /></el-icon>

+              引用

+            </el-button>

+            <el-button type="text" size="small" @click="reportPost(topic.id)">

+              <el-icon><Flag /></el-icon>

+              举报

+            </el-button>

+          </div>

+        </div>

+

+        <!-- 回复列表 -->

+        <div

+          v-for="(reply, index) in replies"

+          :key="reply.id"

+          class="post-item reply-post"

+        >

+          <div class="post-header">

+            <div class="floor-number">#{{ index + 2 }}</div>

+            <div class="post-author">

+              <el-avatar :size="48">{{ reply.author.charAt(0) }}</el-avatar>

+              <div class="author-info">

+                <span class="author-name">{{ reply.author }}</span>

+                <span class="author-title">{{ reply.authorTitle || '会员' }}</span>

+                <div class="author-stats">

+                  <span>帖子: {{ reply.authorPosts || 0 }}</span>

+                  <span>声望: {{ reply.authorReputation || 0 }}</span>

+                </div>

+              </div>

+            </div>

+            <div class="post-time">

+              {{ formatDateTime(reply.createTime) }}

+            </div>

+          </div>

+          

+          <div class="post-content">

+            <div v-if="reply.quotedPost" class="quoted-content">

+              <div class="quote-header">

+                <el-icon><ChatDotRound /></el-icon>

+                <span>{{ reply.quotedPost.author }} 发表于 {{ formatDateTime(reply.quotedPost.time) }}</span>

+              </div>

+              <div class="quote-text">{{ reply.quotedPost.content }}</div>

+            </div>

+            <div class="content-text" v-html="formatContent(reply.content)"></div>

+          </div>

+          

+          <div class="post-actions">

+            <el-button type="text" size="small" @click="likePost(reply.id)">

+              <el-icon><Like /></el-icon>

+              {{ reply.likes || 0 }}

+            </el-button>

+            <el-button type="text" size="small" @click="quotePost(reply)">

+              <el-icon><ChatDotRound /></el-icon>

+              引用

+            </el-button>

+            <el-button type="text" size="small" @click="reportPost(reply.id)">

+              <el-icon><Flag /></el-icon>

+              举报

+            </el-button>

+          </div>

+        </div>

+      </div>

+

+      <!-- 分页 -->

+      <div class="pagination-wrapper">

+        <el-pagination

+          v-model:current-page="currentPage"

+          v-model:page-size="pageSize"

+          :page-sizes="[10, 20, 50]"

+          :total="totalReplies"

+          layout="total, sizes, prev, pager, next, jumper"

+          @size-change="handleSizeChange"

+          @current-change="handleCurrentChange"

+        />

+      </div>

+

+      <!-- 快速回复 -->

+      <div v-if="!topic.closed" class="quick-reply">

+        <h3>快速回复</h3>

+        <el-input

+          v-model="quickReplyContent"

+          type="textarea"

+          :rows="4"

+          placeholder="输入你的回复..."

+          maxlength="2000"

+          show-word-limit

+        />

+        <div class="quick-reply-actions">

+          <el-button @click="clearQuickReply">清空</el-button>

+          <el-button type="primary" @click="submitQuickReply" :loading="submittingReply">

+            发表回复

+          </el-button>

+        </div>

+      </div>

+    </div>

+

+    <!-- 回复对话框 -->

+    <el-dialog

+      v-model="showReplyDialog"

+      title="回复主题"

+      width="700px"

+      :before-close="handleCloseReplyDialog"

+    >

+      <el-form

+        ref="replyFormRef"

+        :model="replyForm"

+        :rules="replyRules"

+        label-width="80px"

+      >

+        <el-form-item v-if="quotedContent" label="引用内容">

+          <div class="quoted-preview">

+            <div class="quote-header">

+              <span>{{ quotedContent.author }}</span>

+            </div>

+            <div class="quote-content">{{ quotedContent.content }}</div>

+            <el-button type="text" size="small" @click="clearQuote">

+              清除引用

+            </el-button>

+          </div>

+        </el-form-item>

+        

+        <el-form-item label="回复内容" prop="content">

+          <el-input

+            v-model="replyForm.content"

+            type="textarea"

+            :rows="8"

+            placeholder="请输入回复内容..."

+            maxlength="5000"

+            show-word-limit

+          />

+        </el-form-item>

+      </el-form>

+      

+      <template #footer>

+        <el-button @click="handleCloseReplyDialog">取消</el-button>

+        <el-button type="primary" @click="submitReply" :loading="submittingReply">

+          发表回复

+        </el-button>

+      </template>

+    </el-dialog>

+  </div>

+</template>

+

+<script>

+import { ref, reactive, onMounted } from 'vue'

+import { useRoute, useRouter } from 'vue-router'

+import { ElMessage, ElMessageBox } from 'element-plus'

+import {

+  Edit,

+  More,

+  View,

+  Comment,

+  Like,

+  ChatDotRound,

+  Flag,

+  ArrowDown

+} from '@element-plus/icons-vue'

+

+export default {

+  name: 'ForumTopicView',

+  setup() {

+    const route = useRoute()

+    const router = useRouter()

+    const replyFormRef = ref(null)

+    

+    const showReplyDialog = ref(false)

+    const submittingReply = ref(false)

+    const isFavorited = ref(false)

+    const currentPage = ref(1)

+    const pageSize = ref(20)

+    const totalReplies = ref(0)

+    const quickReplyContent = ref('')

+    const quotedContent = ref(null)

+    

+    const topic = ref({

+      id: 1,

+      title: '2024年度最佳PT站点推荐与对比分析',

+      sectionId: 1,

+      sectionName: '站务讨论',

+      author: 'PTExpert',

+      authorTitle: '资深会员',

+      authorPosts: 1256,

+      authorReputation: 2890,

+      createTime: '2025-06-01T10:30:00',

+      content: `

+        <p>大家好,作为一个使用PT站点多年的老用户,我想和大家分享一下2024年各大PT站点的使用体验和对比分析。</p>

+        

+        <h3>评测标准</h3>

+        <ul>

+          <li>资源丰富度:种子数量、更新速度、稀有资源</li>

+          <li>用户体验:界面设计、功能完善度、响应速度</li>

+          <li>社区氛围:用户活跃度、互帮互助程度</li>

+          <li>规则友好性:考核难度、分享率要求、保种要求</li>

+        </ul>

+        

+        <h3>推荐站点</h3>

+        <p>经过综合评测,以下几个站点值得推荐:</p>

+        <ol>

+          <li><strong>站点A</strong>:资源最全,更新最快,适合影视爱好者</li>

+          <li><strong>站点B</strong>:音乐资源丰富,无损居多,音质发烧友首选</li>

+          <li><strong>站点C</strong>:软件资源全面,更新及时,开发者必备</li>

+        </ol>

+        

+        <p>具体的详细评测报告我会在后续回复中逐一介绍,欢迎大家讨论和补充!</p>

+      `,

+      views: 2856,

+      replies: 147,

+      likes: 89,

+      tags: ['PT站点', '推荐', '对比'],

+      pinned: true,

+      hot: true,

+      closed: false

+    })

+    

+    const replies = ref([

+      {

+        id: 2,

+        author: 'MovieLover88',

+        authorTitle: '影视达人',

+        authorPosts: 567,

+        authorReputation: 1234,

+        createTime: '2025-06-01T11:15:00',

+        content: '感谢楼主的详细分析!特别期待站点A的详细评测,最近正在寻找好的影视资源站点。',

+        likes: 12

+      },

+      {

+        id: 3,

+        author: 'TechGuru',

+        authorTitle: '技术专家',

+        authorPosts: 890,

+        authorReputation: 2156,

+        createTime: '2025-06-01T12:30:00',

+        content: '站点C确实不错,软件资源很全面。不过楼主能不能也评测一下游戏类的PT站点?',

+        likes: 8,

+        quotedPost: {

+          author: 'PTExpert',

+          time: '2025-06-01T10:30:00',

+          content: '站点C:软件资源全面,更新及时,开发者必备'

+        }

+      }

+    ])

+    

+    const replyForm = reactive({

+      content: ''

+    })

+    

+    const replyRules = {

+      content: [

+        { required: true, message: '请输入回复内容', trigger: 'blur' },

+        { min: 5, max: 5000, message: '内容长度在 5 到 5000 个字符', trigger: 'blur' }

+      ]

+    }

+    

+    onMounted(() => {

+      const topicId = route.params.id

+      fetchTopicDetail(topicId)

+    })

+    

+    const fetchTopicDetail = async (id) => {

+      try {

+        console.log('获取主题详情:', id)

+        totalReplies.value = 147

+      } catch (error) {

+        ElMessage.error('获取主题详情失败')

+        router.back()

+      }

+    }

+    

+    const formatDateTime = (dateString) => {

+      const date = new Date(dateString)

+      return date.toLocaleString('zh-CN', {

+        year: 'numeric',

+        month: '2-digit',

+        day: '2-digit',

+        hour: '2-digit',

+        minute: '2-digit'

+      })

+    }

+    

+    const formatContent = (content) => {

+      return content.replace(/\n/g, '<br>')

+    }

+    

+    const handleTopicAction = (command) => {

+      switch (command) {

+        case 'favorite':

+          isFavorited.value = !isFavorited.value

+          ElMessage.success(isFavorited.value ? '已收藏' : '已取消收藏')

+          break

+        case 'share':

+          navigator.clipboard.writeText(window.location.href)

+          ElMessage.success('链接已复制到剪贴板')

+          break

+        case 'report':

+          reportPost(topic.value.id)

+          break

+      }

+    }

+    

+    const likePost = (postId) => {

+      if (postId === topic.value.id) {

+        topic.value.likes = (topic.value.likes || 0) + 1

+      } else {

+        const reply = replies.value.find(r => r.id === postId)

+        if (reply) {

+          reply.likes = (reply.likes || 0) + 1

+        }

+      }

+      ElMessage.success('点赞成功')

+    }

+    

+    const quotePost = (post) => {

+      quotedContent.value = {

+        author: post.author,

+        content: post.content.replace(/<[^>]*>/g, '').substring(0, 100) + '...',

+        time: post.createTime

+      }

+      showReplyDialog.value = true

+    }

+    

+    const reportPost = async (postId) => {

+      try {

+        await ElMessageBox.prompt('请说明举报原因', '举报内容', {

+          confirmButtonText: '提交举报',

+          cancelButtonText: '取消',

+          inputType: 'textarea',

+          inputPlaceholder: '请详细说明举报原因...'

+        })

+        

+        ElMessage.success('举报已提交,我们会尽快处理')

+      } catch {

+        // 用户取消

+      }

+    }

+    

+    const clearQuote = () => {

+      quotedContent.value = null

+    }

+    

+    const handleCloseReplyDialog = () => {

+      if (replyForm.content) {

+        ElMessageBox.confirm(

+          '确定要关闭吗?未保存的内容将会丢失。',

+          '提示',

+          {

+            confirmButtonText: '确定',

+            cancelButtonText: '取消',

+            type: 'warning'

+          }

+        ).then(() => {

+          resetReplyForm()

+          showReplyDialog.value = false

+        }).catch(() => {

+          // 用户取消

+        })

+      } else {

+        resetReplyForm()

+        showReplyDialog.value = false

+      }

+    }

+    

+    const submitReply = async () => {

+      try {

+        await replyFormRef.value?.validate()

+        

+        submittingReply.value = true

+        

+        await new Promise(resolve => setTimeout(resolve, 1500))

+        

+        const newReply = {

+          id: Date.now(),

+          author: localStorage.getItem('username') || '用户',

+          authorTitle: '会员',

+          authorPosts: 0,

+          authorReputation: 0,

+          createTime: new Date().toISOString(),

+          content: replyForm.content,

+          likes: 0,

+          quotedPost: quotedContent.value

+        }

+        

+        replies.value.push(newReply)

+        topic.value.replies += 1

+        

+        ElMessage.success('回复发表成功!')

+        resetReplyForm()

+        showReplyDialog.value = false

+        

+      } catch (error) {

+        console.error('表单验证失败:', error)

+      } finally {

+        submittingReply.value = false

+      }

+    }

+    

+    const submitQuickReply = async () => {

+      if (!quickReplyContent.value.trim()) {

+        ElMessage.warning('请输入回复内容')

+        return

+      }

+      

+      submittingReply.value = true

+      try {

+        await new Promise(resolve => setTimeout(resolve, 1000))

+        

+        const newReply = {

+          id: Date.now(),

+          author: localStorage.getItem('username') || '用户',

+          authorTitle: '会员',

+          authorPosts: 0,

+          authorReputation: 0,

+          createTime: new Date().toISOString(),

+          content: quickReplyContent.value,

+          likes: 0

+        }

+        

+        replies.value.push(newReply)

+        topic.value.replies += 1

+        quickReplyContent.value = ''

+        

+        ElMessage.success('回复发表成功!')

+      } catch (error) {

+        ElMessage.error('发表回复失败')

+      } finally {

+        submittingReply.value = false

+      }

+    }

+    

+    const clearQuickReply = () => {

+      quickReplyContent.value = ''

+    }

+    

+    const resetReplyForm = () => {

+      replyFormRef.value?.resetFields()

+      replyForm.content = ''

+      quotedContent.value = null

+    }

+    

+    const handleSizeChange = (size) => {

+      pageSize.value = size

+      currentPage.value = 1

+    }

+    

+    const handleCurrentChange = (page) => {

+      currentPage.value = page

+    }

+    

+    return {

+      showReplyDialog,

+      submittingReply,

+      isFavorited,

+      currentPage,

+      pageSize,

+      totalReplies,

+      quickReplyContent,

+      quotedContent,

+      topic,

+      replies,

+      replyForm,

+      replyRules,

+      replyFormRef,

+      formatDateTime,

+      formatContent,

+      handleTopicAction,

+      likePost,

+      quotePost,

+      reportPost,

+      clearQuote,

+      handleCloseReplyDialog,

+      submitReply,

+      submitQuickReply,

+      clearQuickReply,

+      handleSizeChange,

+      handleCurrentChange,

+      Edit,

+      More,

+      View,

+      Comment,

+      Like,

+      ChatDotRound,

+      Flag,

+      ArrowDown

+    }

+  }

+}

+</script>

+

+<style lang="scss" scoped>

+.topic-detail-page {

+  max-width: 1000px;

+  margin: 0 auto;

+  padding: 24px;

+  background: #f5f5f5;

+  min-height: 100vh;

+}

+

+.breadcrumb {

+  margin-bottom: 16px;

+}

+

+.topic-header {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  display: flex;

+  justify-content: space-between;

+  align-items: flex-start;

+  gap: 24px;

+  

+  .topic-info {

+    flex: 1;

+    

+    .topic-title-row {

+      display: flex;

+      align-items: center;

+      gap: 12px;

+      margin-bottom: 12px;

+      

+      .topic-title {

+        font-size: 24px;

+        font-weight: 600;

+        color: #2c3e50;

+        margin: 0;

+        flex: 1;

+      }

+      

+      .topic-status {

+        .el-tag {

+          margin-left: 8px;

+        }

+      }

+    }

+    

+    .topic-tags {

+      margin-bottom: 16px;

+      

+      .el-tag {

+        margin-right: 8px;

+      }

+    }

+    

+    .topic-meta {

+      display: flex;

+      justify-content: space-between;

+      align-items: center;

+      

+      .author-info {

+        display: flex;

+        align-items: center;

+        gap: 12px;

+        

+        .author-details {

+          .author-name {

+            display: block;

+            font-weight: 600;

+            color: #2c3e50;

+            font-size: 14px;

+          }

+          

+          .post-time {

+            display: block;

+            font-size: 12px;

+            color: #909399;

+          }

+        }

+      }

+      

+      .topic-stats {

+        display: flex;

+        gap: 16px;

+        

+        .stat-item {

+          display: flex;

+          align-items: center;

+          gap: 4px;

+          font-size: 14px;

+          color: #7f8c8d;

+        }

+      }

+    }

+  }

+  

+  .topic-actions {

+    display: flex;

+    gap: 12px;

+    flex-shrink: 0;

+  }

+}

+

+.posts-container {

+  .post-item {

+    background: #fff;

+    border-radius: 12px;

+    margin-bottom: 16px;

+    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+    overflow: hidden;

+    

+    &.main-post {

+      border-left: 4px solid #409eff;

+    }

+    

+    .post-header {

+      background: #f8f9fa;

+      padding: 16px 24px;

+      display: flex;

+      align-items: center;

+      gap: 16px;

+      border-bottom: 1px solid #f0f0f0;

+      

+      .floor-number {

+        background: #409eff;

+        color: white;

+        padding: 4px 8px;

+        border-radius: 4px;

+        font-size: 12px;

+        font-weight: 600;

+        min-width: 32px;

+        text-align: center;

+      }

+      

+      .post-author {

+        display: flex;

+        align-items: center;

+        gap: 12px;

+        flex: 1;

+        

+        .author-info {

+          .author-name {

+            display: block;

+            font-weight: 600;

+            color: #2c3e50;

+            font-size: 14px;

+          }

+          

+          .author-title {

+            display: block;

+            font-size: 12px;

+            color: #67c23a;

+            margin-bottom: 4px;

+          }

+          

+          .author-stats {

+            font-size: 11px;

+            color: #909399;

+            

+            span {

+              margin-right: 12px;

+            }

+          }

+        }

+      }

+      

+      .post-time {

+        font-size: 12px;

+        color: #909399;

+      }

+    }

+    

+    .post-content {

+      padding: 24px;

+      

+      .quoted-content {

+        background: #f5f7fa;

+        border-left: 4px solid #e4e7ed;

+        padding: 12px 16px;

+        margin-bottom: 16px;

+        border-radius: 0 4px 4px 0;

+        

+        .quote-header {

+          display: flex;

+          align-items: center;

+          gap: 8px;

+          font-size: 12px;

+          color: #909399;

+          margin-bottom: 8px;

+        }

+        

+        .quote-text {

+          font-size: 14px;

+          color: #606266;

+          line-height: 1.5;

+        }

+      }

+      

+      .content-text {

+        line-height: 1.6;

+        color: #2c3e50;

+        

+        :deep(h3) {

+          color: #2c3e50;

+          font-size: 18px;

+          font-weight: 600;

+          margin: 20px 0 12px 0;

+        }

+        

+        :deep(p) {

+          margin-bottom: 12px;

+        }

+        

+        :deep(ul), :deep(ol) {

+          margin: 12px 0;

+          padding-left: 20px;

+          

+          li {

+            margin-bottom: 8px;

+          }

+        }

+      }

+    }

+    

+    .post-actions {

+      padding: 12px 24px;

+      border-top: 1px solid #f0f0f0;

+      background: #fafafa;

+      

+      .el-button {

+        margin-right: 16px;

+        

+        .el-icon {

+          margin-right: 4px;

+        }

+      }

+    }

+  }

+}

+

+.pagination-wrapper {

+  text-align: center;

+  margin: 24px 0;

+}

+

+.quick-reply {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  h3 {

+    font-size: 18px;

+    font-weight: 600;

+    color: #2c3e50;

+    margin: 0 0 16px 0;

+  }

+  

+  .quick-reply-actions {

+    margin-top: 12px;

+    text-align: right;

+    

+    .el-button {

+      margin-left: 12px;

+    }

+  }

+}

+

+.quoted-preview {

+  background: #f5f7fa;

+  border: 1px solid #e4e7ed;

+  border-radius: 4px;

+  padding: 12px;

+  

+  .quote-header {

+    font-size: 12px;

+    color: #909399;

+    margin-bottom: 8px;

+  }

+  

+  .quote-content {

+    font-size: 14px;

+    color: #606266;

+    margin-bottom: 8px;

+    line-height: 1.5;

+  }

+}

+

+@media (max-width: 768px) {

+  .topic-detail-page {

+    padding: 16px;

+  }

+  

+  .topic-header {

+    flex-direction: column;

+    align-items: flex-start;

+    

+    .topic-actions {

+      width: 100%;

+      justify-content: flex-end;

+    }

+  }

+  

+  .post-header {

+    flex-direction: column;

+    align-items: flex-start;

+    gap: 12px;

+    

+    .floor-number {

+      align-self: flex-start;

+    }

+  }

+  

+  .post-content {

+    padding: 16px;

+  }

+  

+  .post-actions {

+    padding: 12px 16px;

+    

+    .el-button {

+      margin-right: 8px;

+      margin-bottom: 8px;

+    }

+  }

+}

 </style>
\ No newline at end of file
diff --git a/src/views/forum/ForumView.vue b/src/views/forum/ForumView.vue
index e4fa0f9..22345e6 100644
--- a/src/views/forum/ForumView.vue
+++ b/src/views/forum/ForumView.vue
@@ -1,978 +1,978 @@
-<template>
-  <div class="forum-page">
-    <div class="page-container">
-      <!-- 论坛头部 -->
-      <div class="forum-header">
-        <div class="header-content">
-          <h1>社区论坛</h1>
-          <p class="header-description">与其他用户交流讨论,分享经验心得</p>
-          <div class="header-actions">
-            <el-button type="primary" :icon="Edit" @click="showNewTopicDialog = true">
-              发布新帖
-            </el-button>
-          </div>
-        </div>
-      </div>
-
-      <!-- 论坛统计 -->
-      <div class="forum-stats">
-        <div class="stats-grid">
-          <div class="stat-item">
-            <el-icon size="32" color="#409eff"><ChatDotRound /></el-icon>
-            <div class="stat-info">
-              <h3>{{ forumStats.totalTopics }}</h3>
-              <p>主题总数</p>
-            </div>
-          </div>
-          <div class="stat-item">
-            <el-icon size="32" color="#67c23a"><Comment /></el-icon>
-            <div class="stat-info">
-              <h3>{{ forumStats.totalReplies }}</h3>
-              <p>回复总数</p>
-            </div>
-          </div>
-          <div class="stat-item">
-            <el-icon size="32" color="#e6a23c"><User /></el-icon>
-            <div class="stat-info">
-              <h3>{{ forumStats.activeUsers }}</h3>
-              <p>活跃用户</p>
-            </div>
-          </div>
-          <div class="stat-item">
-            <el-icon size="32" color="#f56c6c"><View /></el-icon>
-            <div class="stat-info">
-              <h3>{{ forumStats.todayPosts }}</h3>
-              <p>今日发帖</p>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <!-- 版块列表 -->
-      <div class="forum-sections">
-        <h2 class="section-title">论坛版块</h2>
-        <div class="sections-list">
-          <div
-            v-for="section in forumSections"
-            :key="section.id"
-            class="section-card"
-            @click="navigateToSection(section.id)"
-          >
-            <div class="section-icon">
-              <el-icon size="48" :color="section.color">
-                <component :is="section.icon" />
-              </el-icon>
-            </div>
-            <div class="section-info">
-              <h3 class="section-name">{{ section.name }}</h3>
-              <p class="section-description">{{ section.description }}</p>
-              <div class="section-stats">
-                <span class="stat">{{ section.topics }} 主题</span>
-                <span class="stat">{{ section.replies }} 回复</span>
-              </div>
-            </div>
-            <div class="section-latest">
-              <div v-if="section.latestTopic" class="latest-topic">
-                <p class="topic-title">{{ section.latestTopic.title }}</p>
-                <div class="topic-meta">
-                  <span class="author">{{ section.latestTopic.author }}</span>
-                  <span class="time">{{ formatTime(section.latestTopic.time) }}</span>
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <!-- 热门主题 -->
-      <div class="hot-topics">
-        <div class="section-header">
-          <h2 class="section-title">热门主题</h2>
-          <el-button type="primary" text @click="$router.push('/forum/topics')">
-            查看全部 <el-icon><ArrowRight /></el-icon>
-          </el-button>
-        </div>
-        <div class="topics-list">
-          <div
-            v-for="topic in hotTopics"
-            :key="topic.id"
-            class="topic-item"
-            @click="navigateToTopic(topic.id)"
-          >
-            <div class="topic-content">
-              <div class="topic-header">
-                <h4 class="topic-title">{{ topic.title }}</h4>
-                <div class="topic-tags">
-                  <el-tag
-                    v-for="tag in topic.tags"
-                    :key="tag"
-                    size="small"
-                    type="info"
-                  >
-                    {{ tag }}
-                  </el-tag>
-                </div>
-              </div>
-              <div class="topic-meta">
-                <div class="author-info">
-                  <el-avatar :size="24">{{ topic.author.charAt(0) }}</el-avatar>
-                  <span class="author-name">{{ topic.author }}</span>
-                </div>
-                <div class="topic-stats">
-                  <span class="stat-item">
-                    <el-icon><View /></el-icon>
-                    {{ topic.views }}
-                  </span>
-                  <span class="stat-item">
-                    <el-icon><Comment /></el-icon>
-                    {{ topic.replies }}
-                  </span>
-                  <span class="time">{{ formatTime(topic.lastReply) }}</span>
-                </div>
-              </div>
-            </div>
-            <div class="topic-status">
-              <el-tag v-if="topic.pinned" type="warning" size="small">置顶</el-tag>
-              <el-tag v-if="topic.hot" type="danger" size="small">热门</el-tag>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <!-- 最新回复 -->
-      <div class="recent-replies">
-        <h2 class="section-title">最新回复</h2>
-        <div class="replies-list">
-          <div
-            v-for="reply in recentReplies"
-            :key="reply.id"
-            class="reply-item"
-            @click="navigateToTopic(reply.topicId)"
-          >
-            <div class="reply-avatar">
-              <el-avatar :size="40">{{ reply.author.charAt(0) }}</el-avatar>
-            </div>
-            <div class="reply-content">
-              <div class="reply-header">
-                <span class="reply-author">{{ reply.author }}</span>
-                <span class="reply-action">回复了主题</span>
-                <span class="topic-title">{{ reply.topicTitle }}</span>
-              </div>
-              <div class="reply-text">{{ reply.content }}</div>
-              <div class="reply-time">{{ formatTime(reply.time) }}</div>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <!-- 发布新帖对话框 -->
-    <el-dialog
-      v-model="showNewTopicDialog"
-      title="发布新主题"
-      width="600px"
-      :before-close="handleCloseDialog"
-    >
-      <el-form
-        ref="topicFormRef"
-        :model="newTopic"
-        :rules="topicRules"
-        label-width="80px"
-      >
-        <el-form-item label="版块" prop="sectionId">
-          <el-select v-model="newTopic.sectionId" placeholder="选择版块">
-            <el-option
-              v-for="section in forumSections"
-              :key="section.id"
-              :label="section.name"
-              :value="section.id"
-            />
-          </el-select>
-        </el-form-item>
-        
-        <el-form-item label="标题" prop="title">
-          <el-input
-            v-model="newTopic.title"
-            placeholder="请输入主题标题"
-            maxlength="100"
-            show-word-limit
-          />
-        </el-form-item>
-        
-        <el-form-item label="标签">
-          <div class="tags-input">
-            <el-tag
-              v-for="tag in newTopic.tags"
-              :key="tag"
-              closable
-              @close="removeTopicTag(tag)"
-            >
-              {{ tag }}
-            </el-tag>
-            <el-input
-              v-if="tagInputVisible"
-              ref="tagInputRef"
-              v-model="tagInputValue"
-              size="small"
-              @keyup.enter="addTopicTag"
-              @blur="addTopicTag"
-              style="width: 100px;"
-            />
-            <el-button
-              v-else
-              size="small"
-              @click="showTagInput"
-            >
-              + 添加标签
-            </el-button>
-          </div>
-        </el-form-item>
-        
-        <el-form-item label="内容" prop="content">
-          <el-input
-            v-model="newTopic.content"
-            type="textarea"
-            :rows="8"
-            placeholder="请输入主题内容..."
-            maxlength="5000"
-            show-word-limit
-          />
-        </el-form-item>
-      </el-form>
-      
-      <template #footer>
-        <el-button @click="handleCloseDialog">取消</el-button>
-        <el-button type="primary" @click="submitNewTopic" :loading="submitting">
-          发布主题
-        </el-button>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import { ref, reactive, onMounted, nextTick } from 'vue'
-import { useRouter } from 'vue-router'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import {
-  Edit,
-  ChatDotRound,
-  Comment,
-  User,
-  View,
-  ArrowRight,
-  Film,
-  Headphones,
-  Monitor,
-  GamePad,
-  ChatLineRound,
-  QuestionFilled,
-  Bell
-} from '@element-plus/icons-vue'
-
-export default {
-  name: 'ForumView',
-  setup() {
-    const router = useRouter()
-    const topicFormRef = ref(null)
-    const tagInputRef = ref(null)
-    
-    const showNewTopicDialog = ref(false)
-    const submitting = ref(false)
-    const tagInputVisible = ref(false)
-    const tagInputValue = ref('')
-    
-    const forumStats = reactive({
-      totalTopics: '15,268',
-      totalReplies: '89,456',
-      activeUsers: '2,341',
-      todayPosts: '156'
-    })
-    
-    const newTopic = reactive({
-      sectionId: '',
-      title: '',
-      content: '',
-      tags: []
-    })
-    
-    const topicRules = {
-      sectionId: [
-        { required: true, message: '请选择版块', trigger: 'change' }
-      ],
-      title: [
-        { required: true, message: '请输入标题', trigger: 'blur' },
-        { min: 5, max: 100, message: '标题长度在 5 到 100 个字符', trigger: 'blur' }
-      ],
-      content: [
-        { required: true, message: '请输入内容', trigger: 'blur' },
-        { min: 10, max: 5000, message: '内容长度在 10 到 5000 个字符', trigger: 'blur' }
-      ]
-    }
-    
-    const forumSections = ref([
-      {
-        id: 1,
-        name: '电影讨论',
-        description: '分享和讨论电影资源,交流观影心得',
-        icon: 'Film',
-        color: '#409eff',
-        topics: 3256,
-        replies: 18934,
-        latestTopic: {
-          title: '2024年最佳科幻电影推荐',
-          author: 'MovieFan',
-          time: '2025-06-03T14:30:00'
-        }
-      },
-      {
-        id: 2,
-        name: '音乐分享',
-        description: '音乐资源分享,音乐制作技术交流',
-        icon: 'Headphones',
-        color: '#67c23a',
-        topics: 1892,
-        replies: 9567,
-        latestTopic: {
-          title: '无损音乐格式对比分析',
-          author: 'AudioExpert',
-          time: '2025-06-03T13:45:00'
-        }
-      },
-      {
-        id: 3,
-        name: '软件技术',
-        description: '软件资源分享,技术问题讨论',
-        icon: 'Monitor',
-        color: '#e6a23c',
-        topics: 2134,
-        replies: 12456,
-        latestTopic: {
-          title: 'Adobe 2025 新功能体验分享',
-          author: 'TechGuru',
-          time: '2025-06-03T12:20:00'
-        }
-      },
-      {
-        id: 4,
-        name: '游戏天地',
-        description: '游戏资源分享,游戏攻略讨论',
-        icon: 'GamePad',
-        color: '#f56c6c',
-        topics: 1567,
-        replies: 8234,
-        latestTopic: {
-          title: '年度游戏大作盘点',
-          author: 'GameMaster',
-          time: '2025-06-03T11:50:00'
-        }
-      },
-      {
-        id: 5,
-        name: '站务公告',
-        description: '网站公告,规则说明,意见建议',
-        icon: 'Bell',
-        color: '#909399',
-        topics: 234,
-        replies: 1567,
-        latestTopic: {
-          title: '网站维护通知',
-          author: 'Admin',
-          time: '2025-06-03T10:00:00'
-        }
-      },
-      {
-        id: 6,
-        name: '新手求助',
-        description: '新手问题解答,使用教程分享',
-        icon: 'QuestionFilled',
-        color: '#606266',
-        topics: 456,
-        replies: 2890,
-        latestTopic: {
-          title: '新手如何提高分享率?',
-          author: 'Newbie123',
-          time: '2025-06-03T09:30:00'
-        }
-      }
-    ])
-    
-    const hotTopics = ref([
-      {
-        id: 1,
-        title: '2024年度最佳PT站点推荐与对比分析',
-        author: 'PTExpert',
-        views: 2856,
-        replies: 147,
-        lastReply: '2025-06-03T14:25:00',
-        tags: ['PT站点', '推荐', '对比'],
-        pinned: true,
-        hot: true
-      },
-      {
-        id: 2,
-        title: '如何安全高效地使用BT下载工具',
-        author: 'SafeDownloader',
-        views: 1932,
-        replies: 89,
-        lastReply: '2025-06-03T13:50:00',
-        tags: ['BT工具', '安全', '教程'],
-        hot: true
-      },
-      {
-        id: 3,
-        title: '分享率提升技巧与经验总结',
-        author: 'SeedMaster',
-        views: 1654,
-        replies: 76,
-        lastReply: '2025-06-03T12:40:00',
-        tags: ['分享率', '技巧', '经验']
-      }
-    ])
-    
-    const recentReplies = ref([
-      {
-        id: 1,
-        author: 'MovieLover88',
-        topicId: 1,
-        topicTitle: '阿凡达2观影感受分享',
-        content: '画面效果确实震撼,特别是水下的场景...',
-        time: '2025-06-03T14:45:00'
-      },
-      {
-        id: 2,
-        author: 'TechEnthusiast',
-        topicId: 2,
-        topicTitle: '最新版Photoshop使用技巧',
-        content: '新的AI功能确实很强大,大大提高了工作效率...',
-        time: '2025-06-03T14:30:00'
-      },
-      {
-        id: 3,
-        author: 'GameFan2024',
-        topicId: 3,
-        topicTitle: '赛博朋克2077最新更新体验',
-        content: '修复了很多bug,现在游戏体验好多了...',
-        time: '2025-06-03T14:15:00'
-      }
-    ])
-    
-    onMounted(() => {
-      // 初始化论坛数据
-    })
-    
-    const formatTime = (timeString) => {
-      const date = new Date(timeString)
-      const now = new Date()
-      const diff = now - date
-      const hours = Math.floor(diff / (1000 * 60 * 60))
-      
-      if (hours < 1) return '刚刚'
-      if (hours < 24) return `${hours}小时前`
-      const days = Math.floor(hours / 24)
-      return `${days}天前`
-    }
-    
-    const navigateToSection = (sectionId) => {
-      router.push(`/forum/section/${sectionId}`)
-    }
-    
-    const navigateToTopic = (topicId) => {
-      router.push(`/forum/topic/${topicId}`)
-    }
-    
-    const showTagInput = () => {
-      tagInputVisible.value = true
-      nextTick(() => {
-        tagInputRef.value?.focus()
-      })
-    }
-    
-    const addTopicTag = () => {
-      const tag = tagInputValue.value.trim()
-      if (tag && !newTopic.tags.includes(tag)) {
-        newTopic.tags.push(tag)
-      }
-      tagInputVisible.value = false
-      tagInputValue.value = ''
-    }
-    
-    const removeTopicTag = (tag) => {
-      const index = newTopic.tags.indexOf(tag)
-      if (index > -1) {
-        newTopic.tags.splice(index, 1)
-      }
-    }
-    
-    const handleCloseDialog = () => {
-      if (newTopic.title || newTopic.content) {
-        ElMessageBox.confirm(
-          '确定要关闭吗?未保存的内容将会丢失。',
-          '提示',
-          {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
-            type: 'warning'
-          }
-        ).then(() => {
-          resetForm()
-          showNewTopicDialog.value = false
-        }).catch(() => {
-          // 用户取消
-        })
-      } else {
-        resetForm()
-        showNewTopicDialog.value = false
-      }
-    }
-    
-    const submitNewTopic = async () => {
-      try {
-        await topicFormRef.value?.validate()
-        
-        submitting.value = true
-        
-        // 模拟提交过程
-        await new Promise(resolve => setTimeout(resolve, 1500))
-        
-        ElMessage.success('主题发布成功!')
-        resetForm()
-        showNewTopicDialog.value = false
-        
-        // 跳转到新创建的主题页面
-        router.push('/forum/topic/new')
-        
-      } catch (error) {
-        console.error('表单验证失败:', error)
-      } finally {
-        submitting.value = false
-      }
-    }
-    
-    const resetForm = () => {
-      topicFormRef.value?.resetFields()
-      newTopic.sectionId = ''
-      newTopic.title = ''
-      newTopic.content = ''
-      newTopic.tags = []
-    }
-    
-    return {
-      showNewTopicDialog,
-      submitting,
-      tagInputVisible,
-      tagInputValue,
-      topicFormRef,
-      tagInputRef,
-      forumStats,
-      forumSections,
-      hotTopics,
-      recentReplies,
-      newTopic,
-      topicRules,
-      formatTime,
-      navigateToSection,
-      navigateToTopic,
-      showTagInput,
-      addTopicTag,
-      removeTopicTag,
-      handleCloseDialog,
-      submitNewTopic,
-      Edit,
-      ChatDotRound,
-      Comment,
-      User,
-      View,
-      ArrowRight,
-      Film,
-      Headphones,
-      Monitor,
-      GamePad,
-      Bell,
-      QuestionFilled
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.forum-page {
-  max-width: 1200px;
-  margin: 0 auto;
-  padding: 24px;
-  background: #f5f5f5;
-  min-height: 100vh;
-}
-
-.forum-header {
-  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-  border-radius: 12px;
-  padding: 48px 32px;
-  margin-bottom: 24px;
-  color: white;
-  text-align: center;
-  
-  h1 {
-    font-size: 36px;
-    font-weight: 600;
-    margin: 0 0 12px 0;
-  }
-  
-  .header-description {
-    font-size: 18px;
-    margin: 0 0 24px 0;
-    opacity: 0.9;
-  }
-}
-
-.forum-stats {
-  background: #fff;
-  border-radius: 12px;
-  padding: 24px;
-  margin-bottom: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  .stats-grid {
-    display: grid;
-    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
-    gap: 24px;
-    
-    .stat-item {
-      display: flex;
-      align-items: center;
-      gap: 16px;
-      
-      .stat-info {
-        h3 {
-          font-size: 24px;
-          font-weight: 600;
-          color: #2c3e50;
-          margin: 0 0 4px 0;
-        }
-        
-        p {
-          font-size: 14px;
-          color: #7f8c8d;
-          margin: 0;
-        }
-      }
-    }
-  }
-}
-
-.forum-sections {
-  background: #fff;
-  border-radius: 12px;
-  padding: 24px;
-  margin-bottom: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  .section-title {
-    font-size: 20px;
-    font-weight: 600;
-    color: #2c3e50;
-    margin: 0 0 20px 0;
-  }
-  
-  .sections-list {
-    .section-card {
-      display: flex;
-      align-items: center;
-      gap: 20px;
-      padding: 20px;
-      border: 1px solid #f0f0f0;
-      border-radius: 8px;
-      margin-bottom: 12px;
-      cursor: pointer;
-      transition: all 0.3s ease;
-      
-      &:hover {
-        background: #f8f9fa;
-        border-color: #409eff;
-        transform: translateX(4px);
-      }
-      
-      .section-info {
-        flex: 1;
-        
-        .section-name {
-          font-size: 18px;
-          font-weight: 600;
-          color: #2c3e50;
-          margin: 0 0 8px 0;
-        }
-        
-        .section-description {
-          font-size: 14px;
-          color: #7f8c8d;
-          margin: 0 0 12px 0;
-        }
-        
-        .section-stats {
-          display: flex;
-          gap: 16px;
-          
-          .stat {
-            font-size: 12px;
-            color: #909399;
-          }
-        }
-      }
-      
-      .section-latest {
-        width: 200px;
-        
-        .latest-topic {
-          .topic-title {
-            font-size: 14px;
-            color: #2c3e50;
-            margin: 0 0 8px 0;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            display: -webkit-box;
-            -webkit-line-clamp: 2;
-            -webkit-box-orient: vertical;
-          }
-          
-          .topic-meta {
-            font-size: 12px;
-            color: #909399;
-            
-            .author {
-              margin-right: 8px;
-            }
-          }
-        }
-      }
-    }
-  }
-}
-
-.hot-topics {
-  background: #fff;
-  border-radius: 12px;
-  padding: 24px;
-  margin-bottom: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  .section-header {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: 20px;
-    
-    .section-title {
-      font-size: 20px;
-      font-weight: 600;
-      color: #2c3e50;
-      margin: 0;
-    }
-  }
-  
-  .topics-list {
-    .topic-item {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      padding: 16px;
-      border: 1px solid #f0f0f0;
-      border-radius: 8px;
-      margin-bottom: 12px;
-      cursor: pointer;
-      transition: all 0.3s ease;
-      
-      &:hover {
-        background: #f8f9fa;
-        border-color: #409eff;
-      }
-      
-      .topic-content {
-        flex: 1;
-        
-        .topic-header {
-          display: flex;
-          align-items: center;
-          gap: 12px;
-          margin-bottom: 8px;
-          
-          .topic-title {
-            font-size: 16px;
-            font-weight: 500;
-            color: #2c3e50;
-            margin: 0;
-          }
-          
-          .topic-tags {
-            .el-tag {
-              margin-right: 4px;
-            }
-          }
-        }
-        
-        .topic-meta {
-          display: flex;
-          justify-content: space-between;
-          align-items: center;
-          
-          .author-info {
-            display: flex;
-            align-items: center;
-            gap: 8px;
-            
-            .author-name {
-              font-size: 14px;
-              color: #7f8c8d;
-            }
-          }
-          
-          .topic-stats {
-            display: flex;
-            align-items: center;
-            gap: 16px;
-            font-size: 12px;
-            color: #909399;
-            
-            .stat-item {
-              display: flex;
-              align-items: center;
-              gap: 4px;
-            }
-          }
-        }
-      }
-      
-      .topic-status {
-        .el-tag {
-          margin-left: 8px;
-        }
-      }
-    }
-  }
-}
-
-.recent-replies {
-  background: #fff;
-  border-radius: 12px;
-  padding: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  .section-title {
-    font-size: 20px;
-    font-weight: 600;
-    color: #2c3e50;
-    margin: 0 0 20px 0;
-  }
-  
-  .replies-list {
-    .reply-item {
-      display: flex;
-      flex-direction: column;
-      gap: 12px;
-      padding: 16px;
-      border: 1px solid #f0f0f0;
-      border-radius: 8px;
-      margin-bottom: 12px;
-      cursor: pointer;
-      transition: all 0.3s ease;
-      
-      &:hover {
-        background: #f8f9fa;
-        border-color: #409eff;
-      }
-      
-      .reply-content {
-        flex: 1;
-        
-        .reply-header {
-          font-size: 14px;
-          margin-bottom: 8px;
-          
-          .reply-author {
-            font-weight: 600;
-            color: #2c3e50;
-          }
-          
-          .reply-action {
-            color: #7f8c8d;
-            margin: 0 4px;
-          }
-          
-          .topic-title {
-            color: #409eff;
-            font-weight: 500;
-          }
-        }
-        
-        .reply-text {
-          font-size: 14px;
-          color: #5a6c7d;
-          margin-bottom: 8px;
-          overflow: hidden;
-          text-overflow: ellipsis;
-          display: -webkit-box;
-          -webkit-line-clamp: 2;
-          -webkit-box-orient: vertical;
-        }
-        
-        .reply-time {
-          font-size: 12px;
-          color: #909399;
-        }
-      }
-    }
-  }
-}
-</style>
-
-.tags-input {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 8px;
-  align-items: center;
-  
-  .el-tag {
-    margin: 0;
-  }
-}
-
-@media (max-width: 768px) {
-  .forum-page {
-    padding: 16px;
-  }
-  
-  .forum-header {
-    padding: 32px 24px;
-    
-    h1 {
-      font-size: 28px;
-    }
-    
-    .header-description {
-      font-size: 16px;
-    }
-  }
-  
-  .stats-grid {
-    grid-template-columns: repeat(2, 1fr);
-  }
-  
-  .section-card {
-    flex-direction: column;
-    text-align: center;
-    
-    .section-latest {
-      width: 100%;
-      margin-top: 16px;
-    }
-  }
-  
-  .topic-item {
-    flex-direction: column;
-    align-items: flex-start;
-    
-    .topic-status {
-      margin-top: 12px;
-      align-self: flex-end;
-    }
-  }
+<template>

+  <div class="forum-page">

+    <div class="page-container">

+      <!-- 论坛头部 -->

+      <div class="forum-header">

+        <div class="header-content">

+          <h1>社区论坛</h1>

+          <p class="header-description">与其他用户交流讨论,分享经验心得</p>

+          <div class="header-actions">

+            <el-button type="primary" :icon="Edit" @click="showNewTopicDialog = true">

+              发布新帖

+            </el-button>

+          </div>

+        </div>

+      </div>

+

+      <!-- 论坛统计 -->

+      <div class="forum-stats">

+        <div class="stats-grid">

+          <div class="stat-item">

+            <el-icon size="32" color="#409eff"><ChatDotRound /></el-icon>

+            <div class="stat-info">

+              <h3>{{ forumStats.totalTopics }}</h3>

+              <p>主题总数</p>

+            </div>

+          </div>

+          <div class="stat-item">

+            <el-icon size="32" color="#67c23a"><Comment /></el-icon>

+            <div class="stat-info">

+              <h3>{{ forumStats.totalReplies }}</h3>

+              <p>回复总数</p>

+            </div>

+          </div>

+          <div class="stat-item">

+            <el-icon size="32" color="#e6a23c"><User /></el-icon>

+            <div class="stat-info">

+              <h3>{{ forumStats.activeUsers }}</h3>

+              <p>活跃用户</p>

+            </div>

+          </div>

+          <div class="stat-item">

+            <el-icon size="32" color="#f56c6c"><View /></el-icon>

+            <div class="stat-info">

+              <h3>{{ forumStats.todayPosts }}</h3>

+              <p>今日发帖</p>

+            </div>

+          </div>

+        </div>

+      </div>

+

+      <!-- 版块列表 -->

+      <div class="forum-sections">

+        <h2 class="section-title">论坛版块</h2>

+        <div class="sections-list">

+          <div

+            v-for="section in forumSections"

+            :key="section.id"

+            class="section-card"

+            @click="navigateToSection(section.id)"

+          >

+            <div class="section-icon">

+              <el-icon size="48" :color="section.color">

+                <component :is="section.icon" />

+              </el-icon>

+            </div>

+            <div class="section-info">

+              <h3 class="section-name">{{ section.name }}</h3>

+              <p class="section-description">{{ section.description }}</p>

+              <div class="section-stats">

+                <span class="stat">{{ section.topics }} 主题</span>

+                <span class="stat">{{ section.replies }} 回复</span>

+              </div>

+            </div>

+            <div class="section-latest">

+              <div v-if="section.latestTopic" class="latest-topic">

+                <p class="topic-title">{{ section.latestTopic.title }}</p>

+                <div class="topic-meta">

+                  <span class="author">{{ section.latestTopic.author }}</span>

+                  <span class="time">{{ formatTime(section.latestTopic.time) }}</span>

+                </div>

+              </div>

+            </div>

+          </div>

+        </div>

+      </div>

+

+      <!-- 热门主题 -->

+      <div class="hot-topics">

+        <div class="section-header">

+          <h2 class="section-title">热门主题</h2>

+          <el-button type="primary" text @click="$router.push('/forum/topics')">

+            查看全部 <el-icon><ArrowRight /></el-icon>

+          </el-button>

+        </div>

+        <div class="topics-list">

+          <div

+            v-for="topic in hotTopics"

+            :key="topic.id"

+            class="topic-item"

+            @click="navigateToTopic(topic.id)"

+          >

+            <div class="topic-content">

+              <div class="topic-header">

+                <h4 class="topic-title">{{ topic.title }}</h4>

+                <div class="topic-tags">

+                  <el-tag

+                    v-for="tag in topic.tags"

+                    :key="tag"

+                    size="small"

+                    type="info"

+                  >

+                    {{ tag }}

+                  </el-tag>

+                </div>

+              </div>

+              <div class="topic-meta">

+                <div class="author-info">

+                  <el-avatar :size="24">{{ topic.author.charAt(0) }}</el-avatar>

+                  <span class="author-name">{{ topic.author }}</span>

+                </div>

+                <div class="topic-stats">

+                  <span class="stat-item">

+                    <el-icon><View /></el-icon>

+                    {{ topic.views }}

+                  </span>

+                  <span class="stat-item">

+                    <el-icon><Comment /></el-icon>

+                    {{ topic.replies }}

+                  </span>

+                  <span class="time">{{ formatTime(topic.lastReply) }}</span>

+                </div>

+              </div>

+            </div>

+            <div class="topic-status">

+              <el-tag v-if="topic.pinned" type="warning" size="small">置顶</el-tag>

+              <el-tag v-if="topic.hot" type="danger" size="small">热门</el-tag>

+            </div>

+          </div>

+        </div>

+      </div>

+

+      <!-- 最新回复 -->

+      <div class="recent-replies">

+        <h2 class="section-title">最新回复</h2>

+        <div class="replies-list">

+          <div

+            v-for="reply in recentReplies"

+            :key="reply.id"

+            class="reply-item"

+            @click="navigateToTopic(reply.topicId)"

+          >

+            <div class="reply-avatar">

+              <el-avatar :size="40">{{ reply.author.charAt(0) }}</el-avatar>

+            </div>

+            <div class="reply-content">

+              <div class="reply-header">

+                <span class="reply-author">{{ reply.author }}</span>

+                <span class="reply-action">回复了主题</span>

+                <span class="topic-title">{{ reply.topicTitle }}</span>

+              </div>

+              <div class="reply-text">{{ reply.content }}</div>

+              <div class="reply-time">{{ formatTime(reply.time) }}</div>

+            </div>

+          </div>

+        </div>

+      </div>

+    </div>

+

+    <!-- 发布新帖对话框 -->

+    <el-dialog

+      v-model="showNewTopicDialog"

+      title="发布新主题"

+      width="600px"

+      :before-close="handleCloseDialog"

+    >

+      <el-form

+        ref="topicFormRef"

+        :model="newTopic"

+        :rules="topicRules"

+        label-width="80px"

+      >

+        <el-form-item label="版块" prop="sectionId">

+          <el-select v-model="newTopic.sectionId" placeholder="选择版块">

+            <el-option

+              v-for="section in forumSections"

+              :key="section.id"

+              :label="section.name"

+              :value="section.id"

+            />

+          </el-select>

+        </el-form-item>

+        

+        <el-form-item label="标题" prop="title">

+          <el-input

+            v-model="newTopic.title"

+            placeholder="请输入主题标题"

+            maxlength="100"

+            show-word-limit

+          />

+        </el-form-item>

+        

+        <el-form-item label="标签">

+          <div class="tags-input">

+            <el-tag

+              v-for="tag in newTopic.tags"

+              :key="tag"

+              closable

+              @close="removeTopicTag(tag)"

+            >

+              {{ tag }}

+            </el-tag>

+            <el-input

+              v-if="tagInputVisible"

+              ref="tagInputRef"

+              v-model="tagInputValue"

+              size="small"

+              @keyup.enter="addTopicTag"

+              @blur="addTopicTag"

+              style="width: 100px;"

+            />

+            <el-button

+              v-else

+              size="small"

+              @click="showTagInput"

+            >

+              + 添加标签

+            </el-button>

+          </div>

+        </el-form-item>

+        

+        <el-form-item label="内容" prop="content">

+          <el-input

+            v-model="newTopic.content"

+            type="textarea"

+            :rows="8"

+            placeholder="请输入主题内容..."

+            maxlength="5000"

+            show-word-limit

+          />

+        </el-form-item>

+      </el-form>

+      

+      <template #footer>

+        <el-button @click="handleCloseDialog">取消</el-button>

+        <el-button type="primary" @click="submitNewTopic" :loading="submitting">

+          发布主题

+        </el-button>

+      </template>

+    </el-dialog>

+  </div>

+</template>

+

+<script>

+import { ref, reactive, onMounted, nextTick } from 'vue'

+import { useRouter } from 'vue-router'

+import { ElMessage, ElMessageBox } from 'element-plus'

+import {

+  Edit,

+  ChatDotRound,

+  Comment,

+  User,

+  View,

+  ArrowRight,

+  Film,

+  Headphones,

+  Monitor,

+  GamePad,

+  ChatLineRound,

+  QuestionFilled,

+  Bell

+} from '@element-plus/icons-vue'

+

+export default {

+  name: 'ForumView',

+  setup() {

+    const router = useRouter()

+    const topicFormRef = ref(null)

+    const tagInputRef = ref(null)

+    

+    const showNewTopicDialog = ref(false)

+    const submitting = ref(false)

+    const tagInputVisible = ref(false)

+    const tagInputValue = ref('')

+    

+    const forumStats = reactive({

+      totalTopics: '15,268',

+      totalReplies: '89,456',

+      activeUsers: '2,341',

+      todayPosts: '156'

+    })

+    

+    const newTopic = reactive({

+      sectionId: '',

+      title: '',

+      content: '',

+      tags: []

+    })

+    

+    const topicRules = {

+      sectionId: [

+        { required: true, message: '请选择版块', trigger: 'change' }

+      ],

+      title: [

+        { required: true, message: '请输入标题', trigger: 'blur' },

+        { min: 5, max: 100, message: '标题长度在 5 到 100 个字符', trigger: 'blur' }

+      ],

+      content: [

+        { required: true, message: '请输入内容', trigger: 'blur' },

+        { min: 10, max: 5000, message: '内容长度在 10 到 5000 个字符', trigger: 'blur' }

+      ]

+    }

+    

+    const forumSections = ref([

+      {

+        id: 1,

+        name: '电影讨论',

+        description: '分享和讨论电影资源,交流观影心得',

+        icon: 'Film',

+        color: '#409eff',

+        topics: 3256,

+        replies: 18934,

+        latestTopic: {

+          title: '2024年最佳科幻电影推荐',

+          author: 'MovieFan',

+          time: '2025-06-03T14:30:00'

+        }

+      },

+      {

+        id: 2,

+        name: '音乐分享',

+        description: '音乐资源分享,音乐制作技术交流',

+        icon: 'Headphones',

+        color: '#67c23a',

+        topics: 1892,

+        replies: 9567,

+        latestTopic: {

+          title: '无损音乐格式对比分析',

+          author: 'AudioExpert',

+          time: '2025-06-03T13:45:00'

+        }

+      },

+      {

+        id: 3,

+        name: '软件技术',

+        description: '软件资源分享,技术问题讨论',

+        icon: 'Monitor',

+        color: '#e6a23c',

+        topics: 2134,

+        replies: 12456,

+        latestTopic: {

+          title: 'Adobe 2025 新功能体验分享',

+          author: 'TechGuru',

+          time: '2025-06-03T12:20:00'

+        }

+      },

+      {

+        id: 4,

+        name: '游戏天地',

+        description: '游戏资源分享,游戏攻略讨论',

+        icon: 'GamePad',

+        color: '#f56c6c',

+        topics: 1567,

+        replies: 8234,

+        latestTopic: {

+          title: '年度游戏大作盘点',

+          author: 'GameMaster',

+          time: '2025-06-03T11:50:00'

+        }

+      },

+      {

+        id: 5,

+        name: '站务公告',

+        description: '网站公告,规则说明,意见建议',

+        icon: 'Bell',

+        color: '#909399',

+        topics: 234,

+        replies: 1567,

+        latestTopic: {

+          title: '网站维护通知',

+          author: 'Admin',

+          time: '2025-06-03T10:00:00'

+        }

+      },

+      {

+        id: 6,

+        name: '新手求助',

+        description: '新手问题解答,使用教程分享',

+        icon: 'QuestionFilled',

+        color: '#606266',

+        topics: 456,

+        replies: 2890,

+        latestTopic: {

+          title: '新手如何提高分享率?',

+          author: 'Newbie123',

+          time: '2025-06-03T09:30:00'

+        }

+      }

+    ])

+    

+    const hotTopics = ref([

+      {

+        id: 1,

+        title: '2024年度最佳PT站点推荐与对比分析',

+        author: 'PTExpert',

+        views: 2856,

+        replies: 147,

+        lastReply: '2025-06-03T14:25:00',

+        tags: ['PT站点', '推荐', '对比'],

+        pinned: true,

+        hot: true

+      },

+      {

+        id: 2,

+        title: '如何安全高效地使用BT下载工具',

+        author: 'SafeDownloader',

+        views: 1932,

+        replies: 89,

+        lastReply: '2025-06-03T13:50:00',

+        tags: ['BT工具', '安全', '教程'],

+        hot: true

+      },

+      {

+        id: 3,

+        title: '分享率提升技巧与经验总结',

+        author: 'SeedMaster',

+        views: 1654,

+        replies: 76,

+        lastReply: '2025-06-03T12:40:00',

+        tags: ['分享率', '技巧', '经验']

+      }

+    ])

+    

+    const recentReplies = ref([

+      {

+        id: 1,

+        author: 'MovieLover88',

+        topicId: 1,

+        topicTitle: '阿凡达2观影感受分享',

+        content: '画面效果确实震撼,特别是水下的场景...',

+        time: '2025-06-03T14:45:00'

+      },

+      {

+        id: 2,

+        author: 'TechEnthusiast',

+        topicId: 2,

+        topicTitle: '最新版Photoshop使用技巧',

+        content: '新的AI功能确实很强大,大大提高了工作效率...',

+        time: '2025-06-03T14:30:00'

+      },

+      {

+        id: 3,

+        author: 'GameFan2024',

+        topicId: 3,

+        topicTitle: '赛博朋克2077最新更新体验',

+        content: '修复了很多bug,现在游戏体验好多了...',

+        time: '2025-06-03T14:15:00'

+      }

+    ])

+    

+    onMounted(() => {

+      // 初始化论坛数据

+    })

+    

+    const formatTime = (timeString) => {

+      const date = new Date(timeString)

+      const now = new Date()

+      const diff = now - date

+      const hours = Math.floor(diff / (1000 * 60 * 60))

+      

+      if (hours < 1) return '刚刚'

+      if (hours < 24) return `${hours}小时前`

+      const days = Math.floor(hours / 24)

+      return `${days}天前`

+    }

+    

+    const navigateToSection = (sectionId) => {

+      router.push(`/forum/section/${sectionId}`)

+    }

+    

+    const navigateToTopic = (topicId) => {

+      router.push(`/forum/topic/${topicId}`)

+    }

+    

+    const showTagInput = () => {

+      tagInputVisible.value = true

+      nextTick(() => {

+        tagInputRef.value?.focus()

+      })

+    }

+    

+    const addTopicTag = () => {

+      const tag = tagInputValue.value.trim()

+      if (tag && !newTopic.tags.includes(tag)) {

+        newTopic.tags.push(tag)

+      }

+      tagInputVisible.value = false

+      tagInputValue.value = ''

+    }

+    

+    const removeTopicTag = (tag) => {

+      const index = newTopic.tags.indexOf(tag)

+      if (index > -1) {

+        newTopic.tags.splice(index, 1)

+      }

+    }

+    

+    const handleCloseDialog = () => {

+      if (newTopic.title || newTopic.content) {

+        ElMessageBox.confirm(

+          '确定要关闭吗?未保存的内容将会丢失。',

+          '提示',

+          {

+            confirmButtonText: '确定',

+            cancelButtonText: '取消',

+            type: 'warning'

+          }

+        ).then(() => {

+          resetForm()

+          showNewTopicDialog.value = false

+        }).catch(() => {

+          // 用户取消

+        })

+      } else {

+        resetForm()

+        showNewTopicDialog.value = false

+      }

+    }

+    

+    const submitNewTopic = async () => {

+      try {

+        await topicFormRef.value?.validate()

+        

+        submitting.value = true

+        

+        // 模拟提交过程

+        await new Promise(resolve => setTimeout(resolve, 1500))

+        

+        ElMessage.success('主题发布成功!')

+        resetForm()

+        showNewTopicDialog.value = false

+        

+        // 跳转到新创建的主题页面

+        router.push('/forum/topic/new')

+        

+      } catch (error) {

+        console.error('表单验证失败:', error)

+      } finally {

+        submitting.value = false

+      }

+    }

+    

+    const resetForm = () => {

+      topicFormRef.value?.resetFields()

+      newTopic.sectionId = ''

+      newTopic.title = ''

+      newTopic.content = ''

+      newTopic.tags = []

+    }

+    

+    return {

+      showNewTopicDialog,

+      submitting,

+      tagInputVisible,

+      tagInputValue,

+      topicFormRef,

+      tagInputRef,

+      forumStats,

+      forumSections,

+      hotTopics,

+      recentReplies,

+      newTopic,

+      topicRules,

+      formatTime,

+      navigateToSection,

+      navigateToTopic,

+      showTagInput,

+      addTopicTag,

+      removeTopicTag,

+      handleCloseDialog,

+      submitNewTopic,

+      Edit,

+      ChatDotRound,

+      Comment,

+      User,

+      View,

+      ArrowRight,

+      Film,

+      Headphones,

+      Monitor,

+      GamePad,

+      Bell,

+      QuestionFilled

+    }

+  }

+}

+</script>

+

+<style lang="scss" scoped>

+.forum-page {

+  max-width: 1200px;

+  margin: 0 auto;

+  padding: 24px;

+  background: #f5f5f5;

+  min-height: 100vh;

+}

+

+.forum-header {

+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);

+  border-radius: 12px;

+  padding: 48px 32px;

+  margin-bottom: 24px;

+  color: white;

+  text-align: center;

+  

+  h1 {

+    font-size: 36px;

+    font-weight: 600;

+    margin: 0 0 12px 0;

+  }

+  

+  .header-description {

+    font-size: 18px;

+    margin: 0 0 24px 0;

+    opacity: 0.9;

+  }

+}

+

+.forum-stats {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  .stats-grid {

+    display: grid;

+    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));

+    gap: 24px;

+    

+    .stat-item {

+      display: flex;

+      align-items: center;

+      gap: 16px;

+      

+      .stat-info {

+        h3 {

+          font-size: 24px;

+          font-weight: 600;

+          color: #2c3e50;

+          margin: 0 0 4px 0;

+        }

+        

+        p {

+          font-size: 14px;

+          color: #7f8c8d;

+          margin: 0;

+        }

+      }

+    }

+  }

+}

+

+.forum-sections {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  .section-title {

+    font-size: 20px;

+    font-weight: 600;

+    color: #2c3e50;

+    margin: 0 0 20px 0;

+  }

+  

+  .sections-list {

+    .section-card {

+      display: flex;

+      align-items: center;

+      gap: 20px;

+      padding: 20px;

+      border: 1px solid #f0f0f0;

+      border-radius: 8px;

+      margin-bottom: 12px;

+      cursor: pointer;

+      transition: all 0.3s ease;

+      

+      &:hover {

+        background: #f8f9fa;

+        border-color: #409eff;

+        transform: translateX(4px);

+      }

+      

+      .section-info {

+        flex: 1;

+        

+        .section-name {

+          font-size: 18px;

+          font-weight: 600;

+          color: #2c3e50;

+          margin: 0 0 8px 0;

+        }

+        

+        .section-description {

+          font-size: 14px;

+          color: #7f8c8d;

+          margin: 0 0 12px 0;

+        }

+        

+        .section-stats {

+          display: flex;

+          gap: 16px;

+          

+          .stat {

+            font-size: 12px;

+            color: #909399;

+          }

+        }

+      }

+      

+      .section-latest {

+        width: 200px;

+        

+        .latest-topic {

+          .topic-title {

+            font-size: 14px;

+            color: #2c3e50;

+            margin: 0 0 8px 0;

+            overflow: hidden;

+            text-overflow: ellipsis;

+            display: -webkit-box;

+            -webkit-line-clamp: 2;

+            -webkit-box-orient: vertical;

+          }

+          

+          .topic-meta {

+            font-size: 12px;

+            color: #909399;

+            

+            .author {

+              margin-right: 8px;

+            }

+          }

+        }

+      }

+    }

+  }

+}

+

+.hot-topics {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  .section-header {

+    display: flex;

+    justify-content: space-between;

+    align-items: center;

+    margin-bottom: 20px;

+    

+    .section-title {

+      font-size: 20px;

+      font-weight: 600;

+      color: #2c3e50;

+      margin: 0;

+    }

+  }

+  

+  .topics-list {

+    .topic-item {

+      display: flex;

+      justify-content: space-between;

+      align-items: center;

+      padding: 16px;

+      border: 1px solid #f0f0f0;

+      border-radius: 8px;

+      margin-bottom: 12px;

+      cursor: pointer;

+      transition: all 0.3s ease;

+      

+      &:hover {

+        background: #f8f9fa;

+        border-color: #409eff;

+      }

+      

+      .topic-content {

+        flex: 1;

+        

+        .topic-header {

+          display: flex;

+          align-items: center;

+          gap: 12px;

+          margin-bottom: 8px;

+          

+          .topic-title {

+            font-size: 16px;

+            font-weight: 500;

+            color: #2c3e50;

+            margin: 0;

+          }

+          

+          .topic-tags {

+            .el-tag {

+              margin-right: 4px;

+            }

+          }

+        }

+        

+        .topic-meta {

+          display: flex;

+          justify-content: space-between;

+          align-items: center;

+          

+          .author-info {

+            display: flex;

+            align-items: center;

+            gap: 8px;

+            

+            .author-name {

+              font-size: 14px;

+              color: #7f8c8d;

+            }

+          }

+          

+          .topic-stats {

+            display: flex;

+            align-items: center;

+            gap: 16px;

+            font-size: 12px;

+            color: #909399;

+            

+            .stat-item {

+              display: flex;

+              align-items: center;

+              gap: 4px;

+            }

+          }

+        }

+      }

+      

+      .topic-status {

+        .el-tag {

+          margin-left: 8px;

+        }

+      }

+    }

+  }

+}

+

+.recent-replies {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  .section-title {

+    font-size: 20px;

+    font-weight: 600;

+    color: #2c3e50;

+    margin: 0 0 20px 0;

+  }

+  

+  .replies-list {

+    .reply-item {

+      display: flex;

+      flex-direction: column;

+      gap: 12px;

+      padding: 16px;

+      border: 1px solid #f0f0f0;

+      border-radius: 8px;

+      margin-bottom: 12px;

+      cursor: pointer;

+      transition: all 0.3s ease;

+      

+      &:hover {

+        background: #f8f9fa;

+        border-color: #409eff;

+      }

+      

+      .reply-content {

+        flex: 1;

+        

+        .reply-header {

+          font-size: 14px;

+          margin-bottom: 8px;

+          

+          .reply-author {

+            font-weight: 600;

+            color: #2c3e50;

+          }

+          

+          .reply-action {

+            color: #7f8c8d;

+            margin: 0 4px;

+          }

+          

+          .topic-title {

+            color: #409eff;

+            font-weight: 500;

+          }

+        }

+        

+        .reply-text {

+          font-size: 14px;

+          color: #5a6c7d;

+          margin-bottom: 8px;

+          overflow: hidden;

+          text-overflow: ellipsis;

+          display: -webkit-box;

+          -webkit-line-clamp: 2;

+          -webkit-box-orient: vertical;

+        }

+        

+        .reply-time {

+          font-size: 12px;

+          color: #909399;

+        }

+      }

+    }

+  }

+}

+</style>

+

+.tags-input {

+  display: flex;

+  flex-wrap: wrap;

+  gap: 8px;

+  align-items: center;

+  

+  .el-tag {

+    margin: 0;

+  }

+}

+

+@media (max-width: 768px) {

+  .forum-page {

+    padding: 16px;

+  }

+  

+  .forum-header {

+    padding: 32px 24px;

+    

+    h1 {

+      font-size: 28px;

+    }

+    

+    .header-description {

+      font-size: 16px;

+    }

+  }

+  

+  .stats-grid {

+    grid-template-columns: repeat(2, 1fr);

+  }

+  

+  .section-card {

+    flex-direction: column;

+    text-align: center;

+    

+    .section-latest {

+      width: 100%;

+      margin-top: 16px;

+    }

+  }

+  

+  .topic-item {

+    flex-direction: column;

+    align-items: flex-start;

+    

+    .topic-status {

+      margin-top: 12px;

+      align-self: flex-end;

+    }

+  }

 } 
\ No newline at end of file
diff --git a/src/views/torrent/TorrentDetailView.vue b/src/views/torrent/TorrentDetailView.vue
index 941ebd1..c8ee498 100644
--- a/src/views/torrent/TorrentDetailView.vue
+++ b/src/views/torrent/TorrentDetailView.vue
@@ -1,862 +1,862 @@
-<template>
-  <div class="torrent-detail-page">
-    <div class="page-container">
-      <!-- 返回按钮 -->
-      <div class="back-button">
-        <el-button :icon="ArrowLeft" @click="$router.back()">
-          返回列表
-        </el-button>
-      </div>
-
-      <!-- 种子基本信息 -->
-      <div class="torrent-header">
-        <div class="header-content">
-          <div class="torrent-cover">
-            <el-image
-              :src="torrentInfo.coverImage || '/default-cover.jpg'"
-              :alt="torrentInfo.title"
-              fit="cover"
-              class="cover-image"
-            >
-              <template #error>
-                <div class="image-placeholder">
-                  <el-icon size="48"><Picture /></el-icon>
-                  <span>暂无封面</span>
-                </div>
-              </template>
-            </el-image>
-          </div>
-          
-          <div class="torrent-info">
-            <div class="category-tag">
-              <el-tag :type="getCategoryType(torrentInfo.category)" size="large">
-                {{ getCategoryName(torrentInfo.category) }}
-              </el-tag>
-              <el-tag v-if="torrentInfo.subcategory" type="info" size="small">
-                {{ torrentInfo.subcategory }}
-              </el-tag>
-            </div>
-            
-            <h1 class="torrent-title">{{ torrentInfo.title }}</h1>
-            
-            <div class="torrent-tags">
-              <el-tag
-                v-for="tag in torrentInfo.tags"
-                :key="tag"
-                size="small"
-                effect="plain"
-              >
-                {{ tag }}
-              </el-tag>
-            </div>
-            
-            <div class="torrent-meta">
-              <div class="meta-item">
-                <el-icon><User /></el-icon>
-                <span>上传者:{{ torrentInfo.uploader }}</span>
-              </div>
-              <div class="meta-item">
-                <el-icon><Clock /></el-icon>
-                <span>上传时间:{{ formatDateTime(torrentInfo.uploadTime) }}</span>
-              </div>
-              <div class="meta-item">
-                <el-icon><Document /></el-icon>
-                <span>文件大小:{{ torrentInfo.size }}</span>
-              </div>
-              <div class="meta-item">
-                <el-icon><Files /></el-icon>
-                <span>文件数量:{{ torrentInfo.fileCount }} 个</span>
-              </div>
-            </div>
-            
-            <div class="torrent-stats">
-              <div class="stat-item seeders">
-                <span class="stat-number">{{ torrentInfo.seeders }}</span>
-                <span class="stat-label">做种</span>
-              </div>
-              <div class="stat-item leechers">
-                <span class="stat-number">{{ torrentInfo.leechers }}</span>
-                <span class="stat-label">下载</span>
-              </div>
-              <div class="stat-item downloads">
-                <span class="stat-number">{{ torrentInfo.downloads }}</span>
-                <span class="stat-label">完成</span>
-              </div>
-            </div>
-            
-            <div class="action-buttons">
-              <el-button 
-                type="primary" 
-                size="large" 
-                :icon="Download"
-                @click="handleDownload"
-                :loading="downloading"
-              >
-                {{ downloading ? '准备中...' : '下载种子' }}
-              </el-button>
-              <el-button 
-                type="success" 
-                size="large" 
-                :icon="Star"
-                @click="handleFavorite"
-              >
-                {{ isFavorited ? '已收藏' : '收藏' }}
-              </el-button>
-              <el-button 
-                type="warning" 
-                size="large" 
-                :icon="Flag"
-                @click="handleReport"
-              >
-                举报
-              </el-button>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <!-- 详细信息选项卡 -->
-      <div class="detail-tabs">
-        <el-tabs v-model="activeTab" type="border-card">
-          <!-- 种子描述 -->
-          <el-tab-pane label="详细描述" name="description">
-            <div class="description-content">
-              <div v-if="torrentInfo.description" v-html="formatDescription(torrentInfo.description)"></div>
-              <div v-else class="no-description">暂无详细描述</div>
-            </div>
-          </el-tab-pane>
-          
-          <!-- 文件列表 -->
-          <el-tab-pane label="文件列表" name="files" lazy>
-            <div class="files-list">
-              <el-table :data="torrentInfo.files" stripe>
-                <el-table-column label="文件名" prop="name" min-width="400">
-                  <template #default="{ row }">
-                    <div class="file-name">
-                      <el-icon v-if="row.type === 'folder'"><Folder /></el-icon>
-                      <el-icon v-else><Document /></el-icon>
-                      <span>{{ row.name }}</span>
-                    </div>
-                  </template>
-                </el-table-column>
-                <el-table-column label="大小" prop="size" width="120" align="right" />
-                <el-table-column label="路径" prop="path" min-width="300" />
-              </el-table>
-            </div>
-          </el-tab-pane>
-          
-          <!-- 用户活动 -->
-          <el-tab-pane label="用户活动" name="activity">
-            <div class="activity-section">
-              <div class="activity-stats">
-                <div class="stats-grid">
-                  <div class="stat-card">
-                    <h3>做种用户</h3>
-                    <p class="stat-number">{{ torrentInfo.seeders }}</p>
-                  </div>
-                  <div class="stat-card">
-                    <h3>下载用户</h3>
-                    <p class="stat-number">{{ torrentInfo.leechers }}</p>
-                  </div>
-                  <div class="stat-card">
-                    <h3>完成用户</h3>
-                    <p class="stat-number">{{ torrentInfo.downloads }}</p>
-                  </div>
-                </div>
-              </div>
-              
-              <div class="user-lists">
-                <el-tabs v-model="activityTab" type="card">
-                  <el-tab-pane label="做种用户" name="seeders">
-                    <el-table :data="seedersList" max-height="400">
-                      <el-table-column label="用户" prop="username" />
-                      <el-table-column label="上传量" prop="uploaded" />
-                      <el-table-column label="下载量" prop="downloaded" />
-                      <el-table-column label="分享率" prop="ratio" />
-                      <el-table-column label="做种时间" prop="seedTime" />
-                    </el-table>
-                  </el-tab-pane>
-                  
-                  <el-tab-pane label="下载用户" name="leechers">
-                    <el-table :data="leechersList" max-height="400">
-                      <el-table-column label="用户" prop="username" />
-                      <el-table-column label="进度" prop="progress">
-                        <template #default="{ row }">
-                          <el-progress :percentage="row.progress" :stroke-width="6" />
-                        </template>
-                      </el-table-column>
-                      <el-table-column label="下载速度" prop="downloadSpeed" />
-                      <el-table-column label="剩余时间" prop="eta" />
-                    </el-table>
-                  </el-tab-pane>
-                </el-tabs>
-              </div>
-            </div>
-          </el-tab-pane>
-          
-          <!-- 评论区 -->
-          <el-tab-pane label="评论" name="comments">
-            <div class="comments-section">
-              <!-- 发表评论 -->
-              <div class="comment-form">
-                <el-input
-                  v-model="newComment"
-                  type="textarea"
-                  :rows="4"
-                  placeholder="发表你的评论..."
-                  maxlength="500"
-                  show-word-limit
-                />
-                <div class="comment-actions">
-                  <el-button type="primary" @click="submitComment" :loading="submittingComment">
-                    发表评论
-                  </el-button>
-                </div>
-              </div>
-              
-              <!-- 评论列表 -->
-              <div class="comments-list">
-                <div
-                  v-for="comment in comments"
-                  :key="comment.id"
-                  class="comment-item"
-                >
-                  <div class="comment-avatar">
-                    <el-avatar :size="40">{{ comment.username.charAt(0) }}</el-avatar>
-                  </div>
-                  <div class="comment-content">
-                    <div class="comment-header">
-                      <span class="comment-username">{{ comment.username }}</span>
-                      <span class="comment-time">{{ formatDateTime(comment.time) }}</span>
-                    </div>
-                    <div class="comment-text">{{ comment.content }}</div>
-                    <div class="comment-actions">
-                      <el-button type="text" size="small" @click="likeComment(comment.id)">
-                        <el-icon><Like /></el-icon>
-                        {{ comment.likes || 0 }}
-                      </el-button>
-                      <el-button type="text" size="small" @click="replyComment(comment.id)">
-                        回复
-                      </el-button>
-                    </div>
-                  </div>
-                </div>
-                
-                <div v-if="comments.length === 0" class="no-comments">
-                  暂无评论,快来发表第一条评论吧!
-                </div>
-              </div>
-            </div>
-          </el-tab-pane>
-        </el-tabs>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { ref, onMounted } from 'vue'
-import { useRoute, useRouter } from 'vue-router'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import {
-  ArrowLeft,
-  Download,
-  Star,
-  Flag,
-  User,
-  Clock,
-  Document,
-  Files,
-  Picture,
-  Folder,
-  Like
-} from '@element-plus/icons-vue'
-
-export default {
-  name: 'TorrentDetailView',
-  setup() {
-    const route = useRoute()
-    const router = useRouter()
-    
-    const activeTab = ref('description')
-    const activityTab = ref('seeders')
-    const downloading = ref(false)
-    const isFavorited = ref(false)
-    const submittingComment = ref(false)
-    const newComment = ref('')
-    
-    const torrentInfo = ref({
-      id: 1,
-      title: '[4K蓝光原盘] 阿凡达:水之道 Avatar: The Way of Water (2022)',
-      category: 'movie',
-      subcategory: '科幻片',
-      uploader: 'MovieMaster',
-      uploadTime: '2025-06-03T10:30:00',
-      size: '85.6 GB',
-      fileCount: 125,
-      seeders: 128,
-      leechers: 45,
-      downloads: 892,
-      coverImage: 'https://example.com/avatar2-cover.jpg',
-      tags: ['4K', '蓝光原盘', '科幻', '詹姆斯·卡梅隆'],
-      description: `
-        <h3>影片信息</h3>
-        <p><strong>片名:</strong>阿凡达:水之道 / Avatar: The Way of Water</p>
-        <p><strong>年份:</strong>2022</p>
-        <p><strong>导演:</strong>詹姆斯·卡梅隆</p>
-        <p><strong>主演:</strong>萨姆·沃辛顿 / 佐伊·索尔达娜 / 西格妮·韦弗</p>
-        <p><strong>类型:</strong>科幻 / 动作 / 冒险</p>
-        <p><strong>制片国家/地区:</strong>美国</p>
-        <p><strong>语言:</strong>英语</p>
-        <p><strong>上映日期:</strong>2022-12-16</p>
-        <p><strong>片长:</strong>192分钟</p>
-        
-        <h3>影片简介</h3>
-        <p>杰克·萨利和奈蒂莉组建了家庭,他们的孩子也逐渐成长。当危险威胁到他们时,杰克和奈蒂莉必须为彼此而战,为家庭而战,为生存而战。</p>
-        
-        <h3>技术规格</h3>
-        <ul>
-          <li>视频:4K UHD 2160p / HEVC / HDR10</li>
-          <li>音频:Dolby Atmos TrueHD 7.1 / DTS-HD MA 7.1</li>
-          <li>字幕:中文 / 英文</li>
-          <li>片源:4K UHD 蓝光原盘</li>
-        </ul>
-        
-        <h3>下载说明</h3>
-        <p>本资源为4K蓝光原盘,保持了最高的画质和音质。建议使用支持4K播放的设备观看。</p>
-      `,
-      files: [
-        { name: 'BDMV', type: 'folder', size: '85.6 GB', path: '/' },
-        { name: 'CERTIFICATE', type: 'folder', size: '2.1 MB', path: '/' },
-        { name: 'Avatar.The.Way.of.Water.2022.2160p.UHD.Blu-ray.x265.HDR.Atmos-DETAIL.mkv', type: 'file', size: '32.8 GB', path: '/BDMV/STREAM/' },
-        { name: 'Avatar.The.Way.of.Water.2022.Extras.mkv', type: 'file', size: '12.4 GB', path: '/BDMV/STREAM/' }
-      ]
-    })
-    
-    const seedersList = ref([
-      { username: 'SeedMaster', uploaded: '2.5 TB', downloaded: '850 GB', ratio: '3.02', seedTime: '15天' },
-      { username: 'MovieFan88', uploaded: '1.8 TB', downloaded: '1.2 TB', ratio: '1.50', seedTime: '8天' },
-      { username: 'CinemaLover', uploaded: '3.2 TB', downloaded: '900 GB', ratio: '3.56', seedTime: '22天' }
-    ])
-    
-    const leechersList = ref([
-      { username: 'NewUser123', progress: 65, downloadSpeed: '15.2 MB/s', eta: '2小时15分' },
-      { username: 'MovieSeeker', progress: 23, downloadSpeed: '8.7 MB/s', eta: '8小时32分' },
-      { username: 'FilmCollector', progress: 89, downloadSpeed: '22.1 MB/s', eta: '45分钟' }
-    ])
-    
-    const comments = ref([
-      {
-        id: 1,
-        username: 'MovieReviewer',
-        content: '画质非常棒!4K HDR效果惊艳,水下场景美不胜收。感谢分享!',
-        time: '2025-06-03T12:00:00',
-        likes: 15
-      },
-      {
-        id: 2,
-        username: 'CinemaExpert',
-        content: '音效也很棒,Dolby Atmos的环绕效果让人身临其境。推荐大家下载!',
-        time: '2025-06-03T11:30:00',
-        likes: 8
-      }
-    ])
-    
-    onMounted(() => {
-      const torrentId = route.params.id
-      fetchTorrentDetail(torrentId)
-    })
-    
-    const fetchTorrentDetail = async (id) => {
-      try {
-        // 模拟API调用
-        console.log('获取种子详情:', id)
-        // 这里应该调用真实的API
-      } catch (error) {
-        ElMessage.error('获取种子详情失败')
-        router.back()
-      }
-    }
-    
-    const formatDateTime = (dateString) => {
-      const date = new Date(dateString)
-      return date.toLocaleString('zh-CN', {
-        year: 'numeric',
-        month: '2-digit',
-        day: '2-digit',
-        hour: '2-digit',
-        minute: '2-digit'
-      })
-    }
-    
-    const formatDescription = (description) => {
-      // 简单的HTML清理,实际项目中应该使用专门的库
-      return description.replace(/\n/g, '<br>')
-    }
-    
-    const getCategoryType = (category) => {
-      const types = {
-        'movie': 'primary',
-        'tv': 'info',
-        'music': 'success',
-        'software': 'warning',
-        'game': 'danger'
-      }
-      return types[category] || 'default'
-    }
-    
-    const getCategoryName = (category) => {
-      const names = {
-        'movie': '电影',
-        'tv': '电视剧',
-        'music': '音乐',
-        'software': '软件',
-        'game': '游戏'
-      }
-      return names[category] || category
-    }
-    
-    const handleDownload = async () => {
-      downloading.value = true
-      try {
-        // 模拟下载准备过程
-        await new Promise(resolve => setTimeout(resolve, 1500))
-        
-        // 实际项目中这里应该下载.torrent文件
-        const link = document.createElement('a')
-        link.href = '#' // 实际的种子文件下载链接
-        link.download = `${torrentInfo.value.title}.torrent`
-        link.click()
-        
-        ElMessage.success('种子文件下载完成')
-      } catch (error) {
-        ElMessage.error('下载失败,请稍后重试')
-      } finally {
-        downloading.value = false
-      }
-    }
-    
-    const handleFavorite = () => {
-      isFavorited.value = !isFavorited.value
-      ElMessage.success(isFavorited.value ? '已添加到收藏' : '已取消收藏')
-    }
-    
-    const handleReport = async () => {
-      try {
-        await ElMessageBox.prompt('请说明举报原因', '举报内容', {
-          confirmButtonText: '提交举报',
-          cancelButtonText: '取消',
-          inputType: 'textarea',
-          inputPlaceholder: '请详细说明举报原因...'
-        })
-        
-        ElMessage.success('举报已提交,我们会尽快处理')
-      } catch {
-        // 用户取消
-      }
-    }
-    
-    const submitComment = async () => {
-      if (!newComment.value.trim()) {
-        ElMessage.warning('请输入评论内容')
-        return
-      }
-      
-      submittingComment.value = true
-      try {
-        // 模拟提交评论
-        await new Promise(resolve => setTimeout(resolve, 1000))
-        
-        const comment = {
-          id: Date.now(),
-          username: localStorage.getItem('username') || '用户',
-          content: newComment.value,
-          time: new Date().toISOString(),
-          likes: 0
-        }
-        
-        comments.value.unshift(comment)
-        newComment.value = ''
-        
-        ElMessage.success('评论发表成功')
-      } catch (error) {
-        ElMessage.error('发表评论失败')
-      } finally {
-        submittingComment.value = false
-      }
-    }
-    
-    const likeComment = (commentId) => {
-      const comment = comments.value.find(c => c.id === commentId)
-      if (comment) {
-        comment.likes = (comment.likes || 0) + 1
-        ElMessage.success('点赞成功')
-      }
-    }
-    
-    const replyComment = (commentId) => {
-      // 实现回复功能
-      ElMessage.info('回复功能开发中...')
-    }
-    
-    return {
-      activeTab,
-      activityTab,
-      downloading,
-      isFavorited,
-      submittingComment,
-      newComment,
-      torrentInfo,
-      seedersList,
-      leechersList,
-      comments,
-      formatDateTime,
-      formatDescription,
-      getCategoryType,
-      getCategoryName,
-      handleDownload,
-      handleFavorite,
-      handleReport,
-      submitComment,
-      likeComment,
-      replyComment,
-      ArrowLeft,
-      Download,
-      Star,
-      Flag,
-      User,
-      Clock,
-      Document,
-      Files,
-      Picture,
-      Folder,
-      Like
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.torrent-detail-page {
-  max-width: 1200px;
-  margin: 0 auto;
-  padding: 24px;
-  background: #f5f5f5;
-  min-height: 100vh;
-}
-
-.back-button {
-  margin-bottom: 16px;
-}
-
-.torrent-header {
-  background: #fff;
-  border-radius: 12px;
-  padding: 32px;
-  margin-bottom: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  .header-content {
-    display: flex;
-    gap: 32px;
-    
-    .torrent-cover {
-      flex-shrink: 0;
-      
-      .cover-image {
-        width: 200px;
-        height: 280px;
-        border-radius: 8px;
-        object-fit: cover;
-      }
-      
-      .image-placeholder {
-        width: 200px;
-        height: 280px;
-        background: #f5f5f5;
-        border-radius: 8px;
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-        justify-content: center;
-        color: #999;
-        
-        span {
-          margin-top: 8px;
-          font-size: 14px;
-        }
-      }
-    }
-    
-    .torrent-info {
-      flex: 1;
-      
-      .category-tag {
-        margin-bottom: 16px;
-        
-        .el-tag {
-          margin-right: 8px;
-        }
-      }
-      
-      .torrent-title {
-        font-size: 28px;
-        font-weight: 600;
-        color: #2c3e50;
-        margin: 0 0 16px 0;
-        line-height: 1.3;
-      }
-      
-      .torrent-tags {
-        margin-bottom: 20px;
-        
-        .el-tag {
-          margin: 0 8px 8px 0;
-        }
-      }
-      
-      .torrent-meta {
-        margin-bottom: 20px;
-        
-        .meta-item {
-          display: flex;
-          align-items: center;
-          gap: 8px;
-          margin-bottom: 8px;
-          color: #7f8c8d;
-          font-size: 14px;
-          
-          .el-icon {
-            color: #909399;
-          }
-        }
-      }
-      
-      .torrent-stats {
-        display: flex;
-        gap: 32px;
-        margin-bottom: 24px;
-        
-        .stat-item {
-          text-align: center;
-          
-          .stat-number {
-            display: block;
-            font-size: 24px;
-            font-weight: 600;
-            margin-bottom: 4px;
-            
-            &.seeders { color: #67c23a; }
-            &.leechers { color: #f56c6c; }
-            &.downloads { color: #409eff; }
-          }
-          
-          .stat-label {
-            font-size: 14px;
-            color: #909399;
-          }
-        }
-      }
-      
-      .action-buttons {
-        display: flex;
-        gap: 12px;
-        flex-wrap: wrap;
-      }
-    }
-  }
-}
-
-.detail-tabs {
-  background: #fff;
-  border-radius: 12px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  :deep(.el-tabs__content) {
-    padding: 24px;
-  }
-  
-  .description-content {
-    line-height: 1.6;
-    
-    :deep(h3) {
-      color: #2c3e50;
-      font-size: 18px;
-      font-weight: 600;
-      margin: 24px 0 12px 0;
-      
-      &:first-child {
-        margin-top: 0;
-      }
-    }
-    
-    :deep(p) {
-      margin-bottom: 12px;
-      color: #5a6c7d;
-    }
-    
-    :deep(ul) {
-      margin: 12px 0;
-      padding-left: 20px;
-      
-      li {
-        margin-bottom: 8px;
-        color: #5a6c7d;
-      }
-    }
-    
-    .no-description {
-      text-align: center;
-      color: #909399;
-      padding: 40px 0;
-    }
-  }
-  
-  .files-list {
-    .file-name {
-      display: flex;
-      align-items: center;
-      gap: 8px;
-      
-      .el-icon {
-        color: #909399;
-      }
-    }
-  }
-  
-  .activity-section {
-    .activity-stats {
-      margin-bottom: 24px;
-      
-      .stats-grid {
-        display: grid;
-        grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
-        gap: 16px;
-        
-        .stat-card {
-          background: #f8f9fa;
-          padding: 20px;
-          border-radius: 8px;
-          text-align: center;
-          
-          h3 {
-            font-size: 14px;
-            color: #909399;
-            margin: 0 0 8px 0;
-          }
-          
-          .stat-number {
-            font-size: 24px;
-            font-weight: 600;
-            color: #2c3e50;
-          }
-        }
-      }
-    }
-  }
-  
-  .comments-section {
-    .comment-form {
-      margin-bottom: 32px;
-      
-      .comment-actions {
-        margin-top: 12px;
-        text-align: right;
-      }
-    }
-    
-    .comments-list {
-      .comment-item {
-        display: flex;
-        gap: 16px;
-        margin-bottom: 24px;
-        padding-bottom: 24px;
-        border-bottom: 1px solid #f0f0f0;
-        
-        &:last-child {
-          border-bottom: none;
-          margin-bottom: 0;
-          padding-bottom: 0;
-        }
-        
-        .comment-content {
-          flex: 1;
-          
-          .comment-header {
-            display: flex;
-            align-items: center;
-            gap: 12px;
-            margin-bottom: 8px;
-            
-            .comment-username {
-              font-weight: 600;
-              color: #2c3e50;
-            }
-            
-            .comment-time {
-              font-size: 12px;
-              color: #909399;
-            }
-          }
-          
-          .comment-text {
-            color: #5a6c7d;
-            line-height: 1.5;
-            margin-bottom: 12px;
-          }
-          
-          .comment-actions {
-            .el-button {
-              padding: 0;
-              margin-right: 16px;
-              
-              .el-icon {
-                margin-right: 4px;
-              }
-            }
-          }
-        }
-      }
-      
-      .no-comments {
-        text-align: center;
-        color: #909399;
-        padding: 40px 0;
-      }
-    }
-  }
-}
-
-// 响应式设计
-@media (max-width: 768px) {
-  .torrent-detail-page {
-    padding: 16px;
-  }
-  
-  .torrent-header .header-content {
-    flex-direction: column;
-    text-align: center;
-    
-    .torrent-cover {
-      align-self: center;
-    }
-    
-    .torrent-stats {
-      justify-content: center;
-    }
-    
-    .action-buttons {
-      justify-content: center;
-    }
-  }
-  
-  .activity-section .stats-grid {
-    grid-template-columns: 1fr;
-  }
-  
-  .comment-item {
-    flex-direction: column;
-    gap: 12px;
-  }
-}
+<template>

+  <div class="torrent-detail-page">

+    <div class="page-container">

+      <!-- 返回按钮 -->

+      <div class="back-button">

+        <el-button :icon="ArrowLeft" @click="$router.back()">

+          返回列表

+        </el-button>

+      </div>

+

+      <!-- 种子基本信息 -->

+      <div class="torrent-header">

+        <div class="header-content">

+          <div class="torrent-cover">

+            <el-image

+              :src="torrentInfo.coverImage || '/default-cover.jpg'"

+              :alt="torrentInfo.title"

+              fit="cover"

+              class="cover-image"

+            >

+              <template #error>

+                <div class="image-placeholder">

+                  <el-icon size="48"><Picture /></el-icon>

+                  <span>暂无封面</span>

+                </div>

+              </template>

+            </el-image>

+          </div>

+          

+          <div class="torrent-info">

+            <div class="category-tag">

+              <el-tag :type="getCategoryType(torrentInfo.category)" size="large">

+                {{ getCategoryName(torrentInfo.category) }}

+              </el-tag>

+              <el-tag v-if="torrentInfo.subcategory" type="info" size="small">

+                {{ torrentInfo.subcategory }}

+              </el-tag>

+            </div>

+            

+            <h1 class="torrent-title">{{ torrentInfo.title }}</h1>

+            

+            <div class="torrent-tags">

+              <el-tag

+                v-for="tag in torrentInfo.tags"

+                :key="tag"

+                size="small"

+                effect="plain"

+              >

+                {{ tag }}

+              </el-tag>

+            </div>

+            

+            <div class="torrent-meta">

+              <div class="meta-item">

+                <el-icon><User /></el-icon>

+                <span>上传者:{{ torrentInfo.uploader }}</span>

+              </div>

+              <div class="meta-item">

+                <el-icon><Clock /></el-icon>

+                <span>上传时间:{{ formatDateTime(torrentInfo.uploadTime) }}</span>

+              </div>

+              <div class="meta-item">

+                <el-icon><Document /></el-icon>

+                <span>文件大小:{{ torrentInfo.size }}</span>

+              </div>

+              <div class="meta-item">

+                <el-icon><Files /></el-icon>

+                <span>文件数量:{{ torrentInfo.fileCount }} 个</span>

+              </div>

+            </div>

+            

+            <div class="torrent-stats">

+              <div class="stat-item seeders">

+                <span class="stat-number">{{ torrentInfo.seeders }}</span>

+                <span class="stat-label">做种</span>

+              </div>

+              <div class="stat-item leechers">

+                <span class="stat-number">{{ torrentInfo.leechers }}</span>

+                <span class="stat-label">下载</span>

+              </div>

+              <div class="stat-item downloads">

+                <span class="stat-number">{{ torrentInfo.downloads }}</span>

+                <span class="stat-label">完成</span>

+              </div>

+            </div>

+            

+            <div class="action-buttons">

+              <el-button 

+                type="primary" 

+                size="large" 

+                :icon="Download"

+                @click="handleDownload"

+                :loading="downloading"

+              >

+                {{ downloading ? '准备中...' : '下载种子' }}

+              </el-button>

+              <el-button 

+                type="success" 

+                size="large" 

+                :icon="Star"

+                @click="handleFavorite"

+              >

+                {{ isFavorited ? '已收藏' : '收藏' }}

+              </el-button>

+              <el-button 

+                type="warning" 

+                size="large" 

+                :icon="Flag"

+                @click="handleReport"

+              >

+                举报

+              </el-button>

+            </div>

+          </div>

+        </div>

+      </div>

+

+      <!-- 详细信息选项卡 -->

+      <div class="detail-tabs">

+        <el-tabs v-model="activeTab" type="border-card">

+          <!-- 种子描述 -->

+          <el-tab-pane label="详细描述" name="description">

+            <div class="description-content">

+              <div v-if="torrentInfo.description" v-html="formatDescription(torrentInfo.description)"></div>

+              <div v-else class="no-description">暂无详细描述</div>

+            </div>

+          </el-tab-pane>

+          

+          <!-- 文件列表 -->

+          <el-tab-pane label="文件列表" name="files" lazy>

+            <div class="files-list">

+              <el-table :data="torrentInfo.files" stripe>

+                <el-table-column label="文件名" prop="name" min-width="400">

+                  <template #default="{ row }">

+                    <div class="file-name">

+                      <el-icon v-if="row.type === 'folder'"><Folder /></el-icon>

+                      <el-icon v-else><Document /></el-icon>

+                      <span>{{ row.name }}</span>

+                    </div>

+                  </template>

+                </el-table-column>

+                <el-table-column label="大小" prop="size" width="120" align="right" />

+                <el-table-column label="路径" prop="path" min-width="300" />

+              </el-table>

+            </div>

+          </el-tab-pane>

+          

+          <!-- 用户活动 -->

+          <el-tab-pane label="用户活动" name="activity">

+            <div class="activity-section">

+              <div class="activity-stats">

+                <div class="stats-grid">

+                  <div class="stat-card">

+                    <h3>做种用户</h3>

+                    <p class="stat-number">{{ torrentInfo.seeders }}</p>

+                  </div>

+                  <div class="stat-card">

+                    <h3>下载用户</h3>

+                    <p class="stat-number">{{ torrentInfo.leechers }}</p>

+                  </div>

+                  <div class="stat-card">

+                    <h3>完成用户</h3>

+                    <p class="stat-number">{{ torrentInfo.downloads }}</p>

+                  </div>

+                </div>

+              </div>

+              

+              <div class="user-lists">

+                <el-tabs v-model="activityTab" type="card">

+                  <el-tab-pane label="做种用户" name="seeders">

+                    <el-table :data="seedersList" max-height="400">

+                      <el-table-column label="用户" prop="username" />

+                      <el-table-column label="上传量" prop="uploaded" />

+                      <el-table-column label="下载量" prop="downloaded" />

+                      <el-table-column label="分享率" prop="ratio" />

+                      <el-table-column label="做种时间" prop="seedTime" />

+                    </el-table>

+                  </el-tab-pane>

+                  

+                  <el-tab-pane label="下载用户" name="leechers">

+                    <el-table :data="leechersList" max-height="400">

+                      <el-table-column label="用户" prop="username" />

+                      <el-table-column label="进度" prop="progress">

+                        <template #default="{ row }">

+                          <el-progress :percentage="row.progress" :stroke-width="6" />

+                        </template>

+                      </el-table-column>

+                      <el-table-column label="下载速度" prop="downloadSpeed" />

+                      <el-table-column label="剩余时间" prop="eta" />

+                    </el-table>

+                  </el-tab-pane>

+                </el-tabs>

+              </div>

+            </div>

+          </el-tab-pane>

+          

+          <!-- 评论区 -->

+          <el-tab-pane label="评论" name="comments">

+            <div class="comments-section">

+              <!-- 发表评论 -->

+              <div class="comment-form">

+                <el-input

+                  v-model="newComment"

+                  type="textarea"

+                  :rows="4"

+                  placeholder="发表你的评论..."

+                  maxlength="500"

+                  show-word-limit

+                />

+                <div class="comment-actions">

+                  <el-button type="primary" @click="submitComment" :loading="submittingComment">

+                    发表评论

+                  </el-button>

+                </div>

+              </div>

+              

+              <!-- 评论列表 -->

+              <div class="comments-list">

+                <div

+                  v-for="comment in comments"

+                  :key="comment.id"

+                  class="comment-item"

+                >

+                  <div class="comment-avatar">

+                    <el-avatar :size="40">{{ comment.username.charAt(0) }}</el-avatar>

+                  </div>

+                  <div class="comment-content">

+                    <div class="comment-header">

+                      <span class="comment-username">{{ comment.username }}</span>

+                      <span class="comment-time">{{ formatDateTime(comment.time) }}</span>

+                    </div>

+                    <div class="comment-text">{{ comment.content }}</div>

+                    <div class="comment-actions">

+                      <el-button type="text" size="small" @click="likeComment(comment.id)">

+                        <el-icon><Like /></el-icon>

+                        {{ comment.likes || 0 }}

+                      </el-button>

+                      <el-button type="text" size="small" @click="replyComment(comment.id)">

+                        回复

+                      </el-button>

+                    </div>

+                  </div>

+                </div>

+                

+                <div v-if="comments.length === 0" class="no-comments">

+                  暂无评论,快来发表第一条评论吧!

+                </div>

+              </div>

+            </div>

+          </el-tab-pane>

+        </el-tabs>

+      </div>

+    </div>

+  </div>

+</template>

+

+<script>

+import { ref, onMounted } from 'vue'

+import { useRoute, useRouter } from 'vue-router'

+import { ElMessage, ElMessageBox } from 'element-plus'

+import {

+  ArrowLeft,

+  Download,

+  Star,

+  Flag,

+  User,

+  Clock,

+  Document,

+  Files,

+  Picture,

+  Folder,

+  Like

+} from '@element-plus/icons-vue'

+

+export default {

+  name: 'TorrentDetailView',

+  setup() {

+    const route = useRoute()

+    const router = useRouter()

+    

+    const activeTab = ref('description')

+    const activityTab = ref('seeders')

+    const downloading = ref(false)

+    const isFavorited = ref(false)

+    const submittingComment = ref(false)

+    const newComment = ref('')

+    

+    const torrentInfo = ref({

+      id: 1,

+      title: '[4K蓝光原盘] 阿凡达:水之道 Avatar: The Way of Water (2022)',

+      category: 'movie',

+      subcategory: '科幻片',

+      uploader: 'MovieMaster',

+      uploadTime: '2025-06-03T10:30:00',

+      size: '85.6 GB',

+      fileCount: 125,

+      seeders: 128,

+      leechers: 45,

+      downloads: 892,

+      coverImage: 'https://example.com/avatar2-cover.jpg',

+      tags: ['4K', '蓝光原盘', '科幻', '詹姆斯·卡梅隆'],

+      description: `

+        <h3>影片信息</h3>

+        <p><strong>片名:</strong>阿凡达:水之道 / Avatar: The Way of Water</p>

+        <p><strong>年份:</strong>2022</p>

+        <p><strong>导演:</strong>詹姆斯·卡梅隆</p>

+        <p><strong>主演:</strong>萨姆·沃辛顿 / 佐伊·索尔达娜 / 西格妮·韦弗</p>

+        <p><strong>类型:</strong>科幻 / 动作 / 冒险</p>

+        <p><strong>制片国家/地区:</strong>美国</p>

+        <p><strong>语言:</strong>英语</p>

+        <p><strong>上映日期:</strong>2022-12-16</p>

+        <p><strong>片长:</strong>192分钟</p>

+        

+        <h3>影片简介</h3>

+        <p>杰克·萨利和奈蒂莉组建了家庭,他们的孩子也逐渐成长。当危险威胁到他们时,杰克和奈蒂莉必须为彼此而战,为家庭而战,为生存而战。</p>

+        

+        <h3>技术规格</h3>

+        <ul>

+          <li>视频:4K UHD 2160p / HEVC / HDR10</li>

+          <li>音频:Dolby Atmos TrueHD 7.1 / DTS-HD MA 7.1</li>

+          <li>字幕:中文 / 英文</li>

+          <li>片源:4K UHD 蓝光原盘</li>

+        </ul>

+        

+        <h3>下载说明</h3>

+        <p>本资源为4K蓝光原盘,保持了最高的画质和音质。建议使用支持4K播放的设备观看。</p>

+      `,

+      files: [

+        { name: 'BDMV', type: 'folder', size: '85.6 GB', path: '/' },

+        { name: 'CERTIFICATE', type: 'folder', size: '2.1 MB', path: '/' },

+        { name: 'Avatar.The.Way.of.Water.2022.2160p.UHD.Blu-ray.x265.HDR.Atmos-DETAIL.mkv', type: 'file', size: '32.8 GB', path: '/BDMV/STREAM/' },

+        { name: 'Avatar.The.Way.of.Water.2022.Extras.mkv', type: 'file', size: '12.4 GB', path: '/BDMV/STREAM/' }

+      ]

+    })

+    

+    const seedersList = ref([

+      { username: 'SeedMaster', uploaded: '2.5 TB', downloaded: '850 GB', ratio: '3.02', seedTime: '15天' },

+      { username: 'MovieFan88', uploaded: '1.8 TB', downloaded: '1.2 TB', ratio: '1.50', seedTime: '8天' },

+      { username: 'CinemaLover', uploaded: '3.2 TB', downloaded: '900 GB', ratio: '3.56', seedTime: '22天' }

+    ])

+    

+    const leechersList = ref([

+      { username: 'NewUser123', progress: 65, downloadSpeed: '15.2 MB/s', eta: '2小时15分' },

+      { username: 'MovieSeeker', progress: 23, downloadSpeed: '8.7 MB/s', eta: '8小时32分' },

+      { username: 'FilmCollector', progress: 89, downloadSpeed: '22.1 MB/s', eta: '45分钟' }

+    ])

+    

+    const comments = ref([

+      {

+        id: 1,

+        username: 'MovieReviewer',

+        content: '画质非常棒!4K HDR效果惊艳,水下场景美不胜收。感谢分享!',

+        time: '2025-06-03T12:00:00',

+        likes: 15

+      },

+      {

+        id: 2,

+        username: 'CinemaExpert',

+        content: '音效也很棒,Dolby Atmos的环绕效果让人身临其境。推荐大家下载!',

+        time: '2025-06-03T11:30:00',

+        likes: 8

+      }

+    ])

+    

+    onMounted(() => {

+      const torrentId = route.params.id

+      fetchTorrentDetail(torrentId)

+    })

+    

+    const fetchTorrentDetail = async (id) => {

+      try {

+        // 模拟API调用

+        console.log('获取种子详情:', id)

+        // 这里应该调用真实的API

+      } catch (error) {

+        ElMessage.error('获取种子详情失败')

+        router.back()

+      }

+    }

+    

+    const formatDateTime = (dateString) => {

+      const date = new Date(dateString)

+      return date.toLocaleString('zh-CN', {

+        year: 'numeric',

+        month: '2-digit',

+        day: '2-digit',

+        hour: '2-digit',

+        minute: '2-digit'

+      })

+    }

+    

+    const formatDescription = (description) => {

+      // 简单的HTML清理,实际项目中应该使用专门的库

+      return description.replace(/\n/g, '<br>')

+    }

+    

+    const getCategoryType = (category) => {

+      const types = {

+        'movie': 'primary',

+        'tv': 'info',

+        'music': 'success',

+        'software': 'warning',

+        'game': 'danger'

+      }

+      return types[category] || 'default'

+    }

+    

+    const getCategoryName = (category) => {

+      const names = {

+        'movie': '电影',

+        'tv': '电视剧',

+        'music': '音乐',

+        'software': '软件',

+        'game': '游戏'

+      }

+      return names[category] || category

+    }

+    

+    const handleDownload = async () => {

+      downloading.value = true

+      try {

+        // 模拟下载准备过程

+        await new Promise(resolve => setTimeout(resolve, 1500))

+        

+        // 实际项目中这里应该下载.torrent文件

+        const link = document.createElement('a')

+        link.href = '#' // 实际的种子文件下载链接

+        link.download = `${torrentInfo.value.title}.torrent`

+        link.click()

+        

+        ElMessage.success('种子文件下载完成')

+      } catch (error) {

+        ElMessage.error('下载失败,请稍后重试')

+      } finally {

+        downloading.value = false

+      }

+    }

+    

+    const handleFavorite = () => {

+      isFavorited.value = !isFavorited.value

+      ElMessage.success(isFavorited.value ? '已添加到收藏' : '已取消收藏')

+    }

+    

+    const handleReport = async () => {

+      try {

+        await ElMessageBox.prompt('请说明举报原因', '举报内容', {

+          confirmButtonText: '提交举报',

+          cancelButtonText: '取消',

+          inputType: 'textarea',

+          inputPlaceholder: '请详细说明举报原因...'

+        })

+        

+        ElMessage.success('举报已提交,我们会尽快处理')

+      } catch {

+        // 用户取消

+      }

+    }

+    

+    const submitComment = async () => {

+      if (!newComment.value.trim()) {

+        ElMessage.warning('请输入评论内容')

+        return

+      }

+      

+      submittingComment.value = true

+      try {

+        // 模拟提交评论

+        await new Promise(resolve => setTimeout(resolve, 1000))

+        

+        const comment = {

+          id: Date.now(),

+          username: localStorage.getItem('username') || '用户',

+          content: newComment.value,

+          time: new Date().toISOString(),

+          likes: 0

+        }

+        

+        comments.value.unshift(comment)

+        newComment.value = ''

+        

+        ElMessage.success('评论发表成功')

+      } catch (error) {

+        ElMessage.error('发表评论失败')

+      } finally {

+        submittingComment.value = false

+      }

+    }

+    

+    const likeComment = (commentId) => {

+      const comment = comments.value.find(c => c.id === commentId)

+      if (comment) {

+        comment.likes = (comment.likes || 0) + 1

+        ElMessage.success('点赞成功')

+      }

+    }

+    

+    const replyComment = (commentId) => {

+      // 实现回复功能

+      ElMessage.info('回复功能开发中...')

+    }

+    

+    return {

+      activeTab,

+      activityTab,

+      downloading,

+      isFavorited,

+      submittingComment,

+      newComment,

+      torrentInfo,

+      seedersList,

+      leechersList,

+      comments,

+      formatDateTime,

+      formatDescription,

+      getCategoryType,

+      getCategoryName,

+      handleDownload,

+      handleFavorite,

+      handleReport,

+      submitComment,

+      likeComment,

+      replyComment,

+      ArrowLeft,

+      Download,

+      Star,

+      Flag,

+      User,

+      Clock,

+      Document,

+      Files,

+      Picture,

+      Folder,

+      Like

+    }

+  }

+}

+</script>

+

+<style lang="scss" scoped>

+.torrent-detail-page {

+  max-width: 1200px;

+  margin: 0 auto;

+  padding: 24px;

+  background: #f5f5f5;

+  min-height: 100vh;

+}

+

+.back-button {

+  margin-bottom: 16px;

+}

+

+.torrent-header {

+  background: #fff;

+  border-radius: 12px;

+  padding: 32px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  .header-content {

+    display: flex;

+    gap: 32px;

+    

+    .torrent-cover {

+      flex-shrink: 0;

+      

+      .cover-image {

+        width: 200px;

+        height: 280px;

+        border-radius: 8px;

+        object-fit: cover;

+      }

+      

+      .image-placeholder {

+        width: 200px;

+        height: 280px;

+        background: #f5f5f5;

+        border-radius: 8px;

+        display: flex;

+        flex-direction: column;

+        align-items: center;

+        justify-content: center;

+        color: #999;

+        

+        span {

+          margin-top: 8px;

+          font-size: 14px;

+        }

+      }

+    }

+    

+    .torrent-info {

+      flex: 1;

+      

+      .category-tag {

+        margin-bottom: 16px;

+        

+        .el-tag {

+          margin-right: 8px;

+        }

+      }

+      

+      .torrent-title {

+        font-size: 28px;

+        font-weight: 600;

+        color: #2c3e50;

+        margin: 0 0 16px 0;

+        line-height: 1.3;

+      }

+      

+      .torrent-tags {

+        margin-bottom: 20px;

+        

+        .el-tag {

+          margin: 0 8px 8px 0;

+        }

+      }

+      

+      .torrent-meta {

+        margin-bottom: 20px;

+        

+        .meta-item {

+          display: flex;

+          align-items: center;

+          gap: 8px;

+          margin-bottom: 8px;

+          color: #7f8c8d;

+          font-size: 14px;

+          

+          .el-icon {

+            color: #909399;

+          }

+        }

+      }

+      

+      .torrent-stats {

+        display: flex;

+        gap: 32px;

+        margin-bottom: 24px;

+        

+        .stat-item {

+          text-align: center;

+          

+          .stat-number {

+            display: block;

+            font-size: 24px;

+            font-weight: 600;

+            margin-bottom: 4px;

+            

+            &.seeders { color: #67c23a; }

+            &.leechers { color: #f56c6c; }

+            &.downloads { color: #409eff; }

+          }

+          

+          .stat-label {

+            font-size: 14px;

+            color: #909399;

+          }

+        }

+      }

+      

+      .action-buttons {

+        display: flex;

+        gap: 12px;

+        flex-wrap: wrap;

+      }

+    }

+  }

+}

+

+.detail-tabs {

+  background: #fff;

+  border-radius: 12px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  :deep(.el-tabs__content) {

+    padding: 24px;

+  }

+  

+  .description-content {

+    line-height: 1.6;

+    

+    :deep(h3) {

+      color: #2c3e50;

+      font-size: 18px;

+      font-weight: 600;

+      margin: 24px 0 12px 0;

+      

+      &:first-child {

+        margin-top: 0;

+      }

+    }

+    

+    :deep(p) {

+      margin-bottom: 12px;

+      color: #5a6c7d;

+    }

+    

+    :deep(ul) {

+      margin: 12px 0;

+      padding-left: 20px;

+      

+      li {

+        margin-bottom: 8px;

+        color: #5a6c7d;

+      }

+    }

+    

+    .no-description {

+      text-align: center;

+      color: #909399;

+      padding: 40px 0;

+    }

+  }

+  

+  .files-list {

+    .file-name {

+      display: flex;

+      align-items: center;

+      gap: 8px;

+      

+      .el-icon {

+        color: #909399;

+      }

+    }

+  }

+  

+  .activity-section {

+    .activity-stats {

+      margin-bottom: 24px;

+      

+      .stats-grid {

+        display: grid;

+        grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));

+        gap: 16px;

+        

+        .stat-card {

+          background: #f8f9fa;

+          padding: 20px;

+          border-radius: 8px;

+          text-align: center;

+          

+          h3 {

+            font-size: 14px;

+            color: #909399;

+            margin: 0 0 8px 0;

+          }

+          

+          .stat-number {

+            font-size: 24px;

+            font-weight: 600;

+            color: #2c3e50;

+          }

+        }

+      }

+    }

+  }

+  

+  .comments-section {

+    .comment-form {

+      margin-bottom: 32px;

+      

+      .comment-actions {

+        margin-top: 12px;

+        text-align: right;

+      }

+    }

+    

+    .comments-list {

+      .comment-item {

+        display: flex;

+        gap: 16px;

+        margin-bottom: 24px;

+        padding-bottom: 24px;

+        border-bottom: 1px solid #f0f0f0;

+        

+        &:last-child {

+          border-bottom: none;

+          margin-bottom: 0;

+          padding-bottom: 0;

+        }

+        

+        .comment-content {

+          flex: 1;

+          

+          .comment-header {

+            display: flex;

+            align-items: center;

+            gap: 12px;

+            margin-bottom: 8px;

+            

+            .comment-username {

+              font-weight: 600;

+              color: #2c3e50;

+            }

+            

+            .comment-time {

+              font-size: 12px;

+              color: #909399;

+            }

+          }

+          

+          .comment-text {

+            color: #5a6c7d;

+            line-height: 1.5;

+            margin-bottom: 12px;

+          }

+          

+          .comment-actions {

+            .el-button {

+              padding: 0;

+              margin-right: 16px;

+              

+              .el-icon {

+                margin-right: 4px;

+              }

+            }

+          }

+        }

+      }

+      

+      .no-comments {

+        text-align: center;

+        color: #909399;

+        padding: 40px 0;

+      }

+    }

+  }

+}

+

+// 响应式设计

+@media (max-width: 768px) {

+  .torrent-detail-page {

+    padding: 16px;

+  }

+  

+  .torrent-header .header-content {

+    flex-direction: column;

+    text-align: center;

+    

+    .torrent-cover {

+      align-self: center;

+    }

+    

+    .torrent-stats {

+      justify-content: center;

+    }

+    

+    .action-buttons {

+      justify-content: center;

+    }

+  }

+  

+  .activity-section .stats-grid {

+    grid-template-columns: 1fr;

+  }

+  

+  .comment-item {

+    flex-direction: column;

+    gap: 12px;

+  }

+}

 </style>
\ No newline at end of file
diff --git a/src/views/torrent/TorrentsView.vue b/src/views/torrent/TorrentsView.vue
index f3231da..1ae9f4b 100644
--- a/src/views/torrent/TorrentsView.vue
+++ b/src/views/torrent/TorrentsView.vue
@@ -1,479 +1,479 @@
-<template>
-  <div class="torrents-page">
-    <div class="page-header">
-      <h1>种子资源</h1>
-      <div class="header-actions">
-        <el-button type="primary" :icon="Upload" @click="$router.push('/upload')">
-          上传种子
-        </el-button>
-      </div>
-    </div>
-
-    <!-- 搜索和筛选 -->
-    <div class="search-section">
-      <div class="search-bar">
-        <el-input
-          v-model="searchQuery"
-          placeholder="搜索种子..."
-          :prefix-icon="Search"
-          size="large"
-          @keyup.enter="handleSearch"
-          clearable
-        />
-        <el-button type="primary" size="large" @click="handleSearch">
-          搜索
-        </el-button>
-      </div>
-      
-      <div class="filters">
-        <el-select v-model="selectedCategory" placeholder="分类" @change="handleFilter">
-          <el-option label="全部" value="" />
-          <el-option label="电影" value="movie" />
-          <el-option label="电视剧" value="tv" />
-          <el-option label="音乐" value="music" />
-          <el-option label="软件" value="software" />
-          <el-option label="游戏" value="game" />
-        </el-select>
-        
-        <el-select v-model="sortBy" placeholder="排序方式" @change="handleFilter">
-          <el-option label="上传时间" value="upload_time" />
-          <el-option label="文件大小" value="size" />
-          <el-option label="做种数" value="seeders" />
-          <el-option label="下载数" value="leechers" />
-          <el-option label="完成数" value="downloads" />
-        </el-select>
-        
-        <el-radio-group v-model="sortOrder" @change="handleFilter">
-          <el-radio-button label="desc">降序</el-radio-button>
-          <el-radio-button label="asc">升序</el-radio-button>
-        </el-radio-group>
-      </div>
-    </div>
-
-    <!-- 种子列表 -->
-    <div class="torrents-list">
-      <div class="list-header">
-        <span class="results-count">共找到 {{ totalCount }} 个种子</span>
-      </div>
-      
-      <el-table 
-        :data="torrents" 
-        v-loading="loading"
-        @row-click="handleRowClick"
-        stripe
-        class="torrents-table"
-      >
-        <el-table-column label="分类" width="80">
-          <template #default="{ row }">
-            <el-tag :type="getCategoryType(row.category)" size="small">
-              {{ getCategoryName(row.category) }}
-            </el-tag>
-          </template>
-        </el-table-column>
-        
-        <el-table-column label="种子信息" min-width="400">
-          <template #default="{ row }">
-            <div class="torrent-info">
-              <h4 class="torrent-title">{{ row.title }}</h4>
-              <div class="torrent-meta">
-                <span class="uploader">
-                  <el-icon><User /></el-icon>
-                  {{ row.uploader }}
-                </span>
-                <span class="upload-time">
-                  <el-icon><Clock /></el-icon>
-                  {{ formatTime(row.uploadTime) }}
-                </span>
-                <span class="file-size">
-                  <el-icon><Document /></el-icon>
-                  {{ row.size }}
-                </span>
-              </div>
-            </div>
-          </template>
-        </el-table-column>
-        
-        <el-table-column label="做种" width="80" align="center">
-          <template #default="{ row }">
-            <span class="seeders">{{ row.seeders }}</span>
-          </template>
-        </el-table-column>
-        
-        <el-table-column label="下载" width="80" align="center">
-          <template #default="{ row }">
-            <span class="leechers">{{ row.leechers }}</span>
-          </template>
-        </el-table-column>
-        
-        <el-table-column label="完成" width="80" align="center">
-          <template #default="{ row }">
-            <span>{{ row.downloads }}</span>
-          </template>
-        </el-table-column>
-        
-        <el-table-column label="操作" width="120" align="center">
-          <template #default="{ row }">
-            <el-button 
-              type="primary" 
-              size="small" 
-              :icon="Download"
-              @click.stop="handleDownload(row)"
-            >
-              下载
-            </el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      
-      <!-- 分页 -->
-      <div class="pagination-wrapper">
-        <el-pagination
-          v-model:current-page="currentPage"
-          v-model:page-size="pageSize"
-          :page-sizes="[20, 50, 100]"
-          :total="totalCount"
-          layout="total, sizes, prev, pager, next, jumper"
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-        />
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { ref, onMounted, watch } from 'vue'
-import { useRouter, useRoute } from 'vue-router'
-import { ElMessage } from 'element-plus'
-import {
-  Search,
-  Upload,
-  Download,
-  User,
-  Clock,
-  Document
-} from '@element-plus/icons-vue'
-
-export default {
-  name: 'TorrentsView',
-  setup() {
-    const router = useRouter()
-    const route = useRoute()
-    
-    const loading = ref(false)
-    const searchQuery = ref('')
-    const selectedCategory = ref('')
-    const sortBy = ref('upload_time')
-    const sortOrder = ref('desc')
-    const currentPage = ref(1)
-    const pageSize = ref(20)
-    const totalCount = ref(0)
-    
-    const torrents = ref([
-      {
-        id: 1,
-        title: '[4K蓝光原盘] 阿凡达:水之道 Avatar: The Way of Water (2022)',
-        category: 'movie',
-        uploader: 'MovieMaster',
-        uploadTime: '2025-06-03T10:30:00',
-        size: '85.6 GB',
-        seeders: 128,
-        leechers: 45,
-        downloads: 892
-      },
-      {
-        id: 2,
-        title: '[FLAC] Taylor Swift - Midnights (Deluxe Edition) [2022]',
-        category: 'music',
-        uploader: 'MusicLover',
-        uploadTime: '2025-06-03T09:15:00',
-        size: '1.2 GB',
-        seeders: 67,
-        leechers: 12,
-        downloads: 456
-      },
-      {
-        id: 3,
-        title: '[合集] Adobe Creative Suite 2025 完整版',
-        category: 'software',
-        uploader: 'TechGuru',
-        uploadTime: '2025-06-03T08:45:00',
-        size: '12.8 GB',
-        seeders: 234,
-        leechers: 89,
-        downloads: 1205
-      }
-    ])
-    
-    onMounted(() => {
-      // 从URL参数初始化搜索条件
-      if (route.query.q) {
-        searchQuery.value = route.query.q
-      }
-      if (route.query.category) {
-        selectedCategory.value = route.query.category
-      }
-      
-      fetchTorrents()
-    })
-    
-    const fetchTorrents = async () => {
-      loading.value = true
-      try {
-        // 模拟API调用
-        await new Promise(resolve => setTimeout(resolve, 1000))
-        totalCount.value = 156
-      } catch (error) {
-        ElMessage.error('获取种子列表失败')
-      } finally {
-        loading.value = false
-      }
-    }
-    
-    const handleSearch = () => {
-      currentPage.value = 1
-      updateURL()
-      fetchTorrents()
-    }
-    
-    const handleFilter = () => {
-      currentPage.value = 1
-      updateURL()
-      fetchTorrents()
-    }
-    
-    const updateURL = () => {
-      const query = {}
-      if (searchQuery.value) query.q = searchQuery.value
-      if (selectedCategory.value) query.category = selectedCategory.value
-      if (sortBy.value !== 'upload_time') query.sort = sortBy.value
-      if (sortOrder.value !== 'desc') query.order = sortOrder.value
-      if (currentPage.value > 1) query.page = currentPage.value
-      
-      router.replace({ query })
-    }
-    
-    const handleRowClick = (row) => {
-      router.push(`/torrent/${row.id}`)
-    }
-    
-    const handleDownload = (row) => {
-      ElMessage.success(`开始下载: ${row.title}`)
-      // 这里实现下载逻辑
-    }
-    
-    const handleSizeChange = (size) => {
-      pageSize.value = size
-      currentPage.value = 1
-      fetchTorrents()
-    }
-    
-    const handleCurrentChange = (page) => {
-      currentPage.value = page
-      updateURL()
-      fetchTorrents()
-    }
-    
-    const formatTime = (timeString) => {
-      const date = new Date(timeString)
-      const now = new Date()
-      const diff = now - date
-      const hours = Math.floor(diff / (1000 * 60 * 60))
-      
-      if (hours < 1) return '刚刚'
-      if (hours < 24) return `${hours}小时前`
-      const days = Math.floor(hours / 24)
-      return `${days}天前`
-    }
-    
-    const getCategoryType = (category) => {
-      const types = {
-        'movie': 'primary',
-        'tv': 'info',
-        'music': 'success',
-        'software': 'warning',
-        'game': 'danger'
-      }
-      return types[category] || 'default'
-    }
-    
-    const getCategoryName = (category) => {
-      const names = {
-        'movie': '电影',
-        'tv': '电视剧',
-        'music': '音乐',
-        'software': '软件',
-        'game': '游戏'
-      }
-      return names[category] || category
-    }
-    
-    return {
-      loading,
-      searchQuery,
-      selectedCategory,
-      sortBy,
-      sortOrder,
-      currentPage,
-      pageSize,
-      totalCount,
-      torrents,
-      handleSearch,
-      handleFilter,
-      handleRowClick,
-      handleDownload,
-      handleSizeChange,
-      handleCurrentChange,
-      formatTime,
-      getCategoryType,
-      getCategoryName,
-      Search,
-      Upload,
-      Download,
-      User,
-      Clock,
-      Document
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.torrents-page {
-  max-width: 1200px;
-  margin: 0 auto;
-  padding: 24px;
-}
-
-.page-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 24px;
-  
-  h1 {
-    font-size: 28px;
-    font-weight: 600;
-    color: #2c3e50;
-    margin: 0;
-  }
-}
-
-.search-section {
-  background: #fff;
-  border-radius: 12px;
-  padding: 24px;
-  margin-bottom: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  .search-bar {
-    display: flex;
-    gap: 12px;
-    margin-bottom: 16px;
-    
-    .el-input {
-      flex: 1;
-    }
-  }
-  
-  .filters {
-    display: flex;
-    gap: 16px;
-    flex-wrap: wrap;
-    align-items: center;
-    
-    .el-select {
-      width: 120px;
-    }
-  }
-}
-
-.torrents-list {
-  background: #fff;
-  border-radius: 12px;
-  padding: 24px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  .list-header {
-    margin-bottom: 16px;
-    
-    .results-count {
-      font-size: 14px;
-      color: #909399;
-    }
-  }
-  
-  .torrents-table {
-    .torrent-info {
-      .torrent-title {
-        font-size: 16px;
-        font-weight: 500;
-        color: #2c3e50;
-        margin: 0 0 8px 0;
-        line-height: 1.4;
-        cursor: pointer;
-        
-        &:hover {
-          color: #409eff;
-        }
-      }
-      
-      .torrent-meta {
-        display: flex;
-        gap: 16px;
-        font-size: 12px;
-        color: #909399;
-        
-        span {
-          display: flex;
-          align-items: center;
-          gap: 4px;
-        }
-      }
-    }
-    
-    .seeders {
-      color: #67c23a;
-      font-weight: 600;
-    }
-    
-    .leechers {
-      color: #f56c6c;
-      font-weight: 600;
-    }
-  }
-  
-  .pagination-wrapper {
-    margin-top: 24px;
-    text-align: center;
-  }
-}
-
-@media (max-width: 768px) {
-  .torrents-page {
-    padding: 16px;
-  }
-  
-  .page-header {
-    flex-direction: column;
-    gap: 16px;
-    align-items: flex-start;
-  }
-  
-  .filters {
-    flex-direction: column;
-    align-items: flex-start;
-    
-    .el-select {
-      width: 100%;
-    }
-  }
-  
-  .torrents-table {
-    :deep(.el-table__header),
-    :deep(.el-table__body) {
-      font-size: 12px;
-    }
-  }
-}
+<template>

+  <div class="torrents-page">

+    <div class="page-header">

+      <h1>种子资源</h1>

+      <div class="header-actions">

+        <el-button type="primary" :icon="Upload" @click="$router.push('/upload')">

+          上传种子

+        </el-button>

+      </div>

+    </div>

+

+    <!-- 搜索和筛选 -->

+    <div class="search-section">

+      <div class="search-bar">

+        <el-input

+          v-model="searchQuery"

+          placeholder="搜索种子..."

+          :prefix-icon="Search"

+          size="large"

+          @keyup.enter="handleSearch"

+          clearable

+        />

+        <el-button type="primary" size="large" @click="handleSearch">

+          搜索

+        </el-button>

+      </div>

+      

+      <div class="filters">

+        <el-select v-model="selectedCategory" placeholder="分类" @change="handleFilter">

+          <el-option label="全部" value="" />

+          <el-option label="电影" value="movie" />

+          <el-option label="电视剧" value="tv" />

+          <el-option label="音乐" value="music" />

+          <el-option label="软件" value="software" />

+          <el-option label="游戏" value="game" />

+        </el-select>

+        

+        <el-select v-model="sortBy" placeholder="排序方式" @change="handleFilter">

+          <el-option label="上传时间" value="upload_time" />

+          <el-option label="文件大小" value="size" />

+          <el-option label="做种数" value="seeders" />

+          <el-option label="下载数" value="leechers" />

+          <el-option label="完成数" value="downloads" />

+        </el-select>

+        

+        <el-radio-group v-model="sortOrder" @change="handleFilter">

+          <el-radio-button label="desc">降序</el-radio-button>

+          <el-radio-button label="asc">升序</el-radio-button>

+        </el-radio-group>

+      </div>

+    </div>

+

+    <!-- 种子列表 -->

+    <div class="torrents-list">

+      <div class="list-header">

+        <span class="results-count">共找到 {{ totalCount }} 个种子</span>

+      </div>

+      

+      <el-table 

+        :data="torrents" 

+        v-loading="loading"

+        @row-click="handleRowClick"

+        stripe

+        class="torrents-table"

+      >

+        <el-table-column label="分类" width="80">

+          <template #default="{ row }">

+            <el-tag :type="getCategoryType(row.category)" size="small">

+              {{ getCategoryName(row.category) }}

+            </el-tag>

+          </template>

+        </el-table-column>

+        

+        <el-table-column label="种子信息" min-width="400">

+          <template #default="{ row }">

+            <div class="torrent-info">

+              <h4 class="torrent-title">{{ row.title }}</h4>

+              <div class="torrent-meta">

+                <span class="uploader">

+                  <el-icon><User /></el-icon>

+                  {{ row.uploader }}

+                </span>

+                <span class="upload-time">

+                  <el-icon><Clock /></el-icon>

+                  {{ formatTime(row.uploadTime) }}

+                </span>

+                <span class="file-size">

+                  <el-icon><Document /></el-icon>

+                  {{ row.size }}

+                </span>

+              </div>

+            </div>

+          </template>

+        </el-table-column>

+        

+        <el-table-column label="做种" width="80" align="center">

+          <template #default="{ row }">

+            <span class="seeders">{{ row.seeders }}</span>

+          </template>

+        </el-table-column>

+        

+        <el-table-column label="下载" width="80" align="center">

+          <template #default="{ row }">

+            <span class="leechers">{{ row.leechers }}</span>

+          </template>

+        </el-table-column>

+        

+        <el-table-column label="完成" width="80" align="center">

+          <template #default="{ row }">

+            <span>{{ row.downloads }}</span>

+          </template>

+        </el-table-column>

+        

+        <el-table-column label="操作" width="120" align="center">

+          <template #default="{ row }">

+            <el-button 

+              type="primary" 

+              size="small" 

+              :icon="Download"

+              @click.stop="handleDownload(row)"

+            >

+              下载

+            </el-button>

+          </template>

+        </el-table-column>

+      </el-table>

+      

+      <!-- 分页 -->

+      <div class="pagination-wrapper">

+        <el-pagination

+          v-model:current-page="currentPage"

+          v-model:page-size="pageSize"

+          :page-sizes="[20, 50, 100]"

+          :total="totalCount"

+          layout="total, sizes, prev, pager, next, jumper"

+          @size-change="handleSizeChange"

+          @current-change="handleCurrentChange"

+        />

+      </div>

+    </div>

+  </div>

+</template>

+

+<script>

+import { ref, onMounted, watch } from 'vue'

+import { useRouter, useRoute } from 'vue-router'

+import { ElMessage } from 'element-plus'

+import {

+  Search,

+  Upload,

+  Download,

+  User,

+  Clock,

+  Document

+} from '@element-plus/icons-vue'

+

+export default {

+  name: 'TorrentsView',

+  setup() {

+    const router = useRouter()

+    const route = useRoute()

+    

+    const loading = ref(false)

+    const searchQuery = ref('')

+    const selectedCategory = ref('')

+    const sortBy = ref('upload_time')

+    const sortOrder = ref('desc')

+    const currentPage = ref(1)

+    const pageSize = ref(20)

+    const totalCount = ref(0)

+    

+    const torrents = ref([

+      {

+        id: 1,

+        title: '[4K蓝光原盘] 阿凡达:水之道 Avatar: The Way of Water (2022)',

+        category: 'movie',

+        uploader: 'MovieMaster',

+        uploadTime: '2025-06-03T10:30:00',

+        size: '85.6 GB',

+        seeders: 128,

+        leechers: 45,

+        downloads: 892

+      },

+      {

+        id: 2,

+        title: '[FLAC] Taylor Swift - Midnights (Deluxe Edition) [2022]',

+        category: 'music',

+        uploader: 'MusicLover',

+        uploadTime: '2025-06-03T09:15:00',

+        size: '1.2 GB',

+        seeders: 67,

+        leechers: 12,

+        downloads: 456

+      },

+      {

+        id: 3,

+        title: '[合集] Adobe Creative Suite 2025 完整版',

+        category: 'software',

+        uploader: 'TechGuru',

+        uploadTime: '2025-06-03T08:45:00',

+        size: '12.8 GB',

+        seeders: 234,

+        leechers: 89,

+        downloads: 1205

+      }

+    ])

+    

+    onMounted(() => {

+      // 从URL参数初始化搜索条件

+      if (route.query.q) {

+        searchQuery.value = route.query.q

+      }

+      if (route.query.category) {

+        selectedCategory.value = route.query.category

+      }

+      

+      fetchTorrents()

+    })

+    

+    const fetchTorrents = async () => {

+      loading.value = true

+      try {

+        // 模拟API调用

+        await new Promise(resolve => setTimeout(resolve, 1000))

+        totalCount.value = 156

+      } catch (error) {

+        ElMessage.error('获取种子列表失败')

+      } finally {

+        loading.value = false

+      }

+    }

+    

+    const handleSearch = () => {

+      currentPage.value = 1

+      updateURL()

+      fetchTorrents()

+    }

+    

+    const handleFilter = () => {

+      currentPage.value = 1

+      updateURL()

+      fetchTorrents()

+    }

+    

+    const updateURL = () => {

+      const query = {}

+      if (searchQuery.value) query.q = searchQuery.value

+      if (selectedCategory.value) query.category = selectedCategory.value

+      if (sortBy.value !== 'upload_time') query.sort = sortBy.value

+      if (sortOrder.value !== 'desc') query.order = sortOrder.value

+      if (currentPage.value > 1) query.page = currentPage.value

+      

+      router.replace({ query })

+    }

+    

+    const handleRowClick = (row) => {

+      router.push(`/torrent/${row.id}`)

+    }

+    

+    const handleDownload = (row) => {

+      ElMessage.success(`开始下载: ${row.title}`)

+      // 这里实现下载逻辑

+    }

+    

+    const handleSizeChange = (size) => {

+      pageSize.value = size

+      currentPage.value = 1

+      fetchTorrents()

+    }

+    

+    const handleCurrentChange = (page) => {

+      currentPage.value = page

+      updateURL()

+      fetchTorrents()

+    }

+    

+    const formatTime = (timeString) => {

+      const date = new Date(timeString)

+      const now = new Date()

+      const diff = now - date

+      const hours = Math.floor(diff / (1000 * 60 * 60))

+      

+      if (hours < 1) return '刚刚'

+      if (hours < 24) return `${hours}小时前`

+      const days = Math.floor(hours / 24)

+      return `${days}天前`

+    }

+    

+    const getCategoryType = (category) => {

+      const types = {

+        'movie': 'primary',

+        'tv': 'info',

+        'music': 'success',

+        'software': 'warning',

+        'game': 'danger'

+      }

+      return types[category] || 'default'

+    }

+    

+    const getCategoryName = (category) => {

+      const names = {

+        'movie': '电影',

+        'tv': '电视剧',

+        'music': '音乐',

+        'software': '软件',

+        'game': '游戏'

+      }

+      return names[category] || category

+    }

+    

+    return {

+      loading,

+      searchQuery,

+      selectedCategory,

+      sortBy,

+      sortOrder,

+      currentPage,

+      pageSize,

+      totalCount,

+      torrents,

+      handleSearch,

+      handleFilter,

+      handleRowClick,

+      handleDownload,

+      handleSizeChange,

+      handleCurrentChange,

+      formatTime,

+      getCategoryType,

+      getCategoryName,

+      Search,

+      Upload,

+      Download,

+      User,

+      Clock,

+      Document

+    }

+  }

+}

+</script>

+

+<style lang="scss" scoped>

+.torrents-page {

+  max-width: 1200px;

+  margin: 0 auto;

+  padding: 24px;

+}

+

+.page-header {

+  display: flex;

+  justify-content: space-between;

+  align-items: center;

+  margin-bottom: 24px;

+  

+  h1 {

+    font-size: 28px;

+    font-weight: 600;

+    color: #2c3e50;

+    margin: 0;

+  }

+}

+

+.search-section {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  margin-bottom: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  .search-bar {

+    display: flex;

+    gap: 12px;

+    margin-bottom: 16px;

+    

+    .el-input {

+      flex: 1;

+    }

+  }

+  

+  .filters {

+    display: flex;

+    gap: 16px;

+    flex-wrap: wrap;

+    align-items: center;

+    

+    .el-select {

+      width: 120px;

+    }

+  }

+}

+

+.torrents-list {

+  background: #fff;

+  border-radius: 12px;

+  padding: 24px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  .list-header {

+    margin-bottom: 16px;

+    

+    .results-count {

+      font-size: 14px;

+      color: #909399;

+    }

+  }

+  

+  .torrents-table {

+    .torrent-info {

+      .torrent-title {

+        font-size: 16px;

+        font-weight: 500;

+        color: #2c3e50;

+        margin: 0 0 8px 0;

+        line-height: 1.4;

+        cursor: pointer;

+        

+        &:hover {

+          color: #409eff;

+        }

+      }

+      

+      .torrent-meta {

+        display: flex;

+        gap: 16px;

+        font-size: 12px;

+        color: #909399;

+        

+        span {

+          display: flex;

+          align-items: center;

+          gap: 4px;

+        }

+      }

+    }

+    

+    .seeders {

+      color: #67c23a;

+      font-weight: 600;

+    }

+    

+    .leechers {

+      color: #f56c6c;

+      font-weight: 600;

+    }

+  }

+  

+  .pagination-wrapper {

+    margin-top: 24px;

+    text-align: center;

+  }

+}

+

+@media (max-width: 768px) {

+  .torrents-page {

+    padding: 16px;

+  }

+  

+  .page-header {

+    flex-direction: column;

+    gap: 16px;

+    align-items: flex-start;

+  }

+  

+  .filters {

+    flex-direction: column;

+    align-items: flex-start;

+    

+    .el-select {

+      width: 100%;

+    }

+  }

+  

+  .torrents-table {

+    :deep(.el-table__header),

+    :deep(.el-table__body) {

+      font-size: 12px;

+    }

+  }

+}

 </style>
\ No newline at end of file
diff --git a/src/views/torrent/UploadView.vue b/src/views/torrent/UploadView.vue
index d99b446..80c3660 100644
--- a/src/views/torrent/UploadView.vue
+++ b/src/views/torrent/UploadView.vue
@@ -1,506 +1,506 @@
-<template>
-  <div class="upload-page">
-    <div class="page-header">
-      <h1>上传种子</h1>
-      <p class="page-description">分享你的资源,为社区做贡献</p>
-    </div>
-
-    <div class="upload-form">
-      <el-form
-        ref="uploadFormRef"
-        :model="uploadForm"
-        :rules="formRules"
-        label-width="120px"
-        size="large"
-      >
-        <!-- 种子文件上传 -->
-        <el-form-item label="种子文件" prop="torrentFile" required>
-          <el-upload
-            ref="torrentUploadRef"
-            :auto-upload="false"
-            :limit="1"
-            accept=".torrent"
-            :on-change="handleTorrentChange"
-            :on-remove="handleTorrentRemove"
-            :before-upload="beforeTorrentUpload"
-            drag
-            class="torrent-upload"
-          >
-            <el-icon class="el-icon--upload"><UploadFilled /></el-icon>
-            <div class="el-upload__text">
-              将 .torrent 文件拖到此处,或<em>点击上传</em>
-            </div>
-            <template #tip>
-              <div class="el-upload__tip">
-                只能上传 .torrent 文件,且不超过 10MB
-              </div>
-            </template>
-          </el-upload>
-        </el-form-item>
-
-        <!-- 基本信息 -->
-        <el-form-item label="资源标题" prop="title" required>
-          <el-input
-            v-model="uploadForm.title"
-            placeholder="请输入资源标题"
-            maxlength="200"
-            show-word-limit
-          />
-        </el-form-item>
-
-        <el-form-item label="资源分类" prop="category" required>
-          <el-select v-model="uploadForm.category" placeholder="请选择分类">
-            <el-option label="电影" value="movie" />
-            <el-option label="电视剧" value="tv" />
-            <el-option label="音乐" value="music" />
-            <el-option label="软件" value="software" />
-            <el-option label="游戏" value="game" />
-            <el-option label="电子书" value="ebook" />
-            <el-option label="其他" value="other" />
-          </el-select>
-        </el-form-item>
-
-        <el-form-item label="子分类" prop="subcategory">
-          <el-select v-model="uploadForm.subcategory" placeholder="请选择子分类">
-            <el-option
-              v-for="sub in getSubcategories(uploadForm.category)"
-              :key="sub.value"
-              :label="sub.label"
-              :value="sub.value"
-            />
-          </el-select>
-        </el-form-item>
-
-        <!-- 详细描述 -->
-        <el-form-item label="资源描述" prop="description">
-          <el-input
-            v-model="uploadForm.description"
-            type="textarea"
-            :rows="6"
-            placeholder="请详细描述资源内容,包括格式、质量、语言等信息"
-            maxlength="2000"
-            show-word-limit
-          />
-        </el-form-item>
-
-        <!-- 标签 -->
-        <el-form-item label="标签">
-          <div class="tags-input">
-            <el-tag
-              v-for="tag in uploadForm.tags"
-              :key="tag"
-              closable
-              @close="removeTag(tag)"
-              class="tag-item"
-            >
-              {{ tag }}
-            </el-tag>
-            <el-input
-              v-if="tagInputVisible"
-              ref="tagInputRef"
-              v-model="tagInputValue"
-              size="small"
-              @keyup.enter="addTag"
-              @blur="addTag"
-              class="tag-input"
-            />
-            <el-button
-              v-else
-              size="small"
-              @click="showTagInput"
-              class="add-tag-btn"
-            >
-              + 添加标签
-            </el-button>
-          </div>
-        </el-form-item>
-
-        <!-- 封面图片 -->
-        <el-form-item label="封面图片">
-          <el-upload
-            ref="imageUploadRef"
-            :auto-upload="false"
-            :limit="1"
-            accept="image/*"
-            :on-change="handleImageChange"
-            :on-remove="handleImageRemove"
-            list-type="picture-card"
-            class="image-upload"
-          >
-            <el-icon><Plus /></el-icon>
-            <template #tip>
-              <div class="el-upload__tip">
-                支持 JPG、PNG 格式,建议尺寸 300x400,不超过 5MB
-              </div>
-            </template>
-          </el-upload>
-        </el-form-item>
-
-        <!-- 高级选项 -->
-        <el-form-item>
-          <el-collapse>
-            <el-collapse-item title="高级选项" name="advanced">
-              <el-form-item label="免费时间">
-                <el-select v-model="uploadForm.freeTime" placeholder="选择免费时间">
-                  <el-option label="永久免费" value="forever" />
-                  <el-option label="24小时" value="24h" />
-                  <el-option label="48小时" value="48h" />
-                  <el-option label="7天" value="7d" />
-                  <el-option label="30天" value="30d" />
-                </el-select>
-              </el-form-item>
-
-              <el-form-item label="匿名上传">
-                <el-switch v-model="uploadForm.anonymous" />
-                <span class="form-tip">开启后将不显示上传者信息</span>
-              </el-form-item>
-
-              <el-form-item label="允许HR">
-                <el-switch v-model="uploadForm.allowHR" />
-                <span class="form-tip">允许此种子参与HR考核</span>
-              </el-form-item>
-            </el-collapse-item>
-          </el-collapse>
-        </el-form-item>
-
-        <!-- 提交按钮 -->
-        <el-form-item>
-          <div class="submit-buttons">
-            <el-button @click="resetForm">重置</el-button>
-            <el-button type="primary" @click="submitForm" :loading="uploading">
-              {{ uploading ? '上传中...' : '提交种子' }}
-            </el-button>
-          </div>
-        </el-form-item>
-      </el-form>
-    </div>
-  </div>
-</template>
-
-<script>
-import { ref, reactive, nextTick } from 'vue'
-import { useRouter } from 'vue-router'
-import { ElMessage } from 'element-plus'
-import {
-  UploadFilled,
-  Plus
-} from '@element-plus/icons-vue'
-
-export default {
-  name: 'UploadView',
-  setup() {
-    const router = useRouter()
-    const uploadFormRef = ref(null)
-    const torrentUploadRef = ref(null)
-    const imageUploadRef = ref(null)
-    const tagInputRef = ref(null)
-    
-    const uploading = ref(false)
-    const tagInputVisible = ref(false)
-    const tagInputValue = ref('')
-    
-    const uploadForm = reactive({
-      torrentFile: null,
-      title: '',
-      category: '',
-      subcategory: '',
-      description: '',
-      tags: [],
-      coverImage: null,
-      freeTime: '',
-      anonymous: false,
-      allowHR: true
-    })
-    
-    const formRules = {
-      title: [
-        { required: true, message: '请输入资源标题', trigger: 'blur' },
-        { min: 5, max: 200, message: '标题长度在 5 到 200 个字符', trigger: 'blur' }
-      ],
-      category: [
-        { required: true, message: '请选择资源分类', trigger: 'change' }
-      ],
-      description: [
-        { min: 10, max: 2000, message: '描述长度在 10 到 2000 个字符', trigger: 'blur' }
-      ]
-    }
-    
-    const subcategories = {
-      movie: [
-        { label: '动作片', value: 'action' },
-        { label: '喜剧片', value: 'comedy' },
-        { label: '科幻片', value: 'scifi' },
-        { label: '恐怖片', value: 'horror' },
-        { label: '剧情片', value: 'drama' }
-      ],
-      tv: [
-        { label: '美剧', value: 'us' },
-        { label: '国产剧', value: 'cn' },
-        { label: '日韩剧', value: 'asia' },
-        { label: '英剧', value: 'uk' },
-        { label: '纪录片', value: 'documentary' }
-      ],
-      music: [
-        { label: '流行音乐', value: 'pop' },
-        { label: '古典音乐', value: 'classical' },
-        { label: '摇滚音乐', value: 'rock' },
-        { label: '电子音乐', value: 'electronic' },
-        { label: '其他', value: 'other' }
-      ],
-      software: [
-        { label: '操作系统', value: 'os' },
-        { label: '办公软件', value: 'office' },
-        { label: '开发工具', value: 'dev' },
-        { label: '设计软件', value: 'design' },
-        { label: '其他', value: 'other' }
-      ],
-      game: [
-        { label: 'PC游戏', value: 'pc' },
-        { label: '主机游戏', value: 'console' },
-        { label: '手机游戏', value: 'mobile' },
-        { label: '其他', value: 'other' }
-      ]
-    }
-    
-    const getSubcategories = (category) => {
-      return subcategories[category] || []
-    }
-    
-    const handleTorrentChange = (file) => {
-      uploadForm.torrentFile = file.raw
-      // 这里可以解析torrent文件获取基本信息
-      parseTorrentFile(file.raw)
-    }
-    
-    const handleTorrentRemove = () => {
-      uploadForm.torrentFile = null
-    }
-    
-    const beforeTorrentUpload = (file) => {
-      const isTorrent = file.type === 'application/x-bittorrent' || file.name.endsWith('.torrent')
-      const isLt10M = file.size / 1024 / 1024 < 10
-      
-      if (!isTorrent) {
-        ElMessage.error('只能上传 .torrent 文件!')
-        return false
-      }
-      if (!isLt10M) {
-        ElMessage.error('种子文件大小不能超过 10MB!')
-        return false
-      }
-      return true
-    }
-    
-    const parseTorrentFile = (file) => {
-      // 这里应该实现torrent文件解析
-      // 可以使用 parse-torrent 库
-      console.log('解析种子文件:', file.name)
-      
-      // 模拟解析结果自动填入表单
-      if (!uploadForm.title) {
-        uploadForm.title = file.name.replace('.torrent', '')
-      }
-    }
-    
-    const handleImageChange = (file) => {
-      uploadForm.coverImage = file.raw
-    }
-    
-    const handleImageRemove = () => {
-      uploadForm.coverImage = null
-    }
-    
-    const showTagInput = () => {
-      tagInputVisible.value = true
-      nextTick(() => {
-        tagInputRef.value?.focus()
-      })
-    }
-    
-    const addTag = () => {
-      const tag = tagInputValue.value.trim()
-      if (tag && !uploadForm.tags.includes(tag)) {
-        uploadForm.tags.push(tag)
-      }
-      tagInputVisible.value = false
-      tagInputValue.value = ''
-    }
-    
-    const removeTag = (tag) => {
-      const index = uploadForm.tags.indexOf(tag)
-      if (index > -1) {
-        uploadForm.tags.splice(index, 1)
-      }
-    }
-    
-    const submitForm = async () => {
-      if (!uploadForm.torrentFile) {
-        ElMessage.error('请上传种子文件')
-        return
-      }
-      
-      try {
-        await uploadFormRef.value?.validate()
-        
-        uploading.value = true
-        
-        // 模拟上传过程
-        await new Promise(resolve => setTimeout(resolve, 2000))
-        
-        ElMessage.success('种子上传成功!')
-        router.push('/torrents')
-        
-      } catch (error) {
-        console.error('表单验证失败:', error)
-      } finally {
-        uploading.value = false
-      }
-    }
-    
-    const resetForm = () => {
-      uploadFormRef.value?.resetFields()
-      uploadForm.torrentFile = null
-      uploadForm.coverImage = null
-      uploadForm.tags = []
-      torrentUploadRef.value?.clearFiles()
-      imageUploadRef.value?.clearFiles()
-    }
-    
-    return {
-      uploadFormRef,
-      torrentUploadRef,
-      imageUploadRef,
-      tagInputRef,
-      uploading,
-      tagInputVisible,
-      tagInputValue,
-      uploadForm,
-      formRules,
-      getSubcategories,
-      handleTorrentChange,
-      handleTorrentRemove,
-      beforeTorrentUpload,
-      handleImageChange,
-      handleImageRemove,
-      showTagInput,
-      addTag,
-      removeTag,
-      submitForm,
-      resetForm,
-      UploadFilled,
-      Plus
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.upload-page {
-  max-width: 800px;
-  margin: 0 auto;
-  padding: 24px;
-}
-
-.page-header {
-  text-align: center;
-  margin-bottom: 32px;
-  
-  h1 {
-    font-size: 28px;
-    font-weight: 600;
-    color: #2c3e50;
-    margin: 0 0 8px 0;
-  }
-  
-  .page-description {
-    font-size: 16px;
-    color: #7f8c8d;
-    margin: 0;
-  }
-}
-
-.upload-form {
-  background: #fff;
-  border-radius: 12px;
-  padding: 32px;
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
-  
-  .torrent-upload {
-    width: 100%;
-    
-    :deep(.el-upload-dragger) {
-      width: 100%;
-      height: 180px;
-      border: 2px dashed #d9d9d9;
-      border-radius: 8px;
-      
-      &:hover {
-        border-color: #409eff;
-      }
-    }
-  }
-  
-  .tags-input {
-    display: flex;
-    flex-wrap: wrap;
-    gap: 8px;
-    align-items: center;
-    
-    .tag-item {
-      margin: 0;
-    }
-    
-    .tag-input {
-      width: 100px;
-    }
-    
-    .add-tag-btn {
-      border: 1px dashed #d9d9d9;
-      color: #999;
-      
-      &:hover {
-        border-color: #409eff;
-        color: #409eff;
-      }
-    }
-  }
-  
-  .image-upload {
-    :deep(.el-upload--picture-card) {
-      width: 148px;
-      height: 148px;
-    }
-  }
-  
-  .form-tip {
-    margin-left: 8px;
-    font-size: 12px;
-    color: #909399;
-  }
-  
-  .submit-buttons {
-    display: flex;
-    gap: 16px;
-    justify-content: center;
-    margin-top: 24px;
-  }
-}
-
-@media (max-width: 768px) {
-  .upload-page {
-    padding: 16px;
-  }
-  
-  .upload-form {
-    padding: 24px 16px;
-  }
-  
-  .submit-buttons {
-    flex-direction: column;
-    
-    .el-button {
-      width: 100%;
-    }
-  }
-}
+<template>

+  <div class="upload-page">

+    <div class="page-header">

+      <h1>上传种子</h1>

+      <p class="page-description">分享你的资源,为社区做贡献</p>

+    </div>

+

+    <div class="upload-form">

+      <el-form

+        ref="uploadFormRef"

+        :model="uploadForm"

+        :rules="formRules"

+        label-width="120px"

+        size="large"

+      >

+        <!-- 种子文件上传 -->

+        <el-form-item label="种子文件" prop="torrentFile" required>

+          <el-upload

+            ref="torrentUploadRef"

+            :auto-upload="false"

+            :limit="1"

+            accept=".torrent"

+            :on-change="handleTorrentChange"

+            :on-remove="handleTorrentRemove"

+            :before-upload="beforeTorrentUpload"

+            drag

+            class="torrent-upload"

+          >

+            <el-icon class="el-icon--upload"><UploadFilled /></el-icon>

+            <div class="el-upload__text">

+              将 .torrent 文件拖到此处,或<em>点击上传</em>

+            </div>

+            <template #tip>

+              <div class="el-upload__tip">

+                只能上传 .torrent 文件,且不超过 10MB

+              </div>

+            </template>

+          </el-upload>

+        </el-form-item>

+

+        <!-- 基本信息 -->

+        <el-form-item label="资源标题" prop="title" required>

+          <el-input

+            v-model="uploadForm.title"

+            placeholder="请输入资源标题"

+            maxlength="200"

+            show-word-limit

+          />

+        </el-form-item>

+

+        <el-form-item label="资源分类" prop="category" required>

+          <el-select v-model="uploadForm.category" placeholder="请选择分类">

+            <el-option label="电影" value="movie" />

+            <el-option label="电视剧" value="tv" />

+            <el-option label="音乐" value="music" />

+            <el-option label="软件" value="software" />

+            <el-option label="游戏" value="game" />

+            <el-option label="电子书" value="ebook" />

+            <el-option label="其他" value="other" />

+          </el-select>

+        </el-form-item>

+

+        <el-form-item label="子分类" prop="subcategory">

+          <el-select v-model="uploadForm.subcategory" placeholder="请选择子分类">

+            <el-option

+              v-for="sub in getSubcategories(uploadForm.category)"

+              :key="sub.value"

+              :label="sub.label"

+              :value="sub.value"

+            />

+          </el-select>

+        </el-form-item>

+

+        <!-- 详细描述 -->

+        <el-form-item label="资源描述" prop="description">

+          <el-input

+            v-model="uploadForm.description"

+            type="textarea"

+            :rows="6"

+            placeholder="请详细描述资源内容,包括格式、质量、语言等信息"

+            maxlength="2000"

+            show-word-limit

+          />

+        </el-form-item>

+

+        <!-- 标签 -->

+        <el-form-item label="标签">

+          <div class="tags-input">

+            <el-tag

+              v-for="tag in uploadForm.tags"

+              :key="tag"

+              closable

+              @close="removeTag(tag)"

+              class="tag-item"

+            >

+              {{ tag }}

+            </el-tag>

+            <el-input

+              v-if="tagInputVisible"

+              ref="tagInputRef"

+              v-model="tagInputValue"

+              size="small"

+              @keyup.enter="addTag"

+              @blur="addTag"

+              class="tag-input"

+            />

+            <el-button

+              v-else

+              size="small"

+              @click="showTagInput"

+              class="add-tag-btn"

+            >

+              + 添加标签

+            </el-button>

+          </div>

+        </el-form-item>

+

+        <!-- 封面图片 -->

+        <el-form-item label="封面图片">

+          <el-upload

+            ref="imageUploadRef"

+            :auto-upload="false"

+            :limit="1"

+            accept="image/*"

+            :on-change="handleImageChange"

+            :on-remove="handleImageRemove"

+            list-type="picture-card"

+            class="image-upload"

+          >

+            <el-icon><Plus /></el-icon>

+            <template #tip>

+              <div class="el-upload__tip">

+                支持 JPG、PNG 格式,建议尺寸 300x400,不超过 5MB

+              </div>

+            </template>

+          </el-upload>

+        </el-form-item>

+

+        <!-- 高级选项 -->

+        <el-form-item>

+          <el-collapse>

+            <el-collapse-item title="高级选项" name="advanced">

+              <el-form-item label="免费时间">

+                <el-select v-model="uploadForm.freeTime" placeholder="选择免费时间">

+                  <el-option label="永久免费" value="forever" />

+                  <el-option label="24小时" value="24h" />

+                  <el-option label="48小时" value="48h" />

+                  <el-option label="7天" value="7d" />

+                  <el-option label="30天" value="30d" />

+                </el-select>

+              </el-form-item>

+

+              <el-form-item label="匿名上传">

+                <el-switch v-model="uploadForm.anonymous" />

+                <span class="form-tip">开启后将不显示上传者信息</span>

+              </el-form-item>

+

+              <el-form-item label="允许HR">

+                <el-switch v-model="uploadForm.allowHR" />

+                <span class="form-tip">允许此种子参与HR考核</span>

+              </el-form-item>

+            </el-collapse-item>

+          </el-collapse>

+        </el-form-item>

+

+        <!-- 提交按钮 -->

+        <el-form-item>

+          <div class="submit-buttons">

+            <el-button @click="resetForm">重置</el-button>

+            <el-button type="primary" @click="submitForm" :loading="uploading">

+              {{ uploading ? '上传中...' : '提交种子' }}

+            </el-button>

+          </div>

+        </el-form-item>

+      </el-form>

+    </div>

+  </div>

+</template>

+

+<script>

+import { ref, reactive, nextTick } from 'vue'

+import { useRouter } from 'vue-router'

+import { ElMessage } from 'element-plus'

+import {

+  UploadFilled,

+  Plus

+} from '@element-plus/icons-vue'

+

+export default {

+  name: 'UploadView',

+  setup() {

+    const router = useRouter()

+    const uploadFormRef = ref(null)

+    const torrentUploadRef = ref(null)

+    const imageUploadRef = ref(null)

+    const tagInputRef = ref(null)

+    

+    const uploading = ref(false)

+    const tagInputVisible = ref(false)

+    const tagInputValue = ref('')

+    

+    const uploadForm = reactive({

+      torrentFile: null,

+      title: '',

+      category: '',

+      subcategory: '',

+      description: '',

+      tags: [],

+      coverImage: null,

+      freeTime: '',

+      anonymous: false,

+      allowHR: true

+    })

+    

+    const formRules = {

+      title: [

+        { required: true, message: '请输入资源标题', trigger: 'blur' },

+        { min: 5, max: 200, message: '标题长度在 5 到 200 个字符', trigger: 'blur' }

+      ],

+      category: [

+        { required: true, message: '请选择资源分类', trigger: 'change' }

+      ],

+      description: [

+        { min: 10, max: 2000, message: '描述长度在 10 到 2000 个字符', trigger: 'blur' }

+      ]

+    }

+    

+    const subcategories = {

+      movie: [

+        { label: '动作片', value: 'action' },

+        { label: '喜剧片', value: 'comedy' },

+        { label: '科幻片', value: 'scifi' },

+        { label: '恐怖片', value: 'horror' },

+        { label: '剧情片', value: 'drama' }

+      ],

+      tv: [

+        { label: '美剧', value: 'us' },

+        { label: '国产剧', value: 'cn' },

+        { label: '日韩剧', value: 'asia' },

+        { label: '英剧', value: 'uk' },

+        { label: '纪录片', value: 'documentary' }

+      ],

+      music: [

+        { label: '流行音乐', value: 'pop' },

+        { label: '古典音乐', value: 'classical' },

+        { label: '摇滚音乐', value: 'rock' },

+        { label: '电子音乐', value: 'electronic' },

+        { label: '其他', value: 'other' }

+      ],

+      software: [

+        { label: '操作系统', value: 'os' },

+        { label: '办公软件', value: 'office' },

+        { label: '开发工具', value: 'dev' },

+        { label: '设计软件', value: 'design' },

+        { label: '其他', value: 'other' }

+      ],

+      game: [

+        { label: 'PC游戏', value: 'pc' },

+        { label: '主机游戏', value: 'console' },

+        { label: '手机游戏', value: 'mobile' },

+        { label: '其他', value: 'other' }

+      ]

+    }

+    

+    const getSubcategories = (category) => {

+      return subcategories[category] || []

+    }

+    

+    const handleTorrentChange = (file) => {

+      uploadForm.torrentFile = file.raw

+      // 这里可以解析torrent文件获取基本信息

+      parseTorrentFile(file.raw)

+    }

+    

+    const handleTorrentRemove = () => {

+      uploadForm.torrentFile = null

+    }

+    

+    const beforeTorrentUpload = (file) => {

+      const isTorrent = file.type === 'application/x-bittorrent' || file.name.endsWith('.torrent')

+      const isLt10M = file.size / 1024 / 1024 < 10

+      

+      if (!isTorrent) {

+        ElMessage.error('只能上传 .torrent 文件!')

+        return false

+      }

+      if (!isLt10M) {

+        ElMessage.error('种子文件大小不能超过 10MB!')

+        return false

+      }

+      return true

+    }

+    

+    const parseTorrentFile = (file) => {

+      // 这里应该实现torrent文件解析

+      // 可以使用 parse-torrent 库

+      console.log('解析种子文件:', file.name)

+      

+      // 模拟解析结果自动填入表单

+      if (!uploadForm.title) {

+        uploadForm.title = file.name.replace('.torrent', '')

+      }

+    }

+    

+    const handleImageChange = (file) => {

+      uploadForm.coverImage = file.raw

+    }

+    

+    const handleImageRemove = () => {

+      uploadForm.coverImage = null

+    }

+    

+    const showTagInput = () => {

+      tagInputVisible.value = true

+      nextTick(() => {

+        tagInputRef.value?.focus()

+      })

+    }

+    

+    const addTag = () => {

+      const tag = tagInputValue.value.trim()

+      if (tag && !uploadForm.tags.includes(tag)) {

+        uploadForm.tags.push(tag)

+      }

+      tagInputVisible.value = false

+      tagInputValue.value = ''

+    }

+    

+    const removeTag = (tag) => {

+      const index = uploadForm.tags.indexOf(tag)

+      if (index > -1) {

+        uploadForm.tags.splice(index, 1)

+      }

+    }

+    

+    const submitForm = async () => {

+      if (!uploadForm.torrentFile) {

+        ElMessage.error('请上传种子文件')

+        return

+      }

+      

+      try {

+        await uploadFormRef.value?.validate()

+        

+        uploading.value = true

+        

+        // 模拟上传过程

+        await new Promise(resolve => setTimeout(resolve, 2000))

+        

+        ElMessage.success('种子上传成功!')

+        router.push('/torrents')

+        

+      } catch (error) {

+        console.error('表单验证失败:', error)

+      } finally {

+        uploading.value = false

+      }

+    }

+    

+    const resetForm = () => {

+      uploadFormRef.value?.resetFields()

+      uploadForm.torrentFile = null

+      uploadForm.coverImage = null

+      uploadForm.tags = []

+      torrentUploadRef.value?.clearFiles()

+      imageUploadRef.value?.clearFiles()

+    }

+    

+    return {

+      uploadFormRef,

+      torrentUploadRef,

+      imageUploadRef,

+      tagInputRef,

+      uploading,

+      tagInputVisible,

+      tagInputValue,

+      uploadForm,

+      formRules,

+      getSubcategories,

+      handleTorrentChange,

+      handleTorrentRemove,

+      beforeTorrentUpload,

+      handleImageChange,

+      handleImageRemove,

+      showTagInput,

+      addTag,

+      removeTag,

+      submitForm,

+      resetForm,

+      UploadFilled,

+      Plus

+    }

+  }

+}

+</script>

+

+<style lang="scss" scoped>

+.upload-page {

+  max-width: 800px;

+  margin: 0 auto;

+  padding: 24px;

+}

+

+.page-header {

+  text-align: center;

+  margin-bottom: 32px;

+  

+  h1 {

+    font-size: 28px;

+    font-weight: 600;

+    color: #2c3e50;

+    margin: 0 0 8px 0;

+  }

+  

+  .page-description {

+    font-size: 16px;

+    color: #7f8c8d;

+    margin: 0;

+  }

+}

+

+.upload-form {

+  background: #fff;

+  border-radius: 12px;

+  padding: 32px;

+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);

+  

+  .torrent-upload {

+    width: 100%;

+    

+    :deep(.el-upload-dragger) {

+      width: 100%;

+      height: 180px;

+      border: 2px dashed #d9d9d9;

+      border-radius: 8px;

+      

+      &:hover {

+        border-color: #409eff;

+      }

+    }

+  }

+  

+  .tags-input {

+    display: flex;

+    flex-wrap: wrap;

+    gap: 8px;

+    align-items: center;

+    

+    .tag-item {

+      margin: 0;

+    }

+    

+    .tag-input {

+      width: 100px;

+    }

+    

+    .add-tag-btn {

+      border: 1px dashed #d9d9d9;

+      color: #999;

+      

+      &:hover {

+        border-color: #409eff;

+        color: #409eff;

+      }

+    }

+  }

+  

+  .image-upload {

+    :deep(.el-upload--picture-card) {

+      width: 148px;

+      height: 148px;

+    }

+  }

+  

+  .form-tip {

+    margin-left: 8px;

+    font-size: 12px;

+    color: #909399;

+  }

+  

+  .submit-buttons {

+    display: flex;

+    gap: 16px;

+    justify-content: center;

+    margin-top: 24px;

+  }

+}

+

+@media (max-width: 768px) {

+  .upload-page {

+    padding: 16px;

+  }

+  

+  .upload-form {

+    padding: 24px 16px;

+  }

+  

+  .submit-buttons {

+    flex-direction: column;

+    

+    .el-button {

+      width: 100%;

+    }

+  }

+}

 </style>
\ No newline at end of file