123 lines
4.8 KiB
PHP
123 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace Database\Seeders;
|
|
|
|
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
|
use Illuminate\Database\Seeder;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Slowlyo\OwlAdmin\Models\{AdminMenu, AdminPermission};
|
|
use Slowlyo\OwlAdmin\Support\Cores\Database;
|
|
|
|
class AdminPermissionSeeder extends Seeder
|
|
{
|
|
/**
|
|
* Run the database seeds.
|
|
*/
|
|
public function run(): void
|
|
{
|
|
// Database::make()->fillInitialData();
|
|
DB::table('admin_menus')->truncate();
|
|
DB::table('admin_permissions')->truncate();
|
|
DB::table('admin_permission_menu')->truncate();
|
|
DB::table('admin_role_permissions')->truncate();
|
|
|
|
// icon: https://icones.js.org/collection/mdi
|
|
$list = [
|
|
['name' => '首页', 'icon' => 'mdi:home', 'slug' => 'dashboard', 'url' => '/dashboard', 'is_home' => 1],
|
|
['name' => '系统管理', 'icon' => 'mdi:cog-outline', 'slug' => 'system', 'url' => '/system', 'children' => [
|
|
['name' => '管理员', 'icon' => 'mdi:account-cog-outline', 'slug' => 'admin_users', 'url' => '/system/admin_users'],
|
|
['name' => '角色', 'icon' => 'mdi:account-box-outline', 'slug' => 'roles', 'url' => '/system/admin_roles'],
|
|
['name' => '权限', 'icon' => 'mdi:key-variant', 'slug' => 'permissions', 'url' => '/system/admin_permissions'],
|
|
['name' => '菜单', 'icon' => 'mdi:menu-open', 'slug' => 'menus', 'url' => '/system/admin_menus'],
|
|
['name' => '设置', 'icon' => 'mdi:application-cog-outline', 'slug' => 'settings', 'url' => '/system/settings'],
|
|
['name' => '字典管理', 'icon' => 'mdi:folder-key-network', 'slug' => 'keywords', 'url' => '/system/keywords', 'resource' => true, 'permissions' => ['export' => '导出']],
|
|
]],
|
|
];
|
|
$this->createByTree($list);
|
|
}
|
|
|
|
protected function createByTree($list, $parent = null)
|
|
{
|
|
foreach($list as $item) {
|
|
$parent_permission_id = data_get($parent, 'permission', 0);
|
|
$parent_menu_id = data_get($parent, 'menu', 0);
|
|
$menu = $this->createMenu($item, $parent_menu_id);
|
|
$permission = $this->createPermission($item, $parent_permission_id, $menu);
|
|
if (isset($item['children'])) {
|
|
$this->createByTree($item['children'], ['permission' => $permission->id, 'menu' => $menu->id]);
|
|
}
|
|
$resource_permissions = $this->getResourcePermissions(data_get($item, 'resource'));
|
|
if (isset($item['permissions'])) {
|
|
$resource_permissions = array_merge($resource_permissions, $item['permissions']);
|
|
}
|
|
foreach($resource_permissions as $key => $name) {
|
|
$this->createPermission([
|
|
'name' => $name,
|
|
'slug' => $item['slug'].'.'.$key,
|
|
'url' => null
|
|
], $permission->id, $menu);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected function createMenu($item, $pid = 0)
|
|
{
|
|
return AdminMenu::create([
|
|
'parent_id' => $pid,
|
|
'custom_order' => data_get($item, 'custom_order', 0),
|
|
'title' => data_get($item, 'name'),
|
|
'icon' => data_get($item, 'icon'),
|
|
'url' => data_get($item, 'url'),
|
|
'is_home' => data_get($item, 'is_home', 0),
|
|
]);
|
|
}
|
|
|
|
protected function createPermission($item, $pid = 0, $menu = null)
|
|
{
|
|
$slug = data_get($item, 'slug');
|
|
$url = data_get($item, 'url');
|
|
$permission = AdminPermission::create([
|
|
'parent_id' => $pid,
|
|
'custom_order' => data_get($item, 'custom_order', 0),
|
|
'name' => data_get($item, 'name'),
|
|
'slug' => $slug,
|
|
'http_path' => $url ? [$url] : null,
|
|
]);
|
|
if ($menu) {
|
|
$menu_has_permissions = [
|
|
['permission_id' => $permission->id, 'menu_id' => $menu->id]
|
|
];
|
|
|
|
$parent_menu = $menu->parent;
|
|
do {
|
|
if ($parent_menu) {
|
|
array_push($menu_has_permissions, ['permission_id' => $permission->id, 'menu_id' => $parent_menu->id]);
|
|
$parent_menu = $parent_menu->parent;
|
|
}
|
|
}while($parent_menu);
|
|
DB::table('admin_permission_menu')->insert($menu_has_permissions);
|
|
}
|
|
return $permission;
|
|
}
|
|
|
|
protected function getResourcePermissions($resource)
|
|
{
|
|
$maps = [
|
|
'index' => '列表',
|
|
'create' => '添加',
|
|
'edit' => '修改',
|
|
'show' => '详细',
|
|
'delete' => '删除'
|
|
];
|
|
if ($resource == true) {
|
|
return $maps;
|
|
}
|
|
else if (is_array($resource)) {
|
|
return Arr::only($maps, $resource);
|
|
}
|
|
|
|
return [];
|
|
}
|
|
}
|