初步实现资源与下载的框架,后续在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);
+ }
+}