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:
SpecialX
2026-06-17 13:44:37 +08:00
parent 125f7ec54c
commit 3b6272c99d
195 changed files with 27274 additions and 416 deletions

View File

@@ -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>

View File

@@ -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,
},
]
}