feat: 实现教师资料更新、操作日志和系统设置功能

新增教师资料更新功能,包括个人信息修改和密码更新
添加操作日志记录系统,记录用户关键操作
实现系统设置模块,支持动态配置系统参数
重构数据库模型,新增教师表和系统设置表
优化成绩录入逻辑,支持平时分、期中和期末成绩计算
添加数据导出功能,支持学生、教师和成绩数据导出
完善管理员后台,增加统计图表和操作日志查看
This commit is contained in:
祀梦
2025-12-22 23:30:01 +08:00
parent 16802c85e5
commit b1da021185
43 changed files with 7860 additions and 2835 deletions

View File

@@ -1,36 +1,64 @@
const mysql = require('mysql2/promise');
require('dotenv').config();
const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const fs = require('fs');
const pool = mysql.createPool({
host: process.env.DB_HOST || 'localhost',
user: process.env.DB_USER || 'root',
password: process.env.DB_PASSWORD || '123456',
database: process.env.DB_NAME || 'score_management',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
const dbPath = path.resolve(__dirname, '../database.sqlite');
const db = new sqlite3.Database(dbPath);
// 封装基本查询方法
const query = async (sql, params) => {
try {
const [rows] = await pool.execute(sql, params);
return rows;
} catch (error) {
console.error('Database query error:', error);
throw error;
}
// Promisify query method
const query = (sql, params = []) => {
return new Promise((resolve, reject) => {
// Handle SELECT vs INSERT/UPDATE/DELETE
const trimmedSql = sql.trim().toUpperCase();
if (trimmedSql.startsWith('SELECT') || trimmedSql.startsWith('PRAGMA')) {
db.all(sql, params, (err, rows) => {
if (err) {
console.error('Database query error:', err);
reject(err);
} else {
resolve(rows);
}
});
} else {
db.run(sql, params, function(err) {
if (err) {
console.error('Database execution error:', err);
reject(err);
} else {
// Normalize result to look like MySQL result
// this.lastID, this.changes
resolve({
insertId: this.lastID,
affectedRows: this.changes,
warningStatus: 0
});
}
});
}
});
};
// Mock Pool object for compatibility
const pool = {
query: query,
execute: (sql, params) => query(sql, params).then(res => [res]), // Wrap in array for mysql2 compatibility
getConnection: () => Promise.resolve({
release: () => {},
query: query,
execute: (sql, params) => query(sql, params).then(res => [res]),
beginTransaction: () => query('BEGIN TRANSACTION'),
commit: () => query('COMMIT'),
rollback: () => query('ROLLBACK')
})
};
// 测试连接
const testConnection = async () => {
try {
const connection = await pool.getConnection();
console.log('数据库连接成功');
connection.release();
await query('SELECT 1');
console.log('SQLite 数据库连接成功');
return true;
} catch (error) {
console.error('数据库连接失败:', error.message);
console.error('SQLite 数据库连接失败:', error.message);
return false;
}
};
@@ -39,4 +67,4 @@ module.exports = {
pool,
query,
testConnection
};
};