import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); async function main() { console.log('🔧 修复学生赛事活动菜单...\n'); // 获取所有租户 const tenants = await prisma.tenant.findMany({ select: { id: true, name: true } }); // 检查是否已存在独立的赛事活动菜单 let studentActivityMenu = await prisma.menu.findFirst({ where: { path: '/student-activities' } }); if (!studentActivityMenu) { // 创建独立的赛事活动菜单(一级菜单) studentActivityMenu = await prisma.menu.create({ data: { name: '赛事活动', path: '/student-activities', component: 'contests/Activities', icon: 'TrophyOutlined', permission: 'contest:activity:read', sort: 10, // 放在工作台之后 parentId: null, // 一级菜单 validState: 1, } }); console.log('✅ 创建菜单: 赛事活动 (独立路由)'); } else { console.log('⏭️ 菜单已存在: 赛事活动'); } // 为每个租户分配菜单 for (const tenant of tenants) { const existing = await prisma.tenantMenu.findFirst({ where: { tenantId: tenant.id, menuId: studentActivityMenu.id } }); if (!existing) { await prisma.tenantMenu.create({ data: { tenantId: tenant.id, menuId: studentActivityMenu.id, } }); console.log(`✅ 菜单已分配给租户: ${tenant.name}`); } } // 更新原有的赛事活动菜单(在赛事管理下的)权限,确保只有管理员能看到 const oldActivityMenu = await prisma.menu.findFirst({ where: { path: '/contests/activities', parentId: { not: null } // 有父菜单的 } }); if (oldActivityMenu) { // 保持原有权限 contest:read,这样管理员可以看到 console.log('⏭️ 原赛事活动菜单保持不变(管理员使用)'); } console.log('\n✅ 配置完成!'); console.log('\n学生菜单结构:'); console.log(' - 工作台'); console.log(' - 赛事活动 (独立路由 /student-activities)'); console.log(' - 我的作业 (独立路由 /student-homework)'); } main() .catch(console.error) .finally(() => prisma.$disconnect());