judge4c/prisma/seed-dashboard.ts
2025-06-18 15:51:03 +08:00

172 lines
5.3 KiB
TypeScript

import { PrismaClient, Status, EditorLanguage } from "@/generated/client";
const prisma = new PrismaClient();
async function createDashboardTestData() {
console.log("开始创建 Teacher Dashboard 测试数据...");
// 获取现有的用户和题目
const users = await prisma.user.findMany();
const problems = await prisma.problem.findMany();
if (users.length === 0) {
console.log("没有找到用户,请先运行主种子文件");
return;
}
if (problems.length === 0) {
console.log("没有找到题目,请先运行主种子文件");
return;
}
console.log(`找到 ${users.length} 个用户和 ${problems.length} 个题目`);
// 为每个用户创建一些提交记录
const submissions = [];
for (const user of users) {
// 为每个用户随机选择2-5个题目进行提交
const userProblems = problems.slice(0, Math.floor(Math.random() * 4) + 2);
for (const problem of userProblems) {
// 创建1-3次提交记录
const submissionCount = Math.floor(Math.random() * 3) + 1;
for (let i = 0; i < submissionCount; i++) {
const submission = await prisma.submission.create({
data: {
language: Math.random() > 0.5 ? EditorLanguage.c : EditorLanguage.cpp,
code: `// 用户 ${user.name} 的代码\n#include <stdio.h>\nint main() { return 0; }`,
status: getRandomStatus(),
message: "测试提交",
executionTime: Math.floor(Math.random() * 1000) + 1,
memoryUsage: Math.floor(Math.random() * 128) + 1,
userId: user.id,
problemId: problem.id,
},
});
submissions.push(submission);
}
}
}
console.log(`创建了 ${submissions.length} 个提交记录`);
// 为每个提交创建测试用例结果
const testcaseResults = [];
for (const submission of submissions) {
// 获取该题目的测试用例
const testcases = await prisma.testcase.findMany({
where: { problemId: submission.problemId },
});
for (const testcase of testcases) {
const isCorrect = Math.random() > 0.3; // 70% 的正确率
const testcaseResult = 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,
},
});
testcaseResults.push(testcaseResult);
}
}
console.log(`创建了 ${testcaseResults.length} 个测试用例结果`);
// 创建一些额外的用户来模拟班级
const classUsers = [];
const classNames = ["张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十"];
for (let i = 0; i < 8; i++) {
const user = await prisma.user.create({
data: {
name: `${classNames[i]}-2401班`,
email: `student${i + 1}@example.com`,
password: "$2b$10$SD1T/dYvKTArGdTmf8ERxuBKIONxY01/wSboRNaNsHnKZzDhps/0u",
role: "GUEST",
},
});
classUsers.push(user);
}
// 为班级用户创建提交记录
for (const user of classUsers) {
const userProblems = problems.slice(0, Math.floor(Math.random() * 3) + 1);
for (const problem of userProblems) {
const submission = await prisma.submission.create({
data: {
language: Math.random() > 0.5 ? EditorLanguage.c : EditorLanguage.cpp,
code: `// ${user.name} 的代码\n#include <stdio.h>\nint main() { return 0; }`,
status: Math.random() > 0.6 ? Status.AC : Status.WA, // 40% 的正确率
message: "班级学生提交",
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("Teacher Dashboard 测试数据创建完成!");
}
function getRandomStatus(): Status {
const statuses = [
Status.AC, // Accepted
Status.WA, // Wrong Answer
Status.CE, // Compilation Error
Status.TLE, // Time Limit Exceeded
Status.RE, // Runtime Error
];
// 让 AC 状态出现的概率更高一些
const weights = [0.4, 0.3, 0.1, 0.1, 0.1];
const random = Math.random();
let cumulative = 0;
for (let i = 0; i < statuses.length; i++) {
cumulative += weights[i];
if (random <= cumulative) {
return statuses[i];
}
}
return Status.WA;
}
// 运行函数
createDashboardTestData()
.catch((e) => {
console.error("创建测试数据时出错:", e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});