Files
xin-procurement/database/seeders/PermissionSeeder.php
T

532 lines
28 KiB
PHP

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
/**
* 权限点统一种子(可重复执行)
*
* 约定:
* - 系统菜单保留 local 语言包 key;业务菜单 local 一律留空,name 直接写中文
* - 新增权限:在 menus() 中追加节点后执行:
* php artisan db:seed --class=PermissionSeeder
* - 注意:执行后角色权限关联会被重置为「仅超级管理员拥有全部权限」,
* 非超管角色的自定义授权需在后台重新分配
*/
class PermissionSeeder extends Seeder
{
public function run(): void
{
DB::transaction(function () {
// 1. 清空全部权限与角色关联
DB::table('sys_role_rule')->delete();
DB::table('sys_rule')->delete();
// 2. 重新填充系统菜单与业务菜单
$ruleIds = [];
$this->insertNodes($this->menus(), 0, $ruleIds);
// 3. 全部授权给超级管理员角色(role_id=1)
DB::table('sys_role_rule')->insert(array_map(
static fn (int $ruleId) => ['role_id' => 1, 'rule_id' => $ruleId],
$ruleIds
));
$this->command?->info('权限已重建,共 ' . count($ruleIds) . ' 个权限点,已全部授权给超级管理员');
});
}
/**
* 系统框架菜单(仪表盘、示例页面、AI、系统管理等)
*/
private function menus(): array
{
return [
[
'type' => 'menu',
'name' => '仪表盘',
'key' => 'dashboard',
'icon' => 'PieChartOutlined',
'local' => 'menu.dashboard',
'children' => [
[
'type' => 'route',
'name' => '分析页',
'local' => "menu.analysis",
'key' => 'dashboard.analysis',
'path' => '/dashboard/analysis',
]
]
],
[
'type' => 'menu',
'key' => 'procurement.product',
'name' => '商品中心',
'icon' => 'ShoppingOutlined',
'children' => [
[
'type' => 'route',
'key' => 'product.category',
'name' => '分类管理',
'path' => '/product/category',
'children' => [
['type' => 'rule', 'key' => 'product.category.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'product.category.create', 'name' => '新增'],
['type' => 'rule', 'key' => 'product.category.update', 'name' => '编辑'],
['type' => 'rule', 'key' => 'product.category.delete', 'name' => '删除'],
],
],
[
'type' => 'route',
'key' => 'product.goods',
'name' => '商品列表',
'path' => '/product/goods',
'children' => [
['type' => 'rule', 'key' => 'product.goods.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'product.goods.create', 'name' => '新增'],
['type' => 'rule', 'key' => 'product.goods.update', 'name' => '编辑'],
['type' => 'rule', 'key' => 'product.goods.delete', 'name' => '删除'],
['type' => 'rule', 'key' => 'product.goods.batchPrice', 'name' => '批量调价'],
],
],
[
'type' => 'route',
'key' => 'customer.supplier',
'name' => '供应商',
'path' => '/customer/supplier',
'children' => [
['type' => 'rule', 'key' => 'customer.supplier.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'customer.supplier.create', 'name' => '新增'],
['type' => 'rule', 'key' => 'customer.supplier.update', 'name' => '编辑'],
['type' => 'rule', 'key' => 'customer.supplier.delete', 'name' => '删除'],
],
],
],
],
[
'type' => 'menu',
'key' => 'procurement.customer',
'name' => '客户管理',
'icon' => 'ShopOutlined',
'children' => [
[
'type' => 'route',
'key' => 'customer.store',
'name' => '门店管理',
'path' => '/customer/store',
'children' => [
['type' => 'rule', 'key' => 'customer.store.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'customer.store.create', 'name' => '新增'],
['type' => 'rule', 'key' => 'customer.store.update', 'name' => '编辑'],
['type' => 'rule', 'key' => 'customer.store.delete', 'name' => '删除'],
],
],
[
'type' => 'route',
'key' => 'customer.level',
'name' => '客户等级',
'path' => '/customer/level',
'children' => [
['type' => 'rule', 'key' => 'customer.level.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'customer.level.create', 'name' => '新增'],
['type' => 'rule', 'key' => 'customer.level.update', 'name' => '编辑'],
['type' => 'rule', 'key' => 'customer.level.delete', 'name' => '删除'],
],
],
[
'type' => 'route',
'key' => 'customer.notice',
'name' => '通知管理',
'path' => '/customer/notice',
'children' => [
['type' => 'rule', 'key' => 'customer.notice.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'customer.notice.create', 'name' => '发布'],
['type' => 'rule', 'key' => 'customer.notice.delete', 'name' => '删除'],
],
],
],
],
[
'type' => 'menu',
'key' => 'procurement.order',
'name' => '订货管理',
'icon' => 'FileTextOutlined',
'children' => [
[
'type' => 'route',
'key' => 'order.store',
'name' => '门店订单',
'path' => '/order/store',
'children' => [
['type' => 'rule', 'key' => 'order.store.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'order.store.update', 'name' => '状态流转'],
['type' => 'rule', 'key' => 'order.store.delete', 'name' => '删除(仅已取消订单)'],
],
],
],
],
[
'type' => 'menu',
'key' => 'procurement.purchase',
'name' => '采购管理',
'icon' => 'ShoppingCartOutlined',
'children' => [
[
'type' => 'route',
'key' => 'purchase.order',
'name' => '采购单',
'path' => '/purchase/order',
'children' => [
['type' => 'rule', 'key' => 'purchase.order.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'purchase.order.update', 'name' => '修改'],
['type' => 'rule', 'key' => 'purchase.order.generate', 'name' => '生成采购单'],
['type' => 'rule', 'key' => 'purchase.order.bill', 'name' => '生成账单'],
['type' => 'rule', 'key' => 'purchase.order.export', 'name' => '导出'],
],
],
],
],
[
'type' => 'menu',
'key' => 'procurement.recon',
'name' => '财务管理',
'icon' => 'AccountBookOutlined',
'children' => [
[
'type' => 'route',
'key' => 'recon.bill',
'name' => '门店账单',
'path' => '/recon/bill',
'children' => [
['type' => 'rule', 'key' => 'recon.bill.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'recon.bill.pay', 'name' => '确认收款'],
['type' => 'rule', 'key' => 'recon.bill.export', 'name' => '导出'],
],
],
[
'type' => 'route',
'key' => 'recon.containerReturn',
'name' => '回筐记录',
'path' => '/recon/container-return',
'children' => [
['type' => 'rule', 'key' => 'recon.containerReturn.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'recon.containerReturn.export', 'name' => '导出'],
],
],
[
'type' => 'route',
'key' => 'recon.payment',
'name' => '支付记录',
'path' => '/recon/payment',
'children' => [
['type' => 'rule', 'key' => 'recon.payment.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'recon.payment.audit', 'name' => '审核'],
],
],
],
],
[
'type' => 'menu',
'key' => 'procurement.client',
'name' => '客户端配置',
'icon' => 'MobileOutlined',
'children' => [
[
'type' => 'route',
'key' => 'client.banner',
'name' => '首页轮播图',
'path' => '/client/banner',
'children' => [
['type' => 'rule', 'key' => 'client.banner.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'client.banner.create', 'name' => '新增'],
['type' => 'rule', 'key' => 'client.banner.update', 'name' => '编辑'],
['type' => 'rule', 'key' => 'client.banner.delete', 'name' => '删除'],
],
],
[
'type' => 'route',
'key' => 'client.nav',
'name' => '宫格导航',
'path' => '/client/nav',
'children' => [
['type' => 'rule', 'key' => 'client.nav.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'client.nav.create', 'name' => '新增'],
['type' => 'rule', 'key' => 'client.nav.update', 'name' => '编辑'],
['type' => 'rule', 'key' => 'client.nav.delete', 'name' => '删除'],
],
],
[
'type' => 'route',
'key' => 'client.promo',
'name' => '促销推荐卡片',
'path' => '/client/promo',
'children' => [
['type' => 'rule', 'key' => 'client.promo.query', 'name' => '查询'],
['type' => 'rule', 'key' => 'client.promo.create', 'name' => '新增'],
['type' => 'rule', 'key' => 'client.promo.update', 'name' => '编辑'],
['type' => 'rule', 'key' => 'client.promo.delete', 'name' => '删除'],
],
],
],
],
[
'type' => 'menu',
'name' => 'AI',
'local' => "menu.ai",
'icon' => "OpenAIOutlined",
'key' => "ai",
'children' => [
[
'type' => "route",
'key' => "ai.chat",
'name' => "AI对话",
"path" => "/ai/chat",
'local' => "menu.ai.chat",
'children' => [
['type' => 'rule', 'name' => '发送消息', 'key' => 'ai.chat.send'],
['type' => 'rule', 'name' => '会话列表', 'key' => 'ai.chat.conversations'],
['type' => 'rule', 'name' => '消息列表', 'key' => 'ai.chat.messages'],
['type' => 'rule', 'name' => '删除会话', 'key' => 'ai.chat.delete'],
]
],
[
'type' => "route",
'key' => "ai.conversation",
'name' => "会话管理",
"path" => "/ai/conversation",
'local' => "menu.ai.conversation",
'children' => [
['type' => 'rule', 'name' => '查询会话列表', 'key' => 'ai.conversation.query'],
['type' => 'rule', 'name' => '删除会话', 'key' => 'ai.conversation.delete'],
]
],
[
'type' => "route",
'key' => "ai.agent",
'name' => "Agent 管理",
"path" => "/ai/agent",
'local' => "menu.ai.agent",
'children' => [
['type' => 'rule', 'name' => '查询列表', 'key' => 'ai.agent.query'],
['type' => 'rule', 'name' => '更新 Agent', 'key' => 'ai.agent.update'],
]
],
]
],
[
'type' => "menu",
'name' => "系统管理",
'local' => "menu.system",
'icon' => "SettingOutlined",
'key' => "system",
'children' => [
[
'type' => "route",
'key' => "system.user",
'name' => "用户管理",
'path' => "/system/user",
'local' => "menu.system.user",
'children' => [
['type' => 'rule', 'name' => '查询列表', 'key' => 'system.user.query'],
['type' => 'rule', 'name' => '新增用户', 'key' => 'system.user.create'],
['type' => 'rule', 'name' => '修改用户', 'key' => 'system.user.update'],
['type' => 'rule', 'name' => '删除用户', 'key' => 'system.user.delete'],
['type' => 'rule', 'name' => '重置用户密码', 'key' => 'system.user.resetPassword'],
['type' => 'rule', 'name' => '获取角色选项', 'key' => 'system.user.role'],
['type' => 'rule', 'name' => '获取部门选项', 'key' => 'system.user.dept'],
]
],
[
'type' => "route",
'key' => "system.dept",
'name' => "部门管理",
'path' => "/system/dept",
'local' => "menu.system.dept",
'children' => [
['type' => 'rule', 'name' => '获取部门列表', 'key' => 'system.dept.query'],
['type' => 'rule', 'name' => '新建部门', 'key' => 'system.dept.create'],
['type' => 'rule', 'name' => '更新部门信息', 'key' => 'system.dept.update'],
['type' => 'rule', 'name' => '删除部门', 'key' => 'system.dept.delete'],
['type' => 'rule', 'name' => '获取部门用户', 'key' => 'system.dept.users'],
]
],
[
'type' => "route",
'key' => "system.role",
'name' => "角色管理",
'path' => "/system/role",
'local' => "menu.system.role",
'children' => [
['type' => 'rule', 'name' => '新增角色', 'key' => 'system.role.create'],
['type' => 'rule', 'name' => '查询角色列表', 'key' => 'system.role.query'],
['type' => 'rule', 'name' => '更新角色信息', 'key' => 'system.role.update'],
['type' => 'rule', 'name' => '删除角色', 'key' => 'system.role.delete'],
['type' => 'rule', 'name' => '设置启用状态', 'key' => 'system.role.status'],
['type' => 'rule', 'name' => '获取角色用户', 'key' => 'system.role.users'],
['type' => 'rule', 'name' => '设置角色权限', 'key' => 'system.role.setRule'],
['type' => 'rule', 'name' => '获取权限选项', 'key' => 'system.role.ruleList'],
]
],
[
'type' => "route",
'key' => "system.rule",
'name' => "菜单管理",
'path' => "/system/rule",
'local' => "menu.system.rule",
'children' => [
['type' => 'rule', 'name' => '获取权限列表', 'key' => 'system.rule.query'],
['type' => 'rule', 'name' => '创建权限规则', 'key' => 'system.rule.create'],
['type' => 'rule', 'name' => '更新权限规则', 'key' => 'system.rule.update'],
['type' => 'rule', 'name' => '删除权限规则', 'key' => 'system.rule.delete'],
['type' => 'rule', 'name' => '获取父级权限', 'key' => 'system.rule.parentQuery'],
['type' => 'rule', 'name' => '设置显示状态', 'key' => 'system.rule.show'],
['type' => 'rule', 'name' => '设置启用状态', 'key' => 'system.rule.status'],
]
],
[
'type' => "route",
'name' => "文件管理",
'local' => "menu.system.file",
'key' => "system.file",
'path' => "/system/file",
'children' => [
['type' => 'rule', 'name' => '获取文件夹', 'key' => 'system.file.group.query'],
['type' => 'rule', 'name' => '新增文件夹', 'key' => 'system.file.group.create'],
['type' => 'rule', 'name' => '编辑文件夹', 'key' => 'system.file.group.update'],
['type' => 'rule', 'name' => '删除文件夹', 'key' => 'system.file.group.delete'],
['type' => 'rule', 'name' => '查询文件列表', 'key' => 'system.file.list.query'],
['type' => 'rule', 'name' => '查看文件详情', 'key' => 'system.file.list.show'],
['type' => 'rule', 'name' => '上传文件', 'key' => 'system.file.list.upload'],
['type' => 'rule', 'name' => '下载文件', 'key' => 'system.file.list.download'],
['type' => 'rule', 'name' => '删除文件', 'key' => 'system.file.list.delete'],
['type' => 'rule', 'name' => '永久删除文件', 'key' => 'system.file.list.force-delete'],
['type' => 'rule', 'name' => '恢复文件', 'key' => 'system.file.list.restore'],
['type' => 'rule', 'name' => '查看回收站', 'key' => 'system.file.list.trashed'],
['type' => 'rule', 'name' => '清空回收站', 'key' => 'system.file.list.clean-trashed'],
['type' => 'rule', 'name' => '复制文件', 'key' => 'system.file.list.copy'],
['type' => 'rule', 'name' => '移动文件', 'key' => 'system.file.list.move'],
['type' => 'rule', 'name' => '重命名文件', 'key' => 'system.file.list.rename']
],
],
[
'type' => "route",
'name' => "系统字典",
'local' => "menu.system.dict",
'key' => "system.dict",
'path' => "/system/dict",
'children' => [
['type' => 'rule', 'name' => '字典列表', 'key' => 'system.dict.list.query'],
['type' => 'rule', 'name' => '新增字典', 'key' => 'system.dict.list.create'],
['type' => 'rule', 'name' => '删除字典', 'key' => 'system.dict.list.delete'],
['type' => 'rule', 'name' => '更新字典', 'key' => 'system.dict.list.update'],
['type' => 'rule', 'name' => '字典项列表', 'key' => 'system.dict.item.query'],
['type' => 'rule', 'name' => '字典项新增', 'key' => 'system.dict.item.create'],
['type' => 'rule', 'name' => '字典项编辑', 'key' => 'system.dict.item.update'],
['type' => 'rule', 'name' => '字典项删除', 'key' => 'system.dict.item.delete'],
]
],
[
'type' => "route",
'name' => "系统配置",
'local' => "menu.system.config",
'key' => "system.config",
'path' => "/system/config",
'children' => [
['type' => 'rule', 'name' => '配置列表', 'key' => 'system.config.items.query'],
['type' => 'rule', 'name' => '新增配置', 'key' => 'system.config.items.create'],
['type' => 'rule', 'name' => '编辑配置', 'key' => 'system.config.items.update'],
['type' => 'rule', 'name' => '删除配置', 'key' => 'system.config.items.delete'],
['type' => 'rule', 'name' => '保存配置', 'key' => 'system.config.items.save'],
['type' => 'rule', 'name' => '刷新配置', 'key' => 'system.config.items.refresh'],
['type' => 'rule', 'name' => '配置组编辑', 'key' => 'system.config.group.update'],
['type' => 'rule', 'name' => '配置组删除', 'key' => 'system.config.items.item.delete'],
['type' => 'rule', 'name' => '配置组列表', 'key' => 'system.config.group.query'],
['type' => 'rule', 'name' => '配置组新增', 'key' => 'system.config.group.create'],
]
],
[
'type' => 'route',
'key' => 'system.mail',
'name' => '邮件配置',
'path' => '/system/mail',
'local' => 'menu.system.mail',
'children' => [
['type' => 'rule', 'name' => '获取配置', 'key' => 'system.mail.config'],
['type' => 'rule', 'name' => '保存配置', 'key' => 'system.mail.save'],
['type' => 'rule', 'name' => '发送测试', 'key' => 'system.mail.test'],
]
],
[
'type' => 'route',
'key' => 'system.storage',
'name' => '存储配置',
'path' => '/system/storage',
'local' => 'menu.system.storage',
'children' => [
['type' => 'rule', 'name' => '获取配置', 'key' => 'system.storage.config'],
['type' => 'rule', 'name' => '保存配置', 'key' => 'system.storage.save'],
['type' => 'rule', 'name' => '测试连接', 'key' => 'system.storage.test'],
]
],
[
'type' => 'route',
'key' => 'system.ai',
'name' => 'AI 配置',
'path' => '/system/ai',
'local' => 'menu.system.ai',
'children' => [
['type' => 'rule', 'name' => '获取可用AI列表', 'key' => 'system.ai.list'],
['type' => 'rule', 'name' => '获取AI配置', 'key' => 'system.ai.config'],
['type' => 'rule', 'name' => '保存AI配置', 'key' => 'system.ai.save'],
['type' => 'rule', 'name' => '测试连接', 'key' => 'system.ai.test'],
]
],
[
'type' => "route",
'name' => "系统信息",
'local' => "menu.system.info",
'key' => "system.info",
'path' => "/system/info",
]
]
]
];
}
/**
* 递归写入菜单节点,收集全部节点 ID(menu/route/rule)用于授权
*
* @param array<int, array<string, mixed>> $nodes
* @param array<int> $ruleIds
*/
private function insertNodes(array $nodes, int $parentId, array &$ruleIds): void
{
$now = now();
$order = 0;
foreach ($nodes as $node) {
$id = DB::table('sys_rule')->insertGetId([
'parent_id' => $parentId,
'type' => $node['type'],
'key' => $node['key'],
'name' => $node['name'],
'path' => $node['path'] ?? '',
'icon' => $node['icon'] ?? '',
'order' => $order++,
'local' => $node['local'] ?? '',
'status' => 1,
'hidden' => 1,
'link' => $node['link'] ?? 0,
'created_at' => $now,
'updated_at' => $now,
]);
$ruleIds[] = $id;
if (!empty($node['children']) && is_array($node['children'])) {
$this->insertNodes($node['children'], $id, $ruleIds);
}
}
}
}