125 lines
3.7 KiB
TypeScript
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());
|