feat: 完成 P1 全部功能 + 修复 proxy 导出 + 切换 MySQL 端口至 14013
## P1 功能(20 项) - 站内消息系统、家长仪表盘、学生考勤管理 - Excel 导入导出、用户批量导入、成绩导出 - 排课规则+自动排课+课表调整 - 成绩趋势+对比分析、密码安全策略、速率限制 - 数据变更日志、文件预览+存储策略、全文检索 - 依赖审计集成 CI、数据库定时备份、E2E 测试完善 - 通知偏好管理 ## 基础设施修复 - src/proxy.ts: 将 middleware 导出重命名为 proxy(Next.js 16 要求) - .env: MySQL 端口从 13002 切换至 14013 - scripts/create-db.ts: 新增数据库初始化脚本 ## 架构文档同步 - 004_architecture_impact_map.md 和 005_architecture_data.json 完整记录所有新增表、模块、路由、权限、依赖关系
This commit is contained in:
@@ -3,11 +3,10 @@
|
||||
import * as React from "react"
|
||||
import Link from "next/link"
|
||||
import { usePathname } from "next/navigation"
|
||||
import { Bell, Menu, Search } from "lucide-react"
|
||||
import { Menu } from "lucide-react"
|
||||
import { signOut, useSession } from "next-auth/react"
|
||||
|
||||
import { Button } from "@/shared/components/ui/button"
|
||||
import { Input } from "@/shared/components/ui/input"
|
||||
import { Separator } from "@/shared/components/ui/separator"
|
||||
import {
|
||||
Breadcrumb,
|
||||
@@ -26,7 +25,9 @@ import {
|
||||
DropdownMenuSeparator,
|
||||
DropdownMenuTrigger,
|
||||
} from "@/shared/components/ui/dropdown-menu"
|
||||
import { GlobalSearch } from "@/shared/components/global-search"
|
||||
|
||||
import { NotificationDropdown } from "@/modules/messaging/components/notification-dropdown"
|
||||
import { useSidebar } from "./sidebar-provider"
|
||||
import { NAV_CONFIG } from "../config/navigation"
|
||||
|
||||
@@ -110,20 +111,10 @@ export function SiteHeader() {
|
||||
|
||||
<div className="flex items-center gap-4">
|
||||
{/* Global Search */}
|
||||
<div className="relative hidden md:block">
|
||||
<Search className="text-muted-foreground absolute top-2.5 left-2.5 size-4" />
|
||||
<Input
|
||||
type="search"
|
||||
placeholder="Search... (Cmd+K)"
|
||||
className="w-[200px] pl-9 lg:w-[300px]"
|
||||
/>
|
||||
</div>
|
||||
<GlobalSearch className="hidden md:block" />
|
||||
|
||||
{/* Notifications */}
|
||||
<Button variant="ghost" size="icon" className="text-muted-foreground">
|
||||
<Bell className="size-5" />
|
||||
<span className="sr-only">Notifications</span>
|
||||
</Button>
|
||||
<NotificationDropdown />
|
||||
|
||||
{/* User Nav */}
|
||||
<DropdownMenu>
|
||||
|
||||
@@ -1,18 +1,22 @@
|
||||
import {
|
||||
BarChart,
|
||||
BookOpen,
|
||||
Calendar,
|
||||
CalendarRange,
|
||||
LayoutDashboard,
|
||||
Settings,
|
||||
Users,
|
||||
MessageSquare,
|
||||
Shield,
|
||||
CreditCard,
|
||||
FileQuestion,
|
||||
ClipboardList,
|
||||
Library,
|
||||
PenTool,
|
||||
Briefcase
|
||||
Briefcase,
|
||||
ScrollText,
|
||||
Megaphone,
|
||||
GraduationCap,
|
||||
Mail,
|
||||
CalendarCheck,
|
||||
CalendarClock
|
||||
} from "lucide-react"
|
||||
import type { LucideIcon } from "lucide-react"
|
||||
import { Permissions } from "@/shared/types/permissions"
|
||||
@@ -47,38 +51,43 @@ export const NAV_CONFIG: Record<Role, NavItem[]> = {
|
||||
{ title: "Departments", href: "/admin/school/departments" },
|
||||
{ title: "Classes", href: "/admin/school/classes" },
|
||||
{ title: "Academic Year", href: "/admin/school/academic-year" },
|
||||
{ title: "Course Plans", href: "/admin/course-plans", permission: Permissions.COURSE_PLAN_MANAGE },
|
||||
{ title: "Import Users", href: "/admin/users/import", permission: Permissions.USER_MANAGE },
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Users",
|
||||
icon: Users,
|
||||
href: "/admin/users",
|
||||
permission: Permissions.USER_MANAGE,
|
||||
title: "Scheduling",
|
||||
icon: CalendarClock,
|
||||
href: "/admin/scheduling/rules",
|
||||
permission: Permissions.SCHEDULE_ADJUST,
|
||||
items: [
|
||||
{ title: "Teachers", href: "/admin/users/teachers" },
|
||||
{ title: "Students", href: "/admin/users/students" },
|
||||
{ title: "Parents", href: "/admin/users/parents" },
|
||||
{ title: "Staff", href: "/admin/users/staff" },
|
||||
{ title: "Rules", href: "/admin/scheduling/rules", permission: Permissions.SCHEDULE_ADJUST },
|
||||
{ title: "Auto Schedule", href: "/admin/scheduling/auto", permission: Permissions.SCHEDULE_AUTO },
|
||||
{ title: "Change Requests", href: "/admin/scheduling/changes", permission: Permissions.SCHEDULE_ADJUST },
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Courses",
|
||||
icon: BookOpen,
|
||||
href: "/courses",
|
||||
title: "Audit Logs",
|
||||
icon: ScrollText,
|
||||
href: "/admin/audit-logs",
|
||||
permission: Permissions.AUDIT_LOG_READ,
|
||||
items: [
|
||||
{ title: "Course Catalog", href: "/courses/catalog" },
|
||||
{ title: "Schedules", href: "/courses/schedules" },
|
||||
{ title: "Operation Logs", href: "/admin/audit-logs" },
|
||||
{ title: "Login Logs", href: "/admin/audit-logs/login-logs" },
|
||||
{ title: "Data Changes", href: "/admin/audit-logs/data-changes" },
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Reports",
|
||||
icon: BarChart,
|
||||
href: "/reports",
|
||||
title: "Announcements",
|
||||
icon: Megaphone,
|
||||
href: "/admin/announcements",
|
||||
permission: Permissions.ANNOUNCEMENT_MANAGE,
|
||||
},
|
||||
{
|
||||
title: "Finance",
|
||||
icon: CreditCard,
|
||||
href: "/finance",
|
||||
title: "Messages",
|
||||
icon: Mail,
|
||||
href: "/messages",
|
||||
permission: Permissions.MESSAGE_READ,
|
||||
},
|
||||
{
|
||||
title: "Settings",
|
||||
@@ -119,6 +128,18 @@ export const NAV_CONFIG: Record<Role, NavItem[]> = {
|
||||
{ title: "Submissions", href: "/teacher/homework/submissions" },
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Grades",
|
||||
icon: GraduationCap,
|
||||
href: "/teacher/grades",
|
||||
permission: Permissions.GRADE_RECORD_MANAGE,
|
||||
items: [
|
||||
{ title: "All Grades", href: "/teacher/grades" },
|
||||
{ title: "Batch Entry", href: "/teacher/grades/entry", permission: Permissions.GRADE_RECORD_MANAGE },
|
||||
{ title: "Statistics", href: "/teacher/grades/stats", permission: Permissions.GRADE_RECORD_READ },
|
||||
{ title: "Analytics", href: "/teacher/grades/analytics", permission: Permissions.GRADE_RECORD_READ },
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Question Bank",
|
||||
icon: ClipboardList,
|
||||
@@ -136,15 +157,51 @@ export const NAV_CONFIG: Record<Role, NavItem[]> = {
|
||||
{ title: "Schedule", href: "/teacher/classes/schedule", permission: Permissions.CLASS_SCHEDULE },
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Course Plans",
|
||||
icon: CalendarRange,
|
||||
href: "/teacher/course-plans",
|
||||
permission: Permissions.COURSE_PLAN_READ,
|
||||
},
|
||||
{
|
||||
title: "Attendance",
|
||||
icon: CalendarCheck,
|
||||
href: "/teacher/attendance",
|
||||
permission: Permissions.ATTENDANCE_MANAGE,
|
||||
items: [
|
||||
{ title: "Records", href: "/teacher/attendance" },
|
||||
{ title: "Take Attendance", href: "/teacher/attendance/sheet", permission: Permissions.ATTENDANCE_MANAGE },
|
||||
{ title: "Statistics", href: "/teacher/attendance/stats", permission: Permissions.ATTENDANCE_READ },
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Schedule Changes",
|
||||
icon: CalendarClock,
|
||||
href: "/teacher/schedule-changes",
|
||||
permission: Permissions.SCHEDULE_ADJUST,
|
||||
},
|
||||
{
|
||||
title: "Management",
|
||||
icon: Briefcase,
|
||||
href: "/management",
|
||||
permission: Permissions.GRADE_MANAGE,
|
||||
items: [
|
||||
{ title: "Grade Classes", href: "/management/grade/classes" },
|
||||
{ title: "Grade Insights", href: "/management/grade/insights" },
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Announcements",
|
||||
icon: Megaphone,
|
||||
href: "/announcements",
|
||||
permission: Permissions.ANNOUNCEMENT_READ,
|
||||
},
|
||||
{
|
||||
title: "Messages",
|
||||
icon: Mail,
|
||||
href: "/messages",
|
||||
permission: Permissions.MESSAGE_READ,
|
||||
},
|
||||
],
|
||||
student: [
|
||||
{
|
||||
@@ -169,6 +226,30 @@ export const NAV_CONFIG: Record<Role, NavItem[]> = {
|
||||
href: "/student/schedule",
|
||||
permission: Permissions.CLASS_SCHEDULE,
|
||||
},
|
||||
{
|
||||
title: "My Grades",
|
||||
icon: GraduationCap,
|
||||
href: "/student/grades",
|
||||
permission: Permissions.GRADE_RECORD_READ,
|
||||
},
|
||||
{
|
||||
title: "Attendance",
|
||||
icon: CalendarCheck,
|
||||
href: "/student/attendance",
|
||||
permission: Permissions.ATTENDANCE_READ,
|
||||
},
|
||||
{
|
||||
title: "Announcements",
|
||||
icon: Megaphone,
|
||||
href: "/announcements",
|
||||
permission: Permissions.ANNOUNCEMENT_READ,
|
||||
},
|
||||
{
|
||||
title: "Messages",
|
||||
icon: Mail,
|
||||
href: "/messages",
|
||||
permission: Permissions.MESSAGE_READ,
|
||||
},
|
||||
],
|
||||
parent: [
|
||||
{
|
||||
@@ -177,19 +258,28 @@ export const NAV_CONFIG: Record<Role, NavItem[]> = {
|
||||
href: "/parent/dashboard",
|
||||
},
|
||||
{
|
||||
title: "Children",
|
||||
icon: Users,
|
||||
href: "/parent/children",
|
||||
title: "Grades",
|
||||
icon: GraduationCap,
|
||||
href: "/parent/grades",
|
||||
permission: Permissions.GRADE_RECORD_READ,
|
||||
},
|
||||
{
|
||||
title: "Tuition",
|
||||
icon: CreditCard,
|
||||
href: "/parent/tuition",
|
||||
title: "Attendance",
|
||||
icon: CalendarCheck,
|
||||
href: "/parent/attendance",
|
||||
permission: Permissions.ATTENDANCE_READ,
|
||||
},
|
||||
{
|
||||
title: "Announcements",
|
||||
icon: Megaphone,
|
||||
href: "/announcements",
|
||||
permission: Permissions.ANNOUNCEMENT_READ,
|
||||
},
|
||||
{
|
||||
title: "Messages",
|
||||
icon: MessageSquare,
|
||||
icon: Mail,
|
||||
href: "/messages",
|
||||
permission: Permissions.MESSAGE_READ,
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user