mirror of
https://github.com/massbug/judge4c.git
synced 2025-07-04 07:40:51 +00:00
139 lines
4.6 KiB
TypeScript
139 lines
4.6 KiB
TypeScript
import { PrismaClient, Status, EditorLanguage } from "@/generated/client";
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
async function addMoreProblems() {
|
||
console.log("开始添加10个新题目...");
|
||
|
||
// 获取一个管理员用户作为题目作者
|
||
const admin = await prisma.user.findFirst({ where: { role: "ADMIN" } });
|
||
if (!admin) {
|
||
console.error("未找到管理员用户,无法添加题目");
|
||
return;
|
||
}
|
||
|
||
// 获取现有的最大displayId
|
||
const maxProblem = await prisma.problem.findFirst({
|
||
orderBy: { displayId: 'desc' }
|
||
});
|
||
const baseDisplayId = (maxProblem?.displayId || 1000) + 1;
|
||
|
||
let createdProblems = [];
|
||
|
||
for (let i = 0; i < 10; i++) {
|
||
const displayId = baseDisplayId + i;
|
||
const title = `新题目${displayId}`;
|
||
const description = `这是新添加的第${i + 1}道题目,编号${displayId}`;
|
||
const solution = `// 题目${displayId}的参考解答`;
|
||
|
||
// 创建题目
|
||
const problem = await prisma.problem.create({
|
||
data: {
|
||
displayId,
|
||
title,
|
||
description,
|
||
solution,
|
||
difficulty: "EASY",
|
||
published: true,
|
||
userId: admin.id,
|
||
timeLimit: 1000,
|
||
memoryLimit: 128,
|
||
},
|
||
});
|
||
createdProblems.push(problem);
|
||
console.log(`创建题目: ${displayId} - ${title}`);
|
||
|
||
// 为题目生成2-3个测试用例
|
||
const testcaseCount = Math.floor(Math.random() * 2) + 2;
|
||
for (let j = 0; j < testcaseCount; j++) {
|
||
await prisma.testcase.create({
|
||
data: {
|
||
problemId: problem.id,
|
||
data: {
|
||
create: [
|
||
{ label: `输入A`, value: `${j + 1}`, index: 0 },
|
||
{ label: `输入B`, value: `${(j + 1) * 2}`, index: 1 },
|
||
],
|
||
},
|
||
expectedOutput: `${(j + 1) + (j + 1) * 2}`,
|
||
},
|
||
});
|
||
}
|
||
}
|
||
|
||
// 获取所有GUEST用户作为学生
|
||
let students = await prisma.user.findMany({ where: { role: "GUEST" } });
|
||
if (students.length === 0) {
|
||
console.log("创建10个学生用户...");
|
||
// 如果没有学生,自动创建10个
|
||
const studentNames = ["张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"];
|
||
for (let i = 0; i < 10; i++) {
|
||
const user = await prisma.user.create({
|
||
data: {
|
||
name: studentNames[i],
|
||
email: `auto_student${i + 1}@example.com`,
|
||
password: "$2b$10$SD1T/dYvKTArGdTmf8ERxuBKIONxY01/wSboRNaNsHnKZzDhps/0u",
|
||
role: "GUEST",
|
||
},
|
||
});
|
||
students.push(user);
|
||
}
|
||
}
|
||
|
||
console.log(`为${createdProblems.length}个题目生成提交记录...`);
|
||
|
||
// 为每个题目生成5-10个学生提交和测试用例结果
|
||
for (const problem of createdProblems) {
|
||
const testcases = await prisma.testcase.findMany({ where: { problemId: problem.id } });
|
||
const studentCount = Math.floor(Math.random() * 6) + 5; // 5-10个学生
|
||
|
||
for (let i = 0; i < studentCount; i++) {
|
||
const student = students[i % students.length];
|
||
// 随机生成1-2次提交
|
||
const submissionTimes = Math.floor(Math.random() * 2) + 1;
|
||
|
||
for (let t = 0; t < submissionTimes; t++) {
|
||
// 60%概率AC,40%概率WA
|
||
const isAC = Math.random() < 0.6;
|
||
const submission = await prisma.submission.create({
|
||
data: {
|
||
language: Math.random() > 0.5 ? EditorLanguage.c : EditorLanguage.cpp,
|
||
code: `// ${student.name} 针对题目${problem.displayId}的提交`,
|
||
status: isAC ? Status.AC : Status.WA,
|
||
message: "自动生成提交",
|
||
executionTime: Math.floor(Math.random() * 1000) + 1,
|
||
memoryUsage: Math.floor(Math.random() * 128) + 1,
|
||
userId: student.id,
|
||
problemId: problem.id,
|
||
},
|
||
});
|
||
|
||
// 为每个提交生成测试用例结果
|
||
for (const testcase of testcases) {
|
||
await prisma.testcaseResult.create({
|
||
data: {
|
||
isCorrect: isAC,
|
||
output: isAC ? "正确答案" : "错误答案",
|
||
executionTime: Math.floor(Math.random() * 1000) + 1,
|
||
memoryUsage: Math.floor(Math.random() * 128) + 1,
|
||
submissionId: submission.id,
|
||
testcaseId: testcase.id,
|
||
},
|
||
});
|
||
}
|
||
}
|
||
}
|
||
console.log(`题目${problem.displayId}已生成${studentCount}个学生的提交记录`);
|
||
}
|
||
|
||
console.log("已成功添加10个新题目及其相关数据!");
|
||
}
|
||
|
||
addMoreProblems()
|
||
.catch((e) => {
|
||
console.error("添加题目时出错:", e);
|
||
process.exit(1);
|
||
})
|
||
.finally(async () => {
|
||
await prisma.$disconnect();
|
||
});
|