- another logic of download user and data
This commit is contained in:
Alexandrina-Kuzeleva
2025-11-20 13:06:55 +03:00
parent 160c7863f0
commit 3f0b00decd

View File

@@ -1,43 +1,52 @@
<template>
<div class="min-h-screen bg-gray-50 py-8">
<div class="max-w-4xl mx-auto px-4">
<div v-if="!$user.data">
<NoPermission />
</div>
<div v-else class="min-h-screen bg-gray-50">
<!-- Хедер как в профиле -->
<header class="sticky top-0 z-10 flex items-center justify-between border-b bg-surface-white px-5 py-3">
<Breadcrumbs :items="breadcrumbs" />
</header>
<div class="mx-auto max-w-4xl px-5 py-8">
<h2 class="text-3xl font-bold text-gray-900 mb-8">Мои баллы</h2>
<!-- Загрузка -->
<div v-if="points.loading" class="text-center py-12">
<div v-if="logs.loading" class="text-center py-16">
<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 v-else-if="logs.error" class="bg-red-50 border border-red-200 rounded-xl p-6">
<p class="text-red-700">Ошибка загрузки баллов</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 v-else-if="pointLogs.length === 0" class="bg-white rounded-xl shadow p-12 text-center">
<p class="text-xl text-gray-600">У вас пока нет баллов за активность</p>
<p class="text-sm text-gray-500 mt-2">Участвуйте в мероприятиях баллы скоро появятся!</p>
</div>
<!-- Есть баллы -->
<div v-else>
<!-- Список начислений -->
<div class="bg-white rounded-lg shadow overflow-hidden mb-8">
<div class="bg-white rounded-xl 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 class="flex items-center gap-5">
<div class="text-2xl font-bold"
:class="log.points > 0 ? 'text-green-600' : 'text-red-600'">
{{ log.points > 0 ? '+' : '' }}{{ log.points }}
</div>
<div>
<p class="font-medium text-gray-900">
{{ log.rule || 'Начисление баллов' }}
</p>
<p class="text-sm text-gray-500">
{{ $format.date(log.creation, 'dd MMMM yyyy в HH:mm') }}
</p>
</div>
</div>
</div>
@@ -47,17 +56,15 @@
<!-- Итоговая карточка -->
<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 class="bg-gradient-to-br from-indigo-500 to-purple-600 rounded-xl p-7 text-white shadow-xl">
<p class="text-lg opacity-90">Всего заработано баллов</p>
<p class="text-5xl font-bold mt-3">{{ 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 class="bg-gradient-to-br from-emerald-500 to-teal-600 rounded-xl p-7 text-white shadow-xl">
<p class="text-lg opacity-90">Дополнительно к ЕГЭ при поступлении в МПГУ</p>
<p class="text-5xl font-bold mt-3">+{{ extraAdmissionPoints }}</p>
<p class="text-sm opacity-80 mt-3">максимум 10 баллов ({{ totalPoints }} ÷ 100)</p>
</div>
</div>
</div>
@@ -66,49 +73,48 @@
</template>
<script setup>
import { ref, computed, onMounted } from 'vue'
import { createResource } from 'frappe-ui'
import { inject, computed, onMounted } from 'vue'
import { createResource, Breadcrumbs } from 'frappe-ui'
import NoPermission from '@/components/NoPermission.vue'
// Ресурс для получения логов Energy Point Log текущего пользователя
const points = createResource({
const $user = inject('$user')
// Загружаем логи напрямую через frappe.client.get_list
const logs = createResource({
url: 'frappe.client.get_list',
params: {
makeParams: () => ({
doctype: 'Energy Point Log',
fields: ['name', 'user', 'points', 'rule', 'creation'],
filters: [['user', '=', frappe.session.user]],
fields: ['name', 'points', 'rule', 'creation'],
filters: [['user', '=', $user.data.email]], // ← используем email, он всегда есть
order_by: 'creation desc',
limit_page_length: 0 // без лимита
},
limit_page_length: 0
}),
auto: true,
cache: 'energy-point-logs-' + frappe.session.user
cache: 'my-energy-points-' + $user.data?.email
})
const pointLogs = computed(() => points.data || [])
const pointLogs = computed(() => logs.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
const bonus = Math.floor(totalPoints.value / 100)
return bonus < 10 ? bonus : 10
})
// Форматирование даты
function formatDate(dateString) {
if (!dateString) return ''
return frappe.utils.format_date(dateString, 'dd-MM-yyyy HH:mm')
}
// Хлебные крошки
const breadcrumbs = computed(() => [
{ label: 'Главная', route: { name: 'Dashboard' } },
{ label: 'Мои баллы' }
])
// Перезагружаем при открытии (на всякий случай)
onMounted(() => {
// Принудительно обновим при монтировании (на случай кэша)
points.fetch()
if ($user.data) {
logs.fetch()
}
})
</script>
<style scoped>
/* Можно добавить свои стили, если нужно */
</style>