TEST UPD
- My points page
This commit is contained in:
114
frontend/src/pages/MyPoints.vue
Normal file
114
frontend/src/pages/MyPoints.vue
Normal file
@@ -0,0 +1,114 @@
|
||||
<template>
|
||||
<div class="min-h-screen bg-gray-50 py-8">
|
||||
<div class="max-w-4xl mx-auto px-4">
|
||||
<h2 class="text-3xl font-bold text-gray-900 mb-8">Мои баллы</h2>
|
||||
|
||||
<!-- Загрузка -->
|
||||
<div v-if="points.loading" class="text-center py-12">
|
||||
<p class="text-gray-600">Загружаем ваши баллы...</p>
|
||||
</div>
|
||||
|
||||
<!-- Ошибка -->
|
||||
<div v-else-if="points.error" class="bg-red-50 border border-red-200 rounded-lg p-6">
|
||||
<p class="text-red-700">Ошибка загрузки: {{ points.error.message }}</p>
|
||||
</div>
|
||||
|
||||
<!-- Нет баллов -->
|
||||
<div v-else-if="pointLogs.length === 0" class="bg-white rounded-lg shadow p-8 text-center">
|
||||
<p class="text-gray-600 text-lg">У вас пока нет баллов.</p>
|
||||
</div>
|
||||
|
||||
<!-- Есть баллы -->
|
||||
<div v-else>
|
||||
<!-- Список начислений -->
|
||||
<div class="bg-white rounded-lg shadow overflow-hidden mb-8">
|
||||
<ul class="divide-y divide-gray-200">
|
||||
<li v-for="log in pointLogs" :key="log.name" class="p-6 hover:bg-gray-50 transition">
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="flex-1">
|
||||
<div class="flex items-center gap-4">
|
||||
<div class="text-2xl font-bold text-indigo-600">
|
||||
{{ log.points > 0 ? '+' : '' }}{{ log.points }}
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-lg font-medium text-gray-900">
|
||||
{{ log.rule || 'Начисление баллов' }}
|
||||
</p>
|
||||
<p class="text-sm text-gray-500">
|
||||
{{ formatDate(log.creation) }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- Итоговая карточка -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<div class="bg-gradient-to-r from-indigo-500 to-purple-600 rounded-xl shadow-lg p-6 text-white">
|
||||
<p class="text-lg opacity-90">Общая сумма баллов за активность</p>
|
||||
<p class="text-4xl font-bold mt-2">{{ totalPoints }}</p>
|
||||
</div>
|
||||
|
||||
<div class="bg-gradient-to-r from-green-500 to-emerald-600 rounded-xl shadow-lg p-6 text-white">
|
||||
<p class="text-lg opacity-90">Дополнительных баллов при поступлении в МПГУ</p>
|
||||
<p class="text-4xl font-bold mt-2">{{ extraAdmissionPoints }}</p>
|
||||
<p class="text-sm opacity-80 mt-2">
|
||||
(макс. 10 баллов: {{ totalPoints }} ÷ 100)
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { createResource } from 'frappe-ui'
|
||||
|
||||
// Ресурс для получения логов Energy Point Log текущего пользователя
|
||||
const points = createResource({
|
||||
url: 'frappe.client.get_list',
|
||||
params: {
|
||||
doctype: 'Energy Point Log',
|
||||
fields: ['name', 'user', 'points', 'rule', 'creation'],
|
||||
filters: [['user', '=', frappe.session.user]],
|
||||
order_by: 'creation desc',
|
||||
limit_page_length: 0 // без лимита
|
||||
},
|
||||
auto: true,
|
||||
cache: 'energy-point-logs-' + frappe.session.user
|
||||
})
|
||||
|
||||
const pointLogs = computed(() => points.data || [])
|
||||
|
||||
// Сумма всех баллов
|
||||
const totalPoints = computed(() => {
|
||||
if (!pointLogs.value) return 0
|
||||
return pointLogs.value.reduce((sum, log) => sum + (log.points || 0), 0)
|
||||
})
|
||||
|
||||
// Дополнительные баллы при поступлении (по твоей формуле)
|
||||
const extraAdmissionPoints = computed(() => {
|
||||
const extra = Math.floor(totalPoints.value / 100)
|
||||
return extra < 10 ? extra : 10
|
||||
})
|
||||
|
||||
// Форматирование даты
|
||||
function formatDate(dateString) {
|
||||
if (!dateString) return ''
|
||||
return frappe.utils.format_date(dateString, 'dd-MM-yyyy HH:mm')
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
// Принудительно обновим при монтировании (на случай кэша)
|
||||
points.fetch()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* Можно добавить свои стили, если нужно */
|
||||
</style>
|
||||
@@ -30,6 +30,12 @@ const routes = [
|
||||
name: 'ParentProfile',
|
||||
component: () => import('@/pages/ParentProfile.vue'),
|
||||
},
|
||||
{
|
||||
path: '/mypoints',
|
||||
name: 'MyPoints',
|
||||
component: () => import('@/pages/MyPoints.vue'),
|
||||
},
|
||||
// End of test of page
|
||||
{
|
||||
path: '/courses',
|
||||
name: 'Courses',
|
||||
|
||||
Reference in New Issue
Block a user