146 lines
8.6 KiB
JavaScript
146 lines
8.6 KiB
JavaScript
import { PrismaClient } from "@prisma/client";
|
||
import { PrismaMariaDb } from "@prisma/adapter-mariadb";
|
||
import "dotenv/config";
|
||
|
||
const base = process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4";
|
||
const sep = base.includes("?") ? "&" : "?";
|
||
const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`;
|
||
const adapter = new PrismaMariaDb(connectionString);
|
||
const prisma = new PrismaClient({ adapter });
|
||
|
||
const PERMISSIONS = [
|
||
{ groupName: "工具管理", name: "查看待审核工具", key: "tools.pending.view", sortOrder: 1 },
|
||
{ groupName: "工具管理", name: "通过工具", key: "tools.pending.approve", sortOrder: 2 },
|
||
{ groupName: "工具管理", name: "拒绝工具", key: "tools.pending.reject", sortOrder: 3 },
|
||
{ groupName: "工具管理", name: "批量操作工具", key: "tools.pending.batch", sortOrder: 4 },
|
||
{ groupName: "工具管理", name: "编辑待审核工具", key: "tools.pending.edit", sortOrder: 5 },
|
||
{ groupName: "工具管理", name: "抓取工具Logo", key: "tools.pending.logo", sortOrder: 6 },
|
||
{ groupName: "工具管理", name: "查看已发布工具", key: "tools.published.view", sortOrder: 7 },
|
||
{ groupName: "工具管理", name: "新增工具", key: "tools.published.create", sortOrder: 8 },
|
||
{ groupName: "工具管理", name: "编辑已发布工具", key: "tools.published.edit", sortOrder: 9 },
|
||
{ groupName: "工具管理", name: "删除工具", key: "tools.published.delete", sortOrder: 10 },
|
||
{ groupName: "工具管理", name: "查看工具分类", key: "tools.categories.view", sortOrder: 11 },
|
||
{ groupName: "工具管理", name: "新增工具分类", key: "tools.categories.create", sortOrder: 12 },
|
||
{ groupName: "工具管理", name: "编辑工具分类", key: "tools.categories.edit", sortOrder: 13 },
|
||
{ groupName: "工具管理", name: "删除工具分类", key: "tools.categories.delete", sortOrder: 14 },
|
||
|
||
{ groupName: "技能库", name: "查看待审核技能", key: "skills.pending.view", sortOrder: 15 },
|
||
{ groupName: "技能库", name: "通过技能", key: "skills.pending.approve", sortOrder: 16 },
|
||
{ groupName: "技能库", name: "拒绝技能", key: "skills.pending.reject", sortOrder: 17 },
|
||
{ groupName: "技能库", name: "批量操作技能", key: "skills.pending.batch", sortOrder: 18 },
|
||
{ groupName: "技能库", name: "编辑待审核技能", key: "skills.pending.edit", sortOrder: 19 },
|
||
{ groupName: "技能库", name: "查看已发布技能", key: "skills.published.view", sortOrder: 20 },
|
||
{ groupName: "技能库", name: "编辑已发布技能", key: "skills.published.edit", sortOrder: 21 },
|
||
{ groupName: "技能库", name: "删除技能", key: "skills.published.delete", sortOrder: 22 },
|
||
{ groupName: "技能库", name: "查看技能分类", key: "skills.categories.view", sortOrder: 23 },
|
||
{ groupName: "技能库", name: "新增技能分类", key: "skills.categories.create", sortOrder: 24 },
|
||
{ groupName: "技能库", name: "编辑技能分类", key: "skills.categories.edit", sortOrder: 25 },
|
||
{ groupName: "技能库", name: "删除技能分类", key: "skills.categories.delete", sortOrder: 26 },
|
||
|
||
{ groupName: "评测管理", name: "查看评测列表", key: "reviews.view", sortOrder: 27 },
|
||
{ groupName: "评测管理", name: "查看评测详情", key: "reviews.detail", sortOrder: 28 },
|
||
{ groupName: "评测管理", name: "发布评测", key: "reviews.publish", sortOrder: 29 },
|
||
{ groupName: "评测管理", name: "驳回评测", key: "reviews.reject", sortOrder: 30 },
|
||
{ groupName: "评测管理", name: "编辑评分", key: "reviews.edit_score", sortOrder: 31 },
|
||
{ groupName: "评测管理", name: "请求重评", key: "reviews.regenerate", sortOrder: 32 },
|
||
{ groupName: "评测管理", name: "删除评测", key: "reviews.delete", sortOrder: 33 },
|
||
{ groupName: "评测管理", name: "生成内容(长文/脚本/卡片)", key: "reviews.generate_content", sortOrder: 34 },
|
||
|
||
{ groupName: "AI发现", name: "工具导入", key: "discover.tools.import", sortOrder: 35 },
|
||
{ groupName: "AI发现", name: "工具Logo抓取", key: "discover.tools.logo", sortOrder: 36 },
|
||
{ groupName: "AI发现", name: "检测工具可访问性", key: "discover.tools.check", sortOrder: 37 },
|
||
{ groupName: "AI发现", name: "删除失效工具", key: "discover.tools.check_delete", sortOrder: 38 },
|
||
{ groupName: "AI发现", name: "自动发现技能", key: "discover.skills.auto", sortOrder: 39 },
|
||
{ groupName: "AI发现", name: "手动导入技能", key: "discover.skills.import", sortOrder: 40 },
|
||
{ groupName: "AI发现", name: "更新技能Stars", key: "discover.skills.update_stars", sortOrder: 41 },
|
||
|
||
{ groupName: "内容管理", name: "查看日报列表", key: "content.daily.view", sortOrder: 42 },
|
||
{ groupName: "内容管理", name: "新建日报", key: "content.daily.create", sortOrder: 43 },
|
||
{ groupName: "内容管理", name: "编辑日报", key: "content.daily.edit", sortOrder: 44 },
|
||
{ groupName: "内容管理", name: "删除日报", key: "content.daily.delete", sortOrder: 45 },
|
||
{ groupName: "内容管理", name: "发布/取消发布日报", key: "content.daily.publish", sortOrder: 46 },
|
||
{ groupName: "内容管理", name: "AI生成日报", key: "content.daily.ai_generate", sortOrder: 47 },
|
||
{ groupName: "内容管理", name: "管理新闻条目", key: "content.daily.items_manage", sortOrder: 48 },
|
||
{ groupName: "内容管理", name: "AI新闻发现导入", key: "content.news.import", sortOrder: 49 },
|
||
|
||
{ groupName: "系统管理", name: "查看系统配置", key: "system.config.view", sortOrder: 50 },
|
||
{ groupName: "系统管理", name: "编辑系统配置", key: "system.config.edit", sortOrder: 51 },
|
||
{ groupName: "系统管理", name: "查看角色权限", key: "system.roles.view", sortOrder: 52 },
|
||
{ groupName: "系统管理", name: "编辑角色权限", key: "system.roles.edit", sortOrder: 53 },
|
||
];
|
||
|
||
const VIP_ALLOWED = [
|
||
"tools.pending.view", "tools.published.view", "tools.categories.view",
|
||
"skills.pending.view", "skills.published.view", "skills.categories.view",
|
||
"reviews.view", "reviews.detail",
|
||
"discover.tools.import", "discover.tools.logo", "discover.tools.check",
|
||
"discover.skills.import",
|
||
"content.daily.view", "content.daily.create", "content.daily.edit", "content.daily.ai_generate",
|
||
"content.daily.items_manage", "content.news.import",
|
||
"system.config.view",
|
||
];
|
||
|
||
async function main() {
|
||
console.log("🔐 权限系统种子数据初始化\n");
|
||
|
||
for (const perm of PERMISSIONS) {
|
||
await prisma.permission.upsert({
|
||
where: { key: perm.key },
|
||
create: perm,
|
||
update: { groupName: perm.groupName, name: perm.name, sortOrder: perm.sortOrder },
|
||
});
|
||
}
|
||
console.log(`✅ ${PERMISSIONS.length} 个权限点已同步`);
|
||
|
||
const allPerms = await prisma.permission.findMany({ select: { id: true, key: true } });
|
||
const allPermIds = allPerms.map((p) => p.id);
|
||
|
||
let adminRole = await prisma.role.findUnique({ where: { slug: "admin" } });
|
||
if (!adminRole) {
|
||
adminRole = await prisma.role.create({
|
||
data: { name: "超级管理员", slug: "admin", isSystem: true },
|
||
});
|
||
console.log("✅ 超级管理员角色已创建");
|
||
} else {
|
||
await prisma.role.update({ where: { slug: "admin" }, data: { isSystem: true } });
|
||
console.log("ℹ️ 超级管理员角色已存在");
|
||
}
|
||
|
||
await prisma.rolePermission.deleteMany({ where: { roleId: adminRole.id } });
|
||
for (const permId of allPermIds) {
|
||
await prisma.rolePermission.create({ data: { roleId: adminRole.id, permissionId: permId } });
|
||
}
|
||
console.log(`✅ 超级管理员已分配全部 ${allPermIds.length} 个权限`);
|
||
|
||
let vipRole = await prisma.role.findUnique({ where: { slug: "vip" } });
|
||
if (!vipRole) {
|
||
vipRole = await prisma.role.create({
|
||
data: { name: "VIP成员", slug: "vip", isSystem: true },
|
||
});
|
||
console.log("✅ VIP角色已创建");
|
||
} else {
|
||
console.log("ℹ️ VIP角色已存在");
|
||
}
|
||
|
||
await prisma.rolePermission.deleteMany({ where: { roleId: vipRole.id } });
|
||
const vipPermIds = allPerms.filter((p) => VIP_ALLOWED.includes(p.key)).map((p) => p.id);
|
||
for (const permId of vipPermIds) {
|
||
await prisma.rolePermission.create({ data: { roleId: vipRole.id, permissionId: permId } });
|
||
}
|
||
console.log(`✅ VIP角色已分配 ${vipPermIds.length} 个权限`);
|
||
|
||
const adminUser = await prisma.user.findFirst({ where: { role: "admin" } });
|
||
if (adminUser) {
|
||
await prisma.user.update({
|
||
where: { id: adminUser.id },
|
||
data: { roleId: adminRole.id },
|
||
});
|
||
console.log("✅ 现有管理员用户已关联到超级管理员角色");
|
||
}
|
||
|
||
console.log("\n🏁 权限初始化完成");
|
||
}
|
||
|
||
main()
|
||
.catch((e) => { console.error("💥 种子失败:", e); process.exit(1); })
|
||
.finally(() => prisma.$disconnect()); |