library-picturebook-activity/backend/scripts/fix-student-activity-menu.ts

77 lines
2.2 KiB
TypeScript
Raw Normal View History

2026-01-09 18:14:35 +08:00
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());