library-picturebook-activity/backend/scripts/update-student-permissions.ts

116 lines
3.5 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 studentRole = await prisma.role.findFirst({
where: { code: 'student' }
});
if (!studentRole) {
console.log('❌ 未找到学生角色');
return;
}
console.log(`找到学生角色: ${studentRole.name} (ID: ${studentRole.id})`);
// 需要移除的权限
const permissionsToRemove = [
'contest:read', // 赛事列表权限
'contest:work:read', // 作品管理权限
'contest:work:update', // 作品更新权限
'work:submit', // 提交作品权限
'homework:update', // 作业更新权限
'homework:delete', // 作业删除权限
];
// 需要保留/添加的权限
const permissionsToKeep = [
'workbench:read', // 工作台
'contest:activity:read', // 赛事活动(新权限)
'homework:read', // 查看作业
];
// 移除不需要的权限
console.log('\n📝 移除不需要的权限...');
for (const permCode of permissionsToRemove) {
const perm = await prisma.permission.findFirst({
where: { tenantId: studentRole.tenantId, code: permCode }
});
if (perm) {
const deleted = await prisma.rolePermission.deleteMany({
where: { roleId: studentRole.id, permissionId: perm.id }
});
if (deleted.count > 0) {
console.log(` ✅ 已移除: ${permCode}`);
} else {
console.log(` ⏭️ ${permCode} 未分配,跳过`);
}
}
}
// 创建赛事活动权限(如果不存在)
console.log('\n📝 创建/分配赛事活动权限...');
let activityPerm = await prisma.permission.findFirst({
where: { tenantId: studentRole.tenantId, code: 'contest:activity:read' }
});
if (!activityPerm) {
activityPerm = await prisma.permission.create({
data: {
tenantId: studentRole.tenantId,
code: 'contest:activity:read',
name: '查看赛事活动',
resource: 'contest:activity',
action: 'read',
description: '学生查看赛事活动列表',
}
});
console.log(' ✅ 创建权限: contest:activity:read');
}
// 分配赛事活动权限给学生
const existingActivityPerm = await prisma.rolePermission.findFirst({
where: { roleId: studentRole.id, permissionId: activityPerm.id }
});
if (!existingActivityPerm) {
await prisma.rolePermission.create({
data: { roleId: studentRole.id, permissionId: activityPerm.id }
});
console.log(' ✅ 已分配给学生角色: contest:activity:read');
}
// 更新赛事活动菜单的权限
console.log('\n📝 更新菜单权限配置...');
const activityMenu = await prisma.menu.findFirst({
where: { name: '赛事活动' }
});
if (activityMenu) {
await prisma.menu.update({
where: { id: activityMenu.id },
data: { permission: 'contest:activity:read' }
});
console.log(' ✅ 赛事活动菜单权限更新为: contest:activity:read');
}
// 显示最终的学生权限
console.log('\n📋 学生角色最终权限:');
const finalPerms = await prisma.rolePermission.findMany({
where: { roleId: studentRole.id },
include: { permission: true }
});
finalPerms.forEach(rp => {
console.log(` - ${rp.permission.code}: ${rp.permission.name}`);
});
console.log('\n✅ 学生权限更新完成!');
}
main()
.catch(console.error)
.finally(() => prisma.$disconnect());