mirror of
https://github.com/massbug/judge4c.git
synced 2025-07-05 17:10:52 +00:00
125 lines
4.1 KiB
TypeScript
125 lines
4.1 KiB
TypeScript
|
import { PrismaClient, Status, EditorLanguage } from "@/generated/client";
|
|||
|
|
|||
|
const prisma = new PrismaClient();
|
|||
|
|
|||
|
async function createMoreClasses() {
|
|||
|
console.log("开始创建更多班级的测试数据...");
|
|||
|
|
|||
|
// 获取现有的题目
|
|||
|
const problems = await prisma.problem.findMany();
|
|||
|
|
|||
|
if (problems.length === 0) {
|
|||
|
console.log("没有找到题目,请先运行主种子文件");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// 创建10个班级的用户
|
|||
|
const classNumbers = ["2401", "2402", "2403", "2404", "2405", "2406", "2407", "2408", "2409", "2410"];
|
|||
|
const classNames = ["张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"];
|
|||
|
|
|||
|
for (let i = 0; i < 10; i++) {
|
|||
|
// 为每个班级创建3-5个学生
|
|||
|
const studentsPerClass = Math.floor(Math.random() * 3) + 3; // 3-5个学生
|
|||
|
|
|||
|
for (let j = 0; j < studentsPerClass; j++) {
|
|||
|
const studentName = `${classNames[i]}-${j + 1}`;
|
|||
|
|
|||
|
// 创建学生用户
|
|||
|
const user = await prisma.user.create({
|
|||
|
data: {
|
|||
|
name: `${studentName}-${classNumbers[i]}班`,
|
|||
|
email: `student_${classNumbers[i]}_${j + 1}@example.com`,
|
|||
|
password: "$2b$10$SD1T/dYvKTArGdTmf8ERxuBKIONxY01/wSboRNaNsHnKZzDhps/0u",
|
|||
|
role: "GUEST",
|
|||
|
},
|
|||
|
});
|
|||
|
|
|||
|
// 为每个学生创建2-4个题目的提交记录
|
|||
|
const userProblems = problems.slice(0, Math.floor(Math.random() * 3) + 2);
|
|||
|
|
|||
|
for (const problem of userProblems) {
|
|||
|
// 创建1-3次提交记录
|
|||
|
const submissionCount = Math.floor(Math.random() * 3) + 1;
|
|||
|
|
|||
|
for (let k = 0; k < submissionCount; k++) {
|
|||
|
// 根据班级设置不同的完成率
|
|||
|
let completionRate;
|
|||
|
if (i < 3) {
|
|||
|
completionRate = 0.8; // 前3个班级完成率80%
|
|||
|
} else if (i < 6) {
|
|||
|
completionRate = 0.6; // 中间3个班级完成率60%
|
|||
|
} else {
|
|||
|
completionRate = 0.4; // 后4个班级完成率40%
|
|||
|
}
|
|||
|
|
|||
|
const submission = await prisma.submission.create({
|
|||
|
data: {
|
|||
|
language: Math.random() > 0.5 ? EditorLanguage.c : EditorLanguage.cpp,
|
|||
|
code: `// ${studentName} 的代码\n#include <stdio.h>\nint main() { return 0; }`,
|
|||
|
status: Math.random() < completionRate ? Status.AC : getRandomErrorStatus(),
|
|||
|
message: `${classNumbers[i]}班学生提交`,
|
|||
|
executionTime: Math.floor(Math.random() * 1000) + 1,
|
|||
|
memoryUsage: Math.floor(Math.random() * 128) + 1,
|
|||
|
userId: user.id,
|
|||
|
problemId: problem.id,
|
|||
|
},
|
|||
|
});
|
|||
|
|
|||
|
// 为提交创建测试用例结果
|
|||
|
const testcases = await prisma.testcase.findMany({
|
|||
|
where: { problemId: submission.problemId },
|
|||
|
});
|
|||
|
|
|||
|
for (const testcase of testcases) {
|
|||
|
const isCorrect = submission.status === Status.AC;
|
|||
|
|
|||
|
await prisma.testcaseResult.create({
|
|||
|
data: {
|
|||
|
isCorrect,
|
|||
|
output: isCorrect ? "正确答案" : "错误答案",
|
|||
|
executionTime: Math.floor(Math.random() * 1000) + 1,
|
|||
|
memoryUsage: Math.floor(Math.random() * 128) + 1,
|
|||
|
submissionId: submission.id,
|
|||
|
testcaseId: testcase.id,
|
|||
|
},
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
console.log("10个班级的测试数据创建完成!");
|
|||
|
}
|
|||
|
|
|||
|
function getRandomErrorStatus(): Status {
|
|||
|
const errorStatuses = [
|
|||
|
Status.WA, // Wrong Answer
|
|||
|
Status.CE, // Compilation Error
|
|||
|
Status.TLE, // Time Limit Exceeded
|
|||
|
Status.RE, // Runtime Error
|
|||
|
];
|
|||
|
|
|||
|
const weights = [0.4, 0.2, 0.2, 0.2];
|
|||
|
const random = Math.random();
|
|||
|
let cumulative = 0;
|
|||
|
|
|||
|
for (let i = 0; i < errorStatuses.length; i++) {
|
|||
|
cumulative += weights[i];
|
|||
|
if (random <= cumulative) {
|
|||
|
return errorStatuses[i];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return Status.WA;
|
|||
|
}
|
|||
|
|
|||
|
// 运行函数
|
|||
|
createMoreClasses()
|
|||
|
.catch((e) => {
|
|||
|
console.error("创建班级数据时出错:", e);
|
|||
|
process.exit(1);
|
|||
|
})
|
|||
|
.finally(async () => {
|
|||
|
await prisma.$disconnect();
|
|||
|
});
|