From e7593c8ebf73f2fb74405bf5c4950ed4bfb8f94e Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Fri, 19 Sep 2025 00:31:52 +0800 Subject: [PATCH] Enhance user timeline post metadata and grouping --- .../java/com/openisle/dto/PostMetaDto.java | 5 +- .../java/com/openisle/mapper/UserMapper.java | 7 +- .../controller/UserControllerTest.java | 4 + .../components/TimelineCommentGroup.vue | 185 ++++++++++++++++++ frontend_nuxt/components/TimelinePostItem.vue | 149 ++++++++++++++ frontend_nuxt/pages/users/[id].vue | 146 ++++++-------- 6 files changed, 405 insertions(+), 91 deletions(-) create mode 100644 frontend_nuxt/components/TimelineCommentGroup.vue create mode 100644 frontend_nuxt/components/TimelinePostItem.vue diff --git a/backend/src/main/java/com/openisle/dto/PostMetaDto.java b/backend/src/main/java/com/openisle/dto/PostMetaDto.java index 1667b047f..81df37a9f 100644 --- a/backend/src/main/java/com/openisle/dto/PostMetaDto.java +++ b/backend/src/main/java/com/openisle/dto/PostMetaDto.java @@ -1,6 +1,7 @@ package com.openisle.dto; import java.time.LocalDateTime; +import java.util.List; import lombok.Data; /** Lightweight post metadata used in user profile lists. */ @@ -11,6 +12,8 @@ public class PostMetaDto { private String title; private String snippet; private LocalDateTime createdAt; - private String category; + private CategoryDto category; + private List tags; private long views; + private long commentCount; } diff --git a/backend/src/main/java/com/openisle/mapper/UserMapper.java b/backend/src/main/java/com/openisle/mapper/UserMapper.java index 43aaf8ef0..99203bf2d 100644 --- a/backend/src/main/java/com/openisle/mapper/UserMapper.java +++ b/backend/src/main/java/com/openisle/mapper/UserMapper.java @@ -5,6 +5,7 @@ import com.openisle.model.Comment; import com.openisle.model.Post; import com.openisle.model.User; import com.openisle.service.*; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; @@ -23,6 +24,8 @@ public class UserMapper { private final PostReadService postReadService; private final LevelService levelService; private final MedalService medalService; + private final CategoryMapper categoryMapper; + private final TagMapper tagMapper; @Value("${app.snippet-length}") private int snippetLength; @@ -88,8 +91,10 @@ public class UserMapper { dto.setSnippet(content); } dto.setCreatedAt(post.getCreatedAt()); - dto.setCategory(post.getCategory().getName()); + dto.setCategory(categoryMapper.toDto(post.getCategory())); + dto.setTags(post.getTags().stream().map(tagMapper::toDto).collect(Collectors.toList())); dto.setViews(post.getViews()); + dto.setCommentCount(post.getCommentCount()); return dto; } diff --git a/backend/src/test/java/com/openisle/controller/UserControllerTest.java b/backend/src/test/java/com/openisle/controller/UserControllerTest.java index 6c47232d5..ec0951368 100644 --- a/backend/src/test/java/com/openisle/controller/UserControllerTest.java +++ b/backend/src/test/java/com/openisle/controller/UserControllerTest.java @@ -8,6 +8,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import com.openisle.dto.CommentInfoDto; import com.openisle.dto.PostMetaDto; import com.openisle.dto.UserDto; +import com.openisle.mapper.CategoryMapper; import com.openisle.mapper.TagMapper; import com.openisle.mapper.UserMapper; import com.openisle.model.User; @@ -64,6 +65,9 @@ class UserControllerTest { @MockBean private TagMapper tagMapper; + @MockBean + private CategoryMapper categoryMapper; + @Test void getCurrentUser() throws Exception { User u = new User(); diff --git a/frontend_nuxt/components/TimelineCommentGroup.vue b/frontend_nuxt/components/TimelineCommentGroup.vue new file mode 100644 index 000000000..89ce08b02 --- /dev/null +++ b/frontend_nuxt/components/TimelineCommentGroup.vue @@ -0,0 +1,185 @@ + + + + + diff --git a/frontend_nuxt/components/TimelinePostItem.vue b/frontend_nuxt/components/TimelinePostItem.vue new file mode 100644 index 000000000..ae6f92045 --- /dev/null +++ b/frontend_nuxt/components/TimelinePostItem.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/frontend_nuxt/pages/users/[id].vue b/frontend_nuxt/pages/users/[id].vue index 49b66cdcd..1258f8fb6 100644 --- a/frontend_nuxt/pages/users/[id].vue +++ b/frontend_nuxt/pages/users/[id].vue @@ -220,98 +220,13 @@
{{ formatDate(item.createdAt) }}
--> -