diff --git a/src/main/java/com/pt/controller/ResourceController.java b/src/main/java/com/pt/controller/ResourceController.java
new file mode 100644
index 0000000..5ed01f8
--- /dev/null
+++ b/src/main/java/com/pt/controller/ResourceController.java
@@ -0,0 +1,166 @@
+package com.pt.controller;
+
+import com.pt.constant.Constants;
+import com.pt.entity.Resource;
+import com.pt.entity.User;
+import com.pt.service.ResourceService;
+import com.pt.service.UserService;
+import com.pt.utils.JWTUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/resource")
+@CrossOrigin(origins = "*")
+public class ResourceController {
+
+    @Autowired
+    private ResourceService resourceService;
+    private UserService userService;
+
+    @GetMapping("/list/all")
+    public ResponseEntity<?> getAllResources(@RequestHeader("token") String token,
+                                             @RequestParam("username") String username) {
+        Map<String, Object> ans = new HashMap<>();
+
+        if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)){
+            ans.put("result", "Invalid token");
+            return ResponseEntity.badRequest().body(ans);
+        }
+
+        List<Resource> resources = resourceService.getAllResources();
+        if (resources.isEmpty()) {
+            return ResponseEntity.noContent().build();
+        }
+        return ResponseEntity.ok(resources);
+    }
+
+    @GetMapping("/list/user")
+    public ResponseEntity<?> getUserResources(@RequestHeader("token") String token,
+                                              @RequestParam("username") String username) {
+        Map<String, Object> ans = new HashMap<>();
+
+        if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)){
+            ans.put("result", "Invalid token");
+            return ResponseEntity.badRequest().body(ans);
+        }
+
+        List<Resource> resources = resourceService.getResourcesByAuthor(username);
+        if (resources.isEmpty()) {
+            return ResponseEntity.noContent().build();
+        }
+        return ResponseEntity.ok(resources);
+    }
+
+    @PostMapping("/publish")
+    public ResponseEntity<?> publishResource(@RequestHeader("token") String token,
+                                             @RequestParam("username") String username,
+                                             @RequestParam("size") double size,
+                                             @RequestParam("name") String name,
+                                             @RequestParam("description") String description) {
+        Map<String, Object> ans = new HashMap<>();
+
+        if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)){
+            ans.put("result", "Invalid token");
+            return ResponseEntity.badRequest().body(ans);
+        }
+
+        User user = userService.findByUsername(username);
+        if(user.getLevel() < 2){
+            ans.put("result", "Insufficient permissions to publish resources");
+            return ResponseEntity.status(403).body(ans);
+        }
+
+        resourceService.publishResource(name, description, username, size);
+
+        /*
+            * TODO: 在这里实现资源发布的逻辑
+         */
+
+        ans.put("result", "Resource published successfully");
+        return ResponseEntity.ok(ans);
+    }
+
+    @GetMapping("/get/{resourceId}")
+    public ResponseEntity<?> getResourceById(@PathVariable("resourceId") int resourceId,
+                                              @RequestHeader("token") String token,
+                                              @RequestParam("username") String username) {
+
+        Map<String, Object> ans = new HashMap<>();
+        if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
+            ans.put("result", "Invalid token");
+            return ResponseEntity.badRequest().body(ans);
+        }
+
+        Resource resource = resourceService.getResourceById(resourceId);
+        if (resource == null) {
+            return ResponseEntity.notFound().build();
+        }
+        return ResponseEntity.ok(resource);
+    }
+
+    @GetMapping("/download/{resourceId}")
+    public ResponseEntity<?> downloadResource(@PathVariable("resourceId") int resourceId,
+                                              @RequestHeader("token") String token,
+                                              @RequestParam("username") String username) {
+
+        Map<String, Object> ans = new HashMap<>();
+        if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
+            ans.put("result", "Invalid token");
+            return ResponseEntity.badRequest().body(ans);
+        }
+
+        /*
+            * TODO: 在这里实现下载资源的方法
+         */
+
+        // Here you would typically return the file or a download link
+        return ResponseEntity.ok(ans);
+    }
+
+    @GetMapping("/search")
+    public ResponseEntity<?> searchResources(@RequestHeader("token") String token,
+                                             @RequestParam("username") String username,
+                                             @RequestParam("query") String query) {
+        Map<String, Object> ans = new HashMap<>();
+
+        if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)){
+            ans.put("result", "Invalid token");
+            return ResponseEntity.badRequest().body(ans);
+        }
+
+        List<Resource> resources = resourceService.searchByQuery(query);
+        if (resources.isEmpty()) {
+            return ResponseEntity.noContent().build();
+        }
+        return ResponseEntity.ok(resources);
+    }
+
+    @GetMapping("/delete")
+    public ResponseEntity<?> deleteResource(@RequestHeader("token") String token,
+                                            @RequestParam("username") String username,
+                                            @RequestParam("resourceId") int resourceId) {
+        Map<String, Object> ans = new HashMap<>();
+        Resource resource = resourceService.getResourceById(resourceId);
+
+        if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN) || resource == null || !resource.getAuthor().equals(username)) {
+            ans.put("result", "Invalid token");
+            return ResponseEntity.badRequest().body(ans);
+        }
+
+        /*
+            TODO: 在这里实现删除资源的方法
+         */
+
+
+        resourceService.deleteResource(resourceId);
+
+        ans.put("result", "Resource deleted successfully");
+        return ResponseEntity.ok(ans);
+    }
+}
