library-picturebook-activity/backend/scripts/fix-student-activity-menu.ts
2026-01-09 18:14:35 +08:00

77 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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