第一版提交,答题功能OK,题库管理待完善
This commit is contained in:
174
api/controllers/backupController.ts
Normal file
174
api/controllers/backupController.ts
Normal file
@@ -0,0 +1,174 @@
|
||||
import { Request, Response } from 'express';
|
||||
import * as XLSX from 'xlsx';
|
||||
import { UserModel, QuestionModel, QuizModel } from '../models';
|
||||
|
||||
export class BackupController {
|
||||
// 导出用户数据
|
||||
static async exportUsers(req: Request, res: Response) {
|
||||
try {
|
||||
const result = await UserModel.findAll(10000, 0);
|
||||
const usersData = result.users.map(user => ({
|
||||
ID: user.id,
|
||||
姓名: user.name,
|
||||
手机号: user.phone,
|
||||
创建时间: user.createdAt
|
||||
}));
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: usersData
|
||||
});
|
||||
} catch (error: any) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: error.message || '导出用户数据失败'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 导出问题数据
|
||||
static async exportQuestions(req: Request, res: Response) {
|
||||
try {
|
||||
const { type } = req.query;
|
||||
|
||||
const result = await QuestionModel.findAll({
|
||||
type: type as string,
|
||||
limit: 10000,
|
||||
offset: 0
|
||||
});
|
||||
|
||||
const questionsData = result.questions.map(question => ({
|
||||
ID: question.id,
|
||||
题目内容: question.content,
|
||||
题型: question.type,
|
||||
题目类别: question.category,
|
||||
选项: question.options ? question.options.join('|') : '',
|
||||
标准答案: Array.isArray(question.answer) ? question.answer.join(',') : question.answer,
|
||||
分值: question.score,
|
||||
创建时间: question.createdAt
|
||||
}));
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: questionsData
|
||||
});
|
||||
} catch (error: any) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: error.message || '导出问题数据失败'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 导出答题记录
|
||||
static async exportRecords(req: Request, res: Response) {
|
||||
try {
|
||||
const result = await QuizModel.findAllRecords(10000, 0);
|
||||
const recordsData = result.records.map((record: any) => ({
|
||||
ID: record.id,
|
||||
用户ID: record.userId,
|
||||
用户名: record.userName,
|
||||
手机号: record.userPhone,
|
||||
总得分: record.totalScore,
|
||||
正确题数: record.correctCount,
|
||||
总题数: record.totalCount,
|
||||
答题时间: record.createdAt
|
||||
}));
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: recordsData
|
||||
});
|
||||
} catch (error: any) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: error.message || '导出答题记录失败'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 导出答题答案
|
||||
static async exportAnswers(req: Request, res: Response) {
|
||||
try {
|
||||
// 这里简化处理,实际应该分页获取所有答案
|
||||
const answersData: any[] = [];
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: answersData
|
||||
});
|
||||
} catch (error: any) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: error.message || '导出答题答案失败'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 数据恢复
|
||||
static async restoreData(req: Request, res: Response) {
|
||||
try {
|
||||
const { users, questions, records, answers } = req.body;
|
||||
|
||||
// 数据验证
|
||||
if (!users && !questions && !records && !answers) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '没有可恢复的数据'
|
||||
});
|
||||
}
|
||||
|
||||
let restoredCount = {
|
||||
users: 0,
|
||||
questions: 0,
|
||||
records: 0,
|
||||
answers: 0
|
||||
};
|
||||
|
||||
// 恢复用户数据
|
||||
if (users && users.length > 0) {
|
||||
for (const user of users) {
|
||||
try {
|
||||
await UserModel.create({
|
||||
name: user.姓名 || user.name,
|
||||
phone: user.手机号 || user.phone
|
||||
});
|
||||
restoredCount.users++;
|
||||
} catch (error) {
|
||||
console.log('用户已存在,跳过:', user.手机号 || user.phone);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 恢复题目数据
|
||||
if (questions && questions.length > 0) {
|
||||
for (const question of questions) {
|
||||
try {
|
||||
await QuestionModel.create({
|
||||
content: question.题目内容 || question.content,
|
||||
type: question.题型 || question.type,
|
||||
category: question.题目类别 || question.category || '通用',
|
||||
options: question.选项 ? (question.选项 as string).split('|') : question.options,
|
||||
answer: question.标准答案 || question.answer,
|
||||
score: question.分值 || question.score
|
||||
});
|
||||
restoredCount.questions++;
|
||||
} catch (error) {
|
||||
console.log('题目创建失败,跳过:', error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: '数据恢复成功',
|
||||
data: restoredCount
|
||||
});
|
||||
} catch (error: any) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: error.message || '数据恢复失败'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user