|
| 1 | +import 'reflect-metadata' |
| 2 | +import { DataSource, In, Like } from 'typeorm' |
| 3 | +import { config } from 'dotenv' |
| 4 | +import * as path from 'path' |
| 5 | + |
| 6 | +config({ path: path.resolve(__dirname, '../.env') }) |
| 7 | + |
| 8 | +import { User } from '../src/database/entities/user.entity' |
| 9 | +import { Problem } from '../src/database/entities/problem.entity' |
| 10 | +import { Contest } from '../src/database/entities/contest.entity' |
| 11 | +import { Course } from '../src/database/entities/course.entity' |
| 12 | +import { Tag } from '../src/database/entities/tag.entity' |
| 13 | +import { ContestProblem } from '../src/database/entities/contest-problem.entity' |
| 14 | +import { CourseProblem } from '../src/database/entities/course-problem.entity' |
| 15 | + |
| 16 | +const AppDataSource = new DataSource({ |
| 17 | + type: 'mysql', |
| 18 | + host: process.env.DB_HOST ?? 'localhost', |
| 19 | + port: parseInt(process.env.DB_PORT ?? '3306', 10), |
| 20 | + database: process.env.DB_DATABASE, |
| 21 | + username: process.env.DB_USERNAME, |
| 22 | + password: process.env.DB_PASSWORD, |
| 23 | + entities: [User, Problem, Contest, Course, Tag, ContestProblem, CourseProblem], |
| 24 | + synchronize: false, |
| 25 | +}) |
| 26 | + |
| 27 | +async function main() { |
| 28 | + console.log('🧹 开始清理种子数据...') |
| 29 | + await AppDataSource.initialize() |
| 30 | + console.log('✅ 数据库连接成功') |
| 31 | + |
| 32 | + const userRepo = AppDataSource.getRepository(User) |
| 33 | + const problemRepo = AppDataSource.getRepository(Problem) |
| 34 | + const contestRepo = AppDataSource.getRepository(Contest) |
| 35 | + const courseRepo = AppDataSource.getRepository(Course) |
| 36 | + const contestProblemRepo = AppDataSource.getRepository(ContestProblem) |
| 37 | + const courseProblemRepo = AppDataSource.getRepository(CourseProblem) |
| 38 | + |
| 39 | + // ── 1. 清理竞赛题目关联(先删关联,再删竞赛)──────────────────────────────── |
| 40 | + console.log('\n🏆 清理竞赛...') |
| 41 | + const seedContests = await contestRepo.find({ where: { name: Like('SEED%') } }) |
| 42 | + if (seedContests.length > 0) { |
| 43 | + const contestIds = seedContests.map((c) => c.id) |
| 44 | + const cpDeleted = await contestProblemRepo.delete({ contestId: In(contestIds) }) |
| 45 | + console.log(` ✓ 删除竞赛题目关联 ${cpDeleted.affected ?? 0} 条`) |
| 46 | + const cDeleted = await contestRepo.delete({ name: Like('SEED%') }) |
| 47 | + console.log(` ✓ 删除竞赛 ${cDeleted.affected ?? 0} 条`) |
| 48 | + } else { |
| 49 | + console.log(' - 无 SEED 竞赛,跳过') |
| 50 | + } |
| 51 | + |
| 52 | + // ── 2. 清理课程题目关联(先删关联,再删课程)──────────────────────────────── |
| 53 | + console.log('\n📚 清理课程...') |
| 54 | + const seedCourses = await courseRepo.find({ where: { name: Like('SEED%') } }) |
| 55 | + if (seedCourses.length > 0) { |
| 56 | + const courseIds = seedCourses.map((c) => c.id) |
| 57 | + const cpDeleted = await courseProblemRepo.delete({ courseId: In(courseIds) }) |
| 58 | + console.log(` ✓ 删除课程题目关联 ${cpDeleted.affected ?? 0} 条`) |
| 59 | + const cDeleted = await courseRepo.delete({ name: Like('SEED%') }) |
| 60 | + console.log(` ✓ 删除课程 ${cDeleted.affected ?? 0} 条`) |
| 61 | + } else { |
| 62 | + console.log(' - 无 SEED 课程,跳过') |
| 63 | + } |
| 64 | + |
| 65 | + // ── 3. 清理题目 ──────────────────────────────────────────────────────────── |
| 66 | + console.log('\n📝 清理题目...') |
| 67 | + const pDeleted = await problemRepo.delete({ prefix: 'SEED' }) |
| 68 | + console.log(` ✓ 删除题目 ${pDeleted.affected ?? 0} 条`) |
| 69 | + |
| 70 | + // ── 4. 清理测试用户(保留 sa 账号)─────────────────────────────────────────── |
| 71 | + console.log('\n👤 清理测试用户...') |
| 72 | + const seedUsernames = [ |
| 73 | + 'user1', 'user2', 'user3', 'user4', 'user5', |
| 74 | + 'user6', 'user7', 'user8', 'user9', 'user10', |
| 75 | + 'testadmin', |
| 76 | + ] |
| 77 | + const uDeleted = await userRepo.delete({ username: In(seedUsernames) }) |
| 78 | + console.log(` ✓ 删除用户 ${uDeleted.affected ?? 0} 个`) |
| 79 | + |
| 80 | + await AppDataSource.destroy() |
| 81 | + console.log('\n✅ 种子数据清理完成!(sa 账号已保留)') |
| 82 | +} |
| 83 | + |
| 84 | +main().catch((err) => { |
| 85 | + console.error('❌ 清理失败:', err) |
| 86 | + process.exit(1) |
| 87 | +}) |
0 commit comments