Compare commits

..

3 Commits

Author SHA1 Message Date
Tim
fe167aa0b9 Return structured category and tag data in change logs 2025-09-08 14:27:18 +08:00
Tim
f3421265d2 fix: 修改changelog UI 2025-09-08 14:02:47 +08:00
Tim
f4817cd6d1 Merge pull request #929 from nagisa77/codex/add-user-avatar-return-in-changelog
feat: expand post change log details
2025-09-08 13:54:51 +08:00
3 changed files with 65 additions and 19 deletions

View File

@@ -5,6 +5,7 @@ import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
import java.util.List;
@Getter
@Setter
@@ -18,10 +19,10 @@ public class PostChangeLogDto {
private String newTitle;
private String oldContent;
private String newContent;
private String oldCategory;
private String newCategory;
private String oldTags;
private String newTags;
private CategoryDto oldCategory;
private CategoryDto newCategory;
private List<TagDto> oldTags;
private List<TagDto> newTags;
private Boolean oldClosed;
private Boolean newClosed;
private LocalDateTime oldPinnedAt;

View File

@@ -1,9 +1,15 @@
package com.openisle.mapper;
import com.openisle.dto.CategoryDto;
import com.openisle.dto.PostChangeLogDto;
import com.openisle.dto.TagDto;
import com.openisle.model.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Component
public class PostChangeLogMapper {
public PostChangeLogDto toDto(PostChangeLog log) {
@@ -22,11 +28,41 @@ public class PostChangeLogMapper {
dto.setOldContent(c.getOldContent());
dto.setNewContent(c.getNewContent());
} else if (log instanceof PostCategoryChangeLog cat) {
dto.setOldCategory(cat.getOldCategory());
dto.setNewCategory(cat.getNewCategory());
if (cat.getOldCategory() != null) {
CategoryDto oldCat = new CategoryDto();
oldCat.setName(cat.getOldCategory());
dto.setOldCategory(oldCat);
}
if (cat.getNewCategory() != null) {
CategoryDto newCat = new CategoryDto();
newCat.setName(cat.getNewCategory());
dto.setNewCategory(newCat);
}
} else if (log instanceof PostTagChangeLog tag) {
dto.setOldTags(tag.getOldTags());
dto.setNewTags(tag.getNewTags());
if (tag.getOldTags() != null && !tag.getOldTags().isBlank()) {
List<TagDto> oldTags = Arrays.stream(tag.getOldTags().split(","))
.map(String::trim)
.filter(s -> !s.isEmpty())
.map(name -> {
TagDto t = new TagDto();
t.setName(name);
return t;
})
.collect(Collectors.toList());
dto.setOldTags(oldTags);
}
if (tag.getNewTags() != null && !tag.getNewTags().isBlank()) {
List<TagDto> newTags = Arrays.stream(tag.getNewTags().split(","))
.map(String::trim)
.filter(s -> !s.isEmpty())
.map(name -> {
TagDto t = new TagDto();
t.setName(name);
return t;
})
.collect(Collectors.toList());
dto.setNewTags(newTags);
}
} else if (log instanceof PostClosedChangeLog cl) {
dto.setOldClosed(cl.isOldClosed());
dto.setNewClosed(cl.isNewClosed());

View File

@@ -6,26 +6,27 @@
class="change-log-avatar"
:src="log.userAvatar"
alt="avatar"
@click="() => navigateTo(`/users/${log.username}`)"
/>
<span v-if="log.username" class="change-log-user">{{ log.username }}</span>
<span v-if="log.type === 'CONTENT'">变更了文章内容</span>
<span v-else-if="log.type === 'TITLE'">变更了文章标题</span>
<span v-else-if="log.type === 'CATEGORY'">变更了文章分类</span>
<span v-else-if="log.type === 'TAG'">变更了文章标签</span>
<span v-else-if="log.type === 'CLOSED'">
<span v-if="log.type === 'CONTENT'" class="change-log-content">变更了文章内容</span>
<span v-else-if="log.type === 'TITLE'" class="change-log-content">变更了文章标题</span>
<span v-else-if="log.type === 'CATEGORY'" class="change-log-content">变更了文章分类</span>
<span v-else-if="log.type === 'TAG'" class="change-log-content">变更了文章标签</span>
<span v-else-if="log.type === 'CLOSED'" class="change-log-content">
<template v-if="log.newClosed">关闭了文章</template>
<template v-else>重新打开了文章</template>
</span>
<span v-else-if="log.type === 'PINNED'">
<span v-else-if="log.type === 'PINNED'" class="change-log-content">
<template v-if="log.newPinnedAt">置顶了文章</template>
<template v-else>取消置顶文章</template>
<template v-else>取消置顶文章</template>
</span>
<span v-else-if="log.type === 'FEATURED'">
<span v-else-if="log.type === 'FEATURED'" class="change-log-content">
<template v-if="log.newFeatured">将文章设为精选</template>
<template v-else>取消精选文章</template>
</span>
<span v-else-if="log.type === 'VOTE_RESULT'">投票已出结果</span>
<span v-else-if="log.type === 'LOTTERY_RESULT'">抽奖已开奖</span>
<span v-else-if="log.type === 'VOTE_RESULT'" class="change-log-content">投票已出结果</span>
<span v-else-if="log.type === 'LOTTERY_RESULT'" class="change-log-content">抽奖已开奖</span>
</div>
<div class="change-log-time">{{ log.time }}</div>
<div
@@ -43,6 +44,7 @@ import { createTwoFilesPatch } from 'diff'
import { useIsMobile } from '~/utils/screen'
import 'diff2html/bundles/css/diff2html.min.css'
import BaseImage from '~/components/BaseImage.vue'
import { navigateTo } from 'nuxt/app'
const props = defineProps({
log: Object,
title: String,
@@ -81,8 +83,8 @@ const diffHtml = computed(() => {
.change-log-container {
display: flex;
flex-direction: column;
/* padding-top: 5px; */
/* padding-bottom: 30px; */
opacity: 0.7;
font-size: 14px;
}
.change-log-text {
@@ -93,11 +95,18 @@ const diffHtml = computed(() => {
font-weight: bold;
margin-right: 4px;
}
.change-log-user,
.change-log-content {
opacity: 0.7;
}
.change-log-avatar {
width: 20px;
height: 20px;
border-radius: 50%;
margin-right: 4px;
cursor: pointer;
}
.change-log-time {
font-size: 12px;