diff --git a/src/app/admin/dashboard/page.tsx b/src/app/admin/dashboard/page.tsx index eb96368..894ea79 100644 --- a/src/app/admin/dashboard/page.tsx +++ b/src/app/admin/dashboard/page.tsx @@ -1,27 +1,202 @@ +import { prisma } from "@/lib/prisma"; import Link from "next/link"; -export default function AdminDashboard() { +export default async function AdminDashboard() { + const now = new Date(); + const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000); + const monthAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000); + + const [ + totalStudents, + newStudentsMonth, + totalCourses, + publishedCourses, + activeEnrollments, + expiringWeek, + homeworkPending, + homeworkTotal, + progressTotal, + ] = await Promise.all([ + prisma.user.count({ where: { role: "student" } }), + prisma.user.count({ where: { role: "student", createdAt: { gte: monthAgo } } }), + prisma.course.count(), + prisma.course.count({ where: { published: true } }), + prisma.courseEnrollment.count({ + where: { OR: [{ expiresAt: null }, { expiresAt: { gt: now } }] }, + }), + prisma.courseEnrollment.count({ + where: { expiresAt: { gt: now, lte: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000) } }, + }), + prisma.homeworkSubmission.count({ where: { feedbacks: { none: {} } } }), + prisma.homeworkSubmission.count(), + prisma.lessonProgress.count(), + ]); + + // Recent enrollments + const recentEnrollments = await prisma.courseEnrollment.findMany({ + orderBy: { enrolledAt: "desc" }, + take: 8, + include: { + user: { select: { name: true, email: true } }, + course: { select: { title: true } }, + }, + }); + + // Most active courses (by enrollment count) + const topCourses = await prisma.course.findMany({ + where: { published: true }, + include: { _count: { select: { enrollments: true, modules: true } } }, + orderBy: { enrollments: { _count: "desc" } }, + take: 5, + }); + return ( -
Управление платформой Second Brain.
-📚
-Курсы
-Управление контентом
- - -👥
-Пользователи
-Управление доступом
- -📊
-Аналитика
-Этап 10
++ Платформа Second Brain · {now.toLocaleDateString("ru-RU", { day: "numeric", month: "long", year: "numeric" })} +
+ + {/* Stats grid */} ++ Последние зачисления +
+ + Все → + +Нет зачислений
+ ) : ( +{e.user.name}
+{e.course.title}
++ Популярные курсы +
+ + Все → + +Нет курсов
+ ) : ( +{c.title}
++ {c._count.modules} модулей +
+{c._count.enrollments}
+студентов
++ Активность +
+{progressTotal}
+уроков пройдено
+{homeworkTotal}
+работ сдано
+{value}
++ {label} +
+ {sub && ( ++ {sub} +
+ )} +