diff --git a/frontend/pages/support-activity/components/ActivityRankingModal.vue b/frontend/pages/support-activity/components/ActivityRankingModal.vue
new file mode 100644
index 0000000..b014ce5
--- /dev/null
+++ b/frontend/pages/support-activity/components/ActivityRankingModal.vue
@@ -0,0 +1,1038 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 加载中...
+
+
+
+
+ {{ dataLoadError }}
+
+
+
+
+
+ emit('view-profile', { userId: payload.userId })" />
+
+
+
+
+ 暂无排名数据
+
+
+
+
+
+
+
+
+
+
+ 加载中...
+
+
+
+
+ 没有更多了
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatPopularityScore(currentUserInfo.popularityScore)
+ }}
+
+
+
+
+
+ {{ formatCurrentUserRank(currentUserInfo.rank) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/support-activity/components/ThemeBanner.vue b/frontend/pages/support-activity/components/ThemeBanner.vue
index 2f5d0c3..613ac42 100644
--- a/frontend/pages/support-activity/components/ThemeBanner.vue
+++ b/frontend/pages/support-activity/components/ThemeBanner.vue
@@ -10,7 +10,7 @@
/>
-
+
@@ -74,6 +74,12 @@ watch(() => props.target, (newVal) => {
formattedTarget.value = newVal.toLocaleString()
}, { immediate: false })
+const emit = defineEmits(['tap'])
+
+const handleBannerClick = () => {
+ emit('tap')
+}
+
const progressPercent = computed(() => {
if (props.target === 0) return 0
return Math.min((props.current / props.target) * 100, 100)
diff --git a/frontend/pages/support-activity/index.vue b/frontend/pages/support-activity/index.vue
index b914798..6c6e1ab 100644
--- a/frontend/pages/support-activity/index.vue
+++ b/frontend/pages/support-activity/index.vue
@@ -18,6 +18,7 @@
:current="progressData.current"
:target="progressData.target"
:is-stale-data="isStaleData"
+ @tap="openRankingModal"
/>
@@ -99,6 +100,16 @@
+
+
+
@@ -118,6 +129,7 @@ import ThemeBanner from './components/ThemeBanner.vue'
import ContributionList from './components/ContributionList.vue'
import StageArea from './components/StageArea.vue'
import FloatingBubbles from './components/FloatingBubbles.vue'
+import ActivityRankingModal from './components/ActivityRankingModal.vue'
import ActionBar from './components/ActionBar.vue'
const activityType = ref('birthday')
@@ -139,10 +151,35 @@ const navExpanded = ref(false)
// ActionBar 弹出框状态
const actionBarVisible = ref(false)
+// 排行榜弹窗状态
+const rankingModalVisible = ref(false)
+const currentActivityTitle = ref('')
+
function toggleActionBar() {
actionBarVisible.value = !actionBarVisible.value
}
+// 打开排行榜弹窗
+function openRankingModal() {
+ currentActivityTitle.value = config.value?.title || '活动排名'
+ rankingModalVisible.value = true
+}
+
+// 处理拜访用户
+function handleVisitUser(data) {
+ console.log('拜访用户:', data)
+}
+
+// 处理查看用户资料
+function handleViewUserProfile(data) {
+ console.log('查看用户资料:', data)
+}
+
+// 处理查看作品
+function handleViewArtwork(data) {
+ console.log('查看作品:', data)
+}
+
let progressManager = null
const isCompleted = computed(() => progressData.value.current >= progressData.value.target)