library-picturebook-activity/backend/scripts/init-super-tenant.ts
2025-11-23 14:04:20 +08:00

361 lines
9.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.

// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
// 加载环境变量(必须在其他导入之前)
import * as dotenv from 'dotenv';
import * as path from 'path';
// 根据 NODE_ENV 加载对应的环境配置文件
const nodeEnv = process.env.NODE_ENV || 'development';
const envFile = `.env.${nodeEnv}`;
// scripts 目录的父目录就是 backend 目录
const backendDir = path.resolve(__dirname, '..');
const envPath = path.resolve(backendDir, envFile);
// 尝试加载环境特定的配置文件
dotenv.config({ path: envPath });
// 如果环境特定文件不存在,尝试加载默认的 .env 文件
if (!process.env.DATABASE_URL) {
dotenv.config({ path: path.resolve(backendDir, '.env') });
}
// 验证必要的环境变量
if (!process.env.DATABASE_URL) {
console.error('❌ 错误: 未找到 DATABASE_URL 环境变量');
console.error(` 请确保存在以下文件之一:`);
console.error(` - ${envPath}`);
console.error(` - ${path.resolve(backendDir, '.env')}`);
console.error(` 或者设置 NODE_ENV 环境变量(当前: ${nodeEnv})`);
process.exit(1);
}
import { PrismaClient } from '@prisma/client';
import * as bcrypt from 'bcrypt';
const prisma = new PrismaClient();
async function main() {
console.log('开始初始化超级租户...');
// 检查是否已存在超级租户
const existingSuperTenant = await prisma.tenant.findFirst({
where: { isSuper: 1 },
});
if (existingSuperTenant) {
console.log('超级租户已存在,跳过创建');
console.log(`租户编码: ${existingSuperTenant.code}`);
return;
}
// 创建超级租户
const superTenant = await prisma.tenant.create({
data: {
name: '超级租户',
code: 'super',
domain: 'super',
description: '系统超级租户,拥有所有权限',
isSuper: 1,
validState: 1,
},
});
console.log('超级租户创建成功!');
console.log(`租户ID: ${superTenant.id}`);
console.log(`租户编码: ${superTenant.code}`);
console.log(`租户名称: ${superTenant.name}`);
// 创建超级管理员用户
const hashedPassword = await bcrypt.hash('admin123', 10);
const superAdmin = await prisma.user.create({
data: {
tenantId: superTenant.id,
username: 'admin',
password: hashedPassword,
nickname: '超级管理员',
email: 'admin@super.com',
validState: 1,
},
});
console.log('超级管理员用户创建成功!');
console.log(`用户名: ${superAdmin.username}`);
console.log(`密码: admin123`);
console.log(`用户ID: ${superAdmin.id}`);
// 创建超级管理员角色
const superAdminRole = await prisma.role.create({
data: {
tenantId: superTenant.id,
name: '超级管理员',
code: 'super_admin',
description: '超级管理员角色,拥有所有权限',
validState: 1,
},
});
console.log('超级管理员角色创建成功!');
console.log(`角色编码: ${superAdminRole.code}`);
// 将超级管理员角色分配给用户
await prisma.userRole.create({
data: {
userId: superAdmin.id,
roleId: superAdminRole.id,
},
});
console.log('超级管理员角色已分配给用户');
// 创建基础权限
const permissions = [
{
name: '租户管理-创建',
code: 'tenant:create',
resource: 'tenant',
action: 'create',
},
{
name: '租户管理-查看',
code: 'tenant:read',
resource: 'tenant',
action: 'read',
},
{
name: '租户管理-更新',
code: 'tenant:update',
resource: 'tenant',
action: 'update',
},
{
name: '租户管理-删除',
code: 'tenant:delete',
resource: 'tenant',
action: 'delete',
},
{
name: '用户管理-创建',
code: 'user:create',
resource: 'user',
action: 'create',
},
{
name: '用户管理-查看',
code: 'user:read',
resource: 'user',
action: 'read',
},
{
name: '用户管理-更新',
code: 'user:update',
resource: 'user',
action: 'update',
},
{
name: '用户管理-删除',
code: 'user:delete',
resource: 'user',
action: 'delete',
},
{
name: '角色管理-创建',
code: 'role:create',
resource: 'role',
action: 'create',
},
{
name: '角色管理-查看',
code: 'role:read',
resource: 'role',
action: 'read',
},
{
name: '角色管理-更新',
code: 'role:update',
resource: 'role',
action: 'update',
},
{
name: '角色管理-删除',
code: 'role:delete',
resource: 'role',
action: 'delete',
},
{
name: '权限管理-创建',
code: 'permission:create',
resource: 'permission',
action: 'create',
},
{
name: '权限管理-查看',
code: 'permission:read',
resource: 'permission',
action: 'read',
},
{
name: '权限管理-更新',
code: 'permission:update',
resource: 'permission',
action: 'update',
},
{
name: '权限管理-删除',
code: 'permission:delete',
resource: 'permission',
action: 'delete',
},
{
name: '菜单管理-创建',
code: 'menu:create',
resource: 'menu',
action: 'create',
},
{
name: '菜单管理-查看',
code: 'menu:read',
resource: 'menu',
action: 'read',
},
{
name: '菜单管理-更新',
code: 'menu:update',
resource: 'menu',
action: 'update',
},
{
name: '菜单管理-删除',
code: 'menu:delete',
resource: 'menu',
action: 'delete',
},
];
const createdPermissions = [];
for (const perm of permissions) {
const existing = await prisma.permission.findFirst({
where: {
tenantId: superTenant.id,
code: perm.code,
},
});
if (!existing) {
const permission = await prisma.permission.create({
data: {
tenantId: superTenant.id,
...perm,
validState: 1,
},
});
createdPermissions.push(permission);
} else {
createdPermissions.push(existing);
}
}
console.log(`创建了 ${createdPermissions.length} 个权限`);
// 将所有权限分配给超级管理员角色
await prisma.rolePermission.createMany({
data: createdPermissions.map((perm) => ({
roleId: superAdminRole.id,
permissionId: perm.id,
})),
skipDuplicates: true,
});
console.log('所有权限已分配给超级管理员角色');
// 创建租户管理菜单(如果不存在)
console.log('\n创建租户管理菜单...');
// 查找系统管理菜单(父菜单)
const systemMenu = await prisma.menu.findFirst({
where: {
name: '系统管理',
parentId: null,
},
});
if (systemMenu) {
// 检查租户管理菜单是否已存在
const existingTenantMenu = await prisma.menu.findFirst({
where: {
name: '租户管理',
path: '/system/tenants',
},
});
let tenantMenu;
if (!existingTenantMenu) {
tenantMenu = await prisma.menu.create({
data: {
name: '租户管理',
path: '/system/tenants',
icon: 'TeamOutlined',
component: 'system/tenants/Index',
parentId: systemMenu.id,
permission: 'tenant:read',
sort: 7,
validState: 1,
},
});
console.log('租户管理菜单创建成功');
} else {
tenantMenu = existingTenantMenu;
console.log('租户管理菜单已存在,跳过创建');
}
// 为超级租户分配租户管理菜单
if (tenantMenu) {
const existingTenantMenuRelation = await prisma.tenantMenu.findFirst({
where: {
tenantId: superTenant.id,
menuId: tenantMenu.id,
},
});
if (!existingTenantMenuRelation) {
await prisma.tenantMenu.create({
data: {
tenantId: superTenant.id,
menuId: tenantMenu.id,
},
});
console.log('租户管理菜单已分配给超级租户');
} else {
console.log('租户管理菜单已分配给超级租户,跳过');
}
}
} else {
console.log('警告:未找到系统管理菜单,无法创建租户管理菜单');
}
console.log('\n初始化完成');
console.log('========================================');
console.log('超级租户信息:');
console.log(` 租户编码: ${superTenant.code}`);
console.log(` 访问链接: http://your-domain.com/?tenant=${superTenant.code}`);
console.log('========================================');
console.log('超级管理员登录信息:');
console.log(` 用户名: ${superAdmin.username}`);
console.log(` 密码: admin123`);
console.log(` 租户编码: ${superTenant.code}`);
console.log('========================================');
}
main()
.then(() => {
console.log('\n🎉 初始化脚本执行完成!');
process.exit(0);
})
.catch((error) => {
console.error('\n💥 初始化脚本执行失败:', error);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});