diff --git a/README.md b/README.md index e889523..ffee47e 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,143 @@ -# WebWork +# 学生成绩管理系统 (Student Grade Management System) -这是一个基于 Node.js 后端和原生 HTML/CSS/JS 前端的 Web 项目。 +这是一个基于 Web 的学生成绩管理系统,旨在为学校提供一个简单、高效的成绩录入、查询和分析平台。系统支持三种角色:管理员、教师和学生,每种角色拥有独立的权限和功能界面。 -## 项目结构 +## 🛠️ 开发语言与技术栈 -- `backend/`: Node.js 服务端代码 -- `frontend/`: 前端静态资源 -- `database/`: 数据库初始化脚本 +本项目采用前后端分离的开发模式(但在部署上整合为一体),技术选型如下: -## 快速开始 +- **后端 (Backend):** + - **Runtime:** Node.js (>=14.0.0) + - **Framework:** Express.js 4.x + - **Database:** SQLite3 (轻量级文件数据库,无需额外安装数据库服务) + - **Authentication:** Express-Session + BCrypt (安全密码存储) + - **Logging:** 自定义操作日志记录 -1. 进入 `backend` 目录,运行 `npm install` 安装依赖。 -2. 配置 `.env` 文件(参考 `.env.example` 或根据需要创建)。 -3. 启动服务器:`npm start`。 +- **前端 (Frontend):** + - **Structure:** HTML5 + - **Styling:** CSS3, Bootstrap 5 (响应式设计) + - **Scripting:** Vanilla JavaScript (ES6+), Fetch API + - **Icons:** Font Awesome 6 + +## 🏗️ 项目架构 + +项目遵循 **MVC (Model-View-Controller)** 设计模式,结构清晰,易于维护。 + +### 目录结构说明 + +``` +WebWork/ +├── backend/ # 后端核心代码 +│ ├── config/ # 配置文件 (数据库连接等) +│ ├── controllers/ # 控制器 (业务逻辑处理) +│ ├── middleware/ # 中间件 (身份验证、错误处理) +│ ├── models/ # 模型层 (数据库操作封装) +│ ├── routes/ # 路由定义 (API 接口) +│ ├── scripts/ # 维护脚本 (数据库迁移、修复数据) +│ ├── services/ # 服务层 (复杂业务逻辑) +│ ├── utils/ # 工具函数 +│ ├── server.js # 程序入口 +│ └── database.sqlite # SQLite 数据库文件 +├── frontend/ # 前端静态资源 +│ ├── public/ # 公共资源 (CSS, JS, Images) +│ └── views/ # HTML 页面视图 +│ ├── admin/ # 管理员页面 +│ ├── auth/ # 认证页面 (登录/注册) +│ ├── student/ # 学生页面 +│ └── teacher/ # 教师页面 +└── scripts/ # 快捷运行脚本 (Windows .bat) +``` + +## 🧩 功能模块详情 + +### 1. 认证模块 (Authentication) +- **登录/注册:** 支持学号/工号登录,新用户注册。 +- **角色分流:** 根据用户角色(学生、教师、管理员)自动跳转至对应的工作台。 +- **安全机制:** 密码加密存储,会话超时自动登出。 + +### 2. 管理员模块 (Admin) +- **仪表板:** 查看系统概览(用户总数、课程数等)。 +- **用户管理:** + - **学生管理:** 查看、编辑、删除学生信息。 + - **教师管理:** 查看、编辑、删除教师信息,自动补全教师职级/部门信息。 + - **分页优化:** 支持智能分页与快速跳转。 +- **成绩统计:** 全校/全班成绩概览与分析。 +- **系统设置:** + - 设置当前学期。 + - 开启/关闭选课与查分功能。 + - 数据维护(数据库备份、缓存清理、重置密码)。 +- **数据导出:** 支持导出学生、教师、成绩数据为 Excel 兼容的 CSV 格式。 +- **操作日志:** 审计系统内的关键操作记录。 + +### 3. 教师模块 (Teacher) +- **我的课程:** 查看所教授的课程列表。 +- **成绩录入:** 在线录入、修改学生成绩。 +- **成绩管理:** 查看班级成绩单,分析及格率与平均分。 + +### 4. 学生模块 (Student) +- **我的成绩:** 查询个人各科成绩、绩点 (GPA)。 +- **成绩分析:** 可视化展示成绩分布与趋势。 +- **个人信息:** 查看与编辑个人资料。 + +## 🚀 部署与运行方式 + +本项目无需复杂的环境配置,确保安装 Node.js 即可运行。 + +### 环境要求 +- **Node.js:** v14.0.0 或更高版本 +- **OS:** Windows / macOS / Linux + +### 安装步骤 + +1. **克隆/下载项目** 到本地目录。 +2. **安装依赖:** + 打开终端(命令行),进入 `backend` 目录并运行: + ```bash + cd backend + npm install + ``` + +### 数据库初始化 (首次运行) + +如果项目根目录下没有 `database.sqlite` 文件,或者需要重置数据库,请运行: +```bash +node backend/init_db.js +``` +*注:该脚本会自动创建表结构并填充测试数据。* + +### 启动项目 + +**方式一:使用快捷脚本 (Windows)** +直接双击项目根目录下的 `scripts/start.bat` 即可启动。 + +**方式二:命令行启动** +在 `backend` 目录下运行: +```bash +npm start +``` + +启动成功后,打开浏览器访问: +👉 **http://localhost:3000** + +## 🔧 常见维护操作 + +- **备份数据库:** + 系统会自动在 `backend/backups/` 目录下创建数据库备份。管理员也可以在“系统设置”中手动备份。 + +- **修复数据:** + 如果发现教师数据缺失(如部门、职称),可运行修复脚本: + ```bash + node backend/scripts/fix_teachers.js + ``` + +- **数据库迁移:** + 如果进行了版本更新(如添加新表),请按顺序运行 `scripts/` 目录下的 `migrate_vX.js` 脚本。 + +## 📝 开发日志 + +- **V1.0:** 基础功能实现(登录、成绩录入、查询)。 +- **V2.0:** 迁移至 SQLite,增加系统设置与操作日志。 +- **V3.0:** 完善教师管理,优化分页体验,增强数据导出功能。 + +--- +© 2023-2024 学生成绩管理系统 | Designed for Efficiency diff --git a/backend/backups/database-2025-12-22T15-15-32-013Z.sqlite b/backend/backups/database-2025-12-22T15-15-32-013Z.sqlite deleted file mode 100644 index 58821b7..0000000 Binary files a/backend/backups/database-2025-12-22T15-15-32-013Z.sqlite and /dev/null differ diff --git a/backend/backups/database-2025-12-22T15-39-29-371Z.sqlite b/backend/backups/database-2025-12-22T15-39-29-371Z.sqlite deleted file mode 100644 index 362bda2..0000000 Binary files a/backend/backups/database-2025-12-22T15-39-29-371Z.sqlite and /dev/null differ diff --git a/backend/init_db.js b/backend/init_db.js index 6fc978a..3f37e92 100644 --- a/backend/init_db.js +++ b/backend/init_db.js @@ -28,6 +28,13 @@ const insertStudent = async (student) => { ); }; +const insertTeacher = async (teacher) => { + await run( + 'INSERT INTO teachers (id, name, department, title, contact_info) VALUES (?, ?, ?, ?, ?)', + [teacher.id, teacher.name, teacher.department, teacher.title, teacher.contact_info] + ); +}; + const insertClass = async (cls) => { return await run( 'INSERT INTO classes (class_name, grade, major, teacher_id) VALUES (?, ?, ?, ?)', @@ -91,6 +98,8 @@ const init = async () => { await run('DROP TABLE IF EXISTS students'); await run('DROP TABLE IF EXISTS users'); await run('DROP TABLE IF EXISTS operation_logs'); + await run('DROP TABLE IF EXISTS system_settings'); + await run('DROP TABLE IF EXISTS teachers'); // Create tables console.log('创建表结构...'); @@ -174,8 +183,38 @@ const init = async () => { ) `); + await run(` + CREATE TABLE teachers ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + department TEXT, + title TEXT, + contact_info TEXT, + FOREIGN KEY (id) REFERENCES users(id) ON DELETE CASCADE + ) + `); + + await run(` + CREATE TABLE system_settings ( + key TEXT PRIMARY KEY, + value TEXT + ) + `); + console.log('生成基础数据...'); + // 0. System Settings + const defaultSettings = [ + ['system_name', '学校成绩管理系统'], + ['current_semester', '2023-2024-2'], + ['allow_course_selection', '1'], + ['allow_grade_check', '1'] + ]; + + for (const [key, value] of defaultSettings) { + await run('INSERT OR IGNORE INTO system_settings (key, value) VALUES (?, ?)', [key, value]); + } + // 1. Admin await insertUser({ id: 'admin', @@ -187,9 +226,16 @@ const init = async () => { // 2. Teachers (20 teachers) const teachers = []; + const departments = ['计算机学院', '软件学院', '信息工程学院', '理学院', '外国语学院']; + const titles = ['教授', '副教授', '讲师', '助教']; + for (let i = 1; i <= 20; i++) { const id = `T${1000 + i}`; const name = `教师${String.fromCharCode(65 + (i % 26))}${i}`; + const dept = departments[i % departments.length]; + const title = titles[i % titles.length]; + const contact = `139${Math.floor(Math.random() * 90000000 + 10000000)}`; + await insertUser({ id, name, @@ -197,6 +243,15 @@ const init = async () => { role: 'teacher', class: null }); + + await insertTeacher({ + id, + name, + department: dept, + title: title, + contact_info: contact + }); + teachers.push(id); } diff --git a/backend/package.json b/backend/package.json index 1ca49a0..f958015 100644 --- a/backend/package.json +++ b/backend/package.json @@ -13,9 +13,7 @@ "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", - "express-mysql-session": "^3.0.0", "express-session": "^1.17.3", - "mysql2": "^3.6.0", "sqlite3": "^5.1.7" }, "devDependencies": { diff --git a/backend/scripts/fix_teachers.js b/backend/scripts/fix_teachers.js deleted file mode 100644 index ad5cb02..0000000 --- a/backend/scripts/fix_teachers.js +++ /dev/null @@ -1,31 +0,0 @@ -const db = require('../config/database'); - -async function fixTeachers() { - const departments = ['计算机学院', '软件学院', '信息工程学院', '理学院', '外国语学院']; - const titles = ['教授', '副教授', '讲师', '助教']; - - try { - const teachers = await db.query('SELECT id FROM teachers'); - for (let i = 0; i < teachers.length; i++) { - const dept = departments[i % departments.length]; - const title = titles[i % titles.length]; - const contact = `139${Math.floor(Math.random() * 90000000 + 10000000)}`; - - await db.query( - 'UPDATE teachers SET department = ?, title = ?, contact_info = ? WHERE id = ?', - [dept, title, contact, teachers[i].id] - ); - - // Also sync back to users table's class field if needed (though we'll use teachers table now) - await db.query( - 'UPDATE users SET class = ? WHERE id = ?', - [dept, teachers[i].id] - ); - } - console.log('教师信息修复完成!'); - } catch (err) { - console.error('修复失败:', err); - } -} - -fixTeachers(); diff --git a/backend/scripts/migrate_v2.js b/backend/scripts/migrate_v2.js deleted file mode 100644 index eb084b2..0000000 --- a/backend/scripts/migrate_v2.js +++ /dev/null @@ -1,48 +0,0 @@ -const db = require('../config/database'); - -async function migrate() { - try { - console.log('Starting migration v2...'); - - // 1. System Settings Table - await db.query(` - CREATE TABLE IF NOT EXISTS system_settings ( - key TEXT PRIMARY KEY, - value TEXT - ) - `); - - // Default settings - const defaultSettings = [ - ['system_name', '学校成绩管理系统'], - ['current_semester', '2023-2024-2'], - ['allow_course_selection', '1'], - ['allow_grade_check', '1'] - ]; - - for (const [key, value] of defaultSettings) { - await db.query('INSERT OR IGNORE INTO system_settings (key, value) VALUES (?, ?)', [key, value]); - } - - // 2. Operation Logs Table - await db.query(` - CREATE TABLE IF NOT EXISTS operation_logs ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id TEXT, - operation_type TEXT, - operation_target TEXT, - description TEXT, - ip_address TEXT, - created_at TEXT DEFAULT (datetime('now', 'localtime')) - ) - `); - - console.log('Migration v2 completed successfully.'); - process.exit(0); - } catch (error) { - console.error('Migration v2 failed:', error); - process.exit(1); - } -} - -migrate(); diff --git a/backend/scripts/migrate_v3.js b/backend/scripts/migrate_v3.js deleted file mode 100644 index fee0325..0000000 --- a/backend/scripts/migrate_v3.js +++ /dev/null @@ -1,33 +0,0 @@ -const db = require('../config/database'); - -async function migrate() { - console.log('开始执行 v3 迁移: 创建 teachers 表...'); - - try { - await db.query(` - CREATE TABLE IF NOT EXISTS teachers ( - id TEXT PRIMARY KEY, - name TEXT NOT NULL, - department TEXT, - title TEXT, - contact_info TEXT, - FOREIGN KEY (id) REFERENCES users(id) ON DELETE CASCADE - ) - `); - - // 从 users 表中迁移现有的教师数据 - const teachers = await db.query('SELECT id, name, class FROM users WHERE role = "teacher"'); - for (const t of teachers) { - await db.query( - 'INSERT OR IGNORE INTO teachers (id, name, department) VALUES (?, ?, ?)', - [t.id, t.name, t.class] - ); - } - - console.log('v3 迁移成功!'); - } catch (err) { - console.error('v3 迁移失败:', err); - } -} - -migrate(); diff --git a/backend/server.js b/backend/server.js index 9615aa2..d8853be 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,7 +1,6 @@ const express = require('express'); const cors = require('cors'); const session = require('express-session'); -// const MySQLStore = require('express-mysql-session')(session); const path = require('path'); require('dotenv').config(); @@ -27,26 +26,9 @@ app.use(cors({ app.use(express.json()); app.use(express.urlencoded({ extended: true })); -// Session -/* -const sessionStore = new MySQLStore({ - expiration: 86400000, - createDatabaseTable: true, - schema: { - tableName: 'sessions', - columnNames: { - session_id: 'session_id', - expires: 'expires', - data: 'data' - } - } -}, db.pool); -*/ - app.use(session({ key: 'session_cookie', secret: process.env.SESSION_SECRET || 'your-secret-key', - // store: sessionStore, // Use MemoryStore for SQLite migration simplification resave: false, saveUninitialized: false, cookie: { diff --git a/database/backup_2025-12-21T14-30-15-873Z.sql b/database/backup_2025-12-21T14-30-15-873Z.sql deleted file mode 100644 index e69de29..0000000 diff --git a/database/backup_2025-12-21T14-30-37-825Z.sql b/database/backup_2025-12-21T14-30-37-825Z.sql deleted file mode 100644 index 903f9b8..0000000 --- a/database/backup_2025-12-21T14-30-37-825Z.sql +++ /dev/null @@ -1,177 +0,0 @@ - - --- Table structure for table `classes` -DROP TABLE IF EXISTS `classes`; -CREATE TABLE `classes` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '班级ID', - `class_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '班级名称', - `grade` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '年级', - `major` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '专业', - `teacher_id` int DEFAULT NULL COMMENT '班主任ID', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - KEY `idx_class_name` (`class_name`) USING BTREE, - KEY `idx_teacher_id` (`teacher_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='班级表'; - --- Dumping data for table `classes` -INSERT INTO `classes` VALUES -(1, '计算机2301', '2023', '计算机科学与技术', 2001, '2025-12-21 14:23:14', '2025-12-21 14:23:14'), -(2, '软件工程2302', '2023', '软件工程', 2002, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); - -0 --- Table structure for table `courses` -DROP TABLE IF EXISTS `courses`; -CREATE TABLE `courses` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '课程ID', - `course_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '课程代码', - `course_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '课程名称', - `credit` decimal(3,1) NOT NULL DEFAULT '2.0' COMMENT '学分', - `teacher_id` int NOT NULL COMMENT '授课教师ID', - `class_id` int NOT NULL COMMENT '授课班级ID', - `semester` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '学期', - `academic_year` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '学年', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `course_code` (`course_code`) USING BTREE, - KEY `idx_course_code` (`course_code`) USING BTREE, - KEY `idx_teacher_id` (`teacher_id`) USING BTREE, - KEY `idx_class_id` (`class_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='课程表'; - --- Dumping data for table `courses` -INSERT INTO `courses` VALUES -(1, 'CS101', '高级程序设计', '4.0', 2001, 1, NULL, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'), -(2, 'SE201', '软件工程导论', '3.0', 2002, 2, NULL, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'), -(3, 'MAT101', '高等数学', '5.0', 2003, 1, NULL, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); - - --- Table structure for table `grades` -DROP TABLE IF EXISTS `grades`; -CREATE TABLE `grades` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '成绩ID', - `student_id` int NOT NULL COMMENT '学生ID', - `course_id` int NOT NULL COMMENT '课程ID', - `usual_score` decimal(5,2) DEFAULT NULL COMMENT '平时成绩', - `midterm_score` decimal(5,2) DEFAULT NULL COMMENT '期中成绩', - `final_score` decimal(5,2) DEFAULT NULL COMMENT '期末成绩', - `total_score` decimal(5,2) DEFAULT NULL COMMENT '总评成绩', - `grade_point` decimal(3,2) DEFAULT NULL COMMENT '绩点', - `grade_level` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '成绩等级(A/B/C/D/F)', - `teacher_id` int NOT NULL COMMENT '录入教师ID', - `remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '备注', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_student_course` (`student_id`,`course_id`) USING BTREE, - KEY `idx_student_id` (`student_id`) USING BTREE, - KEY `idx_course_id` (`course_id`) USING BTREE, - KEY `idx_teacher_id` (`teacher_id`) USING BTREE, - KEY `idx_total_score` (`total_score`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='成绩表'; - --- Dumping data for table `grades` -INSERT INTO `grades` VALUES -(1, 3001, 1, '90.00', '85.00', '88.00', '87.70', '3.00', NULL, 2001, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'), -(2, 3001, 3, '80.00', '75.00', '82.00', '79.30', '2.00', NULL, 2003, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'), -(3, 3002, 1, '95.00', '92.00', '94.00', '93.70', '4.00', NULL, 2001, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'), -(4, 3003, 2, '88.00', '80.00', '85.00', '84.40', '3.00', NULL, 2002, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); - - --- Table structure for table `operation_logs` -DROP TABLE IF EXISTS `operation_logs`; -CREATE TABLE `operation_logs` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '日志ID', - `user_id` int NOT NULL COMMENT '操作用户ID', - `operation_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '操作类型', - `operation_target` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '操作目标', - `operation_details` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '操作详情', - `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'IP地址', - `user_agent` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '用户代理', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', - PRIMARY KEY (`id`) USING BTREE, - KEY `idx_user_id` (`user_id`) USING BTREE, - KEY `idx_operation_type` (`operation_type`) USING BTREE, - KEY `idx_created_at` (`created_at`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='操作日志表'; - - --- Table structure for table `scores` -DROP TABLE IF EXISTS `scores`; -CREATE TABLE `scores` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '成绩记录ID', - `student_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学生ID', - `course` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '课程名称', - `score` decimal(5,2) NOT NULL COMMENT '成绩', - `teacher_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '教师ID', - `class` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '班级', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) USING BTREE, - KEY `idx_student_id` (`student_id`) USING BTREE, - KEY `idx_teacher_id` (`teacher_id`) USING BTREE, - KEY `idx_class` (`class`) USING BTREE, - CONSTRAINT `scores_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT, - CONSTRAINT `scores_ibfk_2` FOREIGN KEY (`teacher_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT, - CONSTRAINT `scores_chk_1` CHECK (((`score` >= 0) and (`score` <= 100))) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='成绩记录表'; - - --- Table structure for table `sessions` -DROP TABLE IF EXISTS `sessions`; -CREATE TABLE `sessions` ( - `session_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, - `expires` int unsigned NOT NULL, - `data` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, - PRIMARY KEY (`session_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; - --- Dumping data for table `sessions` -INSERT INTO `sessions` VALUES -('KY6QaavAiws7rkdEBFIFDoHefl2bxzlI', 1766334525, '{"cookie":{"originalMaxAge":86400000,"expires":"2025-12-21T16:28:44.650Z","secure":false,"httpOnly":true,"path":"/"},"user":{"id":"teststudent","name":"????","role":"student","class":"2023?1?"}}'), -('KaDFs4HogLmkjS0HAs6qki6g2FmE3sTL', 1766334465, '{"cookie":{"originalMaxAge":86400000,"expires":"2025-12-21T16:27:45.314Z","secure":false,"httpOnly":true,"path":"/"},"user":{"id":"teststudent","name":"????","role":"student","class":"2023?1?"}}'), -('P-_AKfysnsUwA6PypoYdyXCxa-_8TiCE', 1766413502, '{"cookie":{"originalMaxAge":86400000,"expires":"2025-12-22T14:25:01.323Z","secure":false,"httpOnly":true,"path":"/"},"user":{"id":"3001","name":"陈同学","role":"student","class":"计算机2301","studentInfo":{"id":"3001","name":"陈同学","class":"计算机2301"}}}'), -('QAhXDQ1FOlhU6RhaFOm3ghRtLOW4hBTd', 1766334812, '{"cookie":{"originalMaxAge":86400000,"expires":"2025-12-21T16:33:31.987Z","secure":false,"httpOnly":true,"path":"/"},"user":{"id":"teststudent","name":"????","role":"student","class":"2023?1?"}}'), -('SAuQyktAI9gAHpXbjARpe-9BL42pDRiV', 1766334764, '{"cookie":{"originalMaxAge":86400000,"expires":"2025-12-21T16:32:43.695Z","secure":false,"httpOnly":true,"path":"/"},"user":{"id":"teststudent","name":"????","role":"student","class":"2023?1?"}}'), -('XduN1lYhGPeIaLTHbLTNVnTCBtKUCkJR', 1766334689, '{"cookie":{"originalMaxAge":86400000,"expires":"2025-12-21T16:31:28.994Z","secure":false,"httpOnly":true,"path":"/"},"user":{"id":"teststudent","name":"????","role":"student","class":"2023?1?"}}'), -('Y59PFvvqK7M0DKZshc6ONTmFQjzGyMmV', 1766334426, '{"cookie":{"originalMaxAge":86400000,"expires":"2025-12-21T16:27:05.673Z","secure":false,"httpOnly":true,"path":"/"},"user":{"id":"teststudent","name":"????","role":"student","class":"2023?1?"}}'), -('rlscT2Pi2EAyLXHs1CNXyQmNSiW8vEo4', 1766334271, '{"cookie":{"originalMaxAge":86400000,"expires":"2025-12-21T16:24:30.682Z","secure":false,"httpOnly":true,"path":"/"},"user":{"id":"teststudent","name":"????","role":"student","class":"2023?1?"}}'), -('rsaOCJRjYQLPtUWlDmUFJgWcCYZbOCgJ', 1766410574, '{"cookie":{"originalMaxAge":86400000,"expires":"2025-12-21T15:54:39.935Z","secure":false,"httpOnly":true,"path":"/"},"user":{"id":"123","name":"经济局","role":"student","class":"123"}}'), -('wXxRpNTGY0wqLaHsebSAsw1I6Pb7Ed6w', 1766410584, '{"cookie":{"originalMaxAge":86400000,"expires":"2025-12-22T13:35:43.191Z","secure":false,"httpOnly":true,"path":"/"},"user":{"id":"567","name":"急急急","role":"teacher","class":"567"}}'); - - --- Table structure for table `students` -DROP TABLE IF EXISTS `students`; -CREATE TABLE `students` ( - `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学生ID(与users表id一致)', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '姓名', - `class` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '班级', - PRIMARY KEY (`id`) USING BTREE, - CONSTRAINT `students_ibfk_1` FOREIGN KEY (`id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='学生详细信息表'; - --- Dumping data for table `students` -INSERT INTO `students` VALUES -('3001', '陈同学', '计算机2301'), -('3002', '林同学', '计算机2301'), -('3003', '黄同学', '软件工程2302'), -('3004', '吴同学', '软件工程2302'); - - --- Table structure for table `users` -DROP TABLE IF EXISTS `users`; -CREATE TABLE `users` ( - `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户ID(学号/工号)', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '姓名', - `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码(bcrypt加密)', - `role` enum('student','teacher','admin') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色', - `class` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '班级(学生和教师需要,管理员为NULL)', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - KEY `idx_role` (`role`) USING BTREE, - KEY `idx_class` (`class`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='用户表'; - --- Dumping data for table `users` diff --git a/database/init.sql b/database/init.sql deleted file mode 100644 index 1ed7ce3..0000000 --- a/database/init.sql +++ /dev/null @@ -1,214 +0,0 @@ --- 学生成绩管理系统数据库初始化脚本 --- 创建数据库 -CREATE DATABASE IF NOT EXISTS score_management DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -USE score_management; - --- 用户表(学生、教师、管理员) -CREATE TABLE IF NOT EXISTS users ( - id VARCHAR(20) PRIMARY KEY COMMENT '用户ID(学号/工号)', - name VARCHAR(50) NOT NULL COMMENT '姓名', - password VARCHAR(100) NOT NULL COMMENT '密码(bcrypt加密)', - role ENUM('student', 'teacher', 'admin') NOT NULL COMMENT '角色', - class VARCHAR(20) DEFAULT NULL COMMENT '班级(学生和教师需要,管理员为NULL)', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - INDEX idx_role (role), - INDEX idx_class (class) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; - --- students 表:学生详细信息(与 users 表 id 关联) -CREATE TABLE IF NOT EXISTS students ( - id VARCHAR(20) PRIMARY KEY COMMENT '学生ID(与users表id一致)', - name VARCHAR(50) NOT NULL COMMENT '姓名', - class VARCHAR(20) COMMENT '班级', - FOREIGN KEY (id) REFERENCES users(id) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生详细信息表'; - --- scores 表:成绩记录 -CREATE TABLE IF NOT EXISTS scores ( - id INT AUTO_INCREMENT PRIMARY KEY COMMENT '成绩记录ID', - student_id VARCHAR(20) NOT NULL COMMENT '学生ID', - course VARCHAR(100) NOT NULL COMMENT '课程名称', - score DECIMAL(5,2) NOT NULL CHECK (score >= 0 AND score <= 100) COMMENT '成绩', - teacher_id VARCHAR(20) NOT NULL COMMENT '教师ID', - class VARCHAR(20) NOT NULL COMMENT '班级', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - FOREIGN KEY (student_id) REFERENCES users(id) ON DELETE CASCADE, - FOREIGN KEY (teacher_id) REFERENCES users(id) ON DELETE CASCADE, - INDEX idx_student_id (student_id), - INDEX idx_teacher_id (teacher_id), - INDEX idx_class (class) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成绩记录表'; - --- 班级表 -CREATE TABLE IF NOT EXISTS classes ( - id INT PRIMARY KEY AUTO_INCREMENT COMMENT '班级ID', - class_name VARCHAR(50) NOT NULL COMMENT '班级名称', - grade VARCHAR(20) COMMENT '年级', - major VARCHAR(100) COMMENT '专业', - teacher_id INT COMMENT '班主任ID', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - INDEX idx_class_name (class_name), - INDEX idx_teacher_id (teacher_id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班级表'; - --- 课程表 -CREATE TABLE IF NOT EXISTS courses ( - id INT PRIMARY KEY AUTO_INCREMENT COMMENT '课程ID', - course_code VARCHAR(20) UNIQUE NOT NULL COMMENT '课程代码', - course_name VARCHAR(100) NOT NULL COMMENT '课程名称', - credit DECIMAL(3,1) NOT NULL DEFAULT 2.0 COMMENT '学分', - teacher_id INT NOT NULL COMMENT '授课教师ID', - class_id INT NOT NULL COMMENT '授课班级ID', - semester VARCHAR(20) COMMENT '学期', - academic_year VARCHAR(20) COMMENT '学年', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - INDEX idx_course_code (course_code), - INDEX idx_teacher_id (teacher_id), - INDEX idx_class_id (class_id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程表'; - --- 成绩表 -CREATE TABLE IF NOT EXISTS grades ( - id INT PRIMARY KEY AUTO_INCREMENT COMMENT '成绩ID', - student_id INT NOT NULL COMMENT '学生ID', - course_id INT NOT NULL COMMENT '课程ID', - usual_score DECIMAL(5,2) COMMENT '平时成绩', - midterm_score DECIMAL(5,2) COMMENT '期中成绩', - final_score DECIMAL(5,2) COMMENT '期末成绩', - total_score DECIMAL(5,2) COMMENT '总评成绩', - grade_point DECIMAL(3,2) COMMENT '绩点', - grade_level VARCHAR(10) COMMENT '成绩等级(A/B/C/D/F)', - teacher_id INT NOT NULL COMMENT '录入教师ID', - remark TEXT COMMENT '备注', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - UNIQUE KEY uk_student_course (student_id, course_id), - INDEX idx_student_id (student_id), - INDEX idx_course_id (course_id), - INDEX idx_teacher_id (teacher_id), - INDEX idx_total_score (total_score) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成绩表'; - --- 操作日志表 -CREATE TABLE IF NOT EXISTS operation_logs ( - id INT PRIMARY KEY AUTO_INCREMENT COMMENT '日志ID', - user_id INT NOT NULL COMMENT '操作用户ID', - operation_type VARCHAR(50) NOT NULL COMMENT '操作类型', - operation_target VARCHAR(100) COMMENT '操作目标', - operation_details TEXT COMMENT '操作详情', - ip_address VARCHAR(45) COMMENT 'IP地址', - user_agent TEXT COMMENT '用户代理', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', - INDEX idx_user_id (user_id), - INDEX idx_operation_type (operation_type), - INDEX idx_created_at (created_at) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表'; - --- 插入初始数据 --- 插入管理员用户(密码:admin123) -INSERT INTO users (username, password, name, role, email, phone) VALUES -('admin', '$2b$10$N9qo8uLOickgx2ZMRZoMy.MrqK.3.6Z1zXjJX.3Q7JzQ7JzQ7JzQ7', '系统管理员', 'admin', 'admin@school.edu', '13800138000'); - --- 插入示例班级 -INSERT INTO classes (class_name, grade, major) VALUES -('计算机科学与技术2023级1班', '2023', '计算机科学与技术'), -('软件工程2023级1班', '2023', '软件工程'), -('人工智能2023级1班', '2023', '人工智能'); - --- 插入示例教师(密码:teacher123) -INSERT INTO users (username, password, name, role, class_id, email, phone) VALUES -('t1001', '$2b$10$N9qo8uLOickgx2ZMRZoMy.MrqK.3.6Z1zXjJX.3Q7JzQ7JzQ7JzQ7', '张老师', 'teacher', 1, 'zhang@school.edu', '13800138001'), -('t1002', '$2b$10$N9qo8uLOickgx2ZMRZoMy.MrqK.3.6Z1zXjJX.3Q7JzQ7JzQ7JzQ7', '李老师', 'teacher', 2, 'li@school.edu', '13800138002'); - --- 插入示例学生(密码:student123) -INSERT INTO users (username, password, name, role, class_id, email, phone) VALUES -('s2023001', '$2b$10$N9qo8uLOickgx2ZMRZoMy.MrqK.3.6Z1zXjJX.3Q7JzQ7JzQ7JzQ7', '张三', 'student', 1, 'zhangsan@school.edu', '13800138111'), -('s2023002', '$2b$10$N9qo8uLOickgx2ZMRZoMy.MrqK.3.6Z1zXjJX.3Q7JzQ7JzQ7JzQ7', '李四', 'student', 1, 'lisi@school.edu', '13800138112'), -('s2023003', '$2b$10$N9qo8uLOickgx2ZMRZoMy.MrqK.3.6Z1zXjJX.3Q7JzQ7JzQ7JzQ7', '王五', 'student', 2, 'wangwu@school.edu', '13800138113'); - --- 插入示例课程 -INSERT INTO courses (course_code, course_name, credit, teacher_id, class_id, semester, academic_year) VALUES -('CS101', '计算机基础', 3.0, 2, 1, '2023-2024-1', '2023-2024'), -('CS201', '数据结构', 4.0, 2, 1, '2023-2024-1', '2023-2024'), -('SE101', '软件工程导论', 3.0, 3, 2, '2023-2024-1', '2023-2024'), -('AI101', '人工智能基础', 3.5, 3, 3, '2023-2024-1', '2023-2024'); - --- 插入示例成绩 -INSERT INTO grades (student_id, course_id, usual_score, midterm_score, final_score, total_score, grade_point, grade_level, teacher_id) VALUES -(3, 1, 85.00, 78.00, 82.00, 81.50, 3.2, 'B', 2), -(3, 2, 90.00, 85.00, 88.00, 87.50, 3.7, 'A', 2), -(4, 1, 78.00, 82.00, 80.00, 80.50, 3.0, 'B', 2), -(5, 3, 88.00, 85.00, 90.00, 88.50, 3.8, 'A', 3); - --- 更新班级表的班主任信息 -UPDATE classes SET teacher_id = 2 WHERE id = 1; -UPDATE classes SET teacher_id = 3 WHERE id = 2; - --- 创建视图:学生成绩详情视图 -CREATE OR REPLACE VIEW student_grade_details AS -SELECT - g.id, - g.student_id, - u1.name AS student_name, - u1.username AS student_no, - g.course_id, - c.course_code, - c.course_name, - c.credit, - g.usual_score, - g.midterm_score, - g.final_score, - g.total_score, - g.grade_point, - g.grade_level, - g.teacher_id, - u2.name AS teacher_name, - g.remark, - g.created_at, - g.updated_at -FROM grades g -JOIN users u1 ON g.student_id = u1.id -JOIN courses c ON g.course_id = c.id -JOIN users u2 ON g.teacher_id = u2.id; - --- 创建视图:班级成绩统计视图 -CREATE OR REPLACE VIEW class_grade_statistics AS -SELECT - cl.id AS class_id, - cl.class_name, - c.id AS course_id, - c.course_code, - c.course_name, - COUNT(g.id) AS student_count, - AVG(g.total_score) AS avg_score, - MAX(g.total_score) AS max_score, - MIN(g.total_score) AS min_score, - SUM(CASE WHEN g.grade_level = 'A' THEN 1 ELSE 0 END) AS a_count, - SUM(CASE WHEN g.grade_level = 'B' THEN 1 ELSE 0 END) AS b_count, - SUM(CASE WHEN g.grade_level = 'C' THEN 1 ELSE 0 END) AS c_count, - SUM(CASE WHEN g.grade_level = 'D' THEN 1 ELSE 0 END) AS d_count, - SUM(CASE WHEN g.grade_level = 'F' THEN 1 ELSE 0 END) AS f_count -FROM classes cl -JOIN courses c ON cl.id = c.class_id -LEFT JOIN grades g ON c.id = g.course_id -GROUP BY cl.id, c.id; - --- 显示表结构信息 -SHOW TABLES; - --- 显示各表记录数 -SELECT 'users' AS table_name, COUNT(*) AS record_count FROM users -UNION ALL -SELECT 'classes', COUNT(*) FROM classes -UNION ALL -SELECT 'courses', COUNT(*) FROM courses -UNION ALL -SELECT 'grades', COUNT(*) FROM grades -UNION ALL -SELECT 'operation_logs', COUNT(*) FROM operation_logs; - --- 显示视图 -SHOW FULL TABLES WHERE TABLE_TYPE = 'VIEW'; \ No newline at end of file diff --git a/database/score_management.sql b/database/score_management.sql deleted file mode 100644 index 467b0a9..0000000 --- a/database/score_management.sql +++ /dev/null @@ -1,228 +0,0 @@ -/* - Navicat Premium Dump SQL - - Source Server : DockerMySQLDB - Source Server Type : MySQL - Source Server Version : 90500 (9.5.0) - Source Host : localhost:3306 - Source Schema : score_management - - Target Server Type : MySQL - Target Server Version : 90500 (9.5.0) - File Encoding : 65001 - - Date: 21/12/2025 22:47:56 -*/ - -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for classes --- ---------------------------- -DROP TABLE IF EXISTS `classes`; -CREATE TABLE `classes` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '班级ID', - `class_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '班级名称', - `grade` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '年级', - `major` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '专业', - `teacher_id` int NULL DEFAULT NULL COMMENT '班主任ID', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_class_name`(`class_name` ASC) USING BTREE, - INDEX `idx_teacher_id`(`teacher_id` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '班级表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of classes --- ---------------------------- -INSERT INTO `classes` VALUES (1, '计算机2301', '2023', '计算机科学与技术', 2001, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `classes` VALUES (2, '软件工程2302', '2023', '软件工程', 2002, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); - --- ---------------------------- --- Table structure for courses --- ---------------------------- -DROP TABLE IF EXISTS `courses`; -CREATE TABLE `courses` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '课程ID', - `course_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '课程代码', - `course_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '课程名称', - `credit` decimal(3, 1) NOT NULL DEFAULT 2.0 COMMENT '学分', - `teacher_id` int NOT NULL COMMENT '授课教师ID', - `class_id` int NOT NULL COMMENT '授课班级ID', - `semester` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学期', - `academic_year` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学年', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `course_code`(`course_code` ASC) USING BTREE, - INDEX `idx_course_code`(`course_code` ASC) USING BTREE, - INDEX `idx_teacher_id`(`teacher_id` ASC) USING BTREE, - INDEX `idx_class_id`(`class_id` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '课程表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of courses --- ---------------------------- -INSERT INTO `courses` VALUES (1, 'CS101', '高级程序设计', 4.0, 2001, 1, NULL, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `courses` VALUES (2, 'SE201', '软件工程导论', 3.0, 2002, 2, NULL, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `courses` VALUES (3, 'MAT101', '高等数学', 5.0, 2003, 1, NULL, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); - --- ---------------------------- --- Table structure for grades --- ---------------------------- -DROP TABLE IF EXISTS `grades`; -CREATE TABLE `grades` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '成绩ID', - `student_id` int NOT NULL COMMENT '学生ID', - `course_id` int NOT NULL COMMENT '课程ID', - `usual_score` decimal(5, 2) NULL DEFAULT NULL COMMENT '平时成绩', - `midterm_score` decimal(5, 2) NULL DEFAULT NULL COMMENT '期中成绩', - `final_score` decimal(5, 2) NULL DEFAULT NULL COMMENT '期末成绩', - `total_score` decimal(5, 2) NULL DEFAULT NULL COMMENT '总评成绩', - `grade_point` decimal(3, 2) NULL DEFAULT NULL COMMENT '绩点', - `grade_level` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '成绩等级(A/B/C/D/F)', - `teacher_id` int NOT NULL COMMENT '录入教师ID', - `remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '备注', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_student_course`(`student_id` ASC, `course_id` ASC) USING BTREE, - INDEX `idx_student_id`(`student_id` ASC) USING BTREE, - INDEX `idx_course_id`(`course_id` ASC) USING BTREE, - INDEX `idx_teacher_id`(`teacher_id` ASC) USING BTREE, - INDEX `idx_total_score`(`total_score` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '成绩表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of grades --- ---------------------------- -INSERT INTO `grades` VALUES (1, 3001, 1, 90.00, 85.00, 88.00, 87.70, 3.00, NULL, 2001, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `grades` VALUES (2, 3001, 3, 80.00, 75.00, 82.00, 79.30, 2.00, NULL, 2003, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `grades` VALUES (3, 3002, 1, 95.00, 92.00, 94.00, 93.70, 4.00, NULL, 2001, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `grades` VALUES (4, 3003, 2, 88.00, 80.00, 85.00, 84.40, 3.00, NULL, 2002, NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); - --- ---------------------------- --- Table structure for operation_logs --- ---------------------------- -DROP TABLE IF EXISTS `operation_logs`; -CREATE TABLE `operation_logs` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '日志ID', - `user_id` int NOT NULL COMMENT '操作用户ID', - `operation_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '操作类型', - `operation_target` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作目标', - `operation_details` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '操作详情', - `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'IP地址', - `user_agent` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '用户代理', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_user_id`(`user_id` ASC) USING BTREE, - INDEX `idx_operation_type`(`operation_type` ASC) USING BTREE, - INDEX `idx_created_at`(`created_at` ASC) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '操作日志表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of operation_logs --- ---------------------------- - --- ---------------------------- --- Table structure for scores --- ---------------------------- -DROP TABLE IF EXISTS `scores`; -CREATE TABLE `scores` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '成绩记录ID', - `student_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学生ID', - `course` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '课程名称', - `score` decimal(5, 2) NOT NULL COMMENT '成绩', - `teacher_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '教师ID', - `class` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '班级', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_student_id`(`student_id` ASC) USING BTREE, - INDEX `idx_teacher_id`(`teacher_id` ASC) USING BTREE, - INDEX `idx_class`(`class` ASC) USING BTREE, - CONSTRAINT `scores_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT, - CONSTRAINT `scores_ibfk_2` FOREIGN KEY (`teacher_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT, - CONSTRAINT `scores_chk_1` CHECK ((`score` >= 0) and (`score` <= 100)) -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '成绩记录表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of scores --- ---------------------------- - --- ---------------------------- --- Table structure for sessions --- ---------------------------- -DROP TABLE IF EXISTS `sessions`; -CREATE TABLE `sessions` ( - `session_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, - `expires` int UNSIGNED NOT NULL, - `data` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, - PRIMARY KEY (`session_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of sessions --- ---------------------------- -INSERT INTO `sessions` VALUES ('KY6QaavAiws7rkdEBFIFDoHefl2bxzlI', 1766334525, '{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2025-12-21T16:28:44.650Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"id\":\"teststudent\",\"name\":\"????\",\"role\":\"student\",\"class\":\"2023?1?\"}}'); -INSERT INTO `sessions` VALUES ('KaDFs4HogLmkjS0HAs6qki6g2FmE3sTL', 1766334465, '{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2025-12-21T16:27:45.314Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"id\":\"teststudent\",\"name\":\"????\",\"role\":\"student\",\"class\":\"2023?1?\"}}'); -INSERT INTO `sessions` VALUES ('P-_AKfysnsUwA6PypoYdyXCxa-_8TiCE', 1766414033, '{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2025-12-22T14:25:01.323Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"id\":\"3001\",\"name\":\"陈同学\",\"role\":\"student\",\"class\":\"计算机2301\",\"studentInfo\":{\"id\":\"3001\",\"name\":\"陈同学\",\"class\":\"计算机2301\"}}}'); -INSERT INTO `sessions` VALUES ('QAhXDQ1FOlhU6RhaFOm3ghRtLOW4hBTd', 1766334812, '{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2025-12-21T16:33:31.987Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"id\":\"teststudent\",\"name\":\"????\",\"role\":\"student\",\"class\":\"2023?1?\"}}'); -INSERT INTO `sessions` VALUES ('SAuQyktAI9gAHpXbjARpe-9BL42pDRiV', 1766334764, '{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2025-12-21T16:32:43.695Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"id\":\"teststudent\",\"name\":\"????\",\"role\":\"student\",\"class\":\"2023?1?\"}}'); -INSERT INTO `sessions` VALUES ('XduN1lYhGPeIaLTHbLTNVnTCBtKUCkJR', 1766334689, '{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2025-12-21T16:31:28.994Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"id\":\"teststudent\",\"name\":\"????\",\"role\":\"student\",\"class\":\"2023?1?\"}}'); -INSERT INTO `sessions` VALUES ('Y59PFvvqK7M0DKZshc6ONTmFQjzGyMmV', 1766334426, '{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2025-12-21T16:27:05.673Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"id\":\"teststudent\",\"name\":\"????\",\"role\":\"student\",\"class\":\"2023?1?\"}}'); -INSERT INTO `sessions` VALUES ('rlscT2Pi2EAyLXHs1CNXyQmNSiW8vEo4', 1766334271, '{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2025-12-21T16:24:30.682Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"id\":\"teststudent\",\"name\":\"????\",\"role\":\"student\",\"class\":\"2023?1?\"}}'); -INSERT INTO `sessions` VALUES ('rsaOCJRjYQLPtUWlDmUFJgWcCYZbOCgJ', 1766410574, '{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2025-12-21T15:54:39.935Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"id\":\"123\",\"name\":\"经济局\",\"role\":\"student\",\"class\":\"123\"}}'); -INSERT INTO `sessions` VALUES ('wXxRpNTGY0wqLaHsebSAsw1I6Pb7Ed6w', 1766410584, '{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2025-12-22T13:35:43.191Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"id\":\"567\",\"name\":\"急急急\",\"role\":\"teacher\",\"class\":\"567\"}}'); - --- ---------------------------- --- Table structure for students --- ---------------------------- -DROP TABLE IF EXISTS `students`; -CREATE TABLE `students` ( - `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学生ID(与users表id一致)', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '姓名', - `class` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '班级', - PRIMARY KEY (`id`) USING BTREE, - CONSTRAINT `students_ibfk_1` FOREIGN KEY (`id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学生详细信息表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of students --- ---------------------------- -INSERT INTO `students` VALUES ('3001', '陈同学', '计算机2301'); -INSERT INTO `students` VALUES ('3002', '林同学', '计算机2301'); -INSERT INTO `students` VALUES ('3003', '黄同学', '软件工程2302'); -INSERT INTO `students` VALUES ('3004', '吴同学', '软件工程2302'); - --- ---------------------------- --- Table structure for users --- ---------------------------- -DROP TABLE IF EXISTS `users`; -CREATE TABLE `users` ( - `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户ID(学号/工号)', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '姓名', - `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码(bcrypt加密)', - `role` enum('student','teacher','admin') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色', - `class` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '班级(学生和教师需要,管理员为NULL)', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_role`(`role` ASC) USING BTREE, - INDEX `idx_class`(`class` ASC) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of users --- ---------------------------- -INSERT INTO `users` VALUES ('1000', '超级管理员', '$2a$10$clM161mG1P9oAkxs6yQq5ugu83Gc/hrnVuL.zWRC/vBZ./5TWuYGa', 'admin', NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `users` VALUES ('2001', '张教授', '$2a$10$clM161mG1P9oAkxs6yQq5ugu83Gc/hrnVuL.zWRC/vBZ./5TWuYGa', 'teacher', NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `users` VALUES ('2002', '李老师', '$2a$10$clM161mG1P9oAkxs6yQq5ugu83Gc/hrnVuL.zWRC/vBZ./5TWuYGa', 'teacher', NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `users` VALUES ('2003', '王助教', '$2a$10$clM161mG1P9oAkxs6yQq5ugu83Gc/hrnVuL.zWRC/vBZ./5TWuYGa', 'teacher', NULL, '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `users` VALUES ('3001', '陈同学', '$2a$10$clM161mG1P9oAkxs6yQq5ugu83Gc/hrnVuL.zWRC/vBZ./5TWuYGa', 'student', '计算机2301', '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `users` VALUES ('3002', '林同学', '$2a$10$clM161mG1P9oAkxs6yQq5ugu83Gc/hrnVuL.zWRC/vBZ./5TWuYGa', 'student', '计算机2301', '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `users` VALUES ('3003', '黄同学', '$2a$10$clM161mG1P9oAkxs6yQq5ugu83Gc/hrnVuL.zWRC/vBZ./5TWuYGa', 'student', '软件工程2302', '2025-12-21 14:23:14', '2025-12-21 14:23:14'); -INSERT INTO `users` VALUES ('3004', '吴同学', '$2a$10$clM161mG1P9oAkxs6yQq5ugu83Gc/hrnVuL.zWRC/vBZ./5TWuYGa', 'student', '软件工程2302', '2025-12-21 14:23:14', '2025-12-21 14:23:14'); - -SET FOREIGN_KEY_CHECKS = 1;