diff --git a/backend/src/main/java/com/openisle/controller/GlobalExceptionHandler.java b/backend/src/main/java/com/openisle/controller/GlobalExceptionHandler.java index 7af18210b..461486827 100644 --- a/backend/src/main/java/com/openisle/controller/GlobalExceptionHandler.java +++ b/backend/src/main/java/com/openisle/controller/GlobalExceptionHandler.java @@ -30,7 +30,11 @@ public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity handleException(Exception ex) { - return ResponseEntity.badRequest().body(Map.of("error", ex.getMessage())); + String message = ex.getMessage(); + if (message == null) { + message = ex.getClass().getSimpleName(); + } + return ResponseEntity.badRequest().body(Map.of("error", message)); } } diff --git a/backend/src/main/java/com/openisle/controller/UserController.java b/backend/src/main/java/com/openisle/controller/UserController.java index 1aef3a650..0501c07b1 100644 --- a/backend/src/main/java/com/openisle/controller/UserController.java +++ b/backend/src/main/java/com/openisle/controller/UserController.java @@ -75,7 +75,7 @@ public class UserController { @PutMapping("/me") public ResponseEntity updateProfile(@RequestBody UpdateProfileDto dto, - Authentication auth) { + Authentication auth) { User user = userService.updateProfile(auth.getName(), dto.getUsername(), dto.getIntroduction()); return ResponseEntity.ok(Map.of( "token", jwtService.generateToken(user.getUsername()), @@ -239,6 +239,7 @@ public class UserController { dto.setFollowing(subscriptionService.countSubscribed(user.getUsername())); dto.setCreatedAt(user.getCreatedAt()); dto.setLastPostTime(postService.getLastPostTime(user.getUsername())); + dto.setLastCommentTime(commentService.getLastCommentTimeOfUserByUserId(user.getId())); dto.setTotalViews(postService.getTotalViews(user.getUsername())); dto.setVisitedDays(userVisitService.countVisits(user.getUsername())); dto.setReadPosts(postReadService.countReads(user.getUsername())); @@ -306,6 +307,7 @@ public class UserController { private long following; private java.time.LocalDateTime createdAt; private java.time.LocalDateTime lastPostTime; + private java.time.LocalDateTime lastCommentTime; private long totalViews; private long visitedDays; private long readPosts; diff --git a/backend/src/main/java/com/openisle/repository/CommentRepository.java b/backend/src/main/java/com/openisle/repository/CommentRepository.java index 1b4b8e092..12f20fecd 100644 --- a/backend/src/main/java/com/openisle/repository/CommentRepository.java +++ b/backend/src/main/java/com/openisle/repository/CommentRepository.java @@ -23,4 +23,8 @@ public interface CommentRepository extends JpaRepository { @org.springframework.data.jpa.repository.Query("SELECT COUNT(c) FROM Comment c WHERE c.author.username = :username AND c.createdAt >= :start") long countByAuthorAfter(@org.springframework.data.repository.query.Param("username") String username, @org.springframework.data.repository.query.Param("start") java.time.LocalDateTime start); + + @org.springframework.data.jpa.repository.Query("SELECT MAX(c.createdAt) FROM Comment c WHERE c.author.id = :userId") + java.time.LocalDateTime findLastCommentTimeOfUserByUserId(@org.springframework.data.repository.query.Param("userId") Long userId); + } diff --git a/backend/src/main/java/com/openisle/service/CommentService.java b/backend/src/main/java/com/openisle/service/CommentService.java index ddae361f9..96ed10f4e 100644 --- a/backend/src/main/java/com/openisle/service/CommentService.java +++ b/backend/src/main/java/com/openisle/service/CommentService.java @@ -76,6 +76,10 @@ public class CommentService { return comment; } + public java.time.LocalDateTime getLastCommentTimeOfUserByUserId(Long userId) { // 根据用户id查询该用户最后回复时间 + return commentRepository.findLastCommentTimeOfUserByUserId(userId); + } + @Transactional public Comment addReply(String username, Long parentId, String content) { log.debug("addReply called by user {} for parent comment {}", username, parentId); diff --git a/backend/src/main/resources/logback-spring.xml b/backend/src/main/resources/logback-spring.xml new file mode 100644 index 000000000..f634b7664 --- /dev/null +++ b/backend/src/main/resources/logback-spring.xml @@ -0,0 +1,26 @@ + + + + + + + %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n + + + + + ${LOG_PATH}/app.log + + ${LOG_PATH}/app-%d{yyyy-MM-dd-HH}.log + 72 + + + %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n + + + + + + + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 53f445be1..1b497d70d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "dependencies": { "core-js": "^3.8.3", + "cropperjs": "^1.6.2", "echarts": "^5.6.0", "ldrs": "^1.1.7", "markdown-it": "^14.1.0", @@ -4434,6 +4435,12 @@ "node": ">=10" } }, + "node_modules/cropperjs": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.2.tgz", + "integrity": "sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==", + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "6.0.6", "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.6.tgz", diff --git a/frontend/package.json b/frontend/package.json index ed41c14b4..372208730 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,6 +9,7 @@ }, "dependencies": { "core-js": "^3.8.3", + "cropperjs": "^1.6.2", "echarts": "^5.6.0", "ldrs": "^1.1.7", "markdown-it": "^14.1.0", diff --git a/frontend/src/components/AvatarCropper.vue b/frontend/src/components/AvatarCropper.vue new file mode 100644 index 000000000..2cb0a1d62 --- /dev/null +++ b/frontend/src/components/AvatarCropper.vue @@ -0,0 +1,142 @@ + + + + + + diff --git a/frontend/src/views/ProfileView.vue b/frontend/src/views/ProfileView.vue index 0a9308cc3..538830a6c 100644 --- a/frontend/src/views/ProfileView.vue +++ b/frontend/src/views/ProfileView.vue @@ -44,6 +44,10 @@
最后发帖时间:
{{ formatDate(user.lastPostTime) }}
+
+
最后评论时间:
+
{{ user.lastCommentTime!=null?formatDate(user.lastCommentTime):"暂无评论" }}
+
浏览量:
{{ user.totalViews }}
diff --git a/frontend/src/views/SettingsPageView.vue b/frontend/src/views/SettingsPageView.vue index 01c5935ff..74ef61422 100644 --- a/frontend/src/views/SettingsPageView.vue +++ b/frontend/src/views/SettingsPageView.vue @@ -1,5 +1,11 @@