refactor(database): 迁移到SQLite并清理旧MySQL相关代码
移除MySQL相关依赖和配置,完全迁移到SQLite数据库 删除不再需要的MySQL迁移脚本和备份文件 更新README文档说明新的数据库架构 在init_db.js中整合教师和系统设置表的初始化逻辑
This commit is contained in:
148
README.md
148
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` 安装依赖。
|
- **前端 (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
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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();
|
|
||||||
@@ -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();
|
|
||||||
@@ -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();
|
|
||||||
@@ -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: {
|
||||||
|
|||||||
@@ -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`
|
|
||||||
@@ -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';
|
|
||||||
@@ -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;
|
|
||||||
Reference in New Issue
Block a user