refactor(database): 迁移到SQLite并清理旧MySQL相关代码

移除MySQL相关依赖和配置,完全迁移到SQLite数据库
删除不再需要的MySQL迁移脚本和备份文件
更新README文档说明新的数据库架构
在init_db.js中整合教师和系统设置表的初始化逻辑
This commit is contained in:
祀梦
2025-12-23 00:02:44 +08:00
parent 84d5840391
commit e63ef0af0a
13 changed files with 193 additions and 761 deletions

148
README.md
View File

@@ -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` 安装依赖。 - **前端 (Frontend):**
2. 配置 `.env` 文件(参考 `.env.example` 或根据需要创建)。 - **Structure:** HTML5
3. 启动服务器:`npm start` - **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

View File

@@ -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) => { const insertClass = async (cls) => {
return await run( return await run(
'INSERT INTO classes (class_name, grade, major, teacher_id) VALUES (?, ?, ?, ?)', '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 students');
await run('DROP TABLE IF EXISTS users'); await run('DROP TABLE IF EXISTS users');
await run('DROP TABLE IF EXISTS operation_logs'); 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 // Create tables
console.log('创建表结构...'); 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('生成基础数据...'); 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 // 1. Admin
await insertUser({ await insertUser({
id: 'admin', id: 'admin',
@@ -187,9 +226,16 @@ const init = async () => {
// 2. Teachers (20 teachers) // 2. Teachers (20 teachers)
const teachers = []; const teachers = [];
const departments = ['计算机学院', '软件学院', '信息工程学院', '理学院', '外国语学院'];
const titles = ['教授', '副教授', '讲师', '助教'];
for (let i = 1; i <= 20; i++) { for (let i = 1; i <= 20; i++) {
const id = `T${1000 + i}`; const id = `T${1000 + i}`;
const name = `教师${String.fromCharCode(65 + (i % 26))}${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({ await insertUser({
id, id,
name, name,
@@ -197,6 +243,15 @@ const init = async () => {
role: 'teacher', role: 'teacher',
class: null class: null
}); });
await insertTeacher({
id,
name,
department: dept,
title: title,
contact_info: contact
});
teachers.push(id); teachers.push(id);
} }

View File

@@ -13,9 +13,7 @@
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"express": "^4.18.2", "express": "^4.18.2",
"express-mysql-session": "^3.0.0",
"express-session": "^1.17.3", "express-session": "^1.17.3",
"mysql2": "^3.6.0",
"sqlite3": "^5.1.7" "sqlite3": "^5.1.7"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -1,7 +1,6 @@
const express = require('express'); const express = require('express');
const cors = require('cors'); const cors = require('cors');
const session = require('express-session'); const session = require('express-session');
// const MySQLStore = require('express-mysql-session')(session);
const path = require('path'); const path = require('path');
require('dotenv').config(); require('dotenv').config();
@@ -27,26 +26,9 @@ app.use(cors({
app.use(express.json()); app.use(express.json());
app.use(express.urlencoded({ extended: true })); 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({ app.use(session({
key: 'session_cookie', key: 'session_cookie',
secret: process.env.SESSION_SECRET || 'your-secret-key', secret: process.env.SESSION_SECRET || 'your-secret-key',
// store: sessionStore, // Use MemoryStore for SQLite migration simplification
resave: false, resave: false,
saveUninitialized: false, saveUninitialized: false,
cookie: { cookie: {

View File

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

View File

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

View File

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