application [child-coding-miniapp] view page [pages/progress] development
This commit is contained in:
@@ -35,6 +35,12 @@
|
|||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "游戏页面"
|
"navigationBarTitleText": "游戏页面"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "pages/progress",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "进度页面"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"globalStyle": {
|
"globalStyle": {
|
||||||
|
|||||||
138
apps/child-coding-miniapp/src/pages/progress.vue
Normal file
138
apps/child-coding-miniapp/src/pages/progress.vue
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
<template>
|
||||||
|
<view class="min-h-screen bg-gradient-to-b from-blue-100 to-purple-100 p-4">
|
||||||
|
<!-- 进度概述 -->
|
||||||
|
<view class="bg-white rounded-xl p-4 mb-4 shadow-md">
|
||||||
|
<text class="text-xl font-bold text-gray-800 mb-2">我的进度</text>
|
||||||
|
<view class="flex justify-between items-center">
|
||||||
|
<view class="text-center">
|
||||||
|
<text class="text-2xl font-bold text-blue-600">{{ totalLevels }}</text>
|
||||||
|
<text class="text-sm text-gray-600">总关卡</text>
|
||||||
|
</view>
|
||||||
|
<view class="text-center">
|
||||||
|
<text class="text-2xl font-bold text-green-600">{{ completedLevels }}</text>
|
||||||
|
<text class="text-sm text-gray-600">已完成</text>
|
||||||
|
</view>
|
||||||
|
<view class="text-center">
|
||||||
|
<text class="text-2xl font-bold text-yellow-600">{{ totalScore }}</text>
|
||||||
|
<text class="text-sm text-gray-600">总积分</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- 关卡进度列表 -->
|
||||||
|
<view class="bg-white rounded-xl p-4 mb-4 shadow-md">
|
||||||
|
<text class="text-lg font-bold text-gray-800 mb-3">关卡进度</text>
|
||||||
|
<view v-for="progress in levelProgress" :key="progress.levelId" class="flex justify-between items-center py-2 border-b border-gray-100">
|
||||||
|
<view>
|
||||||
|
<text class="font-medium text-gray-800">{{ progress.levelTitle }}</text>
|
||||||
|
<text class="text-sm text-gray-600">难度: {{ progress.difficulty }}/5</text>
|
||||||
|
</view>
|
||||||
|
<view class="text-right">
|
||||||
|
<view v-if="progress.completed" class="flex items-center">
|
||||||
|
<text class="text-green-600 font-bold mr-2">✓</text>
|
||||||
|
<text class="text-sm text-gray-600">{{ progress.score }} 分</text>
|
||||||
|
</view>
|
||||||
|
<view v-else class="text-gray-500">
|
||||||
|
<text>未完成</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- 成就 -->
|
||||||
|
<view class="bg-white rounded-xl p-4 shadow-md">
|
||||||
|
<text class="text-lg font-bold text-gray-800 mb-3">我的成就</text>
|
||||||
|
<view v-if="userAchievements.length === 0" class="text-center py-8">
|
||||||
|
<text class="text-gray-500">暂无成就,继续努力!</text>
|
||||||
|
</view>
|
||||||
|
<view v-else class="grid grid-cols-2 gap-4">
|
||||||
|
<view v-for="achievement in userAchievements" :key="achievement.id" class="bg-gradient-to-r from-yellow-200 to-yellow-400 rounded-lg p-3 text-center">
|
||||||
|
<text class="text-2xl mb-1">{{ achievement.icon || '🏆' }}</text>
|
||||||
|
<text class="font-bold text-sm">{{ achievement.title }}</text>
|
||||||
|
<text class="text-xs text-gray-700">{{ achievement.points }} 分</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, onMounted } from 'vue'
|
||||||
|
import { entities, auth } from '@/lib/nvwa'
|
||||||
|
|
||||||
|
// 定义类型
|
||||||
|
interface LevelProgress {
|
||||||
|
levelId: number
|
||||||
|
levelTitle: string
|
||||||
|
difficulty: number
|
||||||
|
completed: boolean
|
||||||
|
score?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UserAchievement {
|
||||||
|
id: number
|
||||||
|
title: string
|
||||||
|
icon?: string
|
||||||
|
points: number
|
||||||
|
}
|
||||||
|
|
||||||
|
// 响应式数据
|
||||||
|
const totalLevels = ref(0)
|
||||||
|
const completedLevels = ref(0)
|
||||||
|
const totalScore = ref(0)
|
||||||
|
const levelProgress = ref<LevelProgress[]>([])
|
||||||
|
const userAchievements = ref<UserAchievement[]>([])
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
const user = await auth.currentUser()
|
||||||
|
if (!user) {
|
||||||
|
// 如果未登录,跳转到登录页
|
||||||
|
uni.redirectTo({ url: '/pages/user/login' })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取所有关卡
|
||||||
|
const { data: levels } = await entities.from('level').select('id, title, difficulty')
|
||||||
|
totalLevels.value = levels?.length || 0
|
||||||
|
|
||||||
|
// 获取用户关卡进度
|
||||||
|
const { data: progresses } = await entities.from('user_level_progress').select('level_id, completed, score').eq('user_id', user.id)
|
||||||
|
|
||||||
|
if (progresses) {
|
||||||
|
levelProgress.value = progresses.map(p => {
|
||||||
|
const level = levels?.find(l => l.id === p.level_id)
|
||||||
|
return {
|
||||||
|
levelId: p.level_id,
|
||||||
|
levelTitle: level?.title || '未知关卡',
|
||||||
|
difficulty: level?.difficulty || 1,
|
||||||
|
completed: p.completed,
|
||||||
|
score: p.score
|
||||||
|
}
|
||||||
|
})
|
||||||
|
completedLevels.value = progresses.filter(p => p.completed).length
|
||||||
|
totalScore.value = progresses.reduce((sum, p) => sum + (p.score || 0), 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取用户成就
|
||||||
|
const { data: userAchievData } = await entities.from('user_achievement').select('achievement_id').eq('user_id', user.id)
|
||||||
|
|
||||||
|
if (userAchievData) {
|
||||||
|
const achievementIds = userAchievData.map(ua => ua.achievement_id)
|
||||||
|
if (achievementIds.length > 0) {
|
||||||
|
const { data: achievements } = await entities.from('achievement').select('id, title, icon, points').in('id', achievementIds)
|
||||||
|
if (achievements) {
|
||||||
|
userAchievements.value = achievements.map(a => ({
|
||||||
|
id: a.id,
|
||||||
|
title: a.title,
|
||||||
|
icon: a.icon,
|
||||||
|
points: a.points
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/* 可以添加额外样式 */
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user