mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-02-08 08:01:16 +08:00
Compare commits
1 Commits
feature/lo
...
codex/impl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1fd31184a7 |
@@ -1,6 +1,5 @@
|
||||
package com.openisle.controller;
|
||||
|
||||
import com.openisle.config.CachingConfig;
|
||||
import com.openisle.dto.PostDetailDto;
|
||||
import com.openisle.dto.PostRequest;
|
||||
import com.openisle.dto.PostSummaryDto;
|
||||
@@ -16,7 +15,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
@@ -144,10 +142,6 @@ public class PostController {
|
||||
@Operation(summary = "List posts", description = "List posts by various filters")
|
||||
@ApiResponse(responseCode = "200", description = "List of posts",
|
||||
content = @Content(array = @ArraySchema(schema = @Schema(implementation = PostSummaryDto.class))))
|
||||
@Cacheable(
|
||||
value = CachingConfig.POST_CACHE_NAME,
|
||||
key = "new org.springframework.cache.interceptor.SimpleKey('default', #categoryId, #categoryIds, #tagId, #tagIds, #page, #pageSize)"
|
||||
)
|
||||
public List<PostSummaryDto> listPosts(@RequestParam(value = "categoryId", required = false) Long categoryId,
|
||||
@RequestParam(value = "categoryIds", required = false) List<Long> categoryIds,
|
||||
@RequestParam(value = "tagId", required = false) Long tagId,
|
||||
@@ -194,10 +188,6 @@ public class PostController {
|
||||
@Operation(summary = "Latest reply posts", description = "List posts by latest replies")
|
||||
@ApiResponse(responseCode = "200", description = "Posts sorted by latest reply",
|
||||
content = @Content(array = @ArraySchema(schema = @Schema(implementation = PostSummaryDto.class))))
|
||||
@Cacheable(
|
||||
value = CachingConfig.POST_CACHE_NAME,
|
||||
key = "new org.springframework.cache.interceptor.SimpleKey('latest_reply', #categoryId, #categoryIds, #tagIds, #page, #pageSize)"
|
||||
)
|
||||
public List<PostSummaryDto> latestReplyPosts(@RequestParam(value = "categoryId", required = false) Long categoryId,
|
||||
@RequestParam(value = "categoryIds", required = false) List<Long> categoryIds,
|
||||
@RequestParam(value = "tagId", required = false) Long tagId,
|
||||
|
||||
@@ -23,7 +23,6 @@ import org.springframework.stereotype.Component;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/** Mapper responsible for converting posts into DTOs. */
|
||||
@@ -100,8 +99,6 @@ public class PostMapper {
|
||||
l.setPointCost(lp.getPointCost());
|
||||
l.setStartTime(lp.getStartTime());
|
||||
l.setEndTime(lp.getEndTime());
|
||||
l.setParticipants(lp.getParticipants().stream().map(userMapper::toAuthorDto).collect(Collectors.toList()));
|
||||
l.setWinners(lp.getWinners().stream().map(userMapper::toAuthorDto).collect(Collectors.toList()));
|
||||
dto.setLottery(l);
|
||||
}
|
||||
|
||||
@@ -110,7 +107,6 @@ public class PostMapper {
|
||||
p.setOptions(pp.getOptions());
|
||||
p.setVotes(pp.getVotes());
|
||||
p.setEndTime(pp.getEndTime());
|
||||
p.setParticipants(pp.getParticipants().stream().map(userMapper::toAuthorDto).collect(Collectors.toList()));
|
||||
Map<Integer, List<AuthorDto>> optionParticipants = pollVoteRepository.findByPostId(pp.getId()).stream()
|
||||
.collect(Collectors.groupingBy(PollVote::getOptionIndex,
|
||||
Collectors.mapping(v -> userMapper.toAuthorDto(v.getUser()), Collectors.toList())));
|
||||
|
||||
@@ -323,9 +323,6 @@ public class PostService {
|
||||
return false;
|
||||
}
|
||||
|
||||
@CacheEvict(
|
||||
value = CachingConfig.POST_CACHE_NAME, allEntries = true
|
||||
)
|
||||
public void joinLottery(Long postId, String username) {
|
||||
LotteryPost post = lotteryPostRepository.findById(postId)
|
||||
.orElseThrow(() -> new com.openisle.exception.NotFoundException("Post not found"));
|
||||
@@ -342,9 +339,6 @@ public class PostService {
|
||||
.orElseThrow(() -> new com.openisle.exception.NotFoundException("Post not found"));
|
||||
}
|
||||
|
||||
@CacheEvict(
|
||||
value = CachingConfig.POST_CACHE_NAME, allEntries = true
|
||||
)
|
||||
@Transactional
|
||||
public PollPost votePoll(Long postId, String username, java.util.List<Integer> optionIndices) {
|
||||
PollPost post = pollPostRepository.findById(postId)
|
||||
@@ -382,9 +376,6 @@ public class PostService {
|
||||
return saved;
|
||||
}
|
||||
|
||||
@CacheEvict(
|
||||
value = CachingConfig.POST_CACHE_NAME, allEntries = true
|
||||
)
|
||||
@Transactional
|
||||
public void finalizePoll(Long postId) {
|
||||
scheduledFinalizations.remove(postId);
|
||||
@@ -404,9 +395,6 @@ public class PostService {
|
||||
});
|
||||
}
|
||||
|
||||
@CacheEvict(
|
||||
value = CachingConfig.POST_CACHE_NAME, allEntries = true
|
||||
)
|
||||
@Transactional
|
||||
public void finalizeLottery(Long postId) {
|
||||
log.info("start to finalizeLottery for {}", postId);
|
||||
@@ -520,6 +508,10 @@ public class PostService {
|
||||
return listPostsByLatestReply(null, null, page, pageSize);
|
||||
}
|
||||
|
||||
@Cacheable(
|
||||
value = CachingConfig.POST_CACHE_NAME,
|
||||
key = "new org.springframework.cache.interceptor.SimpleKey('latest_reply', #categoryIds, #tagIds, #page, #pageSize)"
|
||||
)
|
||||
public List<Post> listPostsByLatestReply(java.util.List<Long> categoryIds,
|
||||
java.util.List<Long> tagIds,
|
||||
Integer page,
|
||||
@@ -655,6 +647,10 @@ public class PostService {
|
||||
* @param pageSize
|
||||
* @return
|
||||
*/
|
||||
@Cacheable(
|
||||
value = CachingConfig.POST_CACHE_NAME,
|
||||
key = "new org.springframework.cache.interceptor.SimpleKey('default', #ids, #tids, #page, #pageSize)"
|
||||
)
|
||||
public List<Post> defaultListPosts(List<Long> ids, List<Long> tids, Integer page, Integer pageSize){
|
||||
boolean hasCategories = !CollectionUtils.isEmpty(ids);
|
||||
boolean hasTags = !CollectionUtils.isEmpty(tids);
|
||||
|
||||
@@ -107,11 +107,12 @@ const likeCount = computed(() => counts.value['LIKE'] || 0)
|
||||
const userReacted = (type) =>
|
||||
reactions.value.some((r) => r.type === type && r.user === authState.username)
|
||||
|
||||
const baseReactionOrder = computed(() => {
|
||||
if (reactionTypes.value.length) return [...reactionTypes.value]
|
||||
|
||||
const order = []
|
||||
const defaultOrder = computed(() => {
|
||||
if (reactionTypes.value && reactionTypes.value.length) {
|
||||
return reactionTypes.value
|
||||
}
|
||||
const seen = new Set()
|
||||
const order = []
|
||||
for (const reaction of reactions.value) {
|
||||
if (!seen.has(reaction.type)) {
|
||||
seen.add(reaction.type)
|
||||
@@ -121,38 +122,21 @@ const baseReactionOrder = computed(() => {
|
||||
return order
|
||||
})
|
||||
|
||||
const sortedReactionTypes = computed(() => {
|
||||
const baseOrder = [...baseReactionOrder.value]
|
||||
for (const type of Object.keys(counts.value)) {
|
||||
if (!baseOrder.includes(type)) baseOrder.push(type)
|
||||
}
|
||||
|
||||
const withMetadata = baseOrder.map((type, index) => ({
|
||||
type,
|
||||
count: counts.value[type] || 0,
|
||||
index,
|
||||
}))
|
||||
|
||||
const nonZero = withMetadata
|
||||
.filter((item) => item.count > 0)
|
||||
const displayedReactions = computed(() => {
|
||||
const orderIndex = new Map(defaultOrder.value.map((type, index) => [type, index]))
|
||||
return Object.entries(counts.value)
|
||||
.map(([type, count]) => ({ type, count }))
|
||||
.sort((a, b) => {
|
||||
if (b.count !== a.count) return b.count - a.count
|
||||
return a.index - b.index
|
||||
const indexA = orderIndex.has(a.type) ? orderIndex.get(a.type) : Number.MAX_SAFE_INTEGER
|
||||
const indexB = orderIndex.has(b.type) ? orderIndex.get(b.type) : Number.MAX_SAFE_INTEGER
|
||||
return indexA - indexB
|
||||
})
|
||||
|
||||
const zero = withMetadata.filter((item) => item.count === 0)
|
||||
|
||||
return [...nonZero, ...zero].map((item) => item.type)
|
||||
})
|
||||
|
||||
const displayedReactions = computed(() => {
|
||||
return sortedReactionTypes.value
|
||||
.filter((type) => counts.value[type] > 0)
|
||||
.slice(0, 3)
|
||||
.map((type) => ({ type }))
|
||||
.map(({ type }) => ({ type }))
|
||||
})
|
||||
|
||||
const panelTypes = computed(() => sortedReactionTypes.value.filter((t) => t !== 'LIKE'))
|
||||
const panelTypes = computed(() => reactionTypes.value.filter((t) => t !== 'LIKE'))
|
||||
|
||||
const panelVisible = ref(false)
|
||||
let hideTimer = null
|
||||
|
||||
@@ -122,8 +122,7 @@
|
||||
<l-hatch size="28" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch>
|
||||
</div>
|
||||
<div v-else class="comments-container">
|
||||
<BasePlaceholder v-if="timelineItems.length === 0" text="暂无评论" icon="inbox" />
|
||||
<BaseTimeline v-else :items="timelineItems">
|
||||
<BaseTimeline :items="timelineItems">
|
||||
<template #item="{ item }">
|
||||
<CommentItem
|
||||
v-if="item.kind === 'comment'"
|
||||
@@ -185,7 +184,6 @@ import { useRoute } from 'vue-router'
|
||||
import CommentItem from '~/components/CommentItem.vue'
|
||||
import CommentEditor from '~/components/CommentEditor.vue'
|
||||
import BaseTimeline from '~/components/BaseTimeline.vue'
|
||||
import BasePlaceholder from '~/components/BasePlaceholder.vue'
|
||||
import PostChangeLogItem from '~/components/PostChangeLogItem.vue'
|
||||
import ArticleTags from '~/components/ArticleTags.vue'
|
||||
import ArticleCategory from '~/components/ArticleCategory.vue'
|
||||
@@ -815,7 +813,9 @@ const fetchCommentsAndChangeLog = async () => {
|
||||
|
||||
for (const item of data) {
|
||||
const mappedPayload =
|
||||
item.kind === 'comment' ? mapComment(item.payload) : mapChangeLog(item.payload)
|
||||
item.kind === 'comment'
|
||||
? mapComment(item.payload)
|
||||
: mapChangeLog(item.payload)
|
||||
newTimelineItemList.push(mappedPayload)
|
||||
|
||||
if (item.kind === 'comment') {
|
||||
|
||||
Reference in New Issue
Block a user