添加更新用户流量的方法,并定时跟新到所有用户
Change-Id: I9aa5b3ace0bf327980554a89611b059caed12360
diff --git a/src/main/java/com/pt/controller/AdminController.java b/src/main/java/com/pt/controller/AdminController.java
index 8af5b56..71159e5 100644
--- a/src/main/java/com/pt/controller/AdminController.java
+++ b/src/main/java/com/pt/controller/AdminController.java
@@ -29,7 +29,11 @@
Admin admin = adminService.findByUsernameAndPassword(username, password);
if (admin != null) {
ans.put("message", "Login successful");
- ans.put("data", JWTUtils.generateToken(username, Constants.UserRole.ADMIN, Constants.DEFAULT_EXPIRE_TIME));
+ ans.put("data", Map.of(
+ "token", JWTUtils.generateToken(username, Constants.UserRole.ADMIN, Constants.DEFAULT_EXPIRE_TIME),
+ "uid", admin.getId(),
+ "username", admin.getUsername()
+ ));
return ResponseEntity.ok().body(ans);
} else {
ans.put("message", "Invalid username or password");
diff --git a/src/main/java/com/pt/controller/CommentController.java b/src/main/java/com/pt/controller/CommentController.java
index 00e091d..623d94a 100644
--- a/src/main/java/com/pt/controller/CommentController.java
+++ b/src/main/java/com/pt/controller/CommentController.java
@@ -1,13 +1,19 @@
package com.pt.controller;
+import com.pt.Item.CommentInfo;
import com.pt.constant.Constants;
+import com.pt.entity.Post;
+import com.pt.entity.User;
import com.pt.service.CommentService;
+import com.pt.service.PostService;
+import com.pt.service.UserService;
import com.pt.utils.JWTUtils;
import com.pt.entity.Comment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -20,6 +26,12 @@
@Autowired
private CommentService commentService;
+ @Autowired
+ private PostService postService;
+
+ @Autowired
+ private UserService userService;
+
@PostMapping("/add")
public ResponseEntity<?> addComment(
@RequestHeader("token") String token,
@@ -28,6 +40,7 @@
String content = request.get("content");
String username = request.get("username");
int postId = Integer.parseInt(request.get("postId"));
+ Integer reviewer = request.get("reviewer") != null ? Integer.parseInt(request.get("reviewer")) : null;
Map<String, Object> ans = new HashMap<>();
@@ -36,7 +49,7 @@
return ResponseEntity.badRequest().body(ans);
}
- commentService.addComment(content, username, postId);
+ commentService.addComment(content, username, postId, reviewer);
ans.put("message", "Comment added successfully");
return ResponseEntity.ok(ans);
}
@@ -44,10 +57,9 @@
@DeleteMapping("/delete")
public ResponseEntity<?> deleteComment(
@RequestHeader("token") String token,
- @RequestBody Map<String, String> request
+ @RequestParam("username") String username,
+ @RequestParam("commentId") int commentId
) {
- String username = request.get("username");
- int commentId = Integer.parseInt(request.get("commentId"));
Map<String, Object> ans = new HashMap<>();
@@ -74,10 +86,37 @@
return ResponseEntity.badRequest().body(ans);
}
+ Post post = postService.findPostById(postId);
List<Comment> comments = commentService.getCommentsByPostId(postId);
+ List<CommentInfo> commentInfos = new ArrayList<>();
+ for(Comment comment : comments) {
+ CommentInfo commentInfo = new CommentInfo();
+ commentInfo.setCommentId(comment.getCommentId());
+ commentInfo.setContent(comment.getContent());
+ commentInfo.setWriter(comment.getWriter());
+ commentInfo.setPublishDate(comment.getPublishDate());
+
+ if(comment.getReviewer() != null) {
+ Comment r = commentService.getCommentById(comment.getReviewer());
+ if(r != null) {
+ commentInfo.setReviewer(r.getWriter());
+ commentInfo.setReviewerId(comment.getReviewer());
+ } else {
+ commentInfo.setReviewer("Unknown Reviewer");
+ commentInfo.setReviewerId(0);
+ }
+ } else {
+ commentInfo.setReviewer("");
+ commentInfo.setReviewerId(0);
+ }
+
+ commentInfos.add(commentInfo);
+ }
+
ans.put("message", "Comments retrieved successfully");
ans.put("data", Map.of(
- "comments", comments
+ "content", post.getContent(),
+ "comments", commentInfos
));
return ResponseEntity.ok(ans);
}
diff --git a/src/main/java/com/pt/controller/PostController.java b/src/main/java/com/pt/controller/PostController.java
index 3723dbd..c61bd3e 100644
--- a/src/main/java/com/pt/controller/PostController.java
+++ b/src/main/java/com/pt/controller/PostController.java
@@ -44,12 +44,6 @@
return ResponseEntity.badRequest().body(ans);
}
- Post existingPost = postService.findPostByTitle(title);
- if (existingPost != null) {
- ans.put("result", "Post with this title already exists");
- return ResponseEntity.badRequest().body(ans);
- }
-
postService.createPost(title, content, author);
ans.put("message", "Post created successfully");
return ResponseEntity.ok(ans);
@@ -91,9 +85,15 @@
if(date != null){
posts.removeIf(post -> !post.getPublishDate().toString().equals(date));
}
+
+ posts.sort(
+ // 按发布日期降序排序
+ (p1, p2) -> p2.getPublishDate().compareTo(p1.getPublishDate())
+ );
+
ans.put("message", "Post retrieved successfully");
ans.put("data", Map.of(
- "post", posts
+ "posts", posts
));
return ResponseEntity.ok(ans);
}
@@ -108,11 +108,9 @@
@DeleteMapping("/delete")
public ResponseEntity<?> deletePost(
@RequestHeader("token") String token,
- @RequestBody Map<String, String> request
+ @RequestParam("username") String username,
+ @RequestParam("pid") int pid
) {
- String username = request.get("username");
- int pid = Integer.parseInt(request.get("pid"));
-
Map<String, Object> ans = new HashMap<>();
if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)){
diff --git a/src/main/java/com/pt/controller/TrackerController.java b/src/main/java/com/pt/controller/TrackerController.java
index edae09f..33d8831 100644
--- a/src/main/java/com/pt/controller/TrackerController.java
+++ b/src/main/java/com/pt/controller/TrackerController.java
@@ -23,6 +23,13 @@
String ip = request.getRemoteAddr();
Map<String, String[]> params = request.getParameterMap();
+ // 验证必要参数
+ if (!params.containsKey("username")) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.getWriter().write("Missing required parameter: username");
+ return;
+ }
+
byte[] bencodedResponse = trackerService.handleAnnounce(params, ip);
response.setContentType("application/x-bittorrent");
diff --git a/src/main/java/com/pt/controller/UserController.java b/src/main/java/com/pt/controller/UserController.java
index 7222f36..d9f53ab 100644
--- a/src/main/java/com/pt/controller/UserController.java
+++ b/src/main/java/com/pt/controller/UserController.java
@@ -77,7 +77,14 @@
if (user != null) {
String token = JWTUtils.generateToken(username, Constants.UserRole.USER, Constants.DEFAULT_EXPIRE_TIME);
ans.put("message", "Login successful");
- ans.put("data", token);
+ ans.put("data", Map.of(
+ "token", token,
+ "uid", user.getUid(),
+ "username", user.getUsername(),
+ "email", user.getEmail(),
+ "level", user.getLevel(),
+ "points", user.getPoints()
+ ));
return ResponseEntity.ok().body(ans);
} else {
ans.put("message", "Invalid username or password");
@@ -160,9 +167,8 @@
@DeleteMapping("/delete")
public ResponseEntity<?> deleteUser(@RequestHeader("token") String token,
- @RequestBody Map<String, String> request) {
- String username = request.get("username");
- String targetUsername = request.get("targetUsername");
+ @RequestParam("username") String username,
+ @RequestParam("targetUsername") String targetUsername) {
Map<String, Object> ans = new HashMap<>();
if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)) {
@@ -183,8 +189,7 @@
@GetMapping("/list")
public ResponseEntity<?> listUsers(@RequestHeader("token") String token,
- @RequestBody Map<String, String> request) {
- String username = request.get("username");
+ @RequestParam("username") String username) {
if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)) {
return ResponseEntity.badRequest().body("Invalid token");
}
@@ -203,8 +208,10 @@
@RequestParam("username") String username) {
Map<String, Object> ans = new HashMap<>();
+ System.out.println("Enter user info ");
if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
ans.put("message", "Invalid token");
+ System.out.println("Invalid token");
return ResponseEntity.badRequest().body(ans);
}
@@ -212,10 +219,71 @@
if (user != null) {
ans.put("message", "User info retrieved successfully");
ans.put("data", user);
+ System.out.println("User info retrieved successfully");
return ResponseEntity.ok(ans);
} else {
ans.put("message", "User not found");
+ System.out.println("User not found");
return ResponseEntity.badRequest().body(ans);
}
}
+
+ /**
+ * 获取用户统计信息
+ */
+ @GetMapping("/stats/{username}")
+ public ResponseEntity<?> getUserStats(
+ @RequestHeader("token") String token,
+ @PathVariable String username) {
+
+ Map<String, Object> ans = new HashMap<>();
+
+ if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
+ ans.put("message", "Invalid token");
+ return ResponseEntity.badRequest().body(ans);
+ }
+
+ User user = userService.findByUsername(username);
+ if (user == null) {
+ ans.put("message", "User not found");
+ return ResponseEntity.badRequest().body(ans);
+ }
+
+ // 计算分享率
+ double ratio = user.getDownloaded() == 0 ?
+ (user.getUploaded() > 0 ? Double.MAX_VALUE : 0) :
+ (double) user.getUploaded() / user.getDownloaded();
+
+ // 格式化分享率为两位小数
+ ratio = Math.round(ratio * 100.0) / 100.0;
+
+ // 构建返回数据
+ Map<String, Object> stats = new HashMap<>();
+ double uploadSize = user.getUploaded() / (1024.0 * 1024.0 * 1024.0);
+ double downloadSize = user.getDownloaded() / (1024.0 * 1024.0 * 1024.0);
+
+ stats.put("uploadSize", uploadSize); // 转换为GB
+ stats.put("downloadSize", downloadSize); // 转换为GB
+ stats.put("ratio", ratio);
+ stats.put("points", user.getPoints());
+ stats.put("userClass", getUserClass(user.getLevel()));
+ stats.put("level", user.getLevel());
+
+ ans.put("message", "User stats retrieved successfully");
+ ans.put("data", stats);
+ return ResponseEntity.ok(ans);
+ }
+
+ /**
+ * 根据用户等级返回对应的用户类别名称
+ */
+ private String getUserClass(int level) {
+ switch (level) {
+ case 5: return "大佬";
+ case 4: return "专家";
+ case 3: return "熟练";
+ case 2: return "入门";
+ default: return "新用户";
+ }
+ }
}