refactor(auth): 重构认证模块适配Bootstrap 5样式 feat(controller): 在登录响应中返回用户对象 feat(server): 添加学生个人中心路由 refactor(models): 重构学生和成绩模型结构 style: 更新登录和注册页面UI设计 chore: 添加数据库备份脚本和空备份文件
62 lines
2.3 KiB
JavaScript
62 lines
2.3 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
const db = require('../config/database');
|
|
|
|
async function backup() {
|
|
console.log('开始备份数据库...');
|
|
const backupDir = path.join(__dirname, '../../database');
|
|
const filename = `backup_${new Date().toISOString().replace(/[:.]/g, '-')}.sql`;
|
|
const filepath = path.join(backupDir, filename);
|
|
|
|
if (!fs.existsSync(backupDir)) {
|
|
fs.mkdirSync(backupDir, { recursive: true });
|
|
}
|
|
|
|
try {
|
|
const fileStream = fs.createWriteStream(filepath, { flags: 'a' });
|
|
|
|
// 获取所有表
|
|
const tables = await db.query('SHOW TABLES');
|
|
const tableNames = tables.map(t => Object.values(t)[0]);
|
|
|
|
for (const tableName of tableNames) {
|
|
console.log(`正在备份表: ${tableName}`);
|
|
|
|
// 1. 获取 CREATE TABLE 语句
|
|
const createRows = await db.query(`SHOW CREATE TABLE ${tableName}`);
|
|
const createTableSql = createRows[0]['Create Table'];
|
|
|
|
fileStream.write(`\n\n-- Table structure for table \`${tableName}\`\n`);
|
|
fileStream.write(`DROP TABLE IF EXISTS \`${tableName}\`;\n`);
|
|
fileStream.write(`${createTableSql};\n`);
|
|
|
|
// 2. 获取数据
|
|
const rows = await db.query(`SELECT * FROM ${tableName}`);
|
|
if (rows.length > 0) {
|
|
fileStream.write(`\n-- Dumping data for table \`${tableName}\`\n`);
|
|
fileStream.write(`INSERT INTO \`${tableName}\` VALUES\n`);
|
|
|
|
const values = rows.map(row => {
|
|
const rowValues = Object.values(row).map(val => {
|
|
if (val === null) return 'NULL';
|
|
if (typeof val === 'number') return val;
|
|
// 转义单引号和反斜杠
|
|
return `'${String(val).replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
|
|
});
|
|
return `(${rowValues.join(', ')})`;
|
|
});
|
|
|
|
fileStream.write(values.join(',\n') + ';\n');
|
|
}
|
|
}
|
|
|
|
fileStream.end();
|
|
console.log(`备份完成! 文件保存在: ${filepath}`);
|
|
process.exit(0);
|
|
} catch (error) {
|
|
console.error('备份失败:', error);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
backup(); |