diff --git a/src/api/User/UserApi.ts b/src/api/User/UserApi.ts
index 56152fc..cd7aa55 100644
--- a/src/api/User/UserApi.ts
+++ b/src/api/User/UserApi.ts
@@ -1,12 +1,17 @@
 import type { AxiosResponse } from "axios";
 import axios from "axios";
-import type { UserInfo } from "./type";
+import type { UserDetailInfo, UserInfo } from "./type";
 import type { CommonResponse } from "../type";
 
 class UserAPi {
     static getMe() :Promise<AxiosResponse<CommonResponse<UserInfo>>> {
         return axios.get('/api/user/me');
     }
+
+    static getMeDetail(userid:string) :Promise<AxiosResponse<CommonResponse<UserDetailInfo>>> {
+        return axios.get(`/api/user/${userid}`);
+    }
 }
 
+
 export default UserAPi;
\ No newline at end of file
diff --git a/src/api/User/type.ts b/src/api/User/type.ts
index a7a1503..1410aa8 100644
--- a/src/api/User/type.ts
+++ b/src/api/User/type.ts
@@ -6,5 +6,5 @@
 export interface UserDetailInfo {
     userid: string,
     username: string,
-    // ...
+    email: string,
 }
\ No newline at end of file
diff --git a/src/api/categoryApi.ts b/src/api/categoryApi.ts
deleted file mode 100644
index 816ac71..0000000
--- a/src/api/categoryApi.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-import axios from 'axios';
-import type { CategoryDTO, Category, WorkResponse } from './otherType';
-
-const API_BASE_URL = '/api';
-
-class CategoryAPI {
-  /**
-   * 获取全部分区（树形结构）
-   * @returns 返回分区的树形结构数据
-   */
-  static getCategoryTree(): Promise<CategoryDTO[]> {
-    return axios.get<CategoryDTO[]>(`${API_BASE_URL}/categories`)
-      .then(response => response.data);
-  }
-
-  /**
-   * 获取单个分区详情
-   * @param id 分区ID
-   * @returns 返回单个分区的详细信息
-   */
-  static getCategory(id: number): Promise<Category> {
-    return axios.get<Category>(`${API_BASE_URL}/categories/${id}`)
-      .then(response => response.data);
-  }
-
-  /**
-   * 创建新分区
-   * @param category 分区数据（不包含ID）
-   * @returns 返回创建成功的消息
-   */
-  static createCategory(category: Omit<Category, 'id'>): Promise<string> {
-    return axios.post<string>(`${API_BASE_URL}/categories`, category)
-      .then(response => response.data);
-  }
-
-  /**
-   * 更新分区信息
-   * @param id 分区ID
-   * @param category 更新后的分区数据
-   * @returns 返回更新成功的消息
-   */
-  static updateCategory(id: number, category: Partial<Category>): Promise<string> {
-    return axios.put<string>(`${API_BASE_URL}/categories/${id}`, category)
-      .then(response => response.data);
-  }
-
-  /**
-   * 删除分区
-   * @param id 分区ID
-   * @returns 返回删除成功的消息
-   */
-  static deleteCategory(id: number): Promise<string> {
-    return axios.delete<string>(`${API_BASE_URL}/categories/${id}`)
-      .then(response => response.data);
-  }
-
-  /**
-   * 获取分区下的作品列表（带分页）
-   * @param categoryId 分区ID
-   * @param params 分页和排序参数
-   * @returns 返回作品列表和分页信息
-   */
-  static getWorksByCategory(
-    categoryId: number,
-    params?: {
-      page?: number;
-      size?: number;
-      sort?: string;
-    }
-  ): Promise<WorkResponse> {
-    return axios.get<WorkResponse>(`${API_BASE_URL}/works`, {
-      params: {
-        categoryId,
-        ...params
-      }
-    }).then(response => response.data);
-  }
-
-  /**
-   * 获取子分区列表
-   * @param parentId 父分区ID
-   * @returns 返回子分区列表
-   */
-  static getSubCategories(parentId: number): Promise<CategoryDTO[]> {
-    return axios.get<CategoryDTO[]>(`${API_BASE_URL}/categories/${parentId}/children`)
-      .then(response => response.data);
-  }
-}
-
-export default CategoryAPI;
\ No newline at end of file
diff --git a/src/api/categoryTypes.ts b/src/api/categoryTypes.ts
deleted file mode 100644
index 4a46034..0000000
--- a/src/api/categoryTypes.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import type { ReactNode } from "react";
-
-// 基础分类接口
-export interface CategoryDTO {
-  id: number;
-  name: string;
-  description?: string;
-  parentId?: number;  // 移除了 null 类型，只保留 number | undefined
-  children?: CategoryDTO[];
-  workCount?: number;
-}
-
-
-// 基础资源接口
-interface BaseResource {
-  id: number;
-  title: string;
-  categoryId: number;
-  categoryName: string;
-  uploadDate: string;
-  uploader: string;
-  size: string;
-  seeders: number;
-  leechers: number;
-  downloadCount: number;
-  hash: string;
-}
-
-// 音乐资源
-export interface MusicResource extends BaseResource {
-  category: ReactNode;
-  artist: string;
-  quality: 'MP3 128k' | 'MP3 320k' | 'FLAC' | 'APE' | 'Hi-Res' | 'DSD';
-  genre: string[];
-}
-
-// 影视资源
-export interface MovieResource extends BaseResource {
-  director: string;
-  actors: string[];
-  resolution: '1080p' | '720p' | '4K' | '8K';
-  duration: string;
-}
-
-// 游戏资源
-export interface GameResource extends BaseResource {
-  developer: string;
-  publisher: string;
-  platform: 'PC' | 'PS' | 'Xbox' | 'Switch';
-  releaseDate: string;
-}
-
-// 其他资源
-export interface OtherResource extends BaseResource {
-  description: string;
-  fileType: string;
-}
-
-// 分类DTO
-export interface CategoryDTO {
-  id: number;
-  name: string;
-  description?: string;
-  parentId?: number;
-  children?: CategoryDTO[];
-  workCount?: number;
-}
\ No newline at end of file
diff --git a/src/api/commentApi.ts b/src/api/commentApi.ts
deleted file mode 100644
index 360e659..0000000
--- a/src/api/commentApi.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import axios from 'axios';
-import type { Comment, CommentFormData, CommentReply, ReplyFormData } from './otherType';
-
-const API_BASE_URL = '/api';
-
-class CommentAPI {
-  /**
-   * 添加评论
-   */
-  static addComment(data: CommentFormData): Promise<Comment> {
-    return axios.post<Comment>(`${API_BASE_URL}/comments`, data)
-      .then(response => response.data);
-  }
-
-  /**
-   * 删除评论
-   */
-  static deleteComment(commentId: number): Promise<void> {
-    return axios.delete(`${API_BASE_URL}/comments/${commentId}`);
-  }
-
-  /**
-   * 更新评论
-   */
-  static updateComment(commentId: number, data: CommentFormData): Promise<Comment> {
-    return axios.put<Comment>(`${API_BASE_URL}/comments/${commentId}`, data)
-      .then(response => response.data);
-  }
-
-  /**
-   * 获取单个评论
-   */
-  static getCommentById(commentId: number): Promise<Comment> {
-    return axios.get<Comment>(`${API_BASE_URL}/comments/${commentId}`)
-      .then(response => response.data);
-  }
-
-  /**
-   * 获取帖子下的所有评论
-   */
-  static getCommentsByPostId(postId: number): Promise<Comment[]> {
-    return axios.get<Comment[]>(`${API_BASE_URL}/comments/post/${postId}`)
-      .then(response => response.data);
-  }
-
-  /**
-   * 添加回复
-   */
-  static addReply(commentId: number, data: ReplyFormData): Promise<CommentReply> {
-    return axios.post<CommentReply>(`${API_BASE_URL}/comments/${commentId}/replies`, data)
-      .then(response => response.data);
-  }
-
-  /**
-   * 获取评论的所有回复
-   */
-  static getReplies(commentId: number): Promise<CommentReply[]> {
-    return axios.get<CommentReply[]>(`${API_BASE_URL}/comments/${commentId}/replies`)
-      .then(response => response.data);
-  }
-
-  /**
-   * 点赞评论
-   */
-  static likeComment(commentId: number): Promise<void> {
-    return axios.post(`${API_BASE_URL}/comments/${commentId}/like`);
-  }
-
-  /**
-   * 举报评论
-   */
-  static reportComment(commentId: number, reason: string): Promise<void> {
-    return axios.post(`${API_BASE_URL}/comments/${commentId}/report`, { reason });
-  }
-}
-
-export default CommentAPI;
\ No newline at end of file
diff --git a/src/api/interceptors.ts b/src/api/interceptors.ts
index 3c0863b..04bdcb3 100644
--- a/src/api/interceptors.ts
+++ b/src/api/interceptors.ts
@@ -26,7 +26,7 @@
         code,
         message: msg,
         data,
-        success: code === 0, // 根据 code 判断请求是否成功
+        ...response.data
       },
     };
   },
diff --git a/src/api/otherType.ts b/src/api/otherType.ts
deleted file mode 100644
index 60523d0..0000000
--- a/src/api/otherType.ts
+++ /dev/null
@@ -1,164 +0,0 @@
-// 认证相关类型
-export interface LoginRequest {
-  email: string;
-  password: string;
-}
-
-export interface LoginResponse {
-  user: string;
-  token: string;
-  refreshToken: string;
-}
-
-export interface CommonResponse<T= null> {
-    code: number;       
-    message: string;     
-    data: T;          
-}
-
-// 作品相关类型
-export interface Work {
-  size: string;
-  data(data: any): unknown;
-  artist: string;
-  quality: string;
-  genre: string[];
-  id: number;
-  title: string;
-  author: string;
-  authorId: number;
-  views: number;
-  likes: number;
-  categoryId: number;
-  categoryName: string;
-  description: string;
-  content: string;
-  coverUrl: string;
-  createTime: string;
-  attachments: Attachment[];
-  bugCount: number;
-  discussionCount: number;
-}
-
-export interface WorkResponse {
-  content: Work[];
-  totalElements: number;
-  totalPages: number;
-}
-
-export interface WorkFormData {
-  title: string;
-  categoryId: number;
-  description: string;
-  content: string;
-  coverFile?: File;
-  attachments?: File[];
-}
-
-// Bug反馈相关类型
-export interface BugReport {
-  id: number;
-  title: string;
-  description: string;
-  severity: 'low' | 'medium' | 'high';
-  status: 'open' | 'resolved' | 'wontfix';
-  reporter: string;
-  reporterId: number;
-  workId: number;
-  createTime: string;
-}
-
-// 讨论区相关类型
-export interface Discussion {
-  id: number;
-  title: string;
-  content: string;
-  author: string;
-  authorId: number;
-  workId: number;
-  isPinned: boolean;
-  commentCount: number;
-  createTime: string;
-  lastUpdateTime: string;
-}
-
-export interface DiscussionFormData {
-  workId: number;
-  title: string;
-  content: string;
-}
-
-// 评论相关类型
-export interface Comment {
-  id: number;
-  author: string;
-  avatar: string;
-  content: string;
-  likes: number;
-  replyCount: number;
-  createTime: string;
-  replies?: CommentReply[];
-}
-
-export interface CommentFormData {
-  postId: number; // 可以是作品ID或讨论区ID
-  content: string;
-  parentId?: number; // 用于回复评论
-}
-
-export interface CommentReply {
-  id: number;
-  author: string;
-  avatar: string;
-  content: string;
-  likes: number;
-  createTime: string;
-}
-
-export interface ReplyFormData {
-  content: string;
-}
-
-// 分区相关类型
-export interface Category {
-  id: number;
-  name: string;
-  description?: string;
-  parentId?: number | null;
-  coverUrl?: string;
-  createdAt?: string;
-  updatedAt?: string;
-}
-
-export interface CategoryDTO extends Category {
-  children?: CategoryDTO[];
-  workCount?: number;
-}
-
-// 用户相关类型
-export interface User {
-  id: number;
-  username: string;
-  email: string;
-  avatar?: string;
-  role: 'user' | 'admin';
-  createdAt: string;
-  worksCount: number;
-  completedWorks: number;
-}
-
-// 通用类型
-export interface Attachment {
-  id: number;
-  name: string;
-  url: string;
-  size: string;
-}
-
-// API响应通用类型
-export interface ApiResponse<T> {
-  success: boolean;
-  data?: T;
-  message?: string;
-  error?: string;
-}
\ No newline at end of file
diff --git a/src/api/workApi.ts b/src/api/workApi.ts
deleted file mode 100644
index d624821..0000000
--- a/src/api/workApi.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import axios from 'axios';
-import type { Work, WorkResponse, WorkFormData, BugReport, Discussion } from './otherType';
-
-const API_BASE_URL = '/api';
-
-class WorkAPI {
-  /**
-   * 获取作品列表（支持分页、分类筛选和搜索）
-   */
-  static getWorks(params?: {
-    categoryId?: number;
-    page?: number;
-    size?: number;
-    search?: string;
-  }): Promise<WorkResponse> {
-    return axios.get<WorkResponse>(`${API_BASE_URL}/works`, { params })
-      .then(response => response.data);
-  }
-
-  /**
-   * 获取单个作品详情
-   */
-  static getWorkById(id: number): Promise<Work> {
-    return axios.get<Work>(`${API_BASE_URL}/works/${id}`)
-      .then(response => response.data);
-  }
-
-  /**
-   * 创建新作品
-   */
-  static createWork(data: WorkFormData): Promise<Work> {
-    return axios.post<Work>(`${API_BASE_URL}/works`, data)
-      .then(response => response.data);
-  }
-
-  /**
-   * 更新作品信息
-   */
-  static updateWork(id: number, data: WorkFormData): Promise<Work> {
-    return axios.put<Work>(`${API_BASE_URL}/works/${id}`, data)
-      .then(response => response.data);
-  }
-
-  /**
-   * 删除作品
-   */
-  static deleteWork(id: number): Promise<void> {
-    return axios.delete(`${API_BASE_URL}/works/${id}`);
-  }
-
-  /**
-   * 点赞作品
-   */
-  static likeWork(id: number): Promise<void> {
-    return axios.post(`${API_BASE_URL}/works/${id}/like`);
-  }
-
-  /**
-   * 根据作者查询作品
-   */
-  static getWorksByAuthor(author: string): Promise<Work[]> {
-    return axios.get<Work[]>(`${API_BASE_URL}/works/byAuthor`, { params: { author } })
-      .then(response => response.data);
-  }
-
-  /**
-   * 获取作品Bug反馈列表
-   */
-  static getBugReports(workId: number): Promise<BugReport[]> {
-    return axios.get<BugReport[]>(`${API_BASE_URL}/works/${workId}/bugs`)
-      .then(response => response.data);
-  }
-
-  /**
-   * 提交Bug反馈
-   */
-  static reportBug(workId: number, data: {
-    title: string;
-    description: string;
-    severity: 'low' | 'medium' | 'high';
-  }): Promise<void> {
-    return axios.post(`${API_BASE_URL}/works/${workId}/bugs`, data);
-  }
-
-  /**
-   * 获取作品讨论区列表
-   */
-  static getDiscussions(workId: number): Promise<Discussion[]> {
-    return axios.get<Discussion[]>(`${API_BASE_URL}/works/${workId}/discussions`)
-      .then(response => response.data);
-  }
-
-  /**
-   * 创建新讨论
-   */
-  static createDiscussion(data: {
-    workId: number;
-    title: string;
-    content: string;
-  }): Promise<void> {
-    return axios.post(`${API_BASE_URL}/discussions`, data);
-  }
-}
-
-export default WorkAPI;
\ No newline at end of file
diff --git a/src/assets/categories/film.jpg b/src/assets/categories/film.jpg
deleted file mode 100644
index 3d05b4d..0000000
--- a/src/assets/categories/film.jpg
+++ /dev/null
Binary files differ
diff --git a/src/assets/categories/game.jpg b/src/assets/categories/game.jpg
deleted file mode 100644
index 15571fe..0000000
--- a/src/assets/categories/game.jpg
+++ /dev/null
Binary files differ
diff --git a/src/assets/categories/music.jpg b/src/assets/categories/music.jpg
deleted file mode 100644
index 47dda2c..0000000
--- a/src/assets/categories/music.jpg
+++ /dev/null
Binary files differ
diff --git a/src/assets/categories/other.jpg b/src/assets/categories/other.jpg
deleted file mode 100644
index b7385c0..0000000
--- a/src/assets/categories/other.jpg
+++ /dev/null
Binary files differ
diff --git a/src/components/BugReportSection.tsx b/src/components/BugReportSection.tsx
deleted file mode 100644
index a512fc6..0000000
--- a/src/components/BugReportSection.tsx
+++ /dev/null
@@ -1,159 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { List, Button, Form, Input, Select, message, Typography, Tag, Divider, Pagination } from 'antd';
-import { BugOutlined } from '@ant-design/icons';
-import WorkAPI from '../api/workApi';
-import type { BugReport } from '../api/otherType';
-
-const { Text } = Typography;
-const { Option } = Select;
-const { TextArea } = Input;
-
-interface BugReportForm {
-  title: string;
-  description: string;
-  severity: 'low' | 'medium' | 'high';
-}
-
-const BugReportSection: React.FC<{ workId: number }> = ({ workId }) => {
-  const [bugs, setBugs] = useState<BugReport[]>([]);
-  const [loading, setLoading] = useState(false);
-  const [form] = Form.useForm();
-  const [currentPage, setCurrentPage] = useState(1);
-  const [pageSize, setPageSize] = useState(5); // 每页显示5条
-
-  // 加载Bug反馈列表
-  useEffect(() => {
-    const loadBugs = async () => {
-      try {
-        setLoading(true);
-        const bugList = await WorkAPI.getBugReports(workId);
-        setBugs(bugList);
-      } catch (error) {
-        message.error('加载Bug反馈失败');
-      } finally {
-        setLoading(false);
-      }
-    };
-
-    loadBugs();
-  }, [workId]);
-
-  // 获取当前页的Bug数据
-  const getCurrentPageBugs = () => {
-    const startIndex = (currentPage - 1) * pageSize;
-    const endIndex = startIndex + pageSize;
-    return bugs.slice(startIndex, endIndex);
-  };
-
-  // 提交Bug反馈
-  const handleSubmit = async (values: BugReportForm) => {
-    try {
-      await WorkAPI.reportBug(workId, values);
-      message.success('Bug反馈提交成功');
-      form.resetFields();
-      // 重新加载Bug列表
-      const bugList = await WorkAPI.getBugReports(workId);
-      setBugs(bugList);
-      // 重置到第一页
-      setCurrentPage(1);
-    } catch (error) {
-      message.error('Bug反馈提交失败');
-    }
-  };
-
-  const getSeverityColor = (severity: string) => {
-    switch (severity) {
-      case 'high': return 'red';
-      case 'medium': return 'orange';
-      default: return 'green';
-    }
-  };
-
-  return (
-    <div className="bug-report-section">
-      <Divider orientation="left">
-        <BugOutlined /> Bug反馈
-      </Divider>
-
-      <Form form={form} onFinish={handleSubmit} layout="vertical">
-        <Form.Item
-          name="title"
-          label="Bug标题"
-          rules={[{ required: true, message: '请输入Bug标题' }]}
-        >
-          <Input placeholder="简要描述Bug" />
-        </Form.Item>
-
-        <Form.Item
-          name="severity"
-          label="严重程度"
-          initialValue="medium"
-          rules={[{ required: true }]}
-        >
-          <Select>
-            <Option value="low">低</Option>
-            <Option value="medium">中</Option>
-            <Option value="high">高</Option>
-          </Select>
-        </Form.Item>
-
-        <Form.Item
-          name="description"
-          label="详细描述"
-          rules={[{ required: true, message: '请详细描述Bug' }]}
-        >
-          <TextArea rows={4} placeholder="请详细描述Bug出现的步骤、现象和预期结果" />
-        </Form.Item>
-
-        <Form.Item>
-          <Button type="primary" htmlType="submit">
-            提交Bug
-          </Button>
-        </Form.Item>
-      </Form>
-
-      <Divider orientation="left">Bug列表</Divider>
-
-      <List
-        dataSource={getCurrentPageBugs()}
-        loading={loading}
-        renderItem={bug => (
-          <List.Item>
-            <div className="bug-item">
-              <div className="bug-header">
-                <Text strong>{bug.title}</Text>
-                <Tag color={getSeverityColor(bug.severity)}>
-                  {bug.severity === 'high' ? '严重' : bug.severity === 'medium' ? '中等' : '轻微'}
-                </Tag>
-              </div>
-              <Text type="secondary">报告人: {bug.reporter} | 时间: {new Date(bug.createTime).toLocaleString()}</Text>
-              <div className="bug-content">
-                <Text>{bug.description}</Text>
-              </div>
-              <Tag color={bug.status === 'open' ? 'red' : bug.status === 'resolved' ? 'green' : 'gray'}>
-                {bug.status === 'open' ? '未解决' : bug.status === 'resolved' ? '已解决' : '不予解决'}
-              </Tag>
-            </div>
-          </List.Item>
-        )}
-      />
-
-      <div style={{ textAlign: 'right', marginTop: 16 }}>
-        <Pagination
-          current={currentPage}
-          pageSize={pageSize}
-          total={bugs.length}
-          onChange={(page, size) => {
-            setCurrentPage(page);
-            setPageSize(size);
-          }}
-          showSizeChanger
-          showQuickJumper
-          showTotal={total => `共 ${total} 条`}
-        />
-      </div>
-    </div>
-  );
-};
-
-export default BugReportSection;
\ No newline at end of file
diff --git a/src/components/CustomComment.css b/src/components/CustomComment.css
deleted file mode 100644
index 8f9a012..0000000
--- a/src/components/CustomComment.css
+++ /dev/null
@@ -1,54 +0,0 @@
-/* src/components/CustomComment.css */
-.custom-comment {
-  margin-bottom: 16px;
-  padding: 16px 0;
-  border-bottom: 1px solid #f0f0f0;
-}
-
-.custom-comment:last-child {
-  border-bottom: none;
-}
-
-.custom-comment-inner {
-  display: flex;
-}
-
-.custom-comment-avatar {
-  margin-right: 12px;
-}
-
-.custom-comment-content {
-  flex: 1;
-}
-
-.custom-comment-header {
-  margin-bottom: 8px;
-  display: flex;
-  align-items: center;
-}
-
-.custom-comment-author {
-  font-weight: 500;
-  color: rgba(0, 0, 0, 0.85);
-}
-
-.custom-comment-datetime {
-  margin-left: 12px;
-  font-size: 12px;
-  color: rgba(0, 0, 0, 0.45);
-}
-
-.custom-comment-text {
-  margin-bottom: 8px;
-  color: rgba(0, 0, 0, 0.85);
-  white-space: pre-line;
-}
-
-.custom-comment-actions {
-  margin-top: 8px;
-}
-
-.custom-comment-action {
-  padding: 0 4px;
-  font-size: 12px;
-}
\ No newline at end of file
diff --git a/src/components/DiscussionSection.tsx b/src/components/DiscussionSection.tsx
deleted file mode 100644
index 7fd39c4..0000000
--- a/src/components/DiscussionSection.tsx
+++ /dev/null
@@ -1,190 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { List, Button, Form, Input, message, Avatar, Typography, Modal, Pagination } from 'antd';
-import { LikeOutlined, MessageOutlined } from '@ant-design/icons';
-import CommentAPI from '../api/commentApi';
-import type { Comment } from '../api/otherType';
-
-const { Text } = Typography;
-const { TextArea } = Input;
-
-interface DiscussionSectionProps {
-  workId: number;
-}
-
-const DiscussionSection: React.FC<DiscussionSectionProps> = ({ workId }) => {
-  const [comments, setComments] = useState<Comment[]>([]);
-  const [loading, setLoading] = useState(false);
-  const [modalVisible, setModalVisible] = useState(false);
-  const [form] = Form.useForm();
-  const [currentPage, setCurrentPage] = useState(1);
-  const [pageSize, setPageSize] = useState(5); // 每页显示5条
-
-  // 加载评论
-  useEffect(() => {
-    const loadComments = async () => {
-      try {
-        setLoading(true);
-        const commentList = await CommentAPI.getCommentsByPostId(workId);
-        setComments(commentList);
-      } catch (error) {
-        message.error('加载评论失败');
-      } finally {
-        setLoading(false);
-      }
-    };
-
-    loadComments();
-  }, [workId]);
-
-  // 获取当前页的评论数据
-  const getCurrentPageComments = () => {
-    const startIndex = (currentPage - 1) * pageSize;
-    const endIndex = startIndex + pageSize;
-    return comments.slice(startIndex, endIndex);
-  };
-
-  // 提交新评论
-  const handleSubmit = async (values: { title: string; content: string }) => {
-    try {
-      await CommentAPI.addComment({
-        postId: workId,
-        content: values.content
-      });
-      message.success('评论添加成功');
-      form.resetFields();
-      setModalVisible(false);
-      // 重新加载评论
-      const commentList = await CommentAPI.getCommentsByPostId(workId);
-      setComments(commentList);
-      // 重置到第一页
-      setCurrentPage(1);
-    } catch (error) {
-      message.error('评论添加失败');
-    }
-  };
-
-  // 点赞评论
-  const handleLikeComment = async (commentId: number) => {
-    try {
-      await CommentAPI.likeComment(commentId);
-      setComments(prev => prev.map(comment => 
-        comment.id === commentId 
-          ? { ...comment, likes: (comment.likes || 0) + 1 } 
-          : comment
-      ));
-    } catch (error) {
-      message.error('点赞失败');
-    }
-  };
-
-  return (
-    <div className="discussion-section">
-      <Button 
-        type="primary" 
-        icon={<MessageOutlined />}
-        onClick={() => setModalVisible(true)}
-        style={{ marginBottom: 16 }}
-      >
-        新建讨论
-      </Button>
-
-      <List
-        dataSource={getCurrentPageComments()}
-        loading={loading}
-        renderItem={comment => (
-          <List.Item className="comment-item">
-            <div className="comment-content">
-              <div className="comment-header">
-                <Avatar size="small">
-                  {comment.author?.charAt(0) || '?'}
-                </Avatar>
-                <Text strong>{comment.author || '匿名用户'}</Text>
-                <Text type="secondary">
-                  {comment.createTime ? new Date(comment.createTime).toLocaleString() : '未知时间'}
-                </Text>
-              </div>
-              <div className="comment-body">
-                <Text>{comment.content}</Text>
-              </div>
-              <div className="comment-actions">
-                <Button 
-                  type="text" 
-                  icon={<LikeOutlined />} 
-                  onClick={() => handleLikeComment(comment.id)}
-                >
-                  {comment.likes || 0}
-                </Button>
-              </div>
-            </div>
-          </List.Item>
-        )}
-      />
-
-      <div style={{ textAlign: 'right', marginTop: 16 }}>
-        <Pagination
-          current={currentPage}
-          pageSize={pageSize}
-          total={comments.length}
-          onChange={(page, size) => {
-            setCurrentPage(page);
-            setPageSize(size);
-          }}
-          showSizeChanger
-          showQuickJumper
-          showTotal={total => `共 ${total} 条`}
-        />
-      </div>
-
-      <Modal
-        title={
-          <span>
-            <MessageOutlined style={{ marginRight: 8 }} />
-            新建讨论
-          </span>
-        }
-        visible={modalVisible}
-        onCancel={() => setModalVisible(false)}
-        footer={[
-          <Button key="cancel" onClick={() => setModalVisible(false)}>
-            取消
-          </Button>,
-          <Button 
-            key="submit" 
-            type="primary" 
-            onClick={() => {
-              form.validateFields()
-                .then(values => handleSubmit(values))
-                .catch(() => message.error('请填写完整信息'));
-            }}
-          >
-            创建讨论
-          </Button>,
-        ]}
-      >
-        <Form form={form} layout="vertical">
-          <Form.Item
-            name="title"
-            label="讨论主题"
-            rules={[{ required: true, message: '请输入讨论主题' }]}
-          >
-            <Input placeholder="输入讨论主题" />
-          </Form.Item>
-          
-          <Form.Item
-            name="content"
-            label="讨论内容"
-            rules={[{ required: true, message: '请输入讨论内容' }]}
-          >
-            <TextArea 
-              rows={6} 
-              placeholder="详细描述你想讨论的内容..."
-            />
-          </Form.Item>
-        </Form>
-      </Modal>
-    </div>
-  );
-};
-
-
-export default DiscussionSection;
\ No newline at end of file
diff --git a/src/feature/categories/GameCategory.tsx b/src/feature/categories/GameCategory.tsx
deleted file mode 100644
index 3f5c78d..0000000
--- a/src/feature/categories/GameCategory.tsx
+++ /dev/null
@@ -1,173 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { Card, List, message, Spin, Input, Tag, Typography} from 'antd';
-import { SearchOutlined, PlayCircleOutlined } from '@ant-design/icons';
-import CategoryAPI from '../../api/categoryApi';
-import type { GameResource } from '../../api/categoryTypes';
-import { useNavigate } from 'react-router';
-
-const { Text } = Typography;
-const { Search } = Input;
-
-const GameCategory: React.FC = () => {
-  const [games, setGames] = useState<GameResource[]>([]);
-  const [filteredGames, setFilteredGames] = useState<GameResource[]>([]);
-  const [isLoading, setIsLoading] = useState(true);
-  const [searchQuery, setSearchQuery] = useState('');
-  
-  // 加载数据
-useEffect(() => {
-  const loadGames = async () => {
-    try {
-      const response = await CategoryAPI.getWorksByCategory(3);
-      
-      // 类型转换或断言
-      const gameResources = response.content.map((work: any) => ({
-        ...work,
-        developer: (work as any).developer || '未知开发商',
-        publisher: (work as any).publisher || '未知发行商',
-        platform: (work as any).platform || 'PC',
-        releaseDate: (work as any).releaseDate || '未知日期'
-      })) as unknown as GameResource[];
-      
-      setGames(gameResources);
-      setFilteredGames(gameResources);
-    } catch (error) {
-      message.error('加载游戏资源失败');
-    } finally {
-      setIsLoading(false);
-    }
-  };
-  
-  loadGames();
-}, []);
-
-  // 筛选逻辑
-  useEffect(() => {
-    if (!searchQuery) {
-      setFilteredGames(games);
-      return;
-    }
-    
-    const filtered = games.filter(game => 
-      game.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
-      game.developer.toLowerCase().includes(searchQuery.toLowerCase())
-    );
-    
-    setFilteredGames(filtered);
-  }, [searchQuery, games]);
-
-
-  // // 在加载数据部分添加虚拟数据
-  // useEffect(() => {
-  //   const loadGames = async () => {
-  //     try {
-  //       // 模拟API请求
-  //       const mockGames: GameResource[] = [
-  //         {
-  //           id: 5,
-  //           title: '赛博朋克2077',
-  //           developer: 'CD Projekt Red',
-  //           publisher: 'CD Projekt',
-  //           categoryId: 3,
-  //           categoryName: '角色扮演',
-  //           platform: 'PC',
-  //           releaseDate: '2020-12-10',
-  //           seeders: 156,
-  //           leechers: 34,
-  //           uploadDate: '2023-06-01',
-  //           uploader: 'gameLover',
-  //           downloadCount: 2876,
-  //           hash: 'm3n4o5p6q7r8',
-  //           size: '123Mb'
-  //         },
-  //         {
-  //           id: 6,
-  //           title: '艾尔登法环',
-  //           developer: 'FromSoftware',
-  //           publisher: '万代南梦宫',
-  //           categoryId: 3,
-  //           categoryName: '动作冒险',
-  //           releaseDate: '2022-02-25',
-  //           seeders: 201,
-  //           leechers: 45,
-  //           uploadDate: '2023-05-20',
-  //           uploader: 'hardcoreGamer',
-  //           downloadCount: 3542,
-  //           hash: 's9t0u1v2w3x4',
-  //           platform: 'PC',
-  //           size: '234Mb'
-  //         }
-  //       ];
-
-  //       setGames(mockGames);
-  //       setFilteredGames(mockGames);
-  //     } catch (error) {
-  //       message.error('加载游戏资源失败');
-  //     } finally {
-  //       setIsLoading(false);
-  //     }
-  //   };
-    
-  //   loadGames();
-  // }, []);
-  
-  return (
-    <div className="game-category-container">
-      <div className="category-header">
-        <h1><PlayCircleOutlined /> 游戏资源分区</h1>
-        <p>PC、主机游戏资源分享</p>
-      </div>
-      
-      <Search
-        placeholder="搜索游戏名称或开发商"
-        allowClear
-        enterButton={<SearchOutlined />}
-        value={searchQuery}
-        onChange={e => setSearchQuery(e.target.value)}
-        className="search-bar"
-      />
-      
-      {isLoading ? (
-        <Spin tip="加载游戏资源..." size="large" />
-      ) : (
-        <List
-          grid={{ gutter: 16, column: 1 }}
-          dataSource={filteredGames}
-          renderItem={game => (
-            <List.Item>
-              <GameCard game={game} />
-            </List.Item>
-          )}
-        />
-      )}
-    </div>
-  );
-};
-
-const GameCard: React.FC<{ game: GameResource }> = ({ game }) => {
-  const navigate = useNavigate();
-  
-  const handleClick = () => {
-    navigate(`/works/${game.id}`);
-  };
-
-  return (
-    <Card className="game-card" onClick={handleClick} hoverable>
-      <div className="card-content">
-        <div className="card-header">
-          <Text strong className="resource-title">{game.title}</Text>
-          <Text type="secondary" className="resource-developer">开发商: {game.developer}</Text>
-        </div>
-        
-        <div className="card-meta">
-          <Tag color="blue">{game.platform}</Tag>
-          <Tag color="geekblue">{game.categoryName}</Tag>
-          <Tag color="green">{game.seeders} 做种</Tag>
-          <Tag color="orange">{game.leechers} 下载</Tag>
-        </div>
-      </div>
-    </Card>
-  );
-};
-
-export default GameCategory;
\ No newline at end of file
diff --git a/src/feature/categories/MovieCategory.tsx b/src/feature/categories/MovieCategory.tsx
deleted file mode 100644
index 262ebd4..0000000
--- a/src/feature/categories/MovieCategory.tsx
+++ /dev/null
@@ -1,172 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { Card, List, message, Spin, Input, Tag, Typography} from 'antd';
-import { SearchOutlined, VideoCameraOutlined } from '@ant-design/icons';
-import CategoryAPI from '../../api/categoryApi';
-import type { MovieResource } from '../../api/categoryTypes';
-import { useNavigate } from 'react-router';
-
-const { Text } = Typography;
-const { Search } = Input;
-
-const MovieCategory: React.FC = () => {
-  const [movies, setMovies] = useState<MovieResource[]>([]);
-  const [filteredMovies, setFilteredMovies] = useState<MovieResource[]>([]);
-  const [isLoading, setIsLoading] = useState(true);
-  const [searchQuery, setSearchQuery] = useState('');
-  
-  // 加载数据
-useEffect(() => {
-  const loadMovies = async () => {
-    try {
-      const response = await CategoryAPI.getWorksByCategory(2);
-      // 添加类型断言或转换
-      const movies = response.content.map((work: any) => ({
-        ...work,
-        director: (work as any).director || '未知导演',
-        actors: (work as any).actors || [],
-        resolution: (work as any).resolution || '1080p',
-        duration: (work as any).duration || '0分钟'
-      })) as unknown as MovieResource[];
-      
-      setMovies(movies);
-      setFilteredMovies(movies);
-    } catch (error) {
-      message.error('加载影视资源失败');
-    } finally {
-      setIsLoading(false);
-    }
-  };
-  
-  loadMovies();
-}, []);
-
-  // 筛选逻辑
-  useEffect(() => {
-    if (!searchQuery) {
-      setFilteredMovies(movies);
-      return;
-    }
-    
-    const filtered = movies.filter(movie => 
-      movie.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
-      movie.director.toLowerCase().includes(searchQuery.toLowerCase())
-    );
-    
-    setFilteredMovies(filtered);
-  }, [searchQuery, movies]);
-
-
-//   // 在加载数据部分添加虚拟数据
-// useEffect(() => {
-//   const loadMovies = async () => {
-//     try {
-//       // 模拟API请求
-//       const mockMovies: MovieResource[] = [
-//         {
-//           id: 3,
-//           title: '盗梦空间',
-//           director: '克里斯托弗·诺兰',
-//           categoryId: 2,
-//           categoryName: '科幻电影',
-//           resolution: '1080p',
-//           duration: '148分钟',
-//           actors: ['莱昂纳多·迪卡普里奥', '约瑟夫·高登-莱维特'],
-//           seeders: 215,
-//           leechers: 42,
-//           uploadDate: '2023-06-10',
-//           uploader: 'movieFan',
-//           downloadCount: 3256,
-//           hash: 'a1b2c3d4e5f6',
-//           size: '234Mb'
-//         },
-//         {
-//           id: 4,
-//           title: '肖申克的救赎',
-//           director: '弗兰克·德拉邦特',
-//           categoryId: 2,
-//           categoryName: '剧情片',
-//           resolution: '4K',
-//           duration: '142分钟',
-//           actors: ['蒂姆·罗宾斯', '摩根·弗里曼'],
-//           seeders: 189,
-//           leechers: 28,
-//           uploadDate: '2023-05-15',
-//           uploader: 'classicMovie',
-//           downloadCount: 4123,
-//           hash: 'g7h8i9j0k1l2',
-//           size: '123Mb'
-//         }
-//       ];
-
-//       setMovies(mockMovies);
-//       setFilteredMovies(mockMovies);
-//     } catch (error) {
-//       message.error('加载影视资源失败');
-//     } finally {
-//       setIsLoading(false);
-//     }
-//   };
-  
-//   loadMovies();
-// }, []);
-
-  return (
-    <div className="movie-category-container">
-      <div className="category-header">
-        <h1><VideoCameraOutlined /> 影视资源分区</h1>
-        <p>高清电影、电视剧、纪录片资源分享</p>
-      </div>
-      
-      <Search
-        placeholder="搜索电影或导演"
-        allowClear
-        enterButton={<SearchOutlined />}
-        value={searchQuery}
-        onChange={e => setSearchQuery(e.target.value)}
-        className="search-bar"
-      />
-      
-      {isLoading ? (
-        <Spin tip="加载影视资源..." size="large" />
-      ) : (
-        <List
-          grid={{ gutter: 16, column: 1 }}
-          dataSource={filteredMovies}
-          renderItem={movie => (
-            <List.Item>
-              <MovieCard movie={movie} />
-            </List.Item>
-          )}
-        />
-      )}
-    </div>
-  );
-};
-
-const MovieCard: React.FC<{ movie: MovieResource }> = ({ movie }) => {
-  const navigate = useNavigate();
-  
-  const handleClick = () => {
-    navigate(`/works/${movie.id}`);
-  };
-
-  return (
-    <Card className="movie-card" onClick={handleClick} hoverable>
-      <div className="card-content">
-        <div className="card-header">
-          <Text strong className="resource-title">{movie.title}</Text>
-          <Text type="secondary" className="resource-director">导演: {movie.director}</Text>
-        </div>
-        
-        <div className="card-meta">
-          <Tag color="blue">{movie.resolution}</Tag>
-          <Tag color="geekblue">{movie.categoryName}</Tag>
-          <Tag color="green">{movie.seeders} 做种</Tag>
-          <Tag color="orange">{movie.leechers} 下载</Tag>
-        </div>
-      </div>
-    </Card>
-  );
-};
-
-export default MovieCategory;
\ No newline at end of file
diff --git a/src/feature/categories/MusicCategory.tsx b/src/feature/categories/MusicCategory.tsx
deleted file mode 100644
index f9057ee..0000000
--- a/src/feature/categories/MusicCategory.tsx
+++ /dev/null
@@ -1,191 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { 
-  Card, Button, List, Tag, Typography, 
-  message, Spin, 
-  Input} from 'antd';
-import { 
-  SearchOutlined
-} from '@ant-design/icons';
-import CategoryAPI from '../../api/categoryApi';
-import type { CategoryDTO, MusicResource } from '../../api/categoryTypes';
-import { useNavigate } from 'react-router';
-
-const { Search } = Input;
-const { Text } = Typography;
-
-const MusicCategory: React.FC = () => {
-  const [categories, setCategories] = useState<CategoryDTO[]>([]);
-  const [resources, setResources] = useState<MusicResource[]>([]);
-  const [filteredResources, setFilteredResources] = useState<MusicResource[]>([]);
-  const [isLoading, setIsLoading] = useState(true);
-  const [selectedCategory, setSelectedCategory] = useState<number | null>(null);
-  
-  // 筛选状态
-  const [searchQuery, setSearchQuery] = useState('');
-  const [qualityFilter, setQualityFilter] = useState<string>('all');
-
-  // 加载分类数据
-  useEffect(() => {
-    const loadData = async () => {
-      try {
-        const [categoryData, resourceData] = await Promise.all([
-          CategoryAPI.getCategoryTree(),
-          CategoryAPI.getWorksByCategory(1)
-        ]);
-        
-        // 确保 parentId 不包含 null
-        const normalizedCategories = categoryData.map(cat => ({
-          ...cat,
-          parentId: cat.parentId === null ? undefined : cat.parentId
-        })) as CategoryDTO[];
-        
-        // 音乐资源类型转换
-        const musicResources = resourceData.content.map(work => ({
-          ...work,
-          artist: work.artist || '未知艺术家',
-          quality: work.quality || 'MP3 320k',
-          genre: work.genre || ['未知流派'],
-          categoryName: work.categoryName || '未知分类',
-          size: work.size || '0MB'
-        })) as unknown as MusicResource[];
-        
-        setCategories(normalizedCategories);
-        setResources(musicResources);
-        setFilteredResources(musicResources);
-      } catch (error) {
-        message.error('加载数据失败');
-      } finally {
-        setIsLoading(false);
-      }
-    };
-    
-    loadData();
-  }, []);
-
-  // 筛选逻辑
-  useEffect(() => {
-    let filtered = resources;
-    
-    // 搜索筛选
-    if (searchQuery) {
-      filtered = filtered.filter(resource => 
-        resource.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
-        resource.artist.toLowerCase().includes(searchQuery.toLowerCase())
-      );
-    }
-    
-    // 音质筛选
-    if (qualityFilter !== 'all') {
-      filtered = filtered.filter(resource => resource.quality === qualityFilter);
-    }
-    
-    // 分类筛选
-    if (selectedCategory) {
-      filtered = filtered.filter(resource => resource.categoryId === selectedCategory);
-    }
-    
-    setFilteredResources(filtered);
-  }, [searchQuery, qualityFilter, selectedCategory, resources]);
-
-  // 分类选择处理
-  const handleCategorySelect = (categoryId: number) => {
-    setSelectedCategory(prev => prev === categoryId ? null : categoryId);
-  };
-
-  return (
-    <div className="music-category-container">
-      {/* 头部区域 */}
-      <div className="category-header">
-        <h1>音乐资源分区</h1>
-        <p>高质量音乐资源共享，保持分享率，共建良好PT环境</p>
-      </div>
-      
-      {/* 搜索和筛选 */}
-      <div className="filter-section">
-        <Search
-          placeholder="搜索音乐名称或艺术家"
-          allowClear
-          enterButton={<SearchOutlined />}
-          value={searchQuery}
-          onChange={e => setSearchQuery(e.target.value)}
-          className="search-bar"
-        />
-        
-        <div className="quality-filter">
-          <span>音质筛选：</span>
-          <Button.Group>
-            {['all', 'FLAC', 'Hi-Res', 'MP3 320k'].map(quality => (
-              <Button 
-                key={quality}
-                type={qualityFilter === quality ? 'primary' : 'default'}
-                onClick={() => setQualityFilter(quality)}
-              >
-                {quality === 'all' ? '全部' : quality}
-              </Button>
-            ))}
-          </Button.Group>
-        </div>
-      </div>
-      
-      {/* 分类导航 */}
-      <div className="category-navigation">
-        {categories.map(category => (
-          <Tag 
-            key={category.id}
-            color={selectedCategory === category.id ? 'blue' : undefined}
-            onClick={() => handleCategorySelect(category.id)}
-            className="category-tag"
-          >
-            {category.name} ({category.workCount || 0})
-          </Tag>
-        ))}
-      </div>
-      
-      {/* 内容展示 */}
-      {isLoading ? (
-        <Spin tip="加载中..." size="large" />
-      ) : (
-        <div className="resource-list">
-          <List
-            grid={{ gutter: 16, column: 1 }}
-            dataSource={filteredResources}
-            renderItem={resource => (
-              <List.Item>
-                <ResourceCard resource={resource} />
-              </List.Item>
-            )}
-          />
-        </div>
-      )}
-    </div>
-  );
-};
-
-// 资源卡片组件
-const ResourceCard: React.FC<{ resource: MusicResource }> = ({ resource }) => {
-  const navigate = useNavigate();
-  
-  const handleClick = () => {
-    navigate(`/works/${resource.id}`);
-  };
-
-  return (
-    <Card className="resource-card" onClick={handleClick} hoverable>
-      <div className="card-content">
-        <div className="card-header">
-          <Text strong className="resource-title">{resource.title}</Text>
-          <Text type="secondary" className="resource-artist">{resource.artist}</Text>
-        </div>
-        
-        <div className="card-meta">
-          <Tag color="blue">{resource.quality}</Tag>
-          <Tag color="geekblue">{resource.categoryName}</Tag>
-          <Tag color="green">{resource.seeders} 做种</Tag>
-          <Tag color="orange">{resource.leechers} 下载</Tag>
-        </div>
-      </div>
-    </Card>
-  );
-};
-
-export default MusicCategory;
\ No newline at end of file
diff --git a/src/feature/categories/OtherCategory.tsx b/src/feature/categories/OtherCategory.tsx
deleted file mode 100644
index 6c3318a..0000000
--- a/src/feature/categories/OtherCategory.tsx
+++ /dev/null
@@ -1,178 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { Card, List, message, Spin, Input, Tag, Typography} from 'antd';
-import { SearchOutlined, AppstoreOutlined } from '@ant-design/icons';
-import CategoryAPI from '../../api/categoryApi';
-import type { MovieResource, OtherResource } from '../../api/categoryTypes';
-import { useNavigate } from 'react-router';
-
-const { Text } = Typography;
-const { Search } = Input;
-
-const OtherCategory: React.FC = () => {
-  const [resources, setResources] = useState<OtherResource[]>([]);
-  const [filteredResources, setFilteredResources] = useState<OtherResource[]>([]);
-  const [isLoading, setIsLoading] = useState(true);
-  const [searchQuery, setSearchQuery] = useState('');
-  
-  // 加载数据
-useEffect(() => {
-  const loadResources = async () => {
-    try {
-      const response = await CategoryAPI.getWorksByCategory(4);
-      
-      // 其他资源类型转换
-      const otherResources = response.content.map(work => ({
-        ...work,
-        description: (work as any).description || '暂无描述',
-        fileType: (work as any).fileType || '未知类型'
-      })) as unknown as OtherResource[];
-      
-      setResources(otherResources);
-      setFilteredResources(otherResources);
-    } catch (error) {
-      message.error('加载资源失败');
-    } finally {
-      setIsLoading(false);
-    }
-  };
-  
-  loadResources();
-}, []);
-
-  // 筛选逻辑
-  useEffect(() => {
-    if (!searchQuery) {
-      setFilteredResources(resources);
-      return;
-    }
-    
-    const filtered = resources.filter(resource => 
-      resource.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
-      resource.description.toLowerCase().includes(searchQuery.toLowerCase())
-    );
-    
-    setFilteredResources(filtered);
-  }, [searchQuery, resources]);
-
-    // 在加载数据部分添加虚拟数据
-  useEffect(() => {
-    const loadMovies = async () => {
-      try {
-        // 模拟API请求
-        const mockMovies: MovieResource[] = [
-          {
-            id: 3,
-            title: '盗梦空间',
-            director: '克里斯托弗·诺兰',
-            categoryId: 2,
-            categoryName: '科幻电影',
-            resolution: '1080p',
-            duration: '148分钟',
-            actors: ['莱昂纳多·迪卡普里奥', '约瑟夫·高登-莱维特'],
-            seeders: 215,
-            leechers: 42,
-            uploadDate: '2023-06-10',
-            uploader: 'movieFan',
-            downloadCount: 3256,
-            hash: 'a1b2c3d4e5f6',
-            size: '123Mb'
-          },
-          {
-            id: 4,
-            title: '肖申克的救赎',
-            director: '弗兰克·德拉邦特',
-            categoryId: 2,
-            categoryName: '剧情片',
-            resolution: '4K',
-            duration: '142分钟',
-            actors: ['蒂姆·罗宾斯', '摩根·弗里曼'],
-            seeders: 189,
-            leechers: 28,
-            uploadDate: '2023-05-15',
-            uploader: 'classicMovie',
-            downloadCount: 4123,
-            hash: 'g7h8i9j0k1l2',
-            size: '123Mb'
-          }
-        ];
-
-        setMovies(mockMovies);
-        setFilteredMovies(mockMovies);
-      } catch (error) {
-        message.error('加载影视资源失败');
-      } finally {
-        setIsLoading(false);
-      }
-    };
-    
-    loadMovies();
-  }, []);
-
-  return (
-    <div className="other-category-container">
-      <div className="category-header">
-        <h1><AppstoreOutlined /> 其他资源分区</h1>
-        <p>软件、电子书等其他类型资源</p>
-      </div>
-      
-      <Search
-        placeholder="搜索资源名称或描述"
-        allowClear
-        enterButton={<SearchOutlined />}
-        value={searchQuery}
-        onChange={e => setSearchQuery(e.target.value)}
-        className="search-bar"
-      />
-      
-      {isLoading ? (
-        <Spin tip="加载资源..." size="large" />
-      ) : (
-        <List
-          grid={{ gutter: 16, column: 1 }}
-          dataSource={filteredResources}
-          renderItem={resource => (
-            <List.Item>
-              <OtherResourceCard resource={resource} />
-            </List.Item>
-          )}
-        />
-      )}
-    </div>
-  );
-};
-
-const OtherResourceCard: React.FC<{ resource: OtherResource }> = ({ resource }) => {
-  const navigate = useNavigate();
-  
-  const handleClick = () => {
-    navigate(`/works/${resource.id}`);
-  };
-
-  return (
-    <Card className="other-resource-card" onClick={handleClick} hoverable>
-      <div className="card-content">
-        <div className="card-header">
-          <Text strong className="resource-title">{resource.title}</Text>
-          <Text type="secondary" className="resource-type">类型: {resource.fileType}</Text>
-        </div>
-        
-        <div className="card-meta">
-          <Tag color="geekblue">{resource.categoryName}</Tag>
-          <Tag color="green">{resource.seeders} 做种</Tag>
-          <Tag color="orange">{resource.leechers} 下载</Tag>
-        </div>
-      </div>
-    </Card>
-  );
-};
-
-export default OtherCategory;
-
-function setMovies(_mockMovies: MovieResource[]) {
-  throw new Error('Function not implemented.');
-}
-
-
-function setFilteredMovies(_mockMovies: MovieResource[]) {
-  throw new Error('Function not implemented.');
-}
diff --git a/src/feature/home/Category.tsx b/src/feature/home/Category.tsx
new file mode 100644
index 0000000..2e0ab6f
--- /dev/null
+++ b/src/feature/home/Category.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Row, Col, Typography, Divider } from 'antd';
+import type { CategoryProps } from './types';
+import WorkCard from './WorkCard';
+
+const { Title } = Typography;
+
+const Category: React.FC<CategoryProps> = ({ section, artworks }) => {
+    // 如果没有作品，不渲染该分区
+    if (artworks.length === 0) {
+        return null;
+    }
+
+    return (
+        <div style={{ marginBottom: '48px' }}>
+            <Title level={2} style={{ marginBottom: '24px', color: '#1890ff' }}>
+                {section.name}
+            </Title>
+            <Divider style={{ margin: '16px 0 24px 0' }} />
+
+            <Row gutter={[16, 16]}>
+                {artworks.map((artwork) => (
+                    <Col
+                        key={artwork.id}
+                        xs={24}
+                        sm={12}
+                        md={8}
+                        lg={6}
+                        xl={6}
+                    >
+                        <WorkCard artwork={artwork} />
+                    </Col>
+                ))}
+            </Row>
+        </div>
+    );
+};
+
+export default Category;
\ No newline at end of file
diff --git a/src/feature/home/Home.tsx b/src/feature/home/Home.tsx
index 80e44eb..953af8a 100644
--- a/src/feature/home/Home.tsx
+++ b/src/feature/home/Home.tsx
@@ -1,116 +1,223 @@
-import { NavLink } from 'react-router';
-import filmImg from '../../assets/categories/film.jpg';
-import musicImg from '../../assets/categories/music.jpg';
-import gameImg from '../../assets/categories/game.jpg';
-import otherImg from '../../assets/categories/other.jpg';
-// 假设你有排行榜数据，这里模拟一下，实际根据接口等替换
-const filmRankList = [
-  { id: 1, name: '影视作品1', view: '1.2万' },
-  { id: 2, name: '影视作品2', view: '1.1万' },
-  { id: 3, name: '影视作品3', view: '1.0万' },
-];
-const musicRankList = [
-  { id: 1, name: '音乐作品1', view: '1.5万' },
-  { id: 2, name: '音乐作品2', view: '1.3万' },
-  { id: 3, name: '音乐作品3', view: '1.2万' },
-];
-const gameRankList = [
-  { id: 1, name: '游戏作品1', view: '2.0万' },
-  { id: 2, name: '游戏作品2', view: '1.8万' },
-  { id: 3, name: '游戏作品3', view: '1.6万' },
-];
-const otherRankList = [
-  { id: 1, name: '其他作品1', view: '0.8万' },
-  { id: 2, name: '其他作品2', view: '0.7万' },
-  { id: 3, name: '其他作品3', view: '0.6万' },
-];
+import React, { useEffect, useMemo } from 'react';
+import { useDispatch } from 'react-redux';
+import { Input, Spin, Alert } from 'antd';
+import { SearchOutlined } from '@ant-design/icons';
+import type { Section, Artwork } from './types';
+import { initializeArtworks, selectFilteredArtworks, selectSearchTerm, selectWorkListError, selectWorkListLoading, setSearchTerm } from './workListSlice';
+import { useAppSelector } from '../../store/hooks';
+import { selectSections, selectCategoryLoading, selectCategoryError, initializeSections } from './categorySlice';
+import Category from './Category';
 
-function Home() {
-  const categories = [
-    { id: 'film', name: '影视', image: filmImg, rankList: filmRankList },
-    { id: 'music', name: '音乐', image: musicImg, rankList: musicRankList },
-    { id: 'game', name: '游戏', image: gameImg, rankList: gameRankList },
-    { id: 'other', name: '其他', image: otherImg, rankList: otherRankList },
-  ];
+const Home: React.FC = () => {
+    const dispatch = useDispatch();
 
-  return (
-    <div className="max-w-7xl mx-auto px-4 py-16 flex flex-col items-center">
-      {/* 页面标题 */}
-      <h1 className="text-[clamp(2rem,5vw,3.5rem)] font-bold text-center mb-12 text-gray-800 tracking-tight">
-        欢迎访问创意协作平台
-      </h1>
+    // 从Redux store获取状态
+    const sections = useAppSelector(selectSections);
+    const filteredArtworks = useAppSelector(selectFilteredArtworks);
+    const searchTerm = useAppSelector(selectSearchTerm);
+    const workListLoading = useAppSelector(selectWorkListLoading);
+    const workListError = useAppSelector(selectWorkListError);
+    const categoryLoading = useAppSelector(selectCategoryLoading);
+    const categoryError = useAppSelector(selectCategoryError);
 
-      {/* 分区 + 排行榜 容器，改为 flex 布局 */}
-      <div className="w-full flex max-w-6xl mx-auto">
-        {/* 分区卡片容器 - 响应式网格布局 */}
-        <div className="grid grid-cols-4 gap-6 w-3/4">
-          {categories.map((category) => (
-            <div 
-              key={category.id}
-              className="group relative overflow-hidden rounded-xl shadow-lg transition-all duration-300 hover:-translate-y-2 hover:shadow-xl"
-            >
-              <NavLink to={`/categories/${category.id}`} className="block">
-                {/* 图片容器 */}
-                <div className="aspect-[4/3] relative overflow-hidden">
-                  {/* 背景图片 - 带模糊和亮度调整 */}
-                  <img 
-                    src={category.image}
-                    alt={category.name}
-                    className="w-full h-full object-cover transition-transform duration-700 group-hover:scale-110"
-                    style={{ filter: 'blur(1px) brightness(0.85)' }}
-                  />
+    // 综合加载状态和错误状态
+    const loading = workListLoading || categoryLoading;
+    const error = workListError || categoryError;
 
-                  {/* 渐变遮罩层 - 增强文字可读性 */}
-                  <div className="absolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent z-10"></div>
+    // 示例数据
+    const sampleSections: Section[] = [
+        {
+            id: 1,
+            childrenid: [1, 2, 3],
+            name: "数字艺术"
+        },
+        {
+            id: 2,
+            childrenid: [4, 5],
+            name: "传统绘画"
+        }
+    ];
 
-                  {/* 文字内容 */}
-                  <div className="absolute inset-0 flex flex-col items-center justify-center p-4 z-20">
-                    {/* 分类标题 - 艺术字体 */}
-                    <h2 className="text-[clamp(1.8rem,4vw,2.5rem)] font-bold text-white text-center mb-2" style={{
-                      fontFamily: '"Playfair Display", serif',
-                      textShadow: '0 4px 12px rgba(0,0,0,0.8)',
-                      transform: 'translateY(10px)',
-                      transition: 'transform 0.3s ease-out',
-                      letterSpacing: '2px',
-                      borderBottom: '2px solid rgba(255,255,255,0.6)',
-                      paddingBottom: '4px'
-                    }}>
-                      {category.name}
-                    </h2>
+    const sampleArtworks: Artwork[] = [
+        {
+            id: 1,
+            title: "未来城市概念设计",
+            author: "视觉设计师张三",
+            views: 1247,
+            category: {
+                id: 1,
+                name: "数字艺术",
+                children: ["概念设计", "建筑设计"]
+            },
+            description: "一个关于2050年智慧城市的概念设计作品，融合了可持续发展、人工智能和绿色科技的理念",
+            createTime: "2024-01-15T10:30:00Z",
+            cover: "https://picsum.photos/300/200?random=1"
+        },
+        {
+            id: 2,
+            title: "移动应用界面设计套件",
+            author: "UI设计师李四",
+            views: 856,
+            category: {
+                id: 2,
+                name: "界面设计",
+                children: ["UI/UX设计", "移动端设计"]
+            },
+            description: "一套完整的移动端UI设计规范和组件库，包含100+个精美界面和500+个设计组件",
+            createTime: "2024-02-20T14:15:00Z",
+            cover: "https://picsum.photos/300/200?random=2"
+        },
+        {
+            id: 3,
+            title: "React组件库开发指南",
+            author: "刘松林",
+            views: 432,
+            category: {
+                id: 3,
+                name: "程序开发",
+                children: ["前端开发", "React技术"]
+            },
+            description: "一套完整的企业级React组件库开发教程和源码，包含从设计到发布的完整流程",
+            createTime: "2024-03-10T09:45:00Z",
+            cover: "https://picsum.photos/300/200?random=3"
+        },
+        {
+            id: 4,
+            title: "机械战士3D模型",
+            author: "3D艺术家王五",
+            views: 789,
+            category: {
+                id: 1,
+                name: "数字艺术",
+                children: ["3D建模", "科幻设计"]
+            },
+            description: "一个高精度的科幻机械战士3D模型，包含完整的材质贴图和动画骨骼系统",
+            createTime: "2024-01-25T16:20:00Z",
+            cover: "https://picsum.photos/300/200?random=4"
+        },
+        {
+            id: 5,
+            title: "城市夜景摄影集",
+            author: "摄影师赵六",
+            views: 1123,
+            category: {
+                id: 4,
+                name: "摄影艺术",
+                children: ["摄影作品", "城市风光"]
+            },
+            description: "一组精美的城市夜景摄影作品，捕捉了都市夜晚的璀璨光影",
+            createTime: "2024-02-14T11:30:00Z",
+            cover: "https://picsum.photos/300/200?random=5"
+        },
+        {
+            id: 6,
+            title: "奇幻世界插画系列",
+            author: "插画师孙七",
+            views: 945,
+            category: {
+                id: 5,
+                name: "插画艺术",
+                children: ["插画艺术", "奇幻风格"]
+            },
+            description: "一套充满想象力的奇幻题材插画作品，包含角色设计、场景概念图和完整插图",
+            createTime: "2024-03-05T13:20:00Z",
+            cover: "https://picsum.photos/300/200?random=6"
+        }
+    ];
 
-                    {/* 描述文本 - 悬停显示 */}
-                    <p className="text-indigo-100 text-center opacity-0 transform translate-y-4 transition-all duration-300 group-hover:opacity-100 group-hover:translate-y-0 mt-2" style={{
-                      fontFamily: '"Merriweather", serif',
-                      textShadow: '0 2px 6px rgba(0,0,0,0.6)'
-                    }}>
-                      探索{category.name}创意项目
-                    </p>
-                  </div>
+    // 初始化数据
+    useEffect(() => {
+        dispatch(initializeArtworks(sampleArtworks));
+        dispatch(initializeSections(sampleSections));
+    }, [dispatch]);
+
+    // 处理搜索输入
+    const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+        dispatch(setSearchTerm(e.target.value));
+    };
+
+    // 根据分区ID获取对应的作品
+    const getArtworksBySection = useMemo(() => {
+        return (childrenIds: number[]): Artwork[] => {
+            return filteredArtworks.filter(artwork => childrenIds.includes(artwork.id));
+        };
+    }, [filteredArtworks]);
+
+    // 渲染加载状态
+    if (loading) {
+        return (
+            <div style={{
+                display: 'flex',
+                justifyContent: 'center',
+                alignItems: 'center',
+                height: '100vh'
+            }}>
+                <Spin size="large" tip="加载中..." />
+            </div>
+        );
+    }
+
+    // 渲染错误状态
+    if (error) {
+        return (
+            <div style={{ padding: '24px' }}>
+                <Alert
+                    message="加载失败"
+                    description={error}
+                    type="error"
+                    showIcon
+                />
+            </div>
+        );
+    }
+
+    return (
+        <div style={{
+            backgroundColor: '#f5f5f5',
+            minHeight: '100vh',
+            padding: '24px'
+        }}>
+            <div style={{ maxWidth: 1200, margin: '0 auto' }}>
+                {/* 搜索栏 */}
+                <div style={{ marginBottom: '32px' }}>
+                    <Input
+                        size="large"
+                        placeholder="搜索作品标题、作者、分类..."
+                        prefix={<SearchOutlined />}
+                        value={searchTerm}
+                        onChange={handleSearchChange}
+                        style={{ maxWidth: 600, width: '100%' }}
+                        allowClear
+                    />
                 </div>
-              </NavLink>
-            </div>
-          ))}
-        </div>
 
-        {/* 排行榜区域 - 右侧 */}
-        <div className="w-1/4 pl-6">
-          {categories.map((category) => (
-            <div key={category.id} className="mb-8">
-              <h3 className="text-xl font-bold text-gray-800 mb-4">{category.name}排行榜</h3>
-              <ul>
-                {category.rankList.map((item) => (
-                  <li key={item.id} className="flex justify-between items-center mb-2">
-                    <span>{item.name}</span>
-                    <span className="text-gray-600">{item.view}</span>
-                  </li>
-                ))}
-              </ul>
-            </div>
-          ))}
-        </div>
-      </div>
-    </div>
-  );
-}
+                {/* 分区展示 */}
+                {sections.map((section) => {
+                    const sectionArtworks = getArtworksBySection(section.childrenid);
 
-export default Home;
\ No newline at end of file
+                    return (
+                        <Category
+                            key={section.id}
+                            section={section}
+                            artworks={sectionArtworks}
+                        />
+                    );
+                })}
+
+                {/* 无搜索结果提示 */}
+                {searchTerm && filteredArtworks.length === 0 && (
+                    <div style={{
+                        textAlign: 'center',
+                        padding: '48px 0',
+                        color: '#999'
+                    }}>
+                        <p style={{ fontSize: 16 }}>未找到相关作品</p>
+                        <p>尝试使用其他关键词搜索</p>
+                    </div>
+                )}
+            </div>
+        </div>
+    );
+};
+
+export default Home;
diff --git a/src/feature/home/Tmp.tsx b/src/feature/home/Tmp.tsx
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/feature/home/Tmp.tsx
diff --git a/src/feature/home/WorkCard.tsx b/src/feature/home/WorkCard.tsx
new file mode 100644
index 0000000..1d3ac22
--- /dev/null
+++ b/src/feature/home/WorkCard.tsx
@@ -0,0 +1,90 @@
+import React from 'react';
+import { Card, Typography, Space } from 'antd';
+import { EyeOutlined, UserOutlined } from '@ant-design/icons';
+import type { WorkCardProps } from './types';
+import { useNavigate } from 'react-router';
+
+const { Text, Title } = Typography;
+const { Meta } = Card;
+
+const WorkCard: React.FC<WorkCardProps> = ({ artwork }) => {
+    const handleImageError = (e: React.SyntheticEvent<HTMLImageElement, Event>) => {
+        const target = e.target as HTMLImageElement;
+        target.src = 'https://via.placeholder.com/300x200?text=No+Image';
+    };
+    const nav = useNavigate()
+    const handleClick = () => {
+        nav(`/work/${artwork.id}`)
+    }
+
+    const formatViews = (views: number): string => {
+        return views.toLocaleString();
+    };
+
+    return (
+        <Card
+            hoverable
+            style={{ marginBottom: 16 }}
+            cover={
+                <img
+                    alt={artwork.title}
+                    src={artwork.cover}
+                    style={{
+                        height: 200,
+                        objectFit: 'cover',
+                        borderRadius: '8px 8px 0 0'
+                    }}
+                    onError={handleImageError}
+                />
+            }
+            actions={[
+                <Space key="views">
+                    <EyeOutlined />
+                    <Text type="secondary">{formatViews(artwork.views)}</Text>
+                </Space>,
+                <Space key="author">
+                    <UserOutlined />
+                    <Text type="secondary">{artwork.author}</Text>
+                </Space>,
+            ]}
+            onClick={handleClick}
+        >
+            <Meta
+                title={
+                    <div style={{ marginBottom: 8 }}>
+                        <Title level={4} style={{ margin: 0, fontSize: 16 }}>
+                            {artwork.title}
+                        </Title>
+                    </div>
+                }
+                description={
+                    <Space direction="vertical" size="small" style={{ width: '100%' }}>
+                        <Text type="secondary" style={{ fontSize: 12 }}>
+                            分类: {artwork.category.name}
+                        </Text>
+                        {artwork.category.children.length > 0 && (
+                            <Space wrap size={[4, 4]}>
+                                {artwork.category.children.map((child, index) => (
+                                    <Text
+                                        key={index}
+                                        code
+                                        style={{
+                                            fontSize: 11,
+                                            padding: '2px 6px',
+                                            backgroundColor: '#f5f5f5',
+                                            borderRadius: 4
+                                        }}
+                                    >
+                                        {child}
+                                    </Text>
+                                ))}
+                            </Space>
+                        )}
+                    </Space>
+                }
+            />
+        </Card>
+    );
+};
+
+export default WorkCard;
\ No newline at end of file
diff --git a/src/feature/home/categorySlice.ts b/src/feature/home/categorySlice.ts
new file mode 100644
index 0000000..31482cc
--- /dev/null
+++ b/src/feature/home/categorySlice.ts
@@ -0,0 +1,167 @@
+import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
+import type { Section } from './types';
+
+// 分区状态类型
+export interface CategoryState {
+  sections: Section[];
+  loading: boolean;
+  error: string | null;
+  selectedCategoryId: number | null;
+}
+
+// 初始状态
+const initialState: CategoryState = {
+  sections: [],
+  loading: false,
+  error: null,
+  selectedCategoryId: null,
+};
+
+// 创建categorySlice
+const categorySlice = createSlice({
+  name: 'category',
+  initialState,
+  reducers: {
+    // 设置加载状态
+    setLoading: (state, action: PayloadAction<boolean>) => {
+      state.loading = action.payload;
+      if (action.payload) {
+        state.error = null;
+      }
+    },
+
+    // 设置错误信息
+    setError: (state, action: PayloadAction<string>) => {
+      state.error = action.payload;
+      state.loading = false;
+    },
+
+    // 设置分区列表
+    setSections: (state, action: PayloadAction<Section[]>) => {
+      state.sections = action.payload;
+      state.loading = false;
+      state.error = null;
+    },
+
+    // 添加单个分区
+    addSection: (state, action: PayloadAction<Section>) => {
+      state.sections.push(action.payload);
+    },
+
+    // 更新分区
+    updateSection: (state, action: PayloadAction<Section>) => {
+      const index = state.sections.findIndex(section => section.id === action.payload.id);
+      if (index !== -1) {
+        state.sections[index] = action.payload;
+      }
+    },
+
+    // 删除分区
+    removeSection: (state, action: PayloadAction<number>) => {
+      state.sections = state.sections.filter(section => section.id !== action.payload);
+      // 如果删除的是当前选中的分区，清空选中状态
+      if (state.selectedCategoryId === action.payload) {
+        state.selectedCategoryId = null;
+      }
+    },
+
+    // 设置选中的分区ID
+    setSelectedCategoryId: (state, action: PayloadAction<number | null>) => {
+      state.selectedCategoryId = action.payload;
+    },
+
+    // 向分区添加作品ID
+    addArtworkToSection: (state, action: PayloadAction<{ sectionId: number; artworkId: number }>) => {
+      const { sectionId, artworkId } = action.payload;
+      const section = state.sections.find(s => s.id === sectionId);
+      if (section && !section.childrenid.includes(artworkId)) {
+        section.childrenid.push(artworkId);
+      }
+    },
+
+    // 从分区移除作品ID
+    removeArtworkFromSection: (state, action: PayloadAction<{ sectionId: number; artworkId: number }>) => {
+      const { sectionId, artworkId } = action.payload;
+      const section = state.sections.find(s => s.id === sectionId);
+      if (section) {
+        section.childrenid = section.childrenid.filter(id => id !== artworkId);
+      }
+    },
+
+    // 重新排序分区
+    reorderSections: (state, action: PayloadAction<Section[]>) => {
+      state.sections = action.payload;
+    },
+
+    // 重置分区状态
+    resetCategoryState: () => {
+      return initialState;
+    },
+
+    // 初始化分区数据
+    initializeSections: (state, action: PayloadAction<Section[]>) => {
+      state.sections = action.payload;
+      state.loading = false;
+      state.error = null;
+    },
+  },
+});
+
+// 导出actions
+export const {
+  setLoading,
+  setError,
+  setSections,
+  addSection,
+  updateSection,
+  removeSection,
+  setSelectedCategoryId,
+  addArtworkToSection,
+  removeArtworkFromSection,
+  reorderSections,
+  resetCategoryState,
+  initializeSections,
+} = categorySlice.actions;
+
+// 选择器函数
+export const selectSections = (state: { category: CategoryState }): Section[] => 
+  state.category.sections;
+
+export const selectCategoryLoading = (state: { category: CategoryState }): boolean => 
+  state.category.loading;
+
+export const selectCategoryError = (state: { category: CategoryState }): string | null => 
+  state.category.error;
+
+export const selectSelectedCategoryId = (state: { category: CategoryState }): number | null => 
+  state.category.selectedCategoryId;
+
+// 根据ID获取分区
+export const selectSectionById = (sectionId: number) => (state: { category: CategoryState }) => {
+  return state.category.sections.find(section => section.id === sectionId);
+};
+
+// 获取分区数量
+export const selectSectionCount = (state: { category: CategoryState }) => state.category.sections.length;
+
+// 获取包含特定作品的分区
+export const selectSectionsByArtworkId = (artworkId: number) => (state: { category: CategoryState }) => {
+  return state.category.sections.filter(section => section.childrenid.includes(artworkId));
+};
+
+// 获取选中的分区
+export const selectSelectedSection = (state: { category: CategoryState }) => {
+  const { sections, selectedCategoryId } = state.category;
+  if (selectedCategoryId === null) return null;
+  return sections.find(section => section.id === selectedCategoryId) || null;
+};
+
+// 获取分区名称映射
+export const selectSectionNameMap = (state: { category: CategoryState }) => {
+  return state.category.sections.reduce((acc, section) => {
+    acc[section.id] = section.name;
+    return acc;
+  }, {} as Record<number, string>);
+};
+
+export default categorySlice.reducer;
\ No newline at end of file
diff --git a/src/feature/home/types.ts b/src/feature/home/types.ts
new file mode 100644
index 0000000..90db0de
--- /dev/null
+++ b/src/feature/home/types.ts
@@ -0,0 +1,52 @@
+// 类型定义文件
+export interface Category {
+    id: number;
+    name: string;
+    children: string[];
+}
+
+export interface Artwork {
+    id: number;
+    title: string;
+    author: string;
+    views: number;
+    category: Category;
+    description: string;
+    createTime: string;
+    cover: string;
+}
+
+export interface Section {
+    id: number;
+    childrenid: number[];
+    name: string;
+}
+
+export interface ArtworkDisplayProps {
+    sections: Section[];
+    artworks: Artwork[];
+}
+
+export interface WorkCardProps {
+    artwork: Artwork;
+}
+
+export interface CategoryProps {
+    section: Section;
+    artworks: Artwork[];
+}
+
+// Redux state 类型
+export interface WorkListState {
+    artworks: Artwork[];
+    searchTerm: string;
+    loading: boolean;
+    error: string | null;
+}
+
+export interface CategoryState {
+    sections: Section[];
+    loading: boolean;
+    error: string | null;
+    selectedCategoryId: number | null;
+}
\ No newline at end of file
diff --git a/src/feature/home/workListSlice.ts b/src/feature/home/workListSlice.ts
new file mode 100644
index 0000000..ee0d52e
--- /dev/null
+++ b/src/feature/home/workListSlice.ts
@@ -0,0 +1,131 @@
+import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
+import type{ WorkListState, Artwork, Section } from './types';
+
+// 初始状态
+const initialState: WorkListState = {
+  artworks: [],
+  searchTerm: '',
+  loading: false,
+  error: null,
+};
+
+// 创建slice
+const workListSlice = createSlice({
+  name: 'workList',
+  initialState,
+  reducers: {
+    // 设置加载状态
+    setLoading: (state, action: PayloadAction<boolean>) => {
+      state.loading = action.payload;
+      if (action.payload) {
+        state.error = null;
+      }
+    },
+
+    // 设置错误信息
+    setError: (state, action: PayloadAction<string>) => {
+      state.error = action.payload;
+      state.loading = false;
+    },
+
+    // 设置作品列表
+    setArtworks: (state, action: PayloadAction<Artwork[]>) => {
+      state.artworks = action.payload;
+      state.loading = false;
+      state.error = null;
+    },
+
+    // 添加单个作品
+    addArtwork: (state, action: PayloadAction<Artwork>) => {
+      state.artworks.push(action.payload);
+    },
+
+    // 更新作品
+    updateArtwork: (state, action: PayloadAction<Artwork>) => {
+      const index = state.artworks.findIndex(artwork => artwork.id === action.payload.id);
+      if (index !== -1) {
+        state.artworks[index] = action.payload;
+      }
+    },
+
+    // 删除作品
+    removeArtwork: (state, action: PayloadAction<number>) => {
+      state.artworks = state.artworks.filter(artwork => artwork.id !== action.payload);
+    },
+
+    // 设置搜索词
+    setSearchTerm: (state, action: PayloadAction<string>) => {
+      state.searchTerm = action.payload;
+    },
+
+    // 清空搜索
+    clearSearch: (state) => {
+      state.searchTerm = '';
+    },
+
+    // 重置状态
+    resetState: () => {
+      return initialState;
+    },
+
+    // 初始化数据（用于设置示例数据）
+    initializeArtworks: (state, action: PayloadAction<Artwork[]>) => {
+      state.artworks = action.payload;
+      state.loading = false;
+      state.error = null;
+    },
+  },
+});
+
+// 导出actions
+export const {
+  setLoading,
+  setError,
+  setArtworks,
+  addArtwork,
+  updateArtwork,
+  removeArtwork,
+  setSearchTerm,
+  clearSearch,
+  resetState,
+  initializeArtworks,
+} = workListSlice.actions;
+
+// 选择器函数
+export const selectArtworks = (state: { workList: WorkListState }) => state.workList.artworks;
+export const selectSearchTerm = (state: { workList: WorkListState }) => state.workList.searchTerm;
+export const selectWorkListLoading = (state: { workList: WorkListState }) => state.workList.loading;
+export const selectWorkListError = (state: { workList: WorkListState }) => state.workList.error;
+
+// 过滤后的作品选择器
+export const selectFilteredArtworks = (state: { workList: WorkListState }) => {
+  const { artworks, searchTerm } = state.workList;
+  
+  if (!searchTerm.trim()) {
+    return artworks;
+  }
+  
+  return artworks.filter(artwork => 
+    artwork.title.toLowerCase().includes(searchTerm.toLowerCase()) ||
+    artwork.author.toLowerCase().includes(searchTerm.toLowerCase()) ||
+    artwork.category.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
+    artwork.category.children.some(child => 
+      child.toLowerCase().includes(searchTerm.toLowerCase())
+    )
+  );
+};
+
+// 根据分区获取作品的选择器
+export const selectArtworksBySection = (sectionId: number) => (state: { 
+  workList: WorkListState; 
+  category: { sections: Section[] } 
+}) => {
+  const section = state.category.sections.find(s => s.id === sectionId);
+  const filteredArtworks = selectFilteredArtworks(state);
+  
+  if (!section) return [];
+  
+  return filteredArtworks.filter(artwork => section.childrenid.includes(artwork.id));
+};
+
+export default workListSlice.reducer;
\ No newline at end of file
diff --git a/src/feature/user/UserHome.tsx b/src/feature/user/UserHome.tsx
index 5f925dc..cae4f6d 100644
--- a/src/feature/user/UserHome.tsx
+++ b/src/feature/user/UserHome.tsx
@@ -3,7 +3,7 @@
 import axios from 'axios';
 import { useEffect, useState } from 'react';
 import { useAppSelector, useAppDispatch } from '../../store/hooks';
-import { getUserInfo } from './userSlice';
+import { getUserDetail, getUserInfo } from './userSlice';
 
 const { Title, Text, Paragraph } = Typography;
 
@@ -56,17 +56,19 @@
   // 检查token并获取用户信息
   useEffect(() => {
     const initializeUser = async () => {
-      const token = localStorage.getItem('token');
-      if (!token) {
-        // 如果没有token，重定向到登录页
-        window.location.href = '/login';
-        return;
+      if (userState.userid) {
+        await dispatch(getUserDetail(userState.userid));
+
       }
 
       // 如果用户信息为空或状态为idle，重新获取
       if (!userState.username || userState.status === 'idle') {
         try {
-          await dispatch(getUserInfo()).unwrap();
+          await dispatch(getUserInfo()).then(
+            () => {
+              dispatch(getUserDetail(userState.userid));
+            }
+          )
         } catch (error) {
           console.error('获取用户信息失败:', error);
           // 如果获取用户信息失败，可能token过期，重定向到登录页
@@ -75,6 +77,7 @@
           return;
         }
       }
+
       setPageLoading(false);
     };
 
@@ -139,11 +142,11 @@
   // 如果页面正在初始化，显示加载状态
   if (pageLoading || userState.status === 'loading') {
     return (
-      <div style={{ 
-        display: 'flex', 
-        justifyContent: 'center', 
-        alignItems: 'center', 
-        minHeight: '400px' 
+      <div style={{
+        display: 'flex',
+        justifyContent: 'center',
+        alignItems: 'center',
+        minHeight: '400px'
       }}>
         <Spin size="large" tip="加载用户信息中..." />
       </div>
@@ -153,19 +156,19 @@
   // 如果获取用户信息失败
   if (userState.status === 'failed' || !userState.username) {
     return (
-      <div style={{ 
-        display: 'flex', 
-        justifyContent: 'center', 
-        alignItems: 'center', 
+      <div style={{
+        display: 'flex',
+        justifyContent: 'center',
+        alignItems: 'center',
         minHeight: '400px',
         flexDirection: 'column'
       }}>
-        <Empty 
+        <Empty
           description="无法获取用户信息"
           style={{ marginBottom: 16 }}
         />
-        <Button 
-          type="primary" 
+        <Button
+          type="primary"
           onClick={() => dispatch(getUserInfo())}
         >
           重新加载
@@ -174,21 +177,24 @@
     );
   }
 
+
+
+
   return (
     <div className="user-home-container" style={{ padding: '0 24px' }}>
       {/* 用户信息横栏 */}
-      <Card 
-        style={{ 
-          marginBottom: 24, 
+      <Card
+        style={{
+          marginBottom: 24,
           background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
           border: 'none'
         }}
       >
         <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
           <Space size="large" align="center">
-            <Avatar 
-              size={80} 
-              icon={<UserOutlined />} 
+            <Avatar
+              size={80}
+              icon={<UserOutlined />}
               style={{ backgroundColor: '#fff', color: '#667eea' }}
             />
             <div>
@@ -216,12 +222,12 @@
       <Row gutter={24}>
         {/* 左侧：作品展示栏 */}
         <Col span={16}>
-          <Card 
+          <Card
             title={
               <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
                 <span>我的作品</span>
-                <Button 
-                  type="primary" 
+                <Button
+                  type="primary"
                   icon={<PlusOutlined />}
                   onClick={() => {
                     // 这里后续添加跳转到发布作品页面的逻辑
@@ -239,7 +245,7 @@
                 <Spin size="large" tip="加载作品中..." />
               </div>
             ) : userWorks.length === 0 ? (
-              <Empty 
+              <Empty
                 description="暂无作品，快去发布第一个作品吧！"
                 style={{ padding: '50px 0' }}
               />
@@ -247,7 +253,7 @@
               <Row gutter={[16, 16]}>
                 {userWorks.map((work) => (
                   <Col span={12} key={work.id}>
-                    <Card 
+                    <Card
                       hoverable
                       style={{ height: '100%' }}
                       actions={[
@@ -261,27 +267,27 @@
                     >
                       <Card.Meta
                         title={
-                          <div style={{ 
-                            overflow: 'hidden', 
-                            textOverflow: 'ellipsis', 
-                            whiteSpace: 'nowrap' 
+                          <div style={{
+                            overflow: 'hidden',
+                            textOverflow: 'ellipsis',
+                            whiteSpace: 'nowrap'
                           }}>
                             {work.title}
                           </div>
                         }
                         description={
                           <div>
-                            <Paragraph 
-                              ellipsis={{ rows: 2 }} 
+                            <Paragraph
+                              ellipsis={{ rows: 2 }}
                               style={{ marginBottom: 8, minHeight: '40px' }}
                             >
                               {work.description || '暂无描述'}
                             </Paragraph>
-                            <div style={{ 
-                              display: 'flex', 
-                              justifyContent: 'space-between', 
-                              fontSize: '12px', 
-                              color: '#999' 
+                            <div style={{
+                              display: 'flex',
+                              justifyContent: 'space-between',
+                              fontSize: '12px',
+                              color: '#999'
                             }}>
                               <span>
                                 <CalendarOutlined /> {formatDate(work.createTime)}
@@ -301,7 +307,7 @@
 
         {/* 右侧：通知栏 */}
         <Col span={8}>
-          <Card 
+          <Card
             title={
               <div style={{ display: 'flex', alignItems: 'center' }}>
                 <BellOutlined style={{ marginRight: 8 }} />
@@ -314,8 +320,8 @@
             <div>
               {mockNotifications.map((notification, index) => (
                 <div key={notification.id}>
-                  <div 
-                    style={{ 
+                  <div
+                    style={{
                       padding: '12px',
                       backgroundColor: notification.unread ? '#f6ffed' : 'transparent',
                       borderRadius: '4px',
@@ -323,7 +329,7 @@
                   >
                     <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start' }}>
                       <div style={{ flex: 1 }}>
-                        <div style={{ 
+                        <div style={{
                           fontWeight: notification.unread ? 'bold' : 'normal',
                           marginBottom: '4px',
                           display: 'flex',
@@ -331,15 +337,15 @@
                         }}>
                           {notification.title}
                           {notification.unread && (
-                            <Badge 
-                              color="red" 
+                            <Badge
+                              color="red"
                               style={{ marginLeft: '8px' }}
                             />
                           )}
                         </div>
-                        <div style={{ 
-                          color: '#666', 
-                          fontSize: '14px', 
+                        <div style={{
+                          color: '#666',
+                          fontSize: '14px',
                           lineHeight: '1.4',
                           marginBottom: '8px'
                         }}>
@@ -354,7 +360,7 @@
                   {index < mockNotifications.length - 1 && <Divider style={{ margin: '0' }} />}
                 </div>
               ))}
-              
+
               {/* 查看更多按钮 */}
               <div style={{ textAlign: 'center', marginTop: '16px' }}>
                 <Button type="link">查看全部通知</Button>
diff --git a/src/feature/user/UserLayout.tsx b/src/feature/user/UserLayout.tsx
index cb88dde..e3613ec 100644
--- a/src/feature/user/UserLayout.tsx
+++ b/src/feature/user/UserLayout.tsx
@@ -5,13 +5,13 @@
 
 function UserLayout() {
   return (
-        
-        <Content style={{ margin: '24px 16px 0' }}>
-          <div style={{ padding: 24, minHeight: 360 }}>
-            <Outlet /> {/* 这里会渲染子路由对应的组件 */}
-          </div>
-        </Content>
-      
+
+    <Content style={{ margin: '24px 16px 0' }}>
+      <div style={{ padding: 24, minHeight: 360 }}>
+        <Outlet />
+      </div>
+    </Content>
+
   );
 }
 
diff --git a/src/feature/user/userSlice.ts b/src/feature/user/userSlice.ts
index c3f7e44..64daa4e 100644
--- a/src/feature/user/userSlice.ts
+++ b/src/feature/user/userSlice.ts
@@ -1,6 +1,6 @@
 // src/store/userSlice.ts
 import { createSlice, createAsyncThunk, type PayloadAction } from '@reduxjs/toolkit';
-import type { UserInfo } from '../../api/User/type';
+import type { UserDetailInfo, UserInfo } from '../../api/User/type';
 import UserAPi from '../../api/User/UserApi';
 
 // 定义用户信息的类型
@@ -39,6 +39,23 @@
     } 
 );
 
+export const getUserDetail = createAsyncThunk<
+    UserDetailInfo,
+    string,
+    {rejectValue:string}
+>(
+    'user/getUserDetail',
+    async (id, {  rejectWithValue }) => {
+        if(!id) return rejectWithValue("未获取到用户信息");
+        const response = await UserAPi.getMeDetail(id);
+        if (response.data.code == 0) {
+            return response.data.data;
+        } else {
+            return rejectWithValue(response.data.message);
+        }
+    } 
+);
+
 // 创建 userSlice
 const userSlice = createSlice({
     name: 'user',
@@ -62,7 +79,21 @@
             .addCase(getUserInfo.rejected, (state, action) => {
                 state.status = 'failed';
                 state.error = action.error.message ?? 'Unknown error';
-            });
+            })
+            // getUserDetailFromState
+            .addCase(getUserDetail.pending, (state) => {
+                state.status = 'loading';
+                state.error = null;
+            })
+            .addCase(getUserDetail.fulfilled, (state, action: PayloadAction<UserDetailInfo>) => {
+                state.status = 'succeeded';
+                state.username = action.payload.username;
+                state.email = action.payload.email || '';
+            })
+            .addCase(getUserDetail.rejected, (state, action) => {
+                state.status = 'failed';
+                state.error = action.payload || action.error.message || 'Unknown error';
+            })
     },
 });
 
diff --git a/src/feature/work/Work.tsx b/src/feature/work/Work.tsx
index 56939d1..d9b08f0 100644
--- a/src/feature/work/Work.tsx
+++ b/src/feature/work/Work.tsx
@@ -100,8 +100,6 @@
         }
     }, [work_id, dispatch]);
 
-    // ==================== EditWork 集成功能 ====================
-
     // 更新作品信息
     const handleUpdateArtwork = useCallback(async (updates: Partial<ArtworkData>): Promise<void> => {
         if (!work_id || !currentArtwork) return;
@@ -157,17 +155,6 @@
         }
     }, [work_id, dispatch, comments.current, comments.pageSize]);
 
-    // 兼容旧的编辑处理器
-    const handleEditArtwork = useCallback((): void => {
-        if (isAuthor) {
-            setShowEditControls(true);
-            message.info('请使用上方的编辑控件来修改作品信息');
-        } else {
-            message.warning('您没有编辑此作品的权限');
-        }
-    }, [isAuthor]);
-
-    // ==================== 渲染逻辑 ====================
 
     // 加载状态
     if (loading.artwork) {
@@ -275,7 +262,6 @@
                                 currentPage={safeComments.current}
                                 pageSize={safeComments.pageSize}
                                 isAuthor={isAuthor}
-                                onEditArtwork={handleEditArtwork}
                             />
                         </Flex>
                     </div>
diff --git a/src/feature/work/WorkComponents.tsx b/src/feature/work/WorkComponents.tsx
index 64ef37a..79f976a 100644
--- a/src/feature/work/WorkComponents.tsx
+++ b/src/feature/work/WorkComponents.tsx
@@ -1,6 +1,6 @@
 import React, { useState } from 'react';
 import { Card, Typography, Tag, Flex, Table, Collapse, List, Spin, Alert, Button, Input, Form, message } from 'antd';
-import { EditOutlined, SendOutlined } from '@ant-design/icons';
+import { SendOutlined } from '@ant-design/icons';
 import ReactMarkdown from 'react-markdown';
 import type { ColumnsType } from 'antd/es/table';
 import type { PaginationConfig } from 'antd/es/pagination';
@@ -59,7 +59,7 @@
     description: string;
     isAuthor?: boolean;
     onEdit?: () => void;
-}> = ({ name, author, category, description, isAuthor = false, onEdit }) => (
+}> = ({ name, author, category, description }) => (
     <Card style={{ marginBottom: 20 }}>
         <Flex justify="space-between" align="flex-start">
             <div style={{ flex: 1 }}>
@@ -74,11 +74,6 @@
                     <ReactMarkdown>{description}</ReactMarkdown>
                 </div>
             </div>
-            {isAuthor && (
-                <Button type="primary" icon={<EditOutlined />} onClick={onEdit} style={{ marginLeft: 16 }}>
-                    编辑作品
-                </Button>
-            )}
         </Flex>
     </Card>
 );
diff --git a/src/feature/work/WorkPage.css b/src/feature/work/WorkPage.css
deleted file mode 100644
index 14b815a..0000000
--- a/src/feature/work/WorkPage.css
+++ /dev/null
@@ -1,155 +0,0 @@
-/* 作品页面容器 */
-.work-page-container {
-  max-width: 1200px;
-  margin: 0 auto;
-  padding: 20px;
-}
-
-/* 返回按钮 */
-.back-button {
-  margin-bottom: 20px;
-}
-
-/* 作品头部 */
-.work-header {
-  margin-bottom: 20px;
-}
-
-.work-header .ant-typography {
-  margin-bottom: 8px;
-}
-
-.work-meta {
-  margin: 16px 0;
-}
-
-.like-button {
-  margin-top: 10px;
-}
-
-/* 内容区域 */
-.work-content {
-  padding: 20px;
-  background: #f9f9f9;
-  border-radius: 4px;
-}
-
-/* Bug反馈区域 */
-.bug-report-section {
-  margin-top: 20px;
-}
-
-.bug-item {
-  width: 100%;
-  padding: 15px;
-  border: 1px solid #f0f0f0;
-  border-radius: 4px;
-  margin-bottom: 10px;
-}
-
-.bug-header {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 8px;
-}
-
-.bug-content {
-  margin: 10px 0;
-}
-
-/* 讨论区 */
-.discussion-section {
-  margin-top: 20px;
-}
-
-.discussion-container {
-  display: flex;
-  gap: 20px;
-}
-
-.discussion-list {
-  width: 300px;
-  border-right: 1px solid #f0f0f0;
-  padding-right: 20px;
-}
-
-.discussion-detail {
-  flex: 1;
-}
-
-.discussion-item {
-  padding: 15px;
-  cursor: pointer;
-  border-radius: 4px;
-  margin-bottom: 10px;
-  transition: all 0.3s;
-}
-
-.discussion-item:hover {
-  background: #f5f5f5;
-}
-
-.discussion-item.active {
-  background: #e6f7ff;
-  border-left: 3px solid #1890ff;
-}
-
-.discussion-detail-content {
-  padding: 20px;
-  background: #f9f9f9;
-  border-radius: 4px;
-  margin-bottom: 20px;
-}
-
-.discussion-title {
-  font-size: 18px;
-  display: block;
-  margin-bottom: 10px;
-}
-
-.discussion-meta {
-  display: flex;
-  align-items: center;
-  gap: 10px;
-  margin-bottom: 15px;
-}
-
-.discussion-body {
-  margin-bottom: 20px;
-}
-
-.comment-item {
-  padding: 15px 0;
-  border-bottom: 1px solid #f0f0f0;
-}
-
-.comment-header {
-  display: flex;
-  align-items: center;
-  gap: 10px;
-  margin-bottom: 10px;
-}
-
-.comment-actions {
-  margin-top: 10px;
-}
-
-.new-discussion-btn {
-  margin-bottom: 20px;
-}
-
-/* 响应式调整 */
-@media (max-width: 768px) {
-  .discussion-container {
-    flex-direction: column;
-  }
-  
-  .discussion-list {
-    width: 100%;
-    border-right: none;
-    padding-right: 0;
-    border-bottom: 1px solid #f0f0f0;
-    padding-bottom: 20px;
-    margin-bottom: 20px;
-  }
-}
\ No newline at end of file
diff --git a/src/feature/work/WorkPage.tsx b/src/feature/work/WorkPage.tsx
deleted file mode 100644
index 3a108a7..0000000
--- a/src/feature/work/WorkPage.tsx
+++ /dev/null
@@ -1,131 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { useParams, useNavigate } from 'react-router';
-import { Button, Tabs, message, Spin, Tag, Typography, Space, Divider } from 'antd';
-import { ArrowLeftOutlined, LikeOutlined, BugOutlined, CommentOutlined } from '@ant-design/icons';
-import WorkAPI from '../../api/workApi';
-import BugReportSection from '../../components/BugReportSection';
-import DiscussionSection from '../../components/DiscussionSection';
-import type { Work } from '../../api/otherType';
-
-const { Title, Text, Paragraph } = Typography;
-const { TabPane } = Tabs;
-
-const WorkPage: React.FC = () => {
-  const { id } = useParams<{ id: string }>();
-  const navigate = useNavigate();
-  const [work, setWork] = useState<Work | null>(null);
-  const [loading, setLoading] = useState(true);
-  const [activeTab, setActiveTab] = useState('details');
-
-  // 加载作品数据
-  useEffect(() => {
-    const loadWork = async () => {
-      try {
-        const workData = await WorkAPI.getWorkById(Number(id));
-        setWork(workData);
-      } catch (error) {
-        message.error('加载作品失败');
-        navigate('/');
-      } finally {
-        setLoading(false);
-      }
-    };
-
-    loadWork();
-  }, [id, navigate]);
-
-  // 点赞处理
-  const handleLike = async () => {
-    try {
-      await WorkAPI.likeWork(Number(id));
-      setWork(prev => prev ? { ...prev, likes: prev.likes + 1 } : null);
-      message.success('点赞成功');
-    } catch (error) {
-      message.error('点赞失败');
-    }
-  };
-
-  if (loading) {
-    return <Spin size="large" className="center-spinner" />;
-  }
-
-  if (!work) {
-    return <div>作品不存在</div>;
-  }
-
-  return (
-    <div className="work-page-container">
-      <Button 
-        type="text" 
-        icon={<ArrowLeftOutlined />} 
-        onClick={() => navigate(-1)}
-        className="back-button"
-      >
-        返回
-      </Button>
-
-      <div className="work-header">
-        <Title level={2}>{work.title}</Title>
-        <Text type="secondary">作者: {work.author}</Text>
-        
-        <div className="work-meta">
-          <Space size="middle">
-            <Tag color="blue">{work.categoryName}</Tag>
-            <Text>浏览: {work.views}</Text>
-            <Text>点赞: {work.likes}</Text>
-            <Text>上传时间: {new Date(work.createTime).toLocaleDateString()}</Text>
-          </Space>
-        </div>
-
-        <Button 
-          type="primary" 
-          icon={<LikeOutlined />} 
-          onClick={handleLike}
-          className="like-button"
-        >
-          点赞
-        </Button>
-      </div>
-
-      <Divider />
-
-      <Tabs activeKey={activeTab} onChange={setActiveTab}>
-        <TabPane tab="作品详情" key="details">
-          <div className="work-content">
-            <Title level={4}>作品描述</Title>
-            <Paragraph>{work.description}</Paragraph>
-            
-            <Title level={4}>作品内容</Title>
-            <div className="content-container">
-              {work.content}
-            </div>
-          </div>
-        </TabPane>
-
-        <TabPane 
-          tab={
-            <span>
-              <BugOutlined /> Bug反馈
-            </span>
-          } 
-          key="bugs"
-        >
-          <BugReportSection workId={work.id} />
-        </TabPane>
-
-        <TabPane 
-          tab={
-            <span>
-              <CommentOutlined /> 交流区
-            </span>
-          } 
-          key="discussions"
-        >
-          <DiscussionSection workId={work.id} />
-        </TabPane>
-      </Tabs>
-    </div>
-  );
-};
-
-export default WorkPage;
\ No newline at end of file
diff --git a/src/feature/work/mockData.ts b/src/feature/work/mockData.ts
index 8470e61..9caaed7 100644
--- a/src/feature/work/mockData.ts
+++ b/src/feature/work/mockData.ts
@@ -127,8 +127,8 @@
 
 // 作品数据集合
 export const mockArtworks: Record<string, ArtworkData> = {
-    '12345': {
-        artworkId: '12345',
+    '1': {
+        artworkId: '1',
         artworkCover: 'https://picsum.photos/300/400?random=1',
         author: '视觉设计师张三',
         authorId: 'author_zhangsan_001',
@@ -189,31 +189,16 @@
             { username: '创意总监', userId: 'user_director_104' },
         ],
         usersSeedingHistory: [
-            {
-                username: '资深下载者', uploadTotal: '156.8GB',
-                userId: ''
-            },
-            {
-                username: '设计素材库', uploadTotal: '89.2GB',
-                userId: ''
-            },
-            {
-                username: '创意工作室', uploadTotal: '67.5GB',
-                userId: ''
-            },
-            {
-                username: '学院资源组', uploadTotal: '45.3GB',
-                userId: ''
-            },
-            {
-                username: '独立设计师', uploadTotal: '23.7GB',
-                userId: ''
-            },
+            { username: '资深下载者', uploadTotal: '156.8GB', userId: 'hist_user_001' },
+            { username: '设计素材库', uploadTotal: '89.2GB', userId: 'hist_user_002' },
+            { username: '创意工作室', uploadTotal: '67.5GB', userId: 'hist_user_003' },
+            { username: '学院资源组', uploadTotal: '45.3GB', userId: 'hist_user_004' },
+            { username: '独立设计师', uploadTotal: '23.7GB', userId: 'hist_user_005' },
         ],
     },
     
-    '23456': {
-        artworkId: '23456',
+    '2': {
+        artworkId: '2',
         artworkCover: 'https://picsum.photos/300/400?random=2',
         author: 'UI设计师李四',
         authorId: 'author_lisi_002',
@@ -256,26 +241,17 @@
             { username: '产品经理小王', userId: 'user_pm_wang_202' },
         ],
         usersSeedingHistory: [
-            {
-                username: 'UI设计公司', uploadTotal: '78.9GB',
-                userId: ''
-            },
-            {
-                username: '设计师联盟', uploadTotal: '45.6GB',
-                userId: ''
-            },
-            {
-                username: '学习小组', uploadTotal: '23.4GB',
-                userId: ''
-            },
+            { username: 'UI设计公司', uploadTotal: '78.9GB', userId: 'hist_ui_001' },
+            { username: '设计师联盟', uploadTotal: '45.6GB', userId: 'hist_ui_002' },
+            { username: '学习小组', uploadTotal: '23.4GB', userId: 'hist_ui_003' },
         ],
     },
 
-    '67890': {
-        artworkId: '67890',
+    '3': {
+        artworkId: '3',
         artworkCover: 'https://picsum.photos/300/400?random=6',
         author: '刘松林',
-        authorId: '2', // 用户ID为2
+        authorId: '2',
         artworkName: 'React组件库开发指南',
         artworkCategory: '前端开发',
         comments: [],
@@ -313,33 +289,176 @@
             { username: 'React爱好者', userId: 'user_react_fan_602' },
         ],
         usersSeedingHistory: [
+            { username: '大厂前端团队', uploadTotal: '567.8GB', userId: 'hist_dev_001' },
+            { username: '开源社区', uploadTotal: '234.5GB', userId: 'hist_dev_002' },
+            { username: '技术培训机构', uploadTotal: '189.7GB', userId: 'hist_dev_003' },
+        ],
+    },
+
+    '4': {
+        artworkId: '4',
+        artworkCover: 'https://picsum.photos/300/400?random=7',
+        author: '3D艺术家王五',
+        authorId: 'author_wangwu_004',
+        artworkName: '机械战士3D模型',
+        artworkCategory: '3D建模',
+        comments: [],
+        artworkDescription: `# 机械战士3D模型
+
+一个高精度的科幻机械战士3D模型，包含完整的材质贴图和动画骨骼系统。
+
+## 模型特点
+
+### 🤖 设计风格
+- 未来科幻风格
+- 硬表面建模技术
+- PBR材质工作流
+- 模块化装备系统
+
+### 📐 技术规格
+- **面数**: 25,000 三角面
+- **贴图分辨率**: 4K PBR贴图组
+- **骨骼系统**: 完整人形骨骼
+- **动画**: 10个基础动作
+
+适用于游戏开发、影视制作和3D打印。`,
+        versionList: [
             {
-                username: '大厂前端团队', uploadTotal: '567.8GB',
-                userId: ''
+                version: '1.0',
+                seedFile: 'magnet:?xt=urn:btih:mech_warrior_v1_0&dn=机械战士v1.0.zip',
+                versionDescription: `## 基础版本 v1.0
+
+### 核心内容
+- 🎯 **高精度3D模型** (.fbx, .obj)
+- 🎨 **4K PBR贴图组**
+- 🦴 **完整骨骼系统**
+- 🎬 **基础动画文件**`,
             },
+        ],
+        usersSeedingCurrently: [
+            { username: '游戏开发者小陈', userId: 'user_gamedev_301' },
+            { username: '3D建模师', userId: 'user_3dmodeler_302' },
+        ],
+        usersSeedingHistory: [
+            { username: '游戏工作室', uploadTotal: '234.5GB', userId: 'hist_3d_001' },
+            { username: '影视特效团队', uploadTotal: '178.3GB', userId: 'hist_3d_002' },
+            { username: '独立开发者', uploadTotal: '98.7GB', userId: 'hist_3d_003' },
+        ],
+    },
+
+    '5': {
+        artworkId: '5',
+        artworkCover: 'https://picsum.photos/300/400?random=8',
+        author: '摄影师赵六',
+        authorId: 'author_zhaoliu_005',
+        artworkName: '城市夜景摄影集',
+        artworkCategory: '摄影作品',
+        comments: [],
+        artworkDescription: `# 城市夜景摄影集
+
+一组精美的城市夜景摄影作品，捕捉了都市夜晚的璀璨光影。
+
+## 作品特色
+
+### 📸 拍摄技法
+- 长曝光技术
+- HDR合成处理
+- 光轨艺术表现
+- 城市建筑几何美学
+
+### 🎨 后期处理
+- **RAW格式**: 无损原始文件
+- **精修版本**: Lightroom + Photoshop
+- **色彩分级**: 电影级调色
+- **分辨率**: 6000x4000像素
+
+包含20张高分辨率摄影作品，适合商业使用和艺术收藏。`,
+        versionList: [
             {
-                username: '开源社区', uploadTotal: '234.5GB',
-                userId: ''
+                version: '1.0',
+                seedFile: 'magnet:?xt=urn:btih:night_city_photos_v1_0&dn=城市夜景v1.0.zip',
+                versionDescription: `## 完整版本 v1.0
+
+### 包含内容
+- 📷 **RAW原始文件** (20张)
+- 🎨 **精修JPG版本** (高分辨率)
+- 📋 **拍摄参数记录**
+- 📍 **拍摄地点信息**`,
             },
+        ],
+        usersSeedingCurrently: [
+            { username: '摄影爱好者小林', userId: 'user_photo_401' },
+            { username: '设计师小美', userId: 'user_designer_402' },
+        ],
+        usersSeedingHistory: [
+            { username: '摄影工作室', uploadTotal: '445.8GB', userId: 'hist_photo_001' },
+            { username: '商业摄影师', uploadTotal: '367.2GB', userId: 'hist_photo_002' },
+            { username: '摄影学院', uploadTotal: '289.1GB', userId: 'hist_photo_003' },
+        ],
+    },
+
+    '6': {
+        artworkId: '6',
+        artworkCover: 'https://picsum.photos/300/400?random=9',
+        author: '插画师孙七',
+        authorId: 'author_sunqi_006',
+        artworkName: '奇幻世界插画系列',
+        artworkCategory: '插画艺术',
+        comments: [],
+        artworkDescription: `# 奇幻世界插画系列
+
+一套充满想象力的奇幻题材插画作品，包含角色设计、场景概念图和完整插图。
+
+## 创作风格
+
+### 🎨 艺术特色
+- 欧美奇幻风格
+- 数字绘画技法
+- 丰富色彩层次
+- 细腻光影表现
+
+### 📚 作品内容
+- **角色设计**: 15个原创角色
+- **场景概念**: 8个奇幻场景
+- **完整插图**: 12张精美插画
+- **线稿资源**: 黑白线稿版本
+
+适合游戏美术、小说封面、卡牌设计等多种用途。`,
+        versionList: [
             {
-                username: '技术培训机构', uploadTotal: '189.7GB',
-                userId: ''
+                version: '1.0',
+                seedFile: 'magnet:?xt=urn:btih:fantasy_art_v1_0&dn=奇幻插画v1.0.zip',
+                versionDescription: `## 标准版本 v1.0
+
+### 核心内容
+- 🎨 **高分辨率插画** (35张)
+- ✏️ **线稿资源包**
+- 🎯 **PSD分层文件**
+- 📖 **创作过程记录**`,
             },
         ],
+        usersSeedingCurrently: [
+            { username: '插画学习者', userId: 'user_illustrator_501' },
+            { username: '游戏美术师', userId: 'user_gameart_502' },
+        ],
+        usersSeedingHistory: [
+            { username: '插画师联盟', uploadTotal: '378.9GB', userId: 'hist_art_001' },
+            { username: '游戏美术团队', uploadTotal: '256.4GB', userId: 'hist_art_002' },
+            { username: '艺术学院', uploadTotal: '189.6GB', userId: 'hist_art_003' },
+        ],
     },
 };
 
 // 获取指定作品的评论数据
 export const getCommentsForArtwork = (artworkId: string): Comment[] => {
-    // 为不同作品生成不同的评论
     const commentVariations: Record<string, Comment[]> = {
-        '12345': baseComments,
-        '23456': baseComments.slice(0, 5).map(comment => ({
+        '1': baseComments,
+        '2': baseComments.slice(0, 5).map(comment => ({
             ...comment,
             id: `ui_${comment.id}`,
             content: comment.content.replace('作品', 'UI套件').replace('设计', '界面设计'),
         })),
-        '67890': [
+        '3': [
             {
                 id: 'dev_comment_1',
                 content: '这个组件库的设计思路很棒！TypeScript类型定义特别完善。',
@@ -366,6 +485,21 @@
                 child: [],
             },
         ],
+        '4': baseComments.slice(0, 4).map(comment => ({
+            ...comment,
+            id: `3d_${comment.id}`,
+            content: comment.content.replace('作品', '3D模型').replace('设计', '建模'),
+        })),
+        '5': baseComments.slice(0, 6).map(comment => ({
+            ...comment,
+            id: `photo_${comment.id}`,
+            content: comment.content.replace('作品', '摄影作品').replace('设计思路', '拍摄技法'),
+        })),
+        '6': baseComments.slice(0, 5).map(comment => ({
+            ...comment,
+            id: `art_${comment.id}`,
+            content: comment.content.replace('作品', '插画').replace('设计', '绘画'),
+        })),
     };
     
     return commentVariations[artworkId] || baseComments;
diff --git a/src/routes/routes.ts b/src/routes/routes.ts
index d380bde..eeebbe0 100644
--- a/src/routes/routes.ts
+++ b/src/routes/routes.ts
@@ -12,17 +12,13 @@
 import CreateWork from "../feature/work/CreateWork";
 
 import UserHome from "../feature/user/UserHome";
+// import Tmp from "../feature/home/tmp";
 
 // 创建受保护的组件
 const ProtectedHome = withProtect(Home);
 const ProtectedWork = withProtect(Work);
 const ProtectedCreatWork = withProtect(CreateWork)
-import FilmCategory from '../feature/categories/MovieCategory';
-import MusicCategory from '../feature/categories/MusicCategory';
-import GameCategory from '../feature/categories/GameCategory';
-import OtherCategory from '../feature/categories/OtherCategory';
-import WorkPage from '../feature/work/WorkPage';
-
+const ProtectedUserHome = withProtect(UserHome)
 export default createBrowserRouter([
   {
     path: "/",
@@ -32,14 +28,9 @@
         path: "/",
         Component: ProtectedHome,
       },
-        {path: 'categories/film', Component: FilmCategory,},
-        {path: 'categories/music', Component: MusicCategory,},
-        {path: 'categories/game', Component: GameCategory,},
-        {path: 'categories/other', Component: OtherCategory,},
-        {path: '/works/:id', Component: WorkPage, },
       {
         path: "user",
-        Component: UserHome,
+        Component: ProtectedUserHome,
       },
       {
         Component: AuthLayout,
@@ -56,7 +47,11 @@
       {
         path:"/work/creat",
         Component: ProtectedCreatWork
-      }
+      },
+      // {
+      //   path:"/tmp",
+      //   Component: Tmp
+      // }
     ],
   },
 ]);
\ No newline at end of file
diff --git a/src/store/store.ts b/src/store/store.ts
index cb5b975..b543f75 100644
--- a/src/store/store.ts
+++ b/src/store/store.ts
@@ -2,12 +2,15 @@
 import authReducer from "../feature/auth/authSlice"
 import userReducer from "../feature/user/userSlice"
 import workReducer from "../feature/work/workSlice"
-
+import workListReducer from '../feature/home/workListSlice';
+import categoryReducer from '../feature/home/categorySlice';
 export const store = configureStore({
   reducer: {
       auth: authReducer,
       user: userReducer,
       work: workReducer,
+      workList: workListReducer,
+      category: categoryReducer,
   },
   middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(),
 })
diff --git a/src/test/category/GameCategory.test.tsx b/src/test/category/GameCategory.test.tsx
deleted file mode 100644
index ad42353..0000000
--- a/src/test/category/GameCategory.test.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { render, screen } from '@testing-library/react';
-import GameCategory from '../../feature/categories/GameCategory';
-import { Provider } from 'react-redux';
-import { store } from '../../store/store';
-import { MemoryRouter } from 'react-router';
-
-describe('GameCategory Component', () => {
-  it('renders game category page with search and game cards', () => {
-    render(
-      <MemoryRouter>
-        <Provider store={store}>
-          <GameCategory />
-        </Provider>
-      </MemoryRouter>
-    );
-
-    // 验证标题和描述
-    expect(screen.getByText('游戏资源分区')).toBeInTheDocument();
-    expect(screen.getByText('PC、主机游戏资源分享')).toBeInTheDocument();
-    
-    // 验证搜索框
-    const searchInput = screen.getByPlaceholderText('搜索游戏名称或开发商');
-    expect(searchInput).toBeInTheDocument();
-    
-    // 验证游戏卡片
-    expect(screen.getByText('赛博朋克2077')).toBeInTheDocument();
-    expect(screen.getByText('艾尔登法环')).toBeInTheDocument();
-    
-    // 验证开发商信息
-    expect(screen.getByText('开发商: CD Projekt Red')).toBeInTheDocument();
-    expect(screen.getByText('开发商: FromSoftware')).toBeInTheDocument();
-  });
-});
\ No newline at end of file
diff --git a/src/test/category/MovieCategory.test.tsx b/src/test/category/MovieCategory.test.tsx
deleted file mode 100644
index be1ed01..0000000
--- a/src/test/category/MovieCategory.test.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { render, screen } from '@testing-library/react';
-import MovieCategory from '../../feature/categories/MovieCategory';
-import { Provider } from 'react-redux';
-import { store } from '../../store/store';
-import { MemoryRouter } from 'react-router';
-
-describe('MovieCategory Component', () => {
-  it('renders movie category page with search and movie cards', () => {
-    render(
-      <MemoryRouter>
-        <Provider store={store}>
-          <MovieCategory />
-        </Provider>
-      </MemoryRouter>
-    );
-
-    // 验证标题和描述
-    expect(screen.getByText('影视资源分区')).toBeInTheDocument();
-    expect(screen.getByText('高清电影、电视剧、纪录片资源分享')).toBeInTheDocument();
-    
-    // 验证搜索框
-    const searchInput = screen.getByPlaceholderText('搜索电影或导演');
-    expect(searchInput).toBeInTheDocument();
-    
-    // 验证电影卡片
-    expect(screen.getByText('盗梦空间')).toBeInTheDocument();
-    expect(screen.getByText('肖申克的救赎')).toBeInTheDocument();
-    
-    // 验证导演信息
-    expect(screen.getByText('导演: 克里斯托弗·诺兰')).toBeInTheDocument();
-    expect(screen.getByText('导演: 弗兰克·德拉邦特')).toBeInTheDocument();
-  });
-});
\ No newline at end of file
diff --git a/src/test/category/MusicCategory.test.tsx b/src/test/category/MusicCategory.test.tsx
deleted file mode 100644
index 4de1bdf..0000000
--- a/src/test/category/MusicCategory.test.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { render, screen } from '@testing-library/react';
-import MusicCategory from '../../feature/categories/MusicCategory';
-import { Provider } from 'react-redux';
-import { store } from '../../store/store';
-import { MemoryRouter } from 'react-router';
-
-describe('MusicCategory Component', () => {
-  it('renders music category page with search, filters and music cards', () => {
-    render(
-      <MemoryRouter>
-        <Provider store={store}>
-          <MusicCategory />
-        </Provider>
-      </MemoryRouter>
-    );
-
-    // 验证标题和描述
-    expect(screen.getByText('音乐资源分区')).toBeInTheDocument();
-    expect(screen.getByText('高质量音乐资源共享，保持分享率，共建良好PT环境')).toBeInTheDocument();
-    
-    // 验证搜索框
-    const searchInput = screen.getByPlaceholderText('搜索音乐名称或艺术家');
-    expect(searchInput).toBeInTheDocument();
-    
-    // 验证音质筛选
-    expect(screen.getByText('音质筛选：')).toBeInTheDocument();
-    expect(screen.getByText('全部')).toBeInTheDocument();
-    expect(screen.getByText('FLAC')).toBeInTheDocument();
-    
-    // 验证分类标签
-    expect(screen.getByText('欧美流行 (15)')).toBeInTheDocument();
-    expect(screen.getByText('华语流行 (23)')).toBeInTheDocument();
-    
-    // 验证音乐卡片
-    expect(screen.getByText('Blinding Lights')).toBeInTheDocument();
-    expect(screen.getByText('Bohemian Rhapsody')).toBeInTheDocument();
-  });
-});
\ No newline at end of file
diff --git a/src/test/category/OtherCategory.test.tsx b/src/test/category/OtherCategory.test.tsx
deleted file mode 100644
index dd1e793..0000000
--- a/src/test/category/OtherCategory.test.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { render, screen } from '@testing-library/react';
-import OtherCategory from '../../feature/categories/OtherCategory';
-import { Provider } from 'react-redux';
-import { store } from '../../store/store';
-import { MemoryRouter } from 'react-router';
-
-describe('OtherCategory Component', () => {
-  it('renders other resources category page with search and resource cards', () => {
-    render(
-      <MemoryRouter>
-        <Provider store={store}>
-          <OtherCategory />
-        </Provider>
-      </MemoryRouter>
-    );
-
-    // 验证标题和描述
-    expect(screen.getByText('其他资源分区')).toBeInTheDocument();
-    expect(screen.getByText('软件、电子书等其他类型资源')).toBeInTheDocument();
-    
-    // 验证搜索框
-    const searchInput = screen.getByPlaceholderText('搜索资源名称或描述');
-    expect(searchInput).toBeInTheDocument();
-    
-    // 验证资源卡片
-    expect(screen.getByText('盗梦空间')).toBeInTheDocument();
-    expect(screen.getByText('肖申克的救赎')).toBeInTheDocument();
-    
-    // 验证类型信息
-    expect(screen.getByText('类型: 未知类型')).toBeInTheDocument();
-  });
-});
\ No newline at end of file
diff --git a/src/test/work/WorkPage.test.tsx b/src/test/work/WorkPage.test.tsx
deleted file mode 100644
index 4dc5036..0000000
--- a/src/test/work/WorkPage.test.tsx
+++ /dev/null
@@ -1,268 +0,0 @@
-import { render, screen } from '@testing-library/react';
-import WorkPage from '../../feature/work/WorkPage';
-import { Provider } from 'react-redux';
-import { store } from '../../store/store';
-import { MemoryRouter, Route, Routes, useNavigate } from 'react-router';
-import { act } from 'react-dom/test-utils';
-import WorkAPI from '../../api/workApi';
-import type { Work } from '../../api/otherType';
-import '@testing-library/jest-dom';
-
-// 模拟整个WorkAPI类
-jest.mock('../../api/workApi', () => {
-  return {
-    __esModule: true,
-    default: {
-      getWorkById: jest.fn(),
-      likeWork: jest.fn(),
-      // 添加其他可能用到的方法
-      getBugReports: jest.fn(),
-      getDiscussions: jest.fn()
-    }
-  }
-});
-
-// 模拟子组件
-jest.mock('../../components/BugReportSection', () => () => (
-  <div data-testid="bug-report-mock">BugReportSection Mock</div>
-));
-
-jest.mock('../../components/DiscussionSection', () => () => (
-  <div data-testid="discussion-mock">DiscussionSection Mock</div>
-));
-
-// 模拟react-router-dom的useNavigate
-jest.mock('react-router-dom', () => ({
-  ...jest.requireActual('react-router-dom'),
-  useNavigate: () => jest.fn()
-}));
-
-describe('WorkPage Component', () => {
-  const mockWork: Work = {
-      id: 1,
-      title: '测试作品',
-      author: '测试作者',
-      categoryName: '测试分类',
-      views: 100,
-      likes: 50,
-      createTime: '2023-01-01T00:00:00Z',
-      description: '测试描述',
-      content: '测试内容',
-      size: '',
-      data: function (): unknown {
-          throw new Error('Function not implemented.');
-      },
-      artist: '',
-      quality: '',
-      genre: [],
-      authorId: 0,
-      categoryId: 0,
-      coverUrl: '',
-      attachments: [],
-      bugCount: 0,
-      discussionCount: 0
-  };
-
-  beforeEach(() => {
-    // 重置所有模拟
-    jest.clearAllMocks();
-    
-    // 设置默认模拟实现
-    (WorkAPI.getWorkById as jest.Mock).mockResolvedValue(mockWork);
-    (WorkAPI.likeWork as jest.Mock).mockResolvedValue({});
-  });
-
-  it('renders loading spinner initially', async () => {
-    // 延迟API响应以测试加载状态
-    let resolvePromise: (value: Work) => void;
-    (WorkAPI.getWorkById as jest.Mock).mockImplementation(
-      () => new Promise<Work>((resolve) => {
-        resolvePromise = resolve;
-      })
-    );
-
-    render(
-      <MemoryRouter initialEntries={['/works/1']}>
-        <Provider store={store}>
-          <Routes>
-            <Route path="/works/:id" element={<WorkPage />} />
-          </Routes>
-        </Provider>
-      </MemoryRouter>
-    );
-
-    // 验证加载状态
-    expect(screen.getByRole('status')).toBeInTheDocument();
-    expect(screen.getByText(/加载/)).toBeInTheDocument();
-    
-    // 完成API请求
-    await act(async () => {
-      resolvePromise(mockWork);
-    });
-
-    // 验证加载完成后内容
-    expect(await screen.findByText('测试作品')).toBeInTheDocument();
-  });
-
-  it('renders work details after loading', async () => {
-    render(
-      <MemoryRouter initialEntries={['/works/1']}>
-        <Provider store={store}>
-          <Routes>
-            <Route path="/works/:id" element={<WorkPage />} />
-          </Routes>
-        </Provider>
-      </MemoryRouter>
-    );
-
-    // 等待数据加载完成
-    expect(await screen.findByText('测试作品')).toBeInTheDocument();
-    
-    // 验证头部信息
-    expect(screen.getByText('作者: 测试作者')).toBeInTheDocument();
-    expect(screen.getByText('测试分类')).toHaveClass('ant-tag');
-    expect(screen.getByText('浏览: 100')).toBeInTheDocument();
-    expect(screen.getByText('点赞: 50')).toBeInTheDocument();
-    expect(screen.getByText(/2023/)).toBeInTheDocument();
-    
-    // 验证作品内容
-    expect(screen.getByRole('heading', { level: 4, name: '作品描述' })).toBeInTheDocument();
-    expect(screen.getByText('测试描述')).toBeInTheDocument();
-    expect(screen.getByRole('heading', { level: 4, name: '作品内容' })).toBeInTheDocument();
-    expect(screen.getByText('测试内容')).toBeInTheDocument();
-    
-    // 验证标签页
-    expect(screen.getByRole('tab', { name: '作品详情' })).toBeInTheDocument();
-    expect(screen.getByRole('tab', { name: /Bug反馈/ })).toBeInTheDocument();
-    expect(screen.getByRole('tab', { name: /交流区/ })).toBeInTheDocument();
-  });
-
-  it('handles back button click', async () => {
-    const mockNavigate = jest.fn();
-    (useNavigate as jest.Mock).mockReturnValue(mockNavigate);
-
-    render(
-      <MemoryRouter initialEntries={['/works/1']}>
-        <Provider store={store}>
-          <Routes>
-            <Route path="/works/:id" element={<WorkPage />} />
-          </Routes>
-        </Provider>
-      </MemoryRouter>
-    );
-
-    // 等待数据加载完成
-    await screen.findByText('测试作品');
-    
-    // 点击返回按钮
-    const backButton = screen.getByRole('button', { name: '返回' });
-    await act(async () => {
-      backButton.click();
-    });
-    
-    // 验证导航被调用
-    expect(mockNavigate).toHaveBeenCalledWith(-1);
-  });
-
-  it('handles like button click', async () => {
-    render(
-      <MemoryRouter initialEntries={['/works/1']}>
-        <Provider store={store}>
-          <Routes>
-            <Route path="/works/:id" element={<WorkPage />} />
-          </Routes>
-        </Provider>
-      </MemoryRouter>
-    );
-
-    // 等待数据加载完成
-    await screen.findByText('测试作品');
-    
-    // 点击点赞按钮
-    const likeButton = screen.getByRole('button', { name: '点赞' });
-    await act(async () => {
-      likeButton.click();
-    });
-    
-    // 验证API调用
-    expect(WorkAPI.likeWork).toHaveBeenCalledTimes(1);
-    expect(WorkAPI.likeWork).toHaveBeenCalledWith(1);
-    
-    // 验证UI反馈
-    expect(await screen.findByText('点赞成功')).toBeInTheDocument();
-  });
-
-  it('shows error message when work loading fails', async () => {
-    const errorMessage = '加载失败';
-    (WorkAPI.getWorkById as jest.Mock).mockRejectedValue(new Error(errorMessage));
-
-    const mockNavigate = jest.fn();
-    (useNavigate as jest.Mock).mockReturnValue(mockNavigate);
-
-    render(
-      <MemoryRouter initialEntries={['/works/1']}>
-        <Provider store={store}>
-          <Routes>
-            <Route path="/works/:id" element={<WorkPage />} />
-          </Routes>
-        </Provider>
-      </MemoryRouter>
-    );
-
-    // 验证错误消息
-    expect(await screen.findByText('作品不存在')).toBeInTheDocument();
-    
-    // 验证导航到首页
-    expect(mockNavigate).toHaveBeenCalledWith('/');
-  });
-
-  it('switches between tabs correctly', async () => {
-    render(
-      <MemoryRouter initialEntries={['/works/1']}>
-        <Provider store={store}>
-          <Routes>
-            <Route path="/works/:id" element={<WorkPage />} />
-          </Routes>
-        </Provider>
-      </MemoryRouter>
-    );
-
-    // 等待数据加载完成
-    await screen.findByText('测试作品');
-    
-    // 初始显示作品详情
-    expect(screen.getByText('测试描述')).toBeInTheDocument();
-    expect(screen.queryByTestId('bug-report-mock')).not.toBeInTheDocument();
-    expect(screen.queryByTestId('discussion-mock')).not.toBeInTheDocument();
-    
-    // 点击Bug反馈标签
-    const bugTab = screen.getByRole('tab', { name: /Bug反馈/ });
-    await act(async () => {
-      bugTab.click();
-    });
-    
-    // 验证Bug反馈内容显示
-    expect(screen.queryByText('测试描述')).not.toBeInTheDocument();
-    expect(screen.getByTestId('bug-report-mock')).toBeInTheDocument();
-    
-    // 点击交流区标签
-    const discussionTab = screen.getByRole('tab', { name: /交流区/ });
-    await act(async () => {
-      discussionTab.click();
-    });
-    
-    // 验证交流区内容显示
-    expect(screen.queryByTestId('bug-report-mock')).not.toBeInTheDocument();
-    expect(screen.getByTestId('discussion-mock')).toBeInTheDocument();
-    
-    // 切换回作品详情
-    const detailsTab = screen.getByRole('tab', { name: '作品详情' });
-    await act(async () => {
-      detailsTab.click();
-    });
-    
-    // 验证作品详情再次显示
-    expect(screen.getByText('测试描述')).toBeInTheDocument();
-    expect(screen.queryByTestId('discussion-mock')).not.toBeInTheDocument();
-  });
-});
\ No newline at end of file
