diff --git a/src/app/user/page.tsx b/src/app/user/page.tsx
index 6f29b02..0402059 100644
--- a/src/app/user/page.tsx
+++ b/src/app/user/page.tsx
@@ -1,1125 +1,1382 @@
-'use client';
+"use client";
 
-import React, { useEffect, useState, useRef } from 'react';
-import { TabView, TabPanel } from 'primereact/tabview';
-import { Avatar } from 'primereact/avatar';
-import { Button } from 'primereact/button';
-import { Card } from 'primereact/card';
+import React, { useEffect, useState, useRef } from "react";
+import { TabView, TabPanel } from "primereact/tabview";
+import { Avatar } from "primereact/avatar";
+import { Button } from "primereact/button";
+import { Card } from "primereact/card";
 import { Image } from "primereact/image";
 // 发布资源
-import { Dialog } from 'primereact/dialog';
+import { Dialog } from "primereact/dialog";
 import { InputText } from "primereact/inputtext";
 import { InputTextarea } from "primereact/inputtextarea";
 import { FileUpload } from "primereact/fileupload";
 // 资源分类
 import { RadioButton, RadioButtonChangeEvent } from "primereact/radiobutton";
 // 资源标签
-import { MultiSelect, MultiSelectChangeEvent } from 'primereact/multiselect';
+import { MultiSelect, MultiSelectChangeEvent } from "primereact/multiselect";
 // 浮动按钮
-import { SpeedDial } from 'primereact/speeddial';
+import { SpeedDial } from "primereact/speeddial";
 // 评分图标
-import { Fire } from '@icon-park/react';
+import { Fire } from "@icon-park/react";
 // 消息提醒
-import { Toast } from 'primereact/toast';
+import { Toast } from "primereact/toast";
 // 页面跳转
 import { useRouter } from "next/navigation";
 // 类型转换
 import { toNumber } from "lodash";
 // 分页
-import { Paginator, type PaginatorPageChangeEvent } from 'primereact/paginator';
+import { Paginator, type PaginatorPageChangeEvent } from "primereact/paginator";
 
 // 接口传输
 import axios from "axios";
-import { useLocalStorage } from '../hook/useLocalStorage';
+import { useLocalStorage } from "../hook/useLocalStorage";
 // 样式
-import './user.scss';
+import "./user.scss";
 
 interface User {
-    Id: number;
-};
+  Id: number;
+}
 
 // 用户信息
 interface UserInfo {
-    userId: number;
-    username: string;
-    password: string;
-    avatar: string;
-    followerCount: number;// 粉丝数
-    subscriberCount: number;// 关注数
-    signature: string;// 个性签名
-    uploadAmount: number;
-    purchaseAmount: number;
-    credits: number;
+  userId: number;
+  username: string;
+  password: string;
+  avatar: string;
+  followerCount: number; // 粉丝数
+  subscriberCount: number; // 关注数
+  signature: string; // 个性签名
+  uploadAmount: number;
+  purchaseAmount: number;
+  credits: number;
 }
 
 // 用户数据
 interface UserData {
-    subscriberCount: number; // 关注数
-    uploadAmount: number; // 上传量（资源个数）
-    beDownloadedAmount: number; // 上传资源被下载量
-    seedPercentageList: number[]; // 上传资源类型百分比列表，按材质包、模组、整合包、地图的顺序返回
+  subscriberCount: number; // 关注数
+  uploadAmount: number; // 上传量（资源个数）
+  beDownloadedAmount: number; // 上传资源被下载量
+  seedPercentageList: number[]; // 上传资源类型百分比列表，按材质包、模组、整合包、地图的顺序返回
 }
 
 // 用户发布过的资源
 interface Resource {
-    resourceId: number;
-    resourceName: string;
-    resourcePicture: string;
-    resourceSummary: string; // 资源简介（一句话）
-    resourceDetail: string; // 资源介绍
-    uploadTime: string; // 上传时间
-    lastUpdateTime: string; // 最近更新时间
-    price: number;
-    downloads: number;
-    likes: number;
-    collections: number;
-    comments: number;
-    seeds: number; // 种子数
-    classify: string; // 资源分类(材质包：resourcePack,模组：mod,整合包：modPack ,地图：map
+  resourceId: number;
+  resourceName: string;
+  resourcePicture: string;
+  resourceSummary: string; // 资源简介（一句话）
+  resourceDetail: string; // 资源介绍
+  uploadTime: string; // 上传时间
+  lastUpdateTime: string; // 最近更新时间
+  price: number;
+  downloads: number;
+  likes: number;
+  collections: number;
+  comments: number;
+  seeds: number; // 种子数
+  classify: string; // 资源分类(材质包：resourcePack,模组：mod,整合包：modPack ,地图：map
 }
 
 // 用户发布过的资源列表
 interface ResourceList {
-    records: Resource[];
+  records: Resource[];
 }
 
 // 帖子
 interface Thread {
-    threadId: number;
-    userId: number;
-    threadPicture: string;
-    title: string;
-    likes: number;
-    createAt: string;
+  threadId: number;
+  userId: number;
+  threadPicture: string;
+  title: string;
+  likes: number;
+  createAt: string;
 }
 
 // 发布帖子列表
 interface ThreadList {
-    records: Thread[];
-    total: number;
-    pages: number;
-    current: number;
-    size: number;
+  records: Thread[];
+  total: number;
+  pages: number;
+  current: number;
+  size: number;
 }
 
 // 悬赏
 interface Reward {
-    rewardId: number;
-    userId: number;
-    rewardPicture: string;
-    rewardName: string;
-    createAt: string;
-    rewardDescription: string;
-    price: number;
+  rewardId: number;
+  userId: number;
+  rewardPicture: string;
+  rewardName: string;
+  createAt: string;
+  rewardDescription: string;
+  price: number;
 }
 
 // 我的悬赏列表
 interface RewardList {
-    rewardList: Reward[];
-    total: number; // 总记录数
+  rewardList: Reward[];
+  total: number; // 总记录数
 }
 
 // 资源标签
 interface GameplayOption {
-    name: string;
-    code: number;
+  name: string;
+  code: number;
 }
 
 // 资源标签选项
 const gameplayOptions: GameplayOption[] = [
-    { name: '科技', code: 1 },
-    { name: '魔法', code: 2 },
-    { name: '建筑', code: 3 },
-    { name: '风景', code: 4 },
-    { name: '竞技', code: 5 },
-    { name: '生存', code: 6 },
-    { name: '冒险', code: 7 },
-    { name: '跑酷', code: 8 },
-    { name: '艺术', code: 9 },
-    { name: '剧情', code: 10 },
-    { name: '社交', code: 11 },
-    { name: '策略', code: 12 },
-    { name: '极限', code: 13 }
+  { name: "科技", code: 1 },
+  { name: "魔法", code: 2 },
+  { name: "建筑", code: 3 },
+  { name: "风景", code: 4 },
+  { name: "竞技", code: 5 },
+  { name: "生存", code: 6 },
+  { name: "冒险", code: 7 },
+  { name: "跑酷", code: 8 },
+  { name: "艺术", code: 9 },
+  { name: "剧情", code: 10 },
+  { name: "社交", code: 11 },
+  { name: "策略", code: 12 },
+  { name: "极限", code: 13 },
 ];
 
 export default function UserPage() {
-    const user = useLocalStorage<User>('user');
-    const userId: number = user?.Id ?? -1;
+  const user = useLocalStorage<User>("user");
+  const userId: number = user?.Id ?? -1;
 
-    // 路由
-    const router = useRouter();
-    // 发布资源列表
-    const [resourceList, setResourceList] = useState<Resource[]>([]);
-    // 用户信息
-    const [userInfo, setUserInfo] = useState<UserInfo>();
-    // 用户数据
-    const [userData, setUserData] = useState<UserData>();
-    // 消息提醒
-    const toast = useRef<Toast>(null);
-    // 资源标签
-    const [selectedGameplay, setSelectedGameplay] = useState<GameplayOption[]>([]);
-    // 资源封面路径
-    const [resourcePictureUrl, setResourcePictureUrl] = useState<string>('');
-    // 主页发布帖子列表
-    const [homePageThread, setHomePageThread] = useState<ThreadList>();
-    // 我的帖子列表
-    const [threadList, setThreadList] = useState<Thread[]>([]);
-    // 我的悬赏列表
-    const [rewardList, setRewardList] = useState<Reward[]>([]);
-    // 控制Tab切换
-    const [activeIndex, setActiveIndex] = useState(0);
-    // 帖子分页
-    const [threadFirst, setThreadFirst] = useState(0);
-    const [threadRows, setThreadRows] = useState(6);
-    const [totalThreads, setTotalThreads] = useState<number>(0);
-    const onThreadPageChange = (event: PaginatorPageChangeEvent) => {
-        setThreadFirst(event.first);
-        setThreadRows(event.rows);
-    };
-    const [torrentUrl, setTorrentUrl] = useState<string>(''); // 上传 .torrent 后得到的 URL
+  // 路由
+  const router = useRouter();
+  // 发布资源列表
+  const [resourceList, setResourceList] = useState<Resource[]>([]);
+  // 用户信息
+  const [userInfo, setUserInfo] = useState<UserInfo>();
+  // 用户数据
+  const [userData, setUserData] = useState<UserData>();
+  // 消息提醒
+  const toast = useRef<Toast>(null);
+  // 资源标签
+  const [selectedGameplay, setSelectedGameplay] = useState<GameplayOption[]>(
+    []
+  );
+  // 资源封面路径
+  const [resourcePictureUrl, setResourcePictureUrl] = useState<string>("");
+  // 主页发布帖子列表
+  const [homePageThread, setHomePageThread] = useState<ThreadList>();
+  // 我的帖子列表
+  const [threadList, setThreadList] = useState<Thread[]>([]);
+  // 我的悬赏列表
+  const [rewardList, setRewardList] = useState<Reward[]>([]);
+  // 控制Tab切换
+  const [activeIndex, setActiveIndex] = useState(0);
+  // 帖子分页
+  const [threadFirst, setThreadFirst] = useState(0);
+  const [threadRows, setThreadRows] = useState(6);
+  const [totalThreads, setTotalThreads] = useState<number>(0);
+  const onThreadPageChange = (event: PaginatorPageChangeEvent) => {
+    setThreadFirst(event.first);
+    setThreadRows(event.rows);
+  };
+  const [torrentUrl, setTorrentUrl] = useState<string>(""); // 上传 .torrent 后得到的 URL
 
-    // 悬赏分页
-    const [rewardFirst, setRewardFirst] = useState(0);
-    const [rewardRows, setRewardRows] = useState(5);
-    const [totalRewards, setTotalRewards] = useState<number>(0);
-    const onRewardPageChange = (event: PaginatorPageChangeEvent) => {
-        setRewardFirst(event.first);
-        setRewardRows(event.rows);
-    };
+  // 悬赏分页
+  const [rewardFirst, setRewardFirst] = useState(0);
+  const [rewardRows, setRewardRows] = useState(5);
+  const [totalRewards, setTotalRewards] = useState<number>(0);
+  const onRewardPageChange = (event: PaginatorPageChangeEvent) => {
+    setRewardFirst(event.first);
+    setRewardRows(event.rows);
+  };
 
-    useEffect(() => {
-        fetchUserInfo();
-        fetchUserData();
-        fetchResourceList();
-    }, []);
+  useEffect(() => {
+    fetchUserInfo();
+    fetchUserData();
+    fetchResourceList();
+  }, []);
 
-    // 获取用户信息
-    const fetchUserInfo = async () => {
-        try {
-            const response = await axios.get<UserInfo>(process.env.PUBLIC_URL + `/user/info`, {
-                params: { userId }
-            });
-            console.log('获取用户信息：', response.data);
-            setUserInfo(response.data);
-        } catch (err) {
-            console.error('获取用户信息失败', err);
-            toast.current?.show({ severity: 'error', summary: 'error', detail: '获取用户信息失败' });
+  // 获取用户信息
+  const fetchUserInfo = async () => {
+    try {
+      const response = await axios.get<UserInfo>(
+        process.env.PUBLIC_URL + `/user/info`,
+        {
+          params: { userId },
         }
-    };
-
-    // 获取用户数据
-    const fetchUserData = async () => {
-        try {
-            const response = await axios.get<UserData>(process.env.PUBLIC_URL + `/user/data`, {
-                params: { userId }
-            });
-            console.log('获取用户数据：', response.data);
-            setUserData(response.data);
-        } catch (err) {
-            console.error('获取用户数据失败', err);
-            toast.current?.show({ severity: 'error', summary: 'error', detail: '获取用户数据失败' });
-        }
-    };
-
-    // 格式化数字显示 (3000 -> 3k)
-    const formatCount = (count?: number): string => {
-        if (count == null) return "0"; // 同时处理 undefined/null
-
-        const absCount = Math.abs(count); // 处理负数
-
-        const format = (num: number, suffix: string) => {
-            const fixed = num.toFixed(1);
-            return fixed.endsWith('.0')
-                ? `${Math.floor(num)}${suffix}`
-                : `${fixed}${suffix}`;
-        };
-
-        if (absCount >= 1e6) return format(count / 1e6, "m");
-        if (absCount >= 1e3) return format(count / 1e3, "k");
-        return count.toString();
-    };
-
-    // 获取发布资源
-    const fetchResourceList = async () => {
-        try {
-            const response = await axios.get<ResourceList>(process.env.PUBLIC_URL + `/user/upload`, {
-                params: { userId, pageNumber: 1, rows: 3 }
-            });
-            console.log('获取发布资源列表：', response.data.records);
-            setResourceList(response.data.records);
-        } catch (err) {
-            console.error('获取发布资源失败', err);
-            toast.current?.show({ severity: 'error', summary: 'error', detail: '获取发布资源失败' });
-        }
-    };
-
-    useEffect(() => {
-        fetchHomePageThread();
-    }, []);
-
-    // 获取主页部分的发布帖子
-    const fetchHomePageThread = async () => {
-        try {
-            const response = await axios.get<ThreadList>(process.env.PUBLIC_URL + `/user/thread`, {
-                params: { userId: userId, pageNumber: 1, rows: 3 }
-            })
-            console.log('获取主页发布帖子：', response.data);
-            setHomePageThread(response.data);
-
-        } catch (err) {
-            console.error('获取主页发布帖子失败', err);
-            toast.current?.show({ severity: 'error', summary: 'error', detail: '获取主页发布帖子失败' });
-        }
+      );
+      console.log("获取用户信息：", response.data);
+      setUserInfo(response.data);
+    } catch (err) {
+      console.error("获取用户信息失败", err);
+      toast.current?.show({
+        severity: "error",
+        summary: "error",
+        detail: "获取用户信息失败",
+      });
     }
+  };
 
-    useEffect(() => {
-        fetchThreadList();
-    }, [threadFirst, threadRows]);
-
-    // 获取用户发布的所有帖子
-    const fetchThreadList = async () => {
-        try {
-            const pageNumber = threadFirst / threadRows + 1;
-            const response = await axios.get<ThreadList>(process.env.PUBLIC_URL + `/user/thread`, {
-                params: { userId: userId, pageNumber: pageNumber, rows: threadRows }
-            })
-            console.log('获取我的帖子：', response.data);
-            setThreadList(response.data.records);
-            setTotalThreads(response.data.total)
-        } catch (err) {
-            console.error('获取我的帖子失败', err);
-            toast.current?.show({ severity: 'error', summary: 'error', detail: '获取我的帖子失败' });
+  // 获取用户数据
+  const fetchUserData = async () => {
+    try {
+      const response = await axios.get<UserData>(
+        process.env.PUBLIC_URL + `/user/data`,
+        {
+          params: { userId },
         }
+      );
+      console.log("获取用户数据：", response.data);
+      setUserData(response.data);
+    } catch (err) {
+      console.error("获取用户数据失败", err);
+      toast.current?.show({
+        severity: "error",
+        summary: "error",
+        detail: "获取用户数据失败",
+      });
     }
+  };
 
-    useEffect(() => {
+  // 格式化数字显示 (3000 -> 3k)
+  const formatCount = (count?: number): string => {
+    if (count == null) return "0"; // 同时处理 undefined/null
+
+    const absCount = Math.abs(count); // 处理负数
+
+    const format = (num: number, suffix: string) => {
+      const fixed = num.toFixed(1);
+      return fixed.endsWith(".0")
+        ? `${Math.floor(num)}${suffix}`
+        : `${fixed}${suffix}`;
+    };
+
+    if (absCount >= 1e6) return format(count / 1e6, "m");
+    if (absCount >= 1e3) return format(count / 1e3, "k");
+    return count.toString();
+  };
+
+  // 获取发布资源
+  const fetchResourceList = async () => {
+    try {
+      const response = await axios.get<ResourceList>(
+        process.env.PUBLIC_URL + `/user/upload`,
+        {
+          params: { userId, pageNumber: 1, rows: 3 },
+        }
+      );
+      console.log("获取发布资源列表：", response.data.records);
+      setResourceList(response.data.records);
+    } catch (err) {
+      console.error("获取发布资源失败", err);
+      toast.current?.show({
+        severity: "error",
+        summary: "error",
+        detail: "获取发布资源失败",
+      });
+    }
+  };
+
+  useEffect(() => {
+    fetchHomePageThread();
+  }, []);
+
+  // 获取主页部分的发布帖子
+  const fetchHomePageThread = async () => {
+    try {
+      const response = await axios.get<ThreadList>(
+        process.env.PUBLIC_URL + `/user/thread`,
+        {
+          params: { userId: userId, pageNumber: 1, rows: 3 },
+        }
+      );
+      console.log("获取主页发布帖子：", response.data);
+      setHomePageThread(response.data);
+    } catch (err) {
+      console.error("获取主页发布帖子失败", err);
+      toast.current?.show({
+        severity: "error",
+        summary: "error",
+        detail: "获取主页发布帖子失败",
+      });
+    }
+  };
+
+  useEffect(() => {
+    fetchThreadList();
+  }, [threadFirst, threadRows]);
+
+  // 获取用户发布的所有帖子
+  const fetchThreadList = async () => {
+    try {
+      const pageNumber = threadFirst / threadRows + 1;
+      const response = await axios.get<ThreadList>(
+        process.env.PUBLIC_URL + `/user/thread`,
+        {
+          params: { userId: userId, pageNumber: pageNumber, rows: threadRows },
+        }
+      );
+      console.log("获取我的帖子：", response.data);
+      setThreadList(response.data.records);
+      setTotalThreads(response.data.total);
+    } catch (err) {
+      console.error("获取我的帖子失败", err);
+      toast.current?.show({
+        severity: "error",
+        summary: "error",
+        detail: "获取我的帖子失败",
+      });
+    }
+  };
+
+  useEffect(() => {
+    fetchRewardList();
+  }, [rewardFirst, rewardRows]);
+
+  // 获取用户发布的所有悬赏
+  const fetchRewardList = async () => {
+    try {
+      const pageNumber = rewardFirst / rewardRows + 1;
+      const response = await axios.get<RewardList>(
+        process.env.PUBLIC_URL + `/user/reward`,
+        {
+          params: { userId: userId, pageNumber: pageNumber, rows: rewardRows },
+        }
+      );
+      console.log("获取我的悬赏：", response.data);
+      setRewardList(response.data.rewardList);
+      setTotalRewards(response.data.total);
+    } catch (err) {
+      console.error("获取我的悬赏失败", err);
+      toast.current?.show({
+        severity: "error",
+        summary: "error",
+        detail: "获取我的悬赏失败",
+      });
+    }
+  };
+
+  // 浮动按钮的子模块
+  const actions = [
+    {
+      template: () => (
+        <Button
+          label="管理资源"
+          onClick={() => router.push(`/user/manage/resources/`)}
+        />
+      ),
+    },
+    {
+      template: () => (
+        <Button
+          label="已购资源"
+          onClick={() => router.push(`/user/purchased-resources/`)}
+        />
+      ),
+    },
+    {
+      template: () => (
+        <Button label="发布资源" onClick={() => setVisible(true)} />
+      ),
+    },
+    {
+      template: () => <Button label="编辑悬赏" />,
+    },
+  ];
+
+  // 发布资源弹窗
+  const [visible, setVisible] = useState(false);
+  const [resourceFormData, setResourceFormData] = useState({
+    resource: {
+      resourceName: "",
+      resourcePicture: "",
+      resourceSummary: "",
+      resourceDetail: "",
+      uploadTime: "",
+      lastUpdateTime: "",
+      price: "",
+      classify: "",
+    },
+    resourceVersionName: "",
+    gameplayList: [""],
+    completeRewardId: null,
+    userId: 0,
+  });
+  const [ingredient, setIngredient] = useState<string>("");
+
+  // 删除悬赏弹窗
+  const [deleteVisible, setDeleteVisible] = useState(false);
+  // 要删除悬赏的id
+  const [deleteRewardId, setDeleteResourceId] = useState<number>(0);
+  // 处理删除悬赏接口
+  const handleDeleteSubmit = async () => {
+    try {
+      // 发送DELETE请求
+      const response = await axios.delete(process.env.PUBLIC_URL + `/reward`, {
+        params: { rewardId: deleteRewardId },
+      });
+      console.log("用户" + userId + "要删除" + deleteRewardId + "号悬赏");
+
+      if (response.status === 204) {
+        console.log("用户成功删除悬赏");
+        toast.current?.show({
+          severity: "success",
+          summary: "Success",
+          detail: "删除悬赏成功",
+        });
+        setDeleteVisible(false);
+        // 重新拉取资源列表
         fetchRewardList();
-    }, [rewardFirst, rewardRows]);
-
-    // 获取用户发布的所有悬赏
-    const fetchRewardList = async () => {
-        try {
-            const pageNumber = rewardFirst / rewardRows + 1;
-            const response = await axios.get<RewardList>(process.env.PUBLIC_URL + `/user/reward`, {
-                params: { userId: userId, pageNumber: pageNumber, rows: rewardRows }
-            })
-            console.log('获取我的悬赏：', response.data);
-            setRewardList(response.data.rewardList);
-            setTotalRewards(response.data.total)
-        } catch (err) {
-            console.error('获取我的悬赏失败', err);
-            toast.current?.show({ severity: 'error', summary: 'error', detail: '获取我的悬赏失败' });
-        }
+      }
+    } catch (error) {
+      console.error("资源删除失败:", error);
+      toast.current?.show({
+        severity: "error",
+        summary: "error",
+        detail: "密码错误，资源删除失败",
+      });
     }
+  };
 
-    // 浮动按钮的子模块
-    const actions = [
-        {
-            template: () => (
-                <Button label="管理资源" onClick={() => router.push(`/user/manage/resources/`)} />
-            )
-        },
-        {
-            template: () => (
-                <Button label="已购资源" onClick={() => router.push(`/user/purchased-resources/`)} />
-            )
-        },
-        {
-            template: () => (
-                <Button label="发布资源" onClick={() => setVisible(true)} />
-            )
-        },
-        {
-            template: () => (
-                <Button label="编辑悬赏" />
-            )
-        }
-    ];
+  // 编辑悬赏弹窗
+  const [editVisible, setEditVisible] = useState(false);
+  // 悬赏封面路径
+  const [rewardPictureUrl, setRewardPictureUrl] = useState<string>("");
+  const [editRewardFormData, setEditRewardFormData] = useState({
+    rewardId: 0,
+    rewardName: "",
+    price: "",
+    rewardDescription: "",
+  });
 
-    // 发布资源弹窗
-    const [visible, setVisible] = useState(false);
-    const [resourceFormData, setResourceFormData] = useState({
+  // 处理编辑资源接口
+  const handleEditSubmit = async () => {
+    try {
+      const postData = {
+        rewardId: editRewardFormData.rewardId,
+        rewardName: editRewardFormData.rewardName,
+        rewardPicture: rewardPictureUrl,
+        price: toNumber(editRewardFormData.price),
+        rewardDescription: editRewardFormData.rewardDescription,
+      };
+      // 发送POST请求
+      const response = await axios.put(
+        process.env.PUBLIC_URL + "/reward/info",
+        postData
+      );
+      console.log("编辑悬赏的信息：", postData);
+
+      if (response.status === 200) {
+        toast.current?.show({
+          severity: "success",
+          summary: "Success",
+          detail: "悬赏编辑成功",
+        });
+        // 编辑成功
+        setEditVisible(false);
+        fetchRewardList();
+      }
+    } catch (error) {
+      console.error("悬赏编辑失败:", error);
+      toast.current?.show({
+        severity: "error",
+        summary: "error",
+        detail: "悬赏编辑失败",
+      });
+    }
+  };
+
+  // 上传资源接口
+  const handleSubmit = async () => {
+    try {
+      // 规定用户必须输入的内容
+      if (resourceFormData.resource.resourceName == "") {
+        toast.current?.show({
+          severity: "info",
+          summary: "error",
+          detail: "缺少资源名称",
+        });
+        return;
+      }
+      if (resourceFormData.resource.resourceSummary == "") {
+        toast.current?.show({
+          severity: "info",
+          summary: "error",
+          detail: "缺少资源简介",
+        });
+        return;
+      }
+      if (resourceFormData.resourceVersionName == "") {
+        toast.current?.show({
+          severity: "info",
+          summary: "error",
+          detail: "缺少资源版本名",
+        });
+        return;
+      }
+      if (resourceFormData.resource.price == "") {
+        toast.current?.show({
+          severity: "info",
+          summary: "error",
+          detail: "缺少资源价格",
+        });
+        return;
+      }
+      if (resourceFormData.resource.classify == "") {
+        toast.current?.show({
+          severity: "info",
+          summary: "error",
+          detail: "缺少资源分类",
+        });
+        return;
+      }
+      if (
+        resourceFormData.gameplayList.length === 1 &&
+        resourceFormData.gameplayList[0] === ""
+      ) {
+        toast.current?.show({
+          severity: "info",
+          summary: "error",
+          detail: "缺少资源标签",
+        });
+        return;
+      }
+      if (resourcePictureUrl === "") {
+        toast.current?.show({
+          severity: "info",
+          summary: "error",
+          detail: "缺少资源封面",
+        });
+        return;
+      }
+
+      const currentDate = new Date().toISOString().split("T")[0];
+      const postData = {
         resource: {
-            resourceName: '',
-            resourcePicture: '',
-            resourceSummary: '',
-            resourceDetail: '',
-            uploadTime: '',
-            lastUpdateTime: '',
-            price: '',
-            classify: '',
+          resourceName: resourceFormData.resource.resourceName,
+          resourcePicture: resourcePictureUrl,
+          resourceSummary: resourceFormData.resource.resourceSummary,
+          resourceDetail: resourceFormData.resource.resourceDetail,
+          uploadTime: currentDate,
+          lastUpdateTime: currentDate,
+          price: toNumber(resourceFormData.resource.price),
+          classify: resourceFormData.resource.classify,
         },
-        gameplayList: [''],
+        gameplayList: resourceFormData.gameplayList,
+        resourceVersionName: resourceFormData.resourceVersionName,
         completeRewardId: null,
-        userId: 0,
-    });
-    const [ingredient, setIngredient] = useState<string>('');
+        userId, // 记得用户登录状态获取
+      };
+      // 发送POST请求
+      const response = await axios.post(
+        process.env.PUBLIC_URL + "/resource",
+        postData
+      );
+      console.log("上传资源的信息：", postData);
 
-    // 删除悬赏弹窗
-    const [deleteVisible, setDeleteVisible] = useState(false);
-    // 要删除悬赏的id
-    const [deleteRewardId, setDeleteResourceId] = useState<number>(0);
-    // 处理删除悬赏接口
-    const handleDeleteSubmit = async () => {
+      if (response.status === 200) {
+        toast.current?.show({
+          severity: "success",
+          summary: "Success",
+          detail: "资源上传成功",
+        });
+        console.log(torrentUrl);
         try {
-            // 发送DELETE请求
-            const response = await axios.delete(process.env.PUBLIC_URL + `/reward`, {
-                params: { rewardId: deleteRewardId },
-            });
-            console.log("用户" + userId + "要删除" + deleteRewardId + "号悬赏");
-
-            if (response.status === 204) {
-                console.log("用户成功删除悬赏");
-                toast.current?.show({ severity: 'success', summary: 'Success', detail: '删除悬赏成功' });
-                setDeleteVisible(false);
-                // 重新拉取资源列表
-                fetchRewardList();
+          const versionResponse = await axios.post(
+            `${process.env.PUBLIC_URL}/resource/version`,
+            {
+              resourceVersionName: postData.resourceVersionName,
+              resourceId: Number(response.data),
             }
-        } catch (error) {
-            console.error('资源删除失败:', error);
-            toast.current?.show({ severity: 'error', summary: 'error', detail: '密码错误，资源删除失败' });
+          );
+          // 上传资源文件
+          const btPayload = {
+            torrentUrl: torrentUrl,
+            infoHash: "8",
+            uploadTime: currentDate,
+            uploaderUserId: userId,
+            resourceVersionId: Number(versionResponse.data),
+          };
+
+          await axios.post(`${process.env.PUBLIC_URL}/file/bt`, btPayload);
+          toast.current?.show({
+            severity: "success",
+            summary: "资源登记成功",
+            detail: "已同步种子信息",
+          });
+        } catch (btError) {
+          console.error("种子登记失败:", btError);
+          toast.current?.show({
+            severity: "warn",
+            summary: "资源已上传",
+            detail: "但种子登记失败",
+          });
         }
-    };
 
+        // 上传成功
+        setVisible(false);
+        // 重置表单
+        setResourceFormData({
+          resource: {
+            resourceName: "",
+            resourcePicture: "",
+            resourceSummary: "",
+            resourceDetail: "",
+            uploadTime: "",
+            lastUpdateTime: "",
+            price: "",
+            classify: "",
+          },
+          resourceVersionName: "",
+          gameplayList: [],
+          completeRewardId: null,
+          userId: 0,
+        });
+        // 重置资源分类
+        setIngredient("");
+        // 重置资源标签
+        setSelectedGameplay([]);
+        // 重置资源封面
+        setResourcePictureUrl("");
+        setTorrentUrl("");
+      }
+    } catch (error) {
+      console.error("资源上传失败:", error);
+      toast.current?.show({
+        severity: "error",
+        summary: "error",
+        detail: "资源上传失败",
+      });
+    }
+  };
 
-    // 编辑悬赏弹窗
-    const [editVisible, setEditVisible] = useState(false);
-    // 悬赏封面路径
-    const [rewardPictureUrl, setRewardPictureUrl] = useState<string>('');
-    const [editRewardFormData, setEditRewardFormData] = useState({
-        rewardId: 0,
-        rewardName: '',
-        price: '',
-        rewardDescription: '',
-    });
+  return (
+    <div className="user-container">
+      <Toast ref={toast}></Toast>
+      {/*个人信息*/}
+      <div className="user-profile-card">
+        <Avatar
+          image={userInfo?.avatar}
+          className="user-avatar"
+          shape="circle"
+        />
+        <div className="user-info">
+          <div className="user-detail-info">
+            <div className="name-container">
+              <h2 className="name">{userInfo?.username}</h2>
+              <span className="signature">{userInfo?.signature}</span>
+            </div>
 
-    // 处理编辑资源接口
-    const handleEditSubmit = async () => {
-        try {
-            const postData = {
-                rewardId: editRewardFormData.rewardId,
-                rewardName: editRewardFormData.rewardName,
-                rewardPicture: rewardPictureUrl,
-                price: toNumber(editRewardFormData.price),
-                rewardDescription: editRewardFormData.rewardDescription,
-            };
-            // 发送POST请求
-            const response = await axios.put(process.env.PUBLIC_URL + '/reward/info', postData);
-            console.log("编辑悬赏的信息：", postData);
+            <div className="stats-container">
+              <div className="stats">
+                <span className="stats-label">粉丝：</span>
+                <span className="stats-value">{userInfo?.followerCount}</span>
+              </div>
+              <div className="stats">
+                <span className="stats-label">累计上传量：</span>
+                <span className="stats-value">
+                  {formatCount(userData?.uploadAmount)}
+                </span>
+              </div>
+              <div className="stats">
+                <span className="stats-label">关注：</span>
+                <span className="stats-value">{userInfo?.subscriberCount}</span>
+              </div>
+              <div className="stats">
+                <span className="stats-label">累计被下载量：</span>
+                <span className="stats-value">
+                  {formatCount(userData?.beDownloadedAmount)}
+                </span>
+              </div>
+            </div>
+          </div>
 
-            if (response.status === 200) {
-                toast.current?.show({ severity: 'success', summary: 'Success', detail: '悬赏编辑成功' });
-                // 编辑成功
-                setEditVisible(false);
-                fetchRewardList();
-            }
-        } catch (error) {
-            console.error('悬赏编辑失败:', error);
-            toast.current?.show({ severity: 'error', summary: 'error', detail: '悬赏编辑失败' });
+          <Button label="关注" className="action-button" />
+        </div>
+      </div>
+
+      {/*个人内容*/}
+      <TabView
+        activeIndex={activeIndex}
+        onTabChange={(e) => setActiveIndex(e.index)}
+      >
+        <TabPanel header="主页">
+          {/*发布资源*/}
+          <div className="homepage-item">
+            <div className="section-header">
+              <h1>发布资源</h1>
+              <Button
+                label="显示更多"
+                link
+                onClick={() => router.push("/user/manage/resources/")}
+              />
+            </div>
+            <div className="resource-grid">
+              {resourceList.map((resourceList) => (
+                <Card
+                  key={resourceList.resourceId}
+                  className="resource-card"
+                  onClick={() =>
+                    router.push(
+                      `/resource/resource-detail/${resourceList.resourceId}`
+                    )
+                  }
+                >
+                  <Image
+                    src={resourceList.resourcePicture}
+                    alt={resourceList.resourceName}
+                    width="368"
+                    height="200"
+                  />
+                  <div className="card-content">
+                    <h3>{resourceList.resourceName}</h3>
+                    <div className="view-count">
+                      <Fire theme="outline" size="16" fill="#FF8D1A" />
+                      <span>{resourceList.likes}</span>
+                    </div>
+                  </div>
+                </Card>
+              ))}
+            </div>
+          </div>
+
+          {/*发布帖子*/}
+          <div className="homepage-item">
+            <div className="section-header">
+              <h1>发布帖子</h1>
+              <Button label="显示更多" link onClick={() => setActiveIndex(1)} />
+            </div>
+            <div className="resource-grid">
+              {homePageThread?.records.map((homePageThread) => (
+                <Card
+                  key={homePageThread.threadId}
+                  className="resource-card"
+                  onClick={() =>
+                    router.push(
+                      `/community/thread-detail/${homePageThread.threadId}`
+                    )
+                  }
+                >
+                  <Image
+                    src={homePageThread.threadPicture}
+                    alt={homePageThread.title}
+                    width="368"
+                    height="200"
+                  />
+                  <div className="card-content">
+                    <h3>{homePageThread.title}</h3>
+                    <div className="view-count">
+                      <Fire theme="outline" size="16" fill="#FF8D1A" />
+                      <span>{homePageThread.likes}</span>
+                    </div>
+                  </div>
+                </Card>
+              ))}
+            </div>
+          </div>
+        </TabPanel>
+
+        <TabPanel header="帖子">
+          {/*我的帖子*/}
+          <div className="homepage-item">
+            <div className="section-header">
+              <h1>我的帖子</h1>
+            </div>
+            <div className="resource-grid">
+              {threadList.map((threadList) => (
+                <Card
+                  key={threadList.threadId}
+                  className="resource-card"
+                  onClick={() =>
+                    router.push(
+                      `/community/thread-detail/${threadList.threadId}`
+                    )
+                  }
+                >
+                  <Image
+                    src={threadList.threadPicture}
+                    alt={threadList.title}
+                    width="368"
+                    height="200"
+                  />
+                  <div className="card-content">
+                    <h3>{threadList.title}</h3>
+                    <div className="view-count">
+                      <Fire theme="outline" size="16" fill="#FF8D1A" />
+                      <span>{threadList.likes}</span>
+                    </div>
+                  </div>
+                </Card>
+              ))}
+            </div>
+            {totalThreads > 6 && (
+              <Paginator
+                className="Paginator"
+                first={threadFirst}
+                rows={threadRows}
+                totalRecords={totalThreads}
+                rowsPerPageOptions={[6, 12]}
+                onPageChange={onThreadPageChange}
+              />
+            )}
+          </div>
+        </TabPanel>
+
+        <TabPanel header="收藏"></TabPanel>
+
+        <TabPanel header="数据"></TabPanel>
+
+        <TabPanel header="悬赏">
+          <div className="section-header">
+            <h1>我的悬赏</h1>
+          </div>
+
+          <div className="resource-list">
+            {rewardList.map((rewardItem) => (
+              <Card
+                key={rewardItem.rewardId}
+                className="resources-list-card"
+                onClick={() =>
+                  router.push(`/reward/reward-detail/${rewardItem.rewardId}`)
+                }
+              >
+                <Image
+                  alt="avatar"
+                  src={"rewards/" + rewardItem.rewardPicture}
+                  className="resource-avatar"
+                  width="250"
+                  height="140"
+                />
+                <div className="resource-header">
+                  <div className="resource-content">
+                    <h3>{rewardItem.rewardName}</h3>
+                  </div>
+
+                  <div className="resource-operation">
+                    <Button
+                      label="编辑"
+                      onClick={(e) => {
+                        e.stopPropagation(); // 关键修复：阻止事件冒泡，避免触发Card的点击事件
+                        setEditVisible(true);
+
+                        setEditRewardFormData({
+                          rewardId: rewardItem.rewardId,
+                          rewardName: rewardItem.rewardName,
+                          price: rewardItem.price.toString(),
+                          rewardDescription: rewardItem.rewardDescription,
+                        });
+                        console.log("用户编辑悬赏");
+                      }}
+                    />
+                    <Button
+                      label="删除"
+                      onClick={(e) => {
+                        e.stopPropagation(); // 关键修复：阻止事件冒泡，避免触发Card的点击事件
+                        setDeleteResourceId(rewardItem.rewardId);
+                        setDeleteVisible(true);
+                      }}
+                      style={{ backgroundColor: "rgba(255, 87, 51, 1)" }}
+                    />
+                  </div>
+                </div>
+              </Card>
+            ))}
+
+            {totalRewards > 5 && (
+              <Paginator
+                className="Paginator"
+                first={rewardFirst}
+                rows={rewardRows}
+                totalRecords={totalRewards}
+                rowsPerPageOptions={[5, 10]}
+                onPageChange={onRewardPageChange}
+              />
+            )}
+          </div>
+        </TabPanel>
+      </TabView>
+
+      {/*浮动按钮*/}
+      <div className="card">
+        <SpeedDial
+          model={actions}
+          direction="up"
+          style={{ position: "fixed", bottom: "2rem", right: "2rem" }}
+          showIcon="pi pi-plus"
+          hideIcon="pi pi-times"
+          buttonClassName="custom-speeddial-button"
+        />
+      </div>
+
+      {/*发布资源弹窗*/}
+      <Dialog
+        header="发布资源"
+        visible={visible}
+        onHide={() => setVisible(false)}
+        className="publish-dialog"
+        modal
+        footer={
+          <div className="dialog-footer">
+            <Button
+              label="发布"
+              icon="pi pi-check"
+              onClick={handleSubmit}
+              autoFocus
+            />
+            <Button
+              label="取消"
+              icon="pi pi-times"
+              onClick={() => setVisible(false)}
+              className="p-button-text"
+            />
+          </div>
         }
-    };
+      >
+        <div className="publish-form">
+          <div className="form-field">
+            <div className="form-field-header">
+              <span className="form-field-sign">*</span>
+              <label htmlFor="name">资源名称</label>
+            </div>
+            <InputText
+              id="name"
+              value={resourceFormData.resource.resourceName}
+              onChange={(e) =>
+                setResourceFormData((prev) => ({
+                  ...prev, // 复制顶层所有属性
+                  resource: {
+                    ...prev.resource, // 复制resource对象的所有属性
+                    resourceName: e.target.value, // 只更新resourceName
+                  },
+                }))
+              }
+              placeholder="请输入资源名称"
+              className="w-full"
+            />
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <span className="form-field-sign">*</span>
+              <label htmlFor="summary">资源简介</label>
+            </div>
+            <InputText
+              id="summary"
+              value={resourceFormData.resource.resourceSummary}
+              onChange={(e) =>
+                setResourceFormData((prev) => ({
+                  ...prev, // 复制顶层所有属性
+                  resource: {
+                    ...prev.resource, // 复制resource对象的所有属性
+                    resourceSummary: e.target.value,
+                  },
+                }))
+              }
+              placeholder="请输入资源简介（一句话）"
+              className="w-full"
+            />
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <span className="form-field-sign">*</span>
+              <label htmlFor="summary">资源版本名</label>
+            </div>
+            <InputText
+              id="summary"
+              value={resourceFormData.resourceVersionName}
+              onChange={(e) =>
+                setResourceFormData((prev) => ({
+                  ...prev, // 复制顶层所有属性
+                  resourceVersionName: e.target.value,
+                }))
+              }
+              placeholder="请输入资源版本名"
+              className="w-full"
+            />
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <label htmlFor="detail">资源介绍</label>
+            </div>
+            <InputTextarea
+              id="detail"
+              value={resourceFormData.resource.resourceDetail}
+              onChange={(e) =>
+                setResourceFormData((prev) => ({
+                  ...prev, // 复制顶层所有属性
+                  resource: {
+                    ...prev.resource, // 复制resource对象的所有属性
+                    resourceDetail: e.target.value,
+                  },
+                }))
+              }
+              rows={5}
+              placeholder="请输入资源介绍"
+              className="w-full"
+            />
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <span className="form-field-sign">*</span>
+              <label htmlFor="price">价格</label>
+            </div>
+            <InputText
+              id="price"
+              value={resourceFormData.resource.price}
+              onChange={(e) =>
+                setResourceFormData((prev) => ({
+                  ...prev, // 复制顶层所有属性
+                  resource: {
+                    ...prev.resource, // 复制resource对象的所有属性
+                    price: e.target.value,
+                  },
+                }))
+              }
+              placeholder="请输入资源价格"
+              className="w-full"
+            />
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <span className="form-field-sign">*</span>
+              <label htmlFor="classify">资源分类（请选择一项）</label>
+            </div>
+            <div className="form-field-classify">
+              <div className="flex align-items-center">
+                <RadioButton
+                  inputId="ingredient1"
+                  name="pizza"
+                  value="resourcePack"
+                  onChange={(e: RadioButtonChangeEvent) => {
+                    setResourceFormData((prev) => ({
+                      ...prev, // 复制顶层所有属性
+                      resource: {
+                        ...prev.resource, // 复制resource对象的所有属性
+                        classify: e.target.value,
+                      },
+                    }));
+                    setIngredient(e.value);
+                    console.log(ingredient);
+                    // console.log(resourceFormData.resource.classify);
+                  }}
+                  checked={ingredient === "resourcePack"}
+                />
+                <label htmlFor="ingredient1" className="ml-2">
+                  材质包
+                </label>
+              </div>
+              <div className="flex align-items-center">
+                <RadioButton
+                  inputId="ingredient2"
+                  name="pizza"
+                  value="modPack"
+                  onChange={(e: RadioButtonChangeEvent) => {
+                    setResourceFormData((prev) => ({
+                      ...prev, // 复制顶层所有属性
+                      resource: {
+                        ...prev.resource, // 复制resource对象的所有属性
+                        classify: e.target.value,
+                      },
+                    }));
+                    setIngredient(e.value);
+                  }}
+                  checked={ingredient === "modPack"}
+                />
+                <label htmlFor="ingredient2" className="ml-2">
+                  整合包
+                </label>
+              </div>
+              <div className="flex align-items-center">
+                <RadioButton
+                  inputId="ingredient3"
+                  name="pizza"
+                  value="mod"
+                  onChange={(e: RadioButtonChangeEvent) => {
+                    setResourceFormData((prev) => ({
+                      ...prev, // 复制顶层所有属性
+                      resource: {
+                        ...prev.resource, // 复制resource对象的所有属性
+                        classify: e.target.value,
+                      },
+                    }));
+                    setIngredient(e.value);
+                  }}
+                  checked={ingredient === "mod"}
+                />
+                <label htmlFor="ingredient3" className="ml-2">
+                  模组
+                </label>
+              </div>
+              <div className="flex align-items-center">
+                <RadioButton
+                  inputId="ingredient4"
+                  name="pizza"
+                  value="map"
+                  onChange={(e: RadioButtonChangeEvent) => {
+                    setResourceFormData((prev) => ({
+                      ...prev, // 复制顶层所有属性
+                      resource: {
+                        ...prev.resource, // 复制resource对象的所有属性
+                        classify: e.target.value,
+                      },
+                    }));
+                    setIngredient(e.value);
+                  }}
+                  checked={ingredient === "map"}
+                />
+                <label htmlFor="ingredient4" className="ml-2">
+                  地图
+                </label>
+              </div>
+            </div>
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <span className="form-field-sign">*</span>
+              <label htmlFor="gameplayList">资源标签</label>
+            </div>
+            <MultiSelect
+              value={selectedGameplay}
+              onChange={(e: MultiSelectChangeEvent) => {
+                const selectedOptions = e.value as GameplayOption[];
+                // 提取选中项的 name 属性组成字符串数组
+                const selectedNames = selectedOptions.map((item) => item.name);
 
-    // 上传资源接口
-    const handleSubmit = async () => {
-        try {
-            // 规定用户必须输入的内容
-            if (resourceFormData.resource.resourceName == '') {
-                toast.current?.show({ severity: 'info', summary: 'error', detail: '缺少资源名称' });
-                return;
-            }
-            if (resourceFormData.resource.resourceSummary == '') {
-                toast.current?.show({ severity: 'info', summary: 'error', detail: '缺少资源简介' });
-                return;
-            }
-            if (resourceFormData.resource.price == '') {
-                toast.current?.show({ severity: 'info', summary: 'error', detail: '缺少资源价格' });
-                return;
-            }
-            if (resourceFormData.resource.classify == '') {
-                toast.current?.show({ severity: 'info', summary: 'error', detail: '缺少资源分类' });
-                return;
-            }
-            if (
-                resourceFormData.gameplayList.length === 1 &&
-                resourceFormData.gameplayList[0] === ''
-            ) {
-                toast.current?.show({ severity: 'info', summary: 'error', detail: '缺少资源标签' });
-                return;
-            }
-            if (resourcePictureUrl === '') {
-                toast.current?.show({ severity: 'info', summary: 'error', detail: '缺少资源封面' });
-                return;
-            }
-
-            const currentDate = new Date().toISOString().split('T')[0];
-            const postData = {
-                resource: {
-                    resourceName: resourceFormData.resource.resourceName,
-                    resourcePicture: resourcePictureUrl,
-                    resourceSummary: resourceFormData.resource.resourceSummary,
-                    resourceDetail: resourceFormData.resource.resourceDetail,
-                    uploadTime: currentDate,
-                    lastUpdateTime: currentDate,
-                    price: toNumber(resourceFormData.resource.price),
-                    classify: resourceFormData.resource.classify,
-                },
-                gameplayList: resourceFormData.gameplayList,
-                completeRewardId: null,
-                userId, // 记得用户登录状态获取
-            };
-            // 发送POST请求
-            const response = await axios.post(process.env.PUBLIC_URL + '/resource', postData);
-            console.log("上传资源的信息：", postData);
-
-            if (response.status === 200) {
-                toast.current?.show({ severity: 'success', summary: 'Success', detail: '资源上传成功' });
-                console.log(torrentUrl)
-                // 上传资源文件
-                const btPayload = {
-                    torrentUrl: torrentUrl,
-                    infoHash: '8',
-                    uploadTime: currentDate,
-                    uploaderUserId: userId,
-                    resourceVersionId: 1
-                };
+                setResourceFormData((prev) => ({
+                  ...prev,
+                  gameplayList: selectedNames,
+                }));
+                setSelectedGameplay(selectedOptions);
+              }}
+              options={gameplayOptions}
+              display="chip"
+              optionLabel="name"
+              placeholder="请选择资源标签"
+              className="w-full md:w-20rem"
+            />
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <span className="form-field-sign">*</span>
+              <label>封面图片</label>
+            </div>
+            <FileUpload
+              mode="advanced"
+              name="resource-image"
+              customUpload
+              uploadHandler={async (e) => {
+                const formData = new FormData();
+                formData.append("file", e.files[0]);
 
                 try {
-                    await axios.post(`${process.env.PUBLIC_URL}/file/bt`, btPayload);
-                    toast.current?.show({ severity: 'success', summary: '资源登记成功', detail: '已同步种子信息' });
-                } catch (btError) {
-                    console.error("种子登记失败:", btError);
-                    toast.current?.show({ severity: 'warn', summary: '资源已上传', detail: '但种子登记失败' });
+                  const res = await axios.post(
+                    `${process.env.PUBLIC_URL}/file`,
+                    formData
+                  );
+
+                  const fileUrl = res.data.url;
+                  console.log(fileUrl);
+                  setResourcePictureUrl(fileUrl);
+                  toast.current?.show({
+                    severity: "success",
+                    summary: "上传成功",
+                  });
+                } catch (error) {
+                  console.log(error);
+                  toast.current?.show({
+                    severity: "error",
+                    summary: "上传失败",
+                  });
                 }
-
-                // 上传成功
-                setVisible(false);
-                // 重置表单
-                setResourceFormData({
-                    resource: {
-                        resourceName: '',
-                        resourcePicture: '',
-                        resourceSummary: '',
-                        resourceDetail: '',
-                        uploadTime: '',
-                        lastUpdateTime: '',
-                        price: '',
-                        classify: '',
-                    },
-                    gameplayList: [],
-                    completeRewardId: null,
-                    userId: 0,
-                });
-                // 重置资源分类
-                setIngredient("");
-                // 重置资源标签
-                setSelectedGameplay([]);
-                // 重置资源封面
-                setResourcePictureUrl('');
-                setTorrentUrl('');
-            }
-        } catch (error) {
-            console.error('资源上传失败:', error);
-            toast.current?.show({ severity: 'error', summary: 'error', detail: '资源上传失败' });
-        }
-    };
-
-    return (
-        <div className="user-container">
-            <Toast ref={toast}></Toast>
-            {/*个人信息*/}
-            <div className="user-profile-card">
-                <Avatar
-                    image={userInfo?.avatar}
-                    className="user-avatar"
-                    shape="circle"
-                />
-                <div className="user-info">
-                    <div className="user-detail-info">
-                        <div className="name-container">
-                            <h2 className="name">{userInfo?.username}</h2>
-                            <span className="signature">{userInfo?.signature}</span>
-                        </div>
-
-                        <div className="stats-container">
-                            <div className="stats">
-                                <span className="stats-label">粉丝：</span>
-                                <span className="stats-value">{userInfo?.followerCount}</span>
-                            </div>
-                            <div className="stats">
-                                <span className="stats-label">累计上传量：</span>
-                                <span className="stats-value">{formatCount(userData?.uploadAmount)}</span>
-                            </div>
-                            <div className="stats">
-                                <span className="stats-label">关注：</span>
-                                <span className="stats-value">{userInfo?.subscriberCount}</span>
-                            </div>
-                            <div className="stats">
-                                <span className="stats-label">累计被下载量：</span>
-                                <span className="stats-value">{formatCount(userData?.beDownloadedAmount)}</span>
-                            </div>
-                        </div>
-                    </div>
-
-                    <Button label="关注" className="action-button" />
-                </div>
+              }}
+              auto
+              chooseLabel="上传资源封面"
+            />
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <span className="form-field-sign">*</span>
+              <label>上传资源文件</label>
             </div>
+            <FileUpload
+              mode="advanced"
+              name="resource-file"
+              customUpload
+              uploadHandler={async (e) => {
+                const formData = new FormData();
+                formData.append("file", e.files[0]);
 
-            {/*个人内容*/}
-            <TabView activeIndex={activeIndex} onTabChange={(e) => setActiveIndex(e.index)}>
-                <TabPanel header="主页" >
-                    {/*发布资源*/}
-                    <div className="homepage-item">
-                        <div className="section-header">
-                            <h1>发布资源</h1>
-                            <Button
-                                label="显示更多"
-                                link
-                                onClick={() => router.push('/user/manage/resources/')}
-                            />
-                        </div>
-                        <div className="resource-grid">
-                            {resourceList.map((resourceList) => (
-                                <Card key={resourceList.resourceId} className="resource-card" onClick={() => router.push(`/resource/resource-detail/${resourceList.resourceId}`)}>
-                                    <Image
-                                        src={ resourceList.resourcePicture}
-                                        alt={resourceList.resourceName}
-                                        width="368"
-                                        height="200"
-                                    />
-                                    <div className="card-content">
-                                        <h3>{resourceList.resourceName}</h3>
-                                        <div className="view-count">
-                                            <Fire theme="outline" size="16" fill="#FF8D1A" />
-                                            <span>{resourceList.likes}</span>
-                                        </div>
-                                    </div>
-                                </Card>
-                            ))}
-                        </div>
-                    </div>
-
-                    {/*发布帖子*/}
-                    <div className="homepage-item">
-                        <div className="section-header">
-                            <h1>发布帖子</h1>
-                            <Button
-                                label="显示更多"
-                                link
-                                onClick={() => setActiveIndex(1)}
-                            />
-                        </div>
-                        <div className="resource-grid">
-                            {homePageThread?.records.map((homePageThread) => (
-                                <Card key={homePageThread.threadId} className="resource-card" onClick={() => router.push(`/community/thread-detail/${homePageThread.threadId}`)}>
-                                    <Image
-                                        src={ homePageThread.threadPicture}
-                                        alt={homePageThread.title}
-                                        width="368"
-                                        height="200"
-                                    />
-                                    <div className="card-content">
-                                        <h3>{homePageThread.title}</h3>
-                                        <div className="view-count">
-                                            <Fire theme="outline" size="16" fill="#FF8D1A" />
-                                            <span>{homePageThread.likes}</span>
-                                        </div>
-                                    </div>
-                                </Card>
-                            ))}
-                        </div>
-                    </div>
-                </TabPanel>
-
-                <TabPanel header="帖子">
-                    {/*我的帖子*/}
-                    <div className="homepage-item">
-                        <div className="section-header">
-                            <h1>我的帖子</h1>
-                        </div>
-                        <div className="resource-grid">
-                            {threadList.map((threadList) => (
-                                <Card key={threadList.threadId} className="resource-card" onClick={() => router.push(`/community/thread-detail/${threadList.threadId}`)}>
-                                    <Image
-                                        src={ threadList.threadPicture}
-                                        alt={threadList.title}
-                                        width="368"
-                                        height="200"
-                                    />
-                                    <div className="card-content">
-                                        <h3>{threadList.title}</h3>
-                                        <div className="view-count">
-                                            <Fire theme="outline" size="16" fill="#FF8D1A" />
-                                            <span>{threadList.likes}</span>
-                                        </div>
-                                    </div>
-                                </Card>
-                            ))}
-                        </div>
-                        {totalThreads > 6 && <Paginator
-                            className="Paginator"
-                            first={threadFirst}
-                            rows={threadRows}
-                            totalRecords={totalThreads}
-                            rowsPerPageOptions={[6, 12]}
-                            onPageChange={onThreadPageChange}
-                        />}
-                    </div>
-                </TabPanel>
-
-                <TabPanel header="收藏">
-
-                </TabPanel>
-
-                <TabPanel header="数据">
-
-                </TabPanel>
-
-                <TabPanel header="悬赏">
-                    <div className="section-header">
-                        <h1>我的悬赏</h1>
-                    </div>
-
-                    <div className="resource-list">
-                        {rewardList.map((rewardItem) => (
-                            <Card key={rewardItem.rewardId} className="resources-list-card"
-                                onClick={() => router.push(`/reward/reward-detail/${rewardItem.rewardId}`)}>
-                                <Image alt="avatar"
-                                       src={ "rewards/" + rewardItem.rewardPicture}
-                                       className="resource-avatar" width="250" height="140"/>
-                                <div className="resource-header">
-                                    <div className="resource-content">
-                                        <h3>{rewardItem.rewardName}</h3>
-                                    </div>
-
-                                    <div className="resource-operation">
-                                        <Button
-                                            label="编辑"
-                                            onClick={(e) => {
-                                                e.stopPropagation(); // 关键修复：阻止事件冒泡，避免触发Card的点击事件
-                                                setEditVisible(true);
-
-                                                setEditRewardFormData({
-                                                    rewardId: rewardItem.rewardId,
-                                                    rewardName: rewardItem.rewardName,
-                                                    price: rewardItem.price.toString(),
-                                                    rewardDescription: rewardItem.rewardDescription,
-                                                });
-                                                console.log("用户编辑悬赏");
-                                            }}
-                                        />
-                                        <Button
-                                            label="删除"
-                                            onClick={(e) => {
-                                                e.stopPropagation(); // 关键修复：阻止事件冒泡，避免触发Card的点击事件
-                                                setDeleteResourceId(rewardItem.rewardId);
-                                                setDeleteVisible(true);
-                                            }}
-                                            style={{ backgroundColor: "rgba(255, 87, 51, 1)" }}
-                                        />
-                                    </div>
-                                </div>
-                            </Card>
-                        ))}
-
-                        {totalRewards > 5 && <Paginator
-                            className="Paginator"
-                            first={rewardFirst}
-                            rows={rewardRows}
-                            totalRecords={totalRewards}
-                            rowsPerPageOptions={[5, 10]}
-                            onPageChange={onRewardPageChange}
-                        />}
-                    </div>
-                </TabPanel>
-            </TabView>
-
-            {/*浮动按钮*/}
-            <div className="card">
-                <SpeedDial
-                    model={actions}
-                    direction="up"
-                    style={{ position: 'fixed', bottom: '2rem', right: '2rem' }}
-                    showIcon="pi pi-plus"
-                    hideIcon="pi pi-times"
-                    buttonClassName="custom-speeddial-button"
-                />
-            </div>
-
-            {/*发布资源弹窗*/}
-            <Dialog
-                header="发布资源"
-                visible={visible}
-                onHide={() => setVisible(false)}
-                className="publish-dialog"
-                modal
-                footer={
-                    <div className="dialog-footer">
-                        <Button label="发布" icon="pi pi-check" onClick={handleSubmit} autoFocus />
-                        <Button label="取消" icon="pi pi-times" onClick={() => setVisible(false)} className="p-button-text" />
-                    </div>
+                try {
+                  const res = await axios.post(
+                    `${process.env.PUBLIC_URL}/file`,
+                    formData
+                  );
+                  const fileUrl = res.data;
+                  console.log("上传的 torrent 文件 URL:", fileUrl);
+                  setTorrentUrl(fileUrl);
+                  toast.current?.show({
+                    severity: "success",
+                    summary: "上传成功",
+                    detail: "资源文件已上传",
+                  });
+                } catch (error) {
+                  console.error("上传资源文件失败:", error);
+                  toast.current?.show({
+                    severity: "error",
+                    summary: "上传失败",
+                    detail: "资源文件上传失败",
+                  });
                 }
-            >
-                <div className="publish-form">
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <span className="form-field-sign">*</span>
-                            <label htmlFor="name">资源名称</label>
-                        </div>
-                        <InputText
-                            id="name"
-                            value={resourceFormData.resource.resourceName}
-                            onChange={(e) => setResourceFormData(prev => ({
-                                ...prev, // 复制顶层所有属性
-                                resource: {
-                                    ...prev.resource, // 复制resource对象的所有属性
-                                    resourceName: e.target.value  // 只更新resourceName
-                                }
-                            }))}
-                            placeholder="请输入资源名称"
-                            className="w-full"
-                        />
-                    </div>
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <span className="form-field-sign">*</span>
-                            <label htmlFor="summary">资源简介</label>
-                        </div>
-                        <InputText
-                            id="summary"
-                            value={resourceFormData.resource.resourceSummary}
-                            onChange={(e) => setResourceFormData(prev => ({
-                                ...prev, // 复制顶层所有属性
-                                resource: {
-                                    ...prev.resource, // 复制resource对象的所有属性
-                                    resourceSummary: e.target.value
-                                }
-                            }))}
-                            placeholder="请输入资源简介（一句话）"
-                            className="w-full"
-                        />
-                    </div>
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <label htmlFor="detail">资源介绍</label>
-                        </div>
-                        <InputTextarea
-                            id="detail"
-                            value={resourceFormData.resource.resourceDetail}
-                            onChange={(e) => setResourceFormData(prev => ({
-                                ...prev, // 复制顶层所有属性
-                                resource: {
-                                    ...prev.resource, // 复制resource对象的所有属性
-                                    resourceDetail: e.target.value
-                                }
-                            }))}
-                            rows={5}
-                            placeholder="请输入资源介绍"
-                            className="w-full"
-                        />
-                    </div>
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <span className="form-field-sign">*</span>
-                            <label htmlFor="price">价格</label>
-                        </div>
-                        <InputText
-                            id="price"
-                            value={resourceFormData.resource.price}
-                            onChange={(e) => setResourceFormData(prev => ({
-                                ...prev, // 复制顶层所有属性
-                                resource: {
-                                    ...prev.resource, // 复制resource对象的所有属性
-                                    price: e.target.value
-                                }
-                            }))}
-                            placeholder="请输入资源价格"
-                            className="w-full"
-                        />
-                    </div>
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <span className="form-field-sign">*</span>
-                            <label htmlFor="classify">资源分类（请选择一项）</label>
-                        </div>
-                        <div className="form-field-classify">
-                            <div className="flex align-items-center">
-                                <RadioButton
-                                    inputId="ingredient1"
-                                    name="pizza"
-                                    value="resourcePack"
-                                    onChange={(e: RadioButtonChangeEvent) => {
-                                        setResourceFormData(prev => ({
-                                            ...prev, // 复制顶层所有属性
-                                            resource: {
-                                                ...prev.resource, // 复制resource对象的所有属性
-                                                classify: e.target.value
-                                            }
-                                        }));
-                                        setIngredient(e.value);
-                                        console.log(ingredient);
-                                        // console.log(resourceFormData.resource.classify);
-                                    }}
-                                    checked={ingredient === 'resourcePack'}
-                                />
-                                <label htmlFor="ingredient1" className="ml-2">材质包</label>
-                            </div>
-                            <div className="flex align-items-center">
-                                <RadioButton
-                                    inputId="ingredient2"
-                                    name="pizza"
-                                    value="modPack"
-                                    onChange={(e: RadioButtonChangeEvent) => {
-                                        setResourceFormData(prev => ({
-                                            ...prev, // 复制顶层所有属性
-                                            resource: {
-                                                ...prev.resource, // 复制resource对象的所有属性
-                                                classify: e.target.value
-                                            }
-                                        }));
-                                        setIngredient(e.value);
-                                    }}
-                                    checked={ingredient === 'modPack'}
-                                />
-                                <label htmlFor="ingredient2" className="ml-2">整合包</label>
-                            </div>
-                            <div className="flex align-items-center">
-                                <RadioButton
-                                    inputId="ingredient3"
-                                    name="pizza"
-                                    value="mod"
-                                    onChange={(e: RadioButtonChangeEvent) => {
-                                        setResourceFormData(prev => ({
-                                            ...prev, // 复制顶层所有属性
-                                            resource: {
-                                                ...prev.resource, // 复制resource对象的所有属性
-                                                classify: e.target.value
-                                            }
-                                        }));
-                                        setIngredient(e.value);
-                                    }}
-                                    checked={ingredient === 'mod'}
-                                />
-                                <label htmlFor="ingredient3" className="ml-2">模组</label>
-                            </div>
-                            <div className="flex align-items-center">
-                                <RadioButton
-                                    inputId="ingredient4"
-                                    name="pizza"
-                                    value="map"
-                                    onChange={(e: RadioButtonChangeEvent) => {
-                                        setResourceFormData(prev => ({
-                                            ...prev, // 复制顶层所有属性
-                                            resource: {
-                                                ...prev.resource, // 复制resource对象的所有属性
-                                                classify: e.target.value
-                                            }
-                                        }));
-                                        setIngredient(e.value);
-                                    }}
-                                    checked={ingredient === 'map'}
-                                />
-                                <label htmlFor="ingredient4" className="ml-2">地图</label>
-                            </div>
-                        </div>
-                    </div>
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <span className="form-field-sign">*</span>
-                            <label htmlFor="gameplayList">资源标签</label>
-                        </div>
-                        <MultiSelect
-                            value={selectedGameplay}
-                            onChange={(e: MultiSelectChangeEvent) => {
-                                const selectedOptions = e.value as GameplayOption[];
-                                // 提取选中项的 name 属性组成字符串数组
-                                const selectedNames = selectedOptions.map(item => item.name);
-
-                                setResourceFormData(prev => ({
-                                    ...prev,
-                                    gameplayList: selectedNames
-                                }));
-                                setSelectedGameplay(selectedOptions);
-                            }}
-                            options={gameplayOptions}
-                            display="chip"
-                            optionLabel="name"
-                            placeholder="请选择资源标签"
-                            className="w-full md:w-20rem"
-                        />
-                    </div>
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <span className="form-field-sign">*</span>
-                            <label>封面图片</label>
-                        </div>
-                        <FileUpload
-                            mode="advanced"
-                            name="resource-image"
-                            customUpload
-                            uploadHandler={async (e) => {
-                                const formData = new FormData();
-                                formData.append("file", e.files[0]);
-
-                                try {
-                                    const res = await axios.post(`${process.env.PUBLIC_URL}/file`, formData);
-
-                                    const fileUrl = res.data.url;
-                                    console.log(fileUrl);
-                                    setResourcePictureUrl(fileUrl);
-                                    toast.current?.show({ severity: 'success', summary: '上传成功' });
-                                } catch (error) {
-                                    console.log(error);
-                                    toast.current?.show({ severity: 'error', summary: '上传失败' });
-                                }
-                            }}
-                            auto
-                            chooseLabel="上传资源封面"
-                        />
-                    </div>
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <span className="form-field-sign">*</span>
-                            <label>上传资源文件</label>
-                        </div>
-                        <FileUpload
-                            mode="advanced"
-                            name="resource-file"
-                            customUpload
-                            uploadHandler={async (e) => {
-                                const formData = new FormData();
-                                formData.append("file", e.files[0]);
-
-                                try {
-                                    const res = await axios.post(`${process.env.PUBLIC_URL}/file`, formData);
-                                    const fileUrl = res.data.url;
-                                    console.log("上传的 torrent 文件 URL:", fileUrl);
-                                    setTorrentUrl(fileUrl);
-                                    toast.current?.show({ severity: 'success', summary: '上传成功', detail: '资源文件已上传' });
-                                } catch (error) {
-                                    console.error("上传资源文件失败:", error);
-                                    toast.current?.show({ severity: 'error', summary: '上传失败', detail: '资源文件上传失败' });
-                                }
-                            }}
-                            auto
-                            chooseLabel="上传资源文件（.torrent）"
-                        />
-                    </div>
-
-                </div>
-            </Dialog>
-
-            {/*删除悬赏弹窗*/}
-            <Dialog
-                header="删除悬赏"
-                visible={deleteVisible}
-                onHide={() => setDeleteVisible(false)}
-                className="resource-delete-dialog"
-                modal
-                footer={
-                    <div className="dialog-footer">
-                        <Button label="确认" icon="pi pi-check" onClick={handleDeleteSubmit} autoFocus />
-                        <Button label="取消" icon="pi pi-times" onClick={() => setDeleteVisible(false)} className="p-button-text" />
-                    </div>
-                }
-            >
-                <div className="dialog-form">
-                    <span style={{ marginBottom: "10px" }}>
-                        确认是否删除该悬赏?
-                    </span>
-                </div>
-            </Dialog>
-
-            {/*编辑资源弹窗*/}
-            <Dialog
-                header="编辑资源"
-                visible={editVisible}
-                onHide={() => setEditVisible(false)}
-                className="resource-edit-dialog"
-                modal
-                footer={
-                    <div className="dialog-footer">
-                        <Button label="确认" icon="pi pi-check" onClick={handleEditSubmit} autoFocus />
-                        <Button label="取消" icon="pi pi-times" onClick={() => setEditVisible(false)} className="p-button-text" />
-                    </div>
-                }
-            >
-                <div className="dialog-form">
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <label htmlFor="name">更改标题</label>
-                        </div>
-                        <InputText
-                            id="name"
-                            value={editRewardFormData.rewardName}
-                            onChange={(e) => setEditRewardFormData(prev => ({
-                                ...prev,
-                                rewardName: e.target.value
-                            }))}
-                            className="w-full"
-                        />
-                    </div>
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <label htmlFor="price">更改定价</label>
-                        </div>
-                        <InputText
-                            id="price"
-                            value={editRewardFormData.price}
-                            onChange={(e) => setEditRewardFormData(prev => ({
-                                ...prev,
-                                price: e.target.value
-                            }))}
-                            className="w-full"
-                        />
-                    </div>
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <label htmlFor="description">更改需求</label>
-                        </div>
-                        <InputTextarea
-                            id="description"
-                            value={editRewardFormData.rewardDescription}
-                            onChange={(e) => setEditRewardFormData(prev => ({
-                                ...prev,
-                                rewardDescription: e.target.value
-                            }))}
-                            rows={5}
-                            className="w-full"
-                        />
-                    </div>
-                    <div className="form-field">
-                        <div className="form-field-header">
-                            <span className="form-field-sign">*</span>
-                            <label>封面图片</label>
-                        </div>
-                        <FileUpload
-                            mode="advanced"
-                            name="reward-image"
-                            customUpload
-                            uploadHandler={async (e) => {
-                                const formData = new FormData();
-                                formData.append("file", e.files[0]);
-
-                                try {
-                                    const res = await axios.post(`${process.env.PUBLIC_URL}/file`, formData);
-
-                                    const fileUrl = res.data.url;
-                                    console.log(fileUrl);
-                                    setRewardPictureUrl(fileUrl);
-                                    toast.current?.show({ severity: 'success', summary: '上传成功' });
-                                } catch (error) {
-                                    console.log(error);
-                                    toast.current?.show({ severity: 'error', summary: '上传失败' });
-                                }
-                            }}
-                            auto
-                            accept="image/*"
-                            chooseLabel="选择悬赏封面"
-                        />
-                    </div>
-                </div>
-            </Dialog>
+              }}
+              auto
+              chooseLabel="上传资源文件（.torrent）"
+            />
+          </div>
         </div>
-    );
-};
+      </Dialog>
 
+      {/*删除悬赏弹窗*/}
+      <Dialog
+        header="删除悬赏"
+        visible={deleteVisible}
+        onHide={() => setDeleteVisible(false)}
+        className="resource-delete-dialog"
+        modal
+        footer={
+          <div className="dialog-footer">
+            <Button
+              label="确认"
+              icon="pi pi-check"
+              onClick={handleDeleteSubmit}
+              autoFocus
+            />
+            <Button
+              label="取消"
+              icon="pi pi-times"
+              onClick={() => setDeleteVisible(false)}
+              className="p-button-text"
+            />
+          </div>
+        }
+      >
+        <div className="dialog-form">
+          <span style={{ marginBottom: "10px" }}>确认是否删除该悬赏?</span>
+        </div>
+      </Dialog>
+
+      {/*编辑资源弹窗*/}
+      <Dialog
+        header="编辑资源"
+        visible={editVisible}
+        onHide={() => setEditVisible(false)}
+        className="resource-edit-dialog"
+        modal
+        footer={
+          <div className="dialog-footer">
+            <Button
+              label="确认"
+              icon="pi pi-check"
+              onClick={handleEditSubmit}
+              autoFocus
+            />
+            <Button
+              label="取消"
+              icon="pi pi-times"
+              onClick={() => setEditVisible(false)}
+              className="p-button-text"
+            />
+          </div>
+        }
+      >
+        <div className="dialog-form">
+          <div className="form-field">
+            <div className="form-field-header">
+              <label htmlFor="name">更改标题</label>
+            </div>
+            <InputText
+              id="name"
+              value={editRewardFormData.rewardName}
+              onChange={(e) =>
+                setEditRewardFormData((prev) => ({
+                  ...prev,
+                  rewardName: e.target.value,
+                }))
+              }
+              className="w-full"
+            />
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <label htmlFor="price">更改定价</label>
+            </div>
+            <InputText
+              id="price"
+              value={editRewardFormData.price}
+              onChange={(e) =>
+                setEditRewardFormData((prev) => ({
+                  ...prev,
+                  price: e.target.value,
+                }))
+              }
+              className="w-full"
+            />
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <label htmlFor="description">更改需求</label>
+            </div>
+            <InputTextarea
+              id="description"
+              value={editRewardFormData.rewardDescription}
+              onChange={(e) =>
+                setEditRewardFormData((prev) => ({
+                  ...prev,
+                  rewardDescription: e.target.value,
+                }))
+              }
+              rows={5}
+              className="w-full"
+            />
+          </div>
+          <div className="form-field">
+            <div className="form-field-header">
+              <span className="form-field-sign">*</span>
+              <label>封面图片</label>
+            </div>
+            <FileUpload
+              mode="advanced"
+              name="reward-image"
+              customUpload
+              uploadHandler={async (e) => {
+                const formData = new FormData();
+                formData.append("file", e.files[0]);
+
+                try {
+                  const res = await axios.post(
+                    `${process.env.PUBLIC_URL}/file`,
+                    formData
+                  );
+
+                  const fileUrl = res.data.url;
+                  console.log(fileUrl);
+                  setRewardPictureUrl(fileUrl);
+                  toast.current?.show({
+                    severity: "success",
+                    summary: "上传成功",
+                  });
+                } catch (error) {
+                  console.log(error);
+                  toast.current?.show({
+                    severity: "error",
+                    summary: "上传失败",
+                  });
+                }
+              }}
+              auto
+              accept="image/*"
+              chooseLabel="选择悬赏封面"
+            />
+          </div>
+        </div>
+      </Dialog>
+    </div>
+  );
+}
