This commit is contained in:
ditiqi 2025-02-26 19:49:50 +08:00
parent f2fe2d66be
commit 57f486ca6e
5 changed files with 88 additions and 49 deletions

View File

@ -1,4 +1,10 @@
import React, { useRef, useCallback, useEffect, useMemo, useState } from "react"; import React, {
useRef,
useCallback,
useEffect,
useMemo,
useState,
} from "react";
import { Carousel, Typography } from "antd"; import { Carousel, Typography } from "antd";
import { import {
TeamOutlined, TeamOutlined,
@ -30,13 +36,29 @@ interface PlatformStat {
const HeroSection = () => { const HeroSection = () => {
const carouselRef = useRef<CarouselRef>(null); const carouselRef = useRef<CarouselRef>(null);
const { statistics, slides } = useAppConfig(); const { statistics, slides } = useAppConfig();
const [countStatistics, setCountStatistics] = useState<number>(4) const [countStatistics, setCountStatistics] = useState<number>(4);
const platformStats: PlatformStat[] = useMemo(() => { const platformStats: PlatformStat[] = useMemo(() => {
return [ return [
{ icon: <TeamOutlined />, value: statistics.staffs, label: "注册学员" }, {
{ icon: <StarOutlined />, value: statistics.courses, label: "精品课程" }, icon: <TeamOutlined />,
{ icon: <BookOutlined />, value: statistics.lectures, label: '课程章节' }, value: statistics.staffs,
{ icon: <EyeOutlined />, value: statistics.reads, label: "观看次数" }, label: "注册学员",
},
{
icon: <StarOutlined />,
value: statistics.courses,
label: "精品课程",
},
{
icon: <BookOutlined />,
value: statistics.lectures,
label: "课程章节",
},
{
icon: <EyeOutlined />,
value: statistics.reads,
label: "观看次数",
},
]; ];
}, [statistics]); }, [statistics]);
const handlePrev = useCallback(() => { const handlePrev = useCallback(() => {
@ -48,7 +70,7 @@ const HeroSection = () => {
}, []); }, []);
const countNonZeroValues = (statistics: Record<string, number>): number => { const countNonZeroValues = (statistics: Record<string, number>): number => {
return Object.values(statistics).filter(value => value !== 0).length; return Object.values(statistics).filter((value) => value !== 0).length;
}; };
useEffect(() => { useEffect(() => {
@ -67,8 +89,8 @@ const HeroSection = () => {
dots={{ dots={{
className: "carousel-dots !bottom-32 !z-20", className: "carousel-dots !bottom-32 !z-20",
}}> }}>
{Array.isArray(slides) ? {Array.isArray(slides) ? (
(slides.map((item, index) => ( slides.map((item, index) => (
<div key={index} className="relative h-[600px]"> <div key={index} className="relative h-[600px]">
<div <div
className="absolute inset-0 bg-cover bg-center transform transition-[transform,filter] duration-[2000ms] group-hover:scale-105 group-hover:brightness-110 will-change-[transform,filter]" className="absolute inset-0 bg-cover bg-center transform transition-[transform,filter] duration-[2000ms] group-hover:scale-105 group-hover:brightness-110 will-change-[transform,filter]"
@ -108,13 +130,13 @@ const HeroSection = () => {
</div> </div>
{/* Stats Container */} {/* Stats Container */}
{ {countStatistics > 1 && (
countStatistics > 1 && (
<div className="absolute -bottom-20 left-1/2 -translate-x-1/2 w-3/5 max-w-6xl px-4"> <div className="absolute -bottom-20 left-1/2 -translate-x-1/2 w-3/5 max-w-6xl px-4">
<div className={`rounded-2xl grid grid-cols-${countStatistics} lg:grid-cols-${countStatistics} md:grid-cols-${countStatistics} gap-4 md:gap-8 p-6 md:p-8 bg-white border shadow-xl hover:shadow-2xl transition-shadow duration-500 will-change-[transform,box-shadow]`}> <div
className={`rounded-2xl grid grid-cols-${countStatistics} lg:grid-cols-${countStatistics} md:grid-cols-${countStatistics} gap-4 md:gap-8 p-6 md:p-8 bg-white border shadow-xl hover:shadow-2xl transition-shadow duration-500 will-change-[transform,box-shadow]`}>
{platformStats.map((stat, index) => { {platformStats.map((stat, index) => {
return stat.value return stat.value ? (
? (<div <div
key={index} key={index}
className="text-center transform hover:-translate-y-1 hover:scale-105 transition-transform duration-300 ease-out"> className="text-center transform hover:-translate-y-1 hover:scale-105 transition-transform duration-300 ease-out">
<div className="inline-flex items-center justify-center w-16 h-16 mb-4 rounded-full bg-primary-50 text-primary-600 text-3xl transition-colors duration-300 group-hover:text-primary-700"> <div className="inline-flex items-center justify-center w-16 h-16 mb-4 rounded-full bg-primary-50 text-primary-600 text-3xl transition-colors duration-300 group-hover:text-primary-700">
@ -127,12 +149,11 @@ const HeroSection = () => {
{stat.label} {stat.label}
</div> </div>
</div> </div>
) : null ) : null;
})} })}
</div> </div>
</div> </div>
) )}
}
</section> </section>
); );
}; };

View File

@ -86,6 +86,20 @@ export function UserMenu() {
setModalOpen(true); setModalOpen(true);
}, },
}, },
{
icon: <UserOutlined className="text-lg" />,
label: "我创建的课程",
action: () => {
setModalOpen(true);
},
},
{
icon: <UserOutlined className="text-lg" />,
label: "我学习的课程",
action: () => {
setModalOpen(true);
},
},
canManageAnyStaff && { canManageAnyStaff && {
icon: <SettingOutlined className="text-lg" />, icon: <SettingOutlined className="text-lg" />,
label: "设置", label: "设置",
@ -222,7 +236,8 @@ export function UserMenu() {
focus:ring-2 focus:ring-[#00538E]/20 focus:ring-2 focus:ring-[#00538E]/20
group relative overflow-hidden group relative overflow-hidden
active:scale-[0.99] active:scale-[0.99]
${item.label === "注销" ${
item.label === "注销"
? "text-[#B22234] hover:bg-red-50/80 hover:text-red-700" ? "text-[#B22234] hover:bg-red-50/80 hover:text-red-700"
: "text-[#00538E] hover:bg-[#E6EEF5] hover:text-[#003F6A]" : "text-[#00538E] hover:bg-[#E6EEF5] hover:text-[#003F6A]"
}`}> }`}>
@ -230,7 +245,8 @@ export function UserMenu() {
className={`w-5 h-5 flex items-center justify-center className={`w-5 h-5 flex items-center justify-center
transition-all duration-200 ease-in-out transition-all duration-200 ease-in-out
group-hover:scale-110 group-hover:rotate-6 group-hover:scale-110 group-hover:rotate-6
group-hover:translate-x-0.5 ${item.label === "注销" group-hover:translate-x-0.5 ${
item.label === "注销"
? "group-hover:text-red-600" ? "group-hover:text-red-600"
: "group-hover:text-[#003F6A]" : "group-hover:text-[#003F6A]"
}`}> }`}>

View File

@ -0,0 +1,7 @@
export default function MyDutyPage() {
return <>
</>
}

View File

@ -0,0 +1,3 @@
export default function MyLearningPage() {
return <></>;
}

View File

@ -288,14 +288,6 @@ model Visit {
message Message? @relation(fields: [messageId], references: [id]) message Message? @relation(fields: [messageId], references: [id])
messageId String? @map("message_id") messageId String? @map("message_id")
lectureId String? @map("lecture_id") // 课时ID lectureId String? @map("lecture_id") // 课时ID
// 学习数据
// progress Float? @default(0) @map("progress") // 完成进度(0-100%)
// isCompleted Boolean? @default(false) @map("is_completed") // 是否完成
// lastPosition Int? @default(0) @map("last_position") // 视频播放位置(秒)
// totalWatchTime Int? @default(0) @map("total_watch_time") // 总观看时长(秒)
// // 时间记录
// lastWatchedAt DateTime? @map("last_watched_at") // 最后观看时间
createdAt DateTime @default(now()) @map("created_at") // 创建时间 createdAt DateTime @default(now()) @map("created_at") // 创建时间
updatedAt DateTime @updatedAt @map("updated_at") // 更新时间 updatedAt DateTime @updatedAt @map("updated_at") // 更新时间
deletedAt DateTime? @map("deleted_at") // 删除时间,可为空 deletedAt DateTime? @map("deleted_at") // 删除时间,可为空