Files
zhuiguang-ai/scripts/seed-permissions.mjs

146 lines
8.7 KiB
JavaScript
Raw Permalink 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.
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").replace("mysql://", "mariadb://");
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());