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),
})