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);
+    }
+}
diff --git a/src/main/java/com/pt/entity/Download.java b/src/main/java/com/pt/entity/Download.java
new file mode 100644
index 0000000..38b955a
--- /dev/null
+++ b/src/main/java/com/pt/entity/Download.java
@@ -0,0 +1,55 @@
+package com.pt.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+
+import java.time.LocalDateTime;
+
+@Entity
+public class Download {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int downloadId;
+
+    private String resourceId;
+    private String downloader;
+    private LocalDateTime downloadTime;
+
+    public Download() {
+    }
+
+    public Download(int downloadId, String resourceId, String downloader, LocalDateTime downloadTime) {
+        this.downloadId = downloadId;
+        this.resourceId = resourceId;
+        this.downloader = downloader;
+        this.downloadTime = downloadTime;
+    }
+
+    public int getDownloadId() {
+        return downloadId;
+    }
+    public void setDownloadId(int downloadId) {
+        this.downloadId = downloadId;
+    }
+    public String getResourceId() {
+        return resourceId;
+    }
+    public void setResourceId(String resourceId) {
+        this.resourceId = resourceId;
+    }
+    public String getDownloader() {
+        return downloader;
+    }
+    public void setDownloader(String downloader) {
+        this.downloader = downloader;
+    }
+    public LocalDateTime getDownloadTime() {
+        return downloadTime;
+    }
+    public void setDownloadTime(LocalDateTime downloadTime) {
+        this.downloadTime = downloadTime;
+    }
+}
diff --git a/src/main/java/com/pt/entity/Resource.java b/src/main/java/com/pt/entity/Resource.java
new file mode 100644
index 0000000..2d8567b
--- /dev/null
+++ b/src/main/java/com/pt/entity/Resource.java
@@ -0,0 +1,87 @@
+package com.pt.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+
+import java.time.LocalDateTime;
+
+@Entity
+public class Resource {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int resourceId;
+
+    private String name;
+    private double size;
+
+    private LocalDateTime publishTime;
+    private String author;
+
+    private String description;
+
+    public Resource() {
+    }
+
+    public Resource(int resourceId, String name, double size, LocalDateTime publishTime, String author) {
+        this.resourceId = resourceId;
+        this.name = name;
+        this.size = size;
+        this.publishTime = publishTime;
+        this.author = author;
+    }
+
+    public int getResourceId() {
+        return resourceId;
+    }
+    public void setResourceId(int resourceId) {
+        this.resourceId = resourceId;
+    }
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+    public double getSize() {
+        return size;
+    }
+    public void setSize(double size) {
+        this.size = size;
+    }
+    public LocalDateTime getPublishTime() {
+        return publishTime;
+    }
+    public void setPublishTime(LocalDateTime publishTime) {
+        this.publishTime = publishTime;
+    }
+    public String getAuthor() {
+        return author;
+    }
+    public void setAuthor(String author) {
+        this.author = author;
+    }
+    public String getDescription() {
+        return description;
+    }
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /*
+        * 重写toString方法，将资源信息以JSON字符串形式返回
+     */
+    @Override
+    public String toString() {
+        return "{" +
+                "\"resourceId\":" + resourceId +
+                ", \"name\":\"" + name + "\"" +
+                ", \"size\":" + size +
+                ", \"publishTime\":\"" + publishTime + "\"" +
+                ", \"author\":\"" + author + "\"" +
+                ", \"description\":\"" + description + "\"" +
+                '}';
+    }
+}
diff --git a/src/main/java/com/pt/repository/DownloadRepository.java b/src/main/java/com/pt/repository/DownloadRepository.java
new file mode 100644
index 0000000..741f142
--- /dev/null
+++ b/src/main/java/com/pt/repository/DownloadRepository.java
@@ -0,0 +1,24 @@
+package com.pt.repository;
+
+import com.pt.entity.Download;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface DownloadRepository extends JpaRepository<Download, Integer> {
+    /**
+     * Finds downloads by the resource ID.
+     *
+     * @param resourceId the ID of the resource
+     * @return a list of downloads associated with the specified resource
+     */
+    List<Download> findByResourceId(String resourceId);
+
+    /**
+     * Finds downloads by the downloader's username.
+     *
+     * @param downloader the username of the downloader
+     * @return a list of downloads made by the specified user
+     */
+    List<Download> findByDownloader(String downloader);
+}
diff --git a/src/main/java/com/pt/repository/ResourceRepository.java b/src/main/java/com/pt/repository/ResourceRepository.java
new file mode 100644
index 0000000..d9a5fc1
--- /dev/null
+++ b/src/main/java/com/pt/repository/ResourceRepository.java
@@ -0,0 +1,24 @@
+package com.pt.repository;
+
+import com.pt.entity.Resource;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface ResourceRepository extends JpaRepository<Resource, Integer> {
+    /**
+     * Finds resources by their name containing the specified query, ignoring case.
+     *
+     * @param query the query string to search for in resource names
+     * @return a list of resources whose names contain the query string
+     */
+    List<Resource> findByNameContainingIgnoreCase(String query);
+
+    /**
+     * Finds resources by their author.
+     *
+     * @param author the author's username
+     * @return a list of resources authored by the specified user
+     */
+    List<Resource> findByAuthor(String author);
+}
diff --git a/src/main/java/com/pt/service/DownloadService.java b/src/main/java/com/pt/service/DownloadService.java
new file mode 100644
index 0000000..284be5a
--- /dev/null
+++ b/src/main/java/com/pt/service/DownloadService.java
@@ -0,0 +1,20 @@
+package com.pt.service;
+
+import com.pt.repository.DownloadRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DownloadService {
+
+    @Autowired
+    private DownloadRepository downloadRepository;
+
+    public DownloadService(DownloadRepository downloadRepository) {
+        this.downloadRepository = downloadRepository;
+    }
+
+    /*
+        TODO: 添加下载需要的服务;
+     */
+}
diff --git a/src/main/java/com/pt/service/ResourceService.java b/src/main/java/com/pt/service/ResourceService.java
new file mode 100644
index 0000000..a91bc7d
--- /dev/null
+++ b/src/main/java/com/pt/service/ResourceService.java
@@ -0,0 +1,50 @@
+package com.pt.service;
+
+import com.pt.entity.Resource;
+import com.pt.repository.ResourceRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+public class ResourceService {
+
+    @Autowired
+    private ResourceRepository resourceRepository;
+
+    public ResourceService(ResourceRepository resourceRepository) {
+        this.resourceRepository = resourceRepository;
+    }
+
+    public List<Resource> getAllResources() {
+        return resourceRepository.findAll();
+    }
+
+    public void publishResource(String name, String description, String publisher, double size) {
+        Resource resource = new Resource();
+        resource.setName(name);
+        resource.setSize(size);
+        resource.setDescription(description);
+        resource.setAuthor(publisher);
+        resource.setPublishTime(LocalDateTime.now());
+        resourceRepository.save(resource);
+    }
+
+    public Resource getResourceById(int resourceId) {
+        return resourceRepository.findById(resourceId).orElse(null);
+    }
+
+    public List<Resource> searchByQuery(String query) {
+        return resourceRepository.findByNameContainingIgnoreCase(query);
+    }
+
+    public List<Resource> getResourcesByAuthor(String author) {
+        return resourceRepository.findByAuthor(author);
+    }
+
+    public void deleteResource(int resourceId) {
+        resourceRepository.deleteById(resourceId);
+    }
+}
