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());
|