77 lines
2.2 KiB
TypeScript
77 lines
2.2 KiB
TypeScript
|
|
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());
|