diff --git a/src/main/java/com/g9/g9backend/controller/CommentController.java b/src/main/java/com/g9/g9backend/controller/CommentController.java
new file mode 100644
index 0000000..fec8e68
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/controller/CommentController.java
@@ -0,0 +1,94 @@
+package com.g9.g9backend.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.g9.g9backend.pojo.Comment;
+import com.g9.g9backend.pojo.DTO.GetCommentDTO;
+import com.g9.g9backend.service.CommentService;
+import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Function;
+
+@RestController
+@RequestMapping("/comment")
+public class CommentController {
+
+    private final CommentService commentService;
+
+    private final Logger logger = LoggerFactory.getLogger(CommentController.class);
+
+    public CommentController(CommentService commentService) {
+        this.commentService = commentService;
+    }
+
+    @PostMapping
+    public ResponseEntity<String> postComment(@RequestBody Comment comment) {
+        System.out.println(comment.toString());
+        commentService.save(comment);
+
+        logger.info("评论已发布");
+
+        return ResponseEntity.ok("");
+    }
+
+    @DeleteMapping
+    public ResponseEntity<String> deleteComment(@RequestParam Integer commentId) {
+        commentService.removeById(commentId);
+
+        return ResponseEntity.noContent().build();
+    }
+
+    @GetMapping
+    public ResponseEntity<GetCommentDTO> getComment(@RequestParam Integer id,
+                                                    @RequestParam Integer pageNumber,
+                                                    @RequestParam Integer rows,
+                                                    @RequestParam String type) {
+        Page<Comment> commentPage = new Page<>(pageNumber, rows);
+        LambdaQueryWrapper<Comment> rewardQuery = new LambdaQueryWrapper<Comment>()
+                .orderByDesc(Comment::getCreateAt);
+
+
+        if (Objects.equals(type, "资源")) {
+
+            rewardQuery.eq(Comment::getResourceId, id);
+        }
+
+        if (Objects.equals(type, "帖子")) {
+
+            rewardQuery.eq(Comment::getThreadId, id);
+        }
+
+        if (Objects.equals(type, "悬赏")) {
+
+            rewardQuery.eq(Comment::getRewardId, id);
+        }
+
+        Page<Comment> result = commentService.page(commentPage, rewardQuery);
+
+        GetCommentDTO getCommentDTO = wrapCommentPage(result, item -> {
+            GetCommentDTO.Comment comment = new GetCommentDTO.Comment();
+            comment.setCommentId(item.getCommentId());
+            comment.setUserId(item.getUserId());
+            comment.setReplyId(item.getReplyId() != null ? item.getReplyId() : 0);
+            comment.setContent(item.getContent());
+            comment.setCreateAt(item.getCreateAt());
+            return comment;
+        });
+
+        return ResponseEntity.ok(getCommentDTO);
+    }
+
+    @NotNull
+    private <T> GetCommentDTO wrapCommentPage(Page<T> page, Function<T, GetCommentDTO.Comment> mapper) {
+        List<GetCommentDTO.Comment> records = page.getRecords().stream().map(mapper).toList();
+
+        return new GetCommentDTO(records, (int) page.getTotal(), (int) page.getPages(), (int) page.getCurrent(), (int) page.getSize());
+    }
+
+}
diff --git a/src/main/java/com/g9/g9backend/controller/RewardController.java b/src/main/java/com/g9/g9backend/controller/RewardController.java
index c5b316b..3563f41 100644
--- a/src/main/java/com/g9/g9backend/controller/RewardController.java
+++ b/src/main/java/com/g9/g9backend/controller/RewardController.java
@@ -1,9 +1,23 @@
 package com.g9.g9backend.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.g9.g9backend.pojo.DTO.GetRewardDTO;
+import com.g9.g9backend.pojo.Reward;
+import com.g9.g9backend.service.RewardService;
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Function;
 
 /**
  * RewardController 悬赏控制器类，处理与悬赏相关的请求
@@ -14,5 +28,103 @@
 @RequestMapping("/reward")
 public class RewardController {
 
+    private final RewardService rewardService;
+
     private final Logger logger = LoggerFactory.getLogger(RewardController.class);
+
+    public RewardController(RewardService rewardService) {
+        this.rewardService = rewardService;
+    }
+
+    @PostMapping
+    public ResponseEntity<String> postReward(@RequestBody Reward reward) {
+        reward.setCompletedBy(null);
+        reward.setResourceId(null);
+        rewardService.save(reward);
+
+        logger.info("悬赏已发布");
+
+        return ResponseEntity.ok("");
+    }
+
+    @DeleteMapping
+    public ResponseEntity<String> deleteReward(@RequestParam Integer rewardId) {
+        rewardService.removeById(rewardId);
+
+        logger.info("悬赏已删除");
+
+        return ResponseEntity.noContent().build();
+    }
+
+    @GetMapping
+    public ResponseEntity<GetRewardDTO> getReward(@RequestParam Integer pageNumber,
+                                                  @RequestParam Integer rows,
+                                                  @RequestParam String searchValue,
+                                                  @RequestParam String option) {
+        Page<Reward> rewardPage = new Page<>(pageNumber, rows);
+        LambdaQueryWrapper<Reward> rewardQuery = new LambdaQueryWrapper<Reward>()
+                .like(StringUtils.isNotBlank(searchValue), Reward::getRewardName, searchValue);
+
+        if (Objects.equals(option, "赏金最高")) {
+
+            rewardQuery.orderByDesc(Reward::getPrice);
+        } else {
+
+            rewardQuery.orderByDesc(Reward::getCreateAt);
+        }
+
+        Page<Reward> result = rewardService.page(rewardPage, rewardQuery);
+
+        GetRewardDTO getRewardDTO = wrapRewardPage(result, item -> {
+            GetRewardDTO.Reward reward = new GetRewardDTO.Reward();
+            reward.setRewardId(item.getRewardId());
+            reward.setRewardName(item.getRewardName());
+            reward.setRewardPicture(item.getRewardPicture());
+            reward.setUserId(item.getUserId());
+            reward.setPrice(item.getPrice());
+            reward.setCreateAt(item.getCreateAt());
+            return reward;
+        });
+
+        return ResponseEntity.ok(getRewardDTO);
+    }
+
+    @NotNull
+    private <T> GetRewardDTO wrapRewardPage(Page<T> page, Function<T, GetRewardDTO.Reward> mapper) {
+        List<GetRewardDTO.Reward> records = page.getRecords().stream().map(mapper).toList();
+
+        return new GetRewardDTO(records, (int) page.getTotal(), (int) page.getPages(), (int) page.getCurrent(), (int) page.getSize());
+    }
+
+    @GetMapping(value = "/info")
+    public ResponseEntity<Reward> getRewardInfo(@RequestParam Integer rewardId) {
+
+        return ResponseEntity.ok(rewardService.getById(rewardId));
+    }
+
+    @PutMapping("/info")
+    public ResponseEntity<String> putReward(@RequestBody Reward reward) {
+        Reward rewardUpdate = rewardService.getById(reward.getRewardId());
+        rewardUpdate.setRewardName(reward.getRewardName());
+        rewardUpdate.setRewardPicture(reward.getRewardPicture());
+        rewardUpdate.setPrice(reward.getPrice());
+        rewardUpdate.setRewardDescription(reward.getRewardDescription());
+        rewardUpdate.setLastUpdateAt(Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()));
+        rewardService.updateById(rewardUpdate);
+
+        return ResponseEntity.ok("");
+    }
+
+    @PostMapping(value = "/completion")
+    public ResponseEntity<String> putRewardCompletion(@RequestBody Reward reward) {
+        Reward rewardUpdate = rewardService.getById(reward.getRewardId());
+        rewardUpdate.setCompletedBy(reward.getCompletedBy());
+        rewardUpdate.setCompletedAt(reward.getCompletedAt());
+        rewardUpdate.setResourceId(reward.getResourceId());
+        rewardService.updateById(rewardUpdate);
+
+        return ResponseEntity.ok("");
+    }
+
+
 }
diff --git a/src/main/java/com/g9/g9backend/controller/TotalController.java b/src/main/java/com/g9/g9backend/controller/TotalController.java
new file mode 100644
index 0000000..2359586
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/controller/TotalController.java
@@ -0,0 +1,67 @@
+package com.g9.g9backend.controller;
+
+import com.g9.g9backend.service.ResourceService;
+import com.g9.g9backend.service.ThreadService;
+import com.g9.g9backend.service.UserPurchaseService;
+import com.g9.g9backend.service.UserUploadService;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/total")
+public class TotalController {
+
+    private final ThreadService threadService;
+
+    private final UserPurchaseService userPurchaseService;
+
+    private final UserUploadService userUploadService;
+
+    private final ResourceService resourceService;
+
+    public TotalController(ThreadService threadService, UserPurchaseService userPurchaseService, UserUploadService userUploadService, ResourceService resourceService) {
+        this.threadService = threadService;
+        this.userPurchaseService = userPurchaseService;
+        this.userUploadService = userUploadService;
+        this.resourceService = resourceService;
+    }
+
+    private final Logger logger = LoggerFactory.getLogger(TotalController.class);
+
+
+    @GetMapping(value = "/info")
+    public ResponseEntity<Info> getTotalInfo() {
+
+        long threadCount = threadService.count();
+        long downloadCount = userPurchaseService.count();
+        long authorCount = userUploadService.count();
+        long resourceCount = resourceService.count();
+
+        Info info = new Info(threadCount, downloadCount, authorCount, resourceCount);
+        logger.info("统计数据返回：{}", info);
+
+        return ResponseEntity.ok(info);
+    }
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class Info {
+
+        private long threadCount;
+
+        private long downloadCount;
+
+        private long authorCount;
+
+        private long resourceCount;
+
+    }
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/Comment.java b/src/main/java/com/g9/g9backend/pojo/Comment.java
index eddc42b..1f6e74f 100644
--- a/src/main/java/com/g9/g9backend/pojo/Comment.java
+++ b/src/main/java/com/g9/g9backend/pojo/Comment.java
@@ -21,13 +21,13 @@
 
     private int userId;
 
-    private int threadId;
+    private Integer threadId;
 
-    private int resourceId;
+    private Integer resourceId;
 
-    private int rewardId;
+    private Integer rewardId;
 
-    private int replyId;
+    private Integer replyId;
 
     private String content;
 
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetCommentDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetCommentDTO.java
new file mode 100644
index 0000000..0fb7c44
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetCommentDTO.java
@@ -0,0 +1,42 @@
+package com.g9.g9backend.pojo.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class GetCommentDTO {
+
+    private List<Comment> records;
+
+    private long total;
+
+    private long pages;
+
+    private long current;
+
+    private long size;
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class Comment {
+
+        private int commentId;
+
+        private int userId;
+
+        private int replyId;
+
+        private String content;
+
+        private Date createAt;
+
+    }
+
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetRewardDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetRewardDTO.java
new file mode 100644
index 0000000..f56b878
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetRewardDTO.java
@@ -0,0 +1,44 @@
+package com.g9.g9backend.pojo.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class GetRewardDTO {
+
+    private List<Reward> records;
+
+    private long total;
+
+    private long pages;
+
+    private long current;
+
+    private long size;
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class Reward {
+
+        private int rewardId;
+
+        private String rewardName;
+
+        private String rewardPicture;
+
+        private int userId;
+
+        private float price;
+
+        private Date createAt;
+
+    }
+
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/Reward.java b/src/main/java/com/g9/g9backend/pojo/Reward.java
index 5812284..08a9de8 100644
--- a/src/main/java/com/g9/g9backend/pojo/Reward.java
+++ b/src/main/java/com/g9/g9backend/pojo/Reward.java
@@ -33,9 +33,9 @@
 
     private Date lastUpdateAt;
 
-    private int completedBy;
+    private Integer completedBy;
 
     private Date completedAt;
 
-    private int resourceId;
+    private Integer resourceId;
 }
\ No newline at end of file
