From 8a008a090add82052f532e362e064e20ed1d4ab3 Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Fri, 24 Oct 2025 10:41:10 +0800 Subject: [PATCH] Log post visibility changes --- .../com/openisle/dto/PostChangeLogDto.java | 3 +++ .../openisle/mapper/PostChangeLogMapper.java | 3 +++ .../com/openisle/model/PostChangeType.java | 1 + .../model/PostVisibleScopeChangeLog.java | 23 +++++++++++++++++++ .../service/PostChangeLogService.java | 15 ++++++++++++ .../com/openisle/service/PostService.java | 17 ++++++++++---- .../components/PostChangeLogItem.vue | 15 ++++++++++++ frontend_nuxt/pages/posts/[id]/index.vue | 10 ++++++++ 8 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 backend/src/main/java/com/openisle/model/PostVisibleScopeChangeLog.java diff --git a/backend/src/main/java/com/openisle/dto/PostChangeLogDto.java b/backend/src/main/java/com/openisle/dto/PostChangeLogDto.java index 296287f0a..5f4f56bb1 100644 --- a/backend/src/main/java/com/openisle/dto/PostChangeLogDto.java +++ b/backend/src/main/java/com/openisle/dto/PostChangeLogDto.java @@ -1,6 +1,7 @@ package com.openisle.dto; import com.openisle.model.PostChangeType; +import com.openisle.model.PostVisibleScopeType; import java.time.LocalDateTime; import java.util.List; import lombok.Getter; @@ -29,5 +30,7 @@ public class PostChangeLogDto { private LocalDateTime newPinnedAt; private Boolean oldFeatured; private Boolean newFeatured; + private PostVisibleScopeType oldVisibleScope; + private PostVisibleScopeType newVisibleScope; private Integer amount; } diff --git a/backend/src/main/java/com/openisle/mapper/PostChangeLogMapper.java b/backend/src/main/java/com/openisle/mapper/PostChangeLogMapper.java index cb0d1a9f1..b0eee0dbc 100644 --- a/backend/src/main/java/com/openisle/mapper/PostChangeLogMapper.java +++ b/backend/src/main/java/com/openisle/mapper/PostChangeLogMapper.java @@ -52,6 +52,9 @@ public class PostChangeLogMapper { } else if (log instanceof PostFeaturedChangeLog f) { dto.setOldFeatured(f.isOldFeatured()); dto.setNewFeatured(f.isNewFeatured()); + } else if (log instanceof PostVisibleScopeChangeLog v) { + dto.setOldVisibleScope(v.getOldVisibleScope()); + dto.setNewVisibleScope(v.getNewVisibleScope()); } else if (log instanceof PostDonateChangeLog d) { dto.setAmount(d.getAmount()); } diff --git a/backend/src/main/java/com/openisle/model/PostChangeType.java b/backend/src/main/java/com/openisle/model/PostChangeType.java index eeee99cbb..2d931c68b 100644 --- a/backend/src/main/java/com/openisle/model/PostChangeType.java +++ b/backend/src/main/java/com/openisle/model/PostChangeType.java @@ -8,6 +8,7 @@ public enum PostChangeType { CLOSED, PINNED, FEATURED, + VISIBLE_SCOPE, VOTE_RESULT, LOTTERY_RESULT, DONATE, diff --git a/backend/src/main/java/com/openisle/model/PostVisibleScopeChangeLog.java b/backend/src/main/java/com/openisle/model/PostVisibleScopeChangeLog.java new file mode 100644 index 000000000..f8123941e --- /dev/null +++ b/backend/src/main/java/com/openisle/model/PostVisibleScopeChangeLog.java @@ -0,0 +1,23 @@ +package com.openisle.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@Entity +@Table(name = "post_visible_scope_change_logs") +public class PostVisibleScopeChangeLog extends PostChangeLog { + + @Enumerated(EnumType.STRING) + private PostVisibleScopeType oldVisibleScope; + + @Enumerated(EnumType.STRING) + private PostVisibleScopeType newVisibleScope; +} diff --git a/backend/src/main/java/com/openisle/service/PostChangeLogService.java b/backend/src/main/java/com/openisle/service/PostChangeLogService.java index 0d3fd28ad..cac062192 100644 --- a/backend/src/main/java/com/openisle/service/PostChangeLogService.java +++ b/backend/src/main/java/com/openisle/service/PostChangeLogService.java @@ -99,6 +99,21 @@ public class PostChangeLogService { logRepository.save(log); } + public void recordVisibleScopeChange( + Post post, + User user, + PostVisibleScopeType oldVisibleScope, + PostVisibleScopeType newVisibleScope + ) { + PostVisibleScopeChangeLog log = new PostVisibleScopeChangeLog(); + log.setPost(post); + log.setUser(user); + log.setType(PostChangeType.VISIBLE_SCOPE); + log.setOldVisibleScope(oldVisibleScope); + log.setNewVisibleScope(newVisibleScope); + logRepository.save(log); + } + public void recordVoteResult(Post post) { PostVoteResultChangeLog log = new PostVoteResultChangeLog(); log.setPost(post); diff --git a/backend/src/main/java/com/openisle/service/PostService.java b/backend/src/main/java/com/openisle/service/PostService.java index edacbcd50..cec2613dc 100644 --- a/backend/src/main/java/com/openisle/service/PostService.java +++ b/backend/src/main/java/com/openisle/service/PostService.java @@ -340,10 +340,10 @@ public class PostService { post.setStatus(publishMode == PublishMode.REVIEW ? PostStatus.PENDING : PostStatus.PUBLISHED); // 什么都没设置的情况下,默认为ALL - if(Objects.isNull(postVisibleScopeType)){ - post.setVisibleScope(PostVisibleScopeType.ALL); - }else{ - post.setVisibleScope(postVisibleScopeType); + if (Objects.isNull(postVisibleScopeType)) { + post.setVisibleScope(PostVisibleScopeType.ALL); + } else { + post.setVisibleScope(postVisibleScopeType); } if (post instanceof LotteryPost) { @@ -1190,6 +1190,7 @@ public class PostService { post.setContent(content); post.setCategory(category); post.setTags(new java.util.HashSet<>(tags)); + PostVisibleScopeType oldVisibleScope = post.getVisibleScope(); post.setVisibleScope(postVisibleScopeType); Post updated = postRepository.save(post); imageUploader.adjustReferences(oldContent, content); @@ -1212,6 +1213,14 @@ public class PostService { if (!oldTags.equals(newTags)) { postChangeLogService.recordTagChange(updated, user, oldTags, newTags); } + if (!java.util.Objects.equals(oldVisibleScope, postVisibleScopeType)) { + postChangeLogService.recordVisibleScopeChange( + updated, + user, + oldVisibleScope, + postVisibleScopeType + ); + } if (updated.getStatus() == PostStatus.PUBLISHED) { searchIndexEventPublisher.publishPostSaved(updated); } diff --git a/frontend_nuxt/components/PostChangeLogItem.vue b/frontend_nuxt/components/PostChangeLogItem.vue index c55d15763..80193c86b 100644 --- a/frontend_nuxt/components/PostChangeLogItem.vue +++ b/frontend_nuxt/components/PostChangeLogItem.vue @@ -36,6 +36,10 @@ + + 变更了文章可见范围, 从 {{ formatVisibleScope(log.oldVisibleScope) }} 修改为 + {{ formatVisibleScope(log.newVisibleScope) }} + 系统已计算投票结果 @@ -69,6 +73,17 @@ const props = defineProps({ title: String, }) +const VISIBLE_SCOPE_LABELS = { + ALL: '全部可见', + ONLY_ME: '仅自己可见', + ONLY_REGISTER: '仅注册用户可见', +} + +const formatVisibleScope = (scope) => { + if (!scope) return VISIBLE_SCOPE_LABELS.ALL + return VISIBLE_SCOPE_LABELS[scope] ?? scope +} + const diffHtml = computed(() => { // Track theme changes const isDark = import.meta.client && document.documentElement.dataset.theme === 'dark' diff --git a/frontend_nuxt/pages/posts/[id]/index.vue b/frontend_nuxt/pages/posts/[id]/index.vue index 31ce3bf8c..234393c26 100644 --- a/frontend_nuxt/pages/posts/[id]/index.vue +++ b/frontend_nuxt/pages/posts/[id]/index.vue @@ -416,6 +416,14 @@ const changeLogIcon = (l) => { } else { return 'dislike' } + } else if (l.type === 'VISIBLE_SCOPE') { + if (l.newVisibleScope === 'ONLY_ME') { + return 'lock-one' + } else if (l.newVisibleScope === 'ONLY_REGISTER') { + return 'peoples-two' + } else { + return 'communication' + } } else if (l.type === 'VOTE_RESULT') { return 'check-one' } else if (l.type === 'LOTTERY_RESULT') { @@ -446,6 +454,8 @@ const mapChangeLog = (l) => ({ newCategory: l.newCategory, oldTags: l.oldTags, newTags: l.newTags, + oldVisibleScope: l.oldVisibleScope, + newVisibleScope: l.newVisibleScope, amount: l.amount, icon: changeLogIcon(l), })