feat: 实现教师资料更新、操作日志和系统设置功能
新增教师资料更新功能,包括个人信息修改和密码更新 添加操作日志记录系统,记录用户关键操作 实现系统设置模块,支持动态配置系统参数 重构数据库模型,新增教师表和系统设置表 优化成绩录入逻辑,支持平时分、期中和期末成绩计算 添加数据导出功能,支持学生、教师和成绩数据导出 完善管理员后台,增加统计图表和操作日志查看
This commit is contained in:
@@ -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
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user