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

125 lines
3.7 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 }
});
for (const tenant of tenants) {
console.log(`\n📝 处理租户: ${tenant.name} (ID: ${tenant.id})`);
// 1. 创建学生作业权限(如果不存在)
let studentHomeworkPerm = await prisma.permission.findFirst({
where: { tenantId: tenant.id, code: 'homework:student:read' }
});
if (!studentHomeworkPerm) {
studentHomeworkPerm = await prisma.permission.create({
data: {
tenantId: tenant.id,
code: 'homework:student:read',
name: '学生查看作业',
resource: 'homework:student',
action: 'read',
description: '学生查看作业列表',
}
});
console.log(' ✅ 创建权限: homework:student:read');
}
// 2. 分配给学生角色
const studentRole = await prisma.role.findFirst({
where: { tenantId: tenant.id, code: 'student' }
});
if (studentRole) {
const existing = await prisma.rolePermission.findFirst({
where: { roleId: studentRole.id, permissionId: studentHomeworkPerm.id }
});
if (!existing) {
await prisma.rolePermission.create({
data: { roleId: studentRole.id, permissionId: studentHomeworkPerm.id }
});
console.log(' ✅ 已分配给学生角色');
}
}
// 3. 创建学生作业菜单
// 先检查是否已存在
const existingMenu = await prisma.menu.findFirst({
where: { path: '/student-homework' }
});
if (!existingMenu) {
const studentHomeworkMenu = await prisma.menu.create({
data: {
name: '我的作业',
path: '/student-homework',
component: 'homework/StudentList',
icon: 'BookOutlined',
permission: 'homework:student:read',
sort: 15, // 放在作业管理之前
validState: 1,
}
});
console.log(' ✅ 创建菜单: 我的作业');
// 4. 将菜单分配给租户
await prisma.tenantMenu.create({
data: {
tenantId: tenant.id,
menuId: studentHomeworkMenu.id,
}
});
console.log(' ✅ 菜单已分配给租户');
} else {
console.log(' ⏭️ 菜单已存在');
// 确保菜单已分配给租户
const tenantMenu = await prisma.tenantMenu.findFirst({
where: { tenantId: tenant.id, menuId: existingMenu.id }
});
if (!tenantMenu) {
await prisma.tenantMenu.create({
data: {
tenantId: tenant.id,
menuId: existingMenu.id,
}
});
console.log(' ✅ 菜单已分配给租户');
}
}
}
// 5. 移除学生角色的 homework:read 权限(这个权限是给管理员的)
console.log('\n📝 更新权限配置...');
const allStudentRoles = await prisma.role.findMany({
where: { code: 'student' }
});
for (const studentRole of allStudentRoles) {
// 获取 homework:read 权限
const homeworkReadPerm = await prisma.permission.findFirst({
where: { tenantId: studentRole.tenantId, code: 'homework:read' }
});
if (homeworkReadPerm) {
await prisma.rolePermission.deleteMany({
where: { roleId: studentRole.id, permissionId: homeworkReadPerm.id }
});
console.log(` ✅ 移除学生角色(ID:${studentRole.id})的 homework:read 权限`);
}
}
console.log('\n✅ 学生作业菜单配置完成!');
}
main()
.catch(console.error)
.finally(() => prisma.$disconnect());