const pool = require('../db'); const ExcelJS = require('exceljs'); async function updateScore(req, res) { const { student_id, points } = req.body; let connection; // 在try块外部声明connection try { connection = await pool.getConnection(); // 更新学生的积分并增加点名次数 const [result] = await connection.query( 'UPDATE students SET score = score + ?, call_count = call_count + 1 WHERE student_id = ?', [points, student_id] ); if (result.affectedRows > 0) { // 查询更新后的分数 const [rows] = await connection.query( 'SELECT score FROM students WHERE student_id = ?', [student_id] ); if (rows.length > 0) { const updatedScore = rows[0].score; return res.send(String(updatedScore)); } else { return res.status(404).send('学生不存在'); } } else { return res.status(404).send('学生不存在'); } } catch (error) { console.error('数据库操作失败:', error); return res.status(500).send('更新积分失败'); } finally { if (connection) { connection.release(); // 只有在connection已被赋值时才调用release } } } async function getStudentScore(req, res) { const { student_id } = req.body; let connection; try { connection = await pool.getConnection(); // 查询指定学生的分数 const [rows] = await connection.query( 'SELECT score FROM students WHERE student_id =?', [student_id] ); if (rows.length > 0) { const score = rows[0].score; // 修改这里,构建包含student_id和score的对象并返回 return res.json({ student_id, score }); } else { return res.status(404).json({ message: '学生不存在' }); } } catch (error) { console.error('数据库操作失败:', error); return res.status(500).json({ error: '获取分数失败' }); } finally { if (connection) { connection.release(); } } } async function exportScores(req, res) { let connection; try { connection = await pool.getConnection(); // 查询学生的成绩 const [rows] = await connection.query('SELECT student_name, student_id, score FROM students'); // 创建一个工作簿和一个工作表 const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('Scores'); // 添加列标题 worksheet.columns = [ { header: 'Student Name', key: 'student_name', width: 20 }, { header: 'Student ID', key: 'student_id', width: 15 }, { header: 'Score', key: 'score', width: 10 }, ]; // 将数据添加到工作表中 rows.forEach(row => { worksheet.addRow(row); }); // 设置响应头,告知浏览器以附件形式下载文件 res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); res.setHeader('Content-Disposition', 'attachment; filename=scores.xlsx'); // 生成并发送 Excel 文件 await workbook.xlsx.write(res); res.end(); } catch (error) { console.error('导出成绩失败:', error); res.status(500).send({ error: '无法导出成绩' }); } finally { if (connection) connection.release(); } } module.exports = { updateScore, getStudentScore,exportScores };