judge4c/prisma/add-more-problems.ts
2025-06-18 15:51:03 +08:00

139 lines
4.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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%概率AC40%概率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();
});