初步实现资源与下载的框架,后续在TODO处完善即可。

Change-Id: Ie28b6c1a7a14d665f8f5873c1397e7f8c1ebd99a
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);
+    }
+}