feat: release

This commit is contained in:
zzc
2026-05-21 23:00:54 +08:00
parent b778216afb
commit 1b7dc31916
5 changed files with 81 additions and 55 deletions

View File

@@ -37,38 +37,38 @@
</view>
<!-- 领奖台 (Top 3) -->
<view class="podium-section">
<view class="podium-section" v-if="ratingItems && ratingItems.length >= 3">
<!-- 第二名 -->
<view class="podium-item rank-2">
<view class="avatar-wrap">
<image class="avatar" :src="topicData.top3[1].avatar" mode="aspectFill" />
<image class="avatar" :src="FILE_BASE_URL + ratingItems[1].avatarUrl" mode="aspectFill" />
<text class="rank-badge badge-2">2</text>
</view>
<view class="info-box box-2">
<text class="name">{{ topicData.top3[1].name }}</text>
<text class="score">分数 {{ topicData.top3[1].score }}</text>
<text class="name">{{ ratingItems[1].name }}</text>
<text class="score">分数 {{ ratingItems[1].score }}</text>
</view>
</view>
<!-- 第一名 -->
<view class="podium-item rank-1">
<view class="avatar-wrap">
<image class="avatar avatar-1" :src="topicData.top3[0].avatar" mode="aspectFill" />
<image class="avatar avatar-1" :src="FILE_BASE_URL + ratingItems[0].avatarUrl" mode="aspectFill" />
<text class="rank-badge badge-1">1</text>
</view>
<view class="info-box box-1">
<text class="name name-1">{{ topicData.top3[0].name }}</text>
<text class="score score-1">分数 {{ topicData.top3[0].score }}</text>
<text class="name name-1">{{ ratingItems[0].name }}</text>
<text class="score score-1">分数 {{ ratingItems[0].score }}</text>
</view>
</view>
<!-- 第三名 -->
<view class="podium-item rank-3">
<view class="avatar-wrap">
<image class="avatar" :src="topicData.top3[2].avatar" mode="aspectFill" />
<image class="avatar" :src="FILE_BASE_URL + ratingItems[2].avatarUrl" mode="aspectFill" />
<text class="rank-badge badge-3">3</text>
</view>
<view class="info-box box-3">
<text class="name">{{ topicData.top3[2].name }}</text>
<text class="score">分数 {{ topicData.top3[2].score }}</text>
<text class="name">{{ ratingItems[2].name }}</text>
<text class="score">分数 {{ ratingItems[2].score }}</text>
</view>
</view>
</view>
@@ -82,7 +82,7 @@
@tap="goToDetail(item.id)"
>
<view class="card-header">
<image class="item-avatar" :src="item.avatar" mode="aspectFill" />
<image class="item-avatar" :src="FILE_BASE_URL + item.avatarUrl" mode="aspectFill" />
<text class="item-name">{{ item.name }}</text>
<view class="rank-tag" v-if="item.rank <= 3">NO.{{ item.rank }}</view>
<view class="flex-spacer"></view>
@@ -179,12 +179,16 @@
import { ref } from 'vue';
import { getStatusBarHeight } from "@/utils/system";
import { onPullDownRefresh, onReachBottom, onLoad } from "@dcloudio/uni-app";
import { fetchTopicDetail, fetchTopicRatingItems } from "@/api/topic";
import { FILE_BASE_URL } from "@/utils/constants";
// 状态栏高度处理
const statusBarHeight = ref(getStatusBarHeight() || 44);
const loading = ref(false);
const hasMore = ref(true);
const currentPage = ref(1);
const currentTopicId = ref(null);
const goBack = () => {
uni.navigateBack({
@@ -192,19 +196,28 @@ const goBack = () => {
});
};
// 模拟页面数据
const topicData = ref({
title: '你心中的千古一帝',
heat: '98.2w',
participants: '23万',
aiSummary: '当前讨论聚焦于"开疆拓土"与"民生治理"的权重对比。唐太宗凭借高频的"六合一统"评价暂时领跑,而秦始皇的"制度基石"标签正在快速攀升。',
top3: [
{ id: 1, name: '李世民', score: '9.8', avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=11' },
{ id: 2, name: '秦始皇', score: '9.5', avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=12' },
{ id: 3, name: '康熙', score: '9.2', avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=13' }
]
title: '',
heat: '0',
participants: '0',
aiSummary: ''
});
const loadDetail = async (topicId) => {
try {
const res = await fetchTopicDetail(topicId);
const data = res?.data || res || {};
topicData.value = {
title: data.title || '',
heat: data.heat || '0',
participants: data.participants || '0',
aiSummary: data.aiSummary || '暂无总结'
};
} catch (e) {
console.error("获取主题详情失败:", e);
}
};
const showAddPopup = ref(false);
const newItem = ref({
name: '',
@@ -254,28 +267,34 @@ const actions = [
{ label: '封神', value: 'god', emoji: '👑' }
];
const mockRatingItems = [
{
id: 1,
rank: 1,
name: '李世民',
avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=11',
score: '9.8',
quote: '六合一统,文治武功,除了儿子不行没毛病。',
userAction: 'god'
},
{
id: 2,
rank: 2,
name: '秦始皇',
avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=12',
score: '9.5',
quote: '两千年来,我们都还在用他设计的制度版本。',
userAction: ''
}
];
const ratingItems = ref([]);
const ratingItems = ref([...mockRatingItems]);
const loadItems = async (topicId, page = 1) => {
if (page === 1) {
ratingItems.value = [];
}
try {
loading.value = true;
const res = await fetchTopicRatingItems(topicId, page);
const list = res?.data?.records || res?.records || res?.list || [];
ratingItems.value = [...ratingItems.value, ...list];
hasMore.value = list.length >= 10; // 假设 pageSize 是 10
} catch (error) {
console.error("获取评分项列表失败:", error);
hasMore.value = false;
} finally {
loading.value = false;
}
};
onLoad((options) => {
if (options.topicId) {
currentTopicId.value = options.topicId;
loadDetail(options.topicId);
loadItems(options.topicId, 1);
}
});
const mockComments = [
{
@@ -307,11 +326,18 @@ const goToDetail = (itemId) => {
};
// 下拉刷新
onPullDownRefresh(() => {
setTimeout(() => {
ratingItems.value = [...mockRatingItems];
comments.value = [...mockComments];
onPullDownRefresh(async () => {
if (currentTopicId.value) {
currentPage.value = 1;
hasMore.value = true;
await Promise.all([
loadDetail(currentTopicId.value),
loadItems(currentTopicId.value, currentPage.value)
]);
}
// 模拟评论刷新(此处未接接口,暂时保留原有模拟刷新逻辑,去掉 mockRatingItems 的重置)
setTimeout(() => {
comments.value = [...mockComments];
uni.stopPullDownRefresh();
}, 1000);
});
@@ -319,14 +345,15 @@ onPullDownRefresh(() => {
// 上拉加载更多
onReachBottom(() => {
if (!hasMore.value || loading.value) return;
loading.value = true;
if (currentTopicId.value) {
currentPage.value += 1;
loadItems(currentTopicId.value, currentPage.value);
}
// 原有的评论模拟加载(根据需要决定是否保留)
setTimeout(() => {
const moreComments = mockComments.map(c => ({...c, id: c.id + comments.value.length}));
comments.value.push(...moreComments);
loading.value = false;
if (comments.value.length >= 10) {
hasMore.value = false;
}
}, 1000);
});
</script>