From 19e5ecc29a4944982c6b146613a905ab6ee85587 Mon Sep 17 00:00:00 2001 From: Edward Yang Date: Tue, 2 Aug 2022 10:55:06 +0800 Subject: [PATCH] update roles --- beike/Admin/Repositories/PermissionRepo.php | 37 +++++++------ beike/Admin/View/Components/Header.php | 31 ++++++++--- beike/Admin/View/Components/Sidebar.php | 59 ++++++++++++--------- 3 files changed, 80 insertions(+), 47 deletions(-) diff --git a/beike/Admin/Repositories/PermissionRepo.php b/beike/Admin/Repositories/PermissionRepo.php index 3c5d4c22..51b5aacd 100644 --- a/beike/Admin/Repositories/PermissionRepo.php +++ b/beike/Admin/Repositories/PermissionRepo.php @@ -12,12 +12,13 @@ namespace Beike\Admin\Repositories; use Beike\Models\AdminUser; +use Spatie\Permission\Exceptions\PermissionDoesNotExist; use Spatie\Permission\Models\Role; class PermissionRepo { - private $adminUser; - private $adminRole; + private AdminUser $adminUser; + private Role $adminRole; public function setUser(AdminUser $user): PermissionRepo { @@ -61,11 +62,11 @@ class PermissionRepo private function getProductPermissions(): array { return [ - ['code' => 'product_list', 'name' => '商品列表', 'selected' => $this->hasPermission('product_list')], - ['code' => 'product_create', 'name' => '商品创建', 'selected' => $this->hasPermission('product_create')], - ['code' => 'product_show', 'name' => '商品详情', 'selected' => $this->hasPermission('product_show')], - ['code' => 'product_update', 'name' => '商品编辑', 'selected' => $this->hasPermission('product_update')], - ['code' => 'product_delete', 'name' => '商品删除', 'selected' => $this->hasPermission('product_delete')], + ['code' => 'products_index', 'name' => '商品列表', 'selected' => $this->hasPermission('products_index')], + ['code' => 'products_create', 'name' => '商品创建', 'selected' => $this->hasPermission('products_create')], + ['code' => 'products_show', 'name' => '商品详情', 'selected' => $this->hasPermission('products_show')], + ['code' => 'products_update', 'name' => '商品编辑', 'selected' => $this->hasPermission('products_update')], + ['code' => 'products_delete', 'name' => '商品删除', 'selected' => $this->hasPermission('products_delete')], ]; } @@ -78,11 +79,11 @@ class PermissionRepo private function getOrderPermissions(): array { return [ - ['code' => 'order_list', 'name' => '订单列表', 'selected' => $this->hasPermission('order_list')], - ['code' => 'order_create', 'name' => '订单创建', 'selected' => $this->hasPermission('order_create')], - ['code' => 'order_show', 'name' => '订单详情', 'selected' => $this->hasPermission('order_show')], - ['code' => 'order_update', 'name' => '订单编辑', 'selected' => $this->hasPermission('order_update')], - ['code' => 'order_delete', 'name' => '订单删除', 'selected' => $this->hasPermission('order_delete')], + ['code' => 'orders_index', 'name' => '订单列表', 'selected' => $this->hasPermission('orders_index')], + ['code' => 'orders_create', 'name' => '订单创建', 'selected' => $this->hasPermission('orders_create')], + ['code' => 'orders_show', 'name' => '订单详情', 'selected' => $this->hasPermission('orders_show')], + ['code' => 'orders_update', 'name' => '订单编辑', 'selected' => $this->hasPermission('orders_update')], + ['code' => 'orders_delete', 'name' => '订单删除', 'selected' => $this->hasPermission('orders_delete')], ]; } @@ -95,10 +96,14 @@ class PermissionRepo */ private function hasPermission($permission): bool { - if ($this->adminRole) { - return $this->adminRole->hasPermissionTo($permission); - } elseif ($this->adminUser) { - return $this->adminUser->hasPermissionTo($permission); + try { + if ($this->adminRole) { + return $this->adminRole->hasPermissionTo($permission); + } elseif ($this->adminUser) { + return $this->adminUser->can($permission); + } + } catch (PermissionDoesNotExist $exception) { + return false; } return false; } diff --git a/beike/Admin/View/Components/Header.php b/beike/Admin/View/Components/Header.php index 7a9df1d5..8f815a95 100644 --- a/beike/Admin/View/Components/Header.php +++ b/beike/Admin/View/Components/Header.php @@ -2,11 +2,13 @@ namespace Beike\Admin\View\Components; +use Beike\Models\AdminUser; use Illuminate\View\Component; class Header extends Component { public array $links = []; + private AdminUser $adminUser; /** * Create a new component instance. @@ -15,13 +17,10 @@ class Header extends Component */ public function __construct() { - $this->addLink('管理首页', admin_route('home.index'), equal_route('admin.home.index')); - $this->addLink('订单管理', admin_route('orders.index'), equal_route('admin.orders.index')); - $this->addLink('商品管理', admin_route('products.index'), equal_route('admin.products.index')); - $this->addLink('会员管理', admin_route('customers.index'), equal_route('admin.customers.index')); - $this->addLink('系统设置', admin_route('settings.index'), equal_route('admin.settings.index')); + $this->adminUser = auth()->user(); } + /** * Get the view / contents that represent the component. * @@ -29,11 +28,31 @@ class Header extends Component */ public function render() { + $this->addLink('管理首页', 'home.index', equal_route('admin.home.index')); + $this->addLink('订单管理', 'orders.index', equal_route('admin.orders.index')); + $this->addLink('商品管理', 'products.index', equal_route('admin.products.index')); + $this->addLink('会员管理', 'customers.index', equal_route('admin.customers.index')); + $this->addLink('系统设置', 'settings.index', equal_route('admin.settings.index')); + return view('admin::components.header'); } - private function addLink($title, $url, $active = false) + + /** + * 添加后台顶部菜单链接 + * + * @param $title + * @param $route + * @param false $active + */ + private function addLink($title, $route, bool $active = false) { + $permissionRoute = str_replace('.', '_', $route); + if ($this->adminUser->cannot($permissionRoute) && $route != 'home.index') { + return; + } + + $url = admin_route($route); $this->links[] = [ 'title' => $title, 'url' => $url, diff --git a/beike/Admin/View/Components/Sidebar.php b/beike/Admin/View/Components/Sidebar.php index 74ca046c..70bd3740 100644 --- a/beike/Admin/View/Components/Sidebar.php +++ b/beike/Admin/View/Components/Sidebar.php @@ -2,6 +2,7 @@ namespace Beike\Admin\View\Components; +use Beike\Models\AdminUser; use Illuminate\Support\Str; use Illuminate\View\Component; @@ -10,6 +11,7 @@ class Sidebar extends Component public array $links = []; private string $adminName; private string $routeNameWithPrefix; + private AdminUser $adminUser; /** * Create a new component instance. @@ -20,6 +22,7 @@ class Sidebar extends Component { $this->adminName = admin_name(); $this->routeNameWithPrefix = request()->route()->getName(); + $this->adminUser = auth(AdminUser::AUTH_GUARD)->user(); } /** @@ -34,40 +37,40 @@ class Sidebar extends Component $routeName = str_replace($adminName . '.', '', $routeNameWithPrefix); if (Str::startsWith($routeName, ['home.'])) { - $this->addLink('首页装修', admin_route('design.index'), 'fa fa-tachometer-alt', $this->equalRoute('design.index'), true); - $this->addLink('插件列表', admin_route('plugins.index'), 'fa fa-tachometer-alt', $this->equalRoute('plugins.index')); - $this->addLink('商品分类', admin_route('categories.index'), 'fa fa-tachometer-alt', $this->equalRoute('categories.index')); - $this->addLink('品牌管理', admin_route('brands.index'), 'fa fa-tachometer-alt', $this->equalRoute('brands.index')); - $this->addLink('税率设置', admin_route('tax_rates.index'), 'fa fa-tachometer-alt', $this->equalRoute('tax_rates.index')); - $this->addLink('语言管理', admin_route('tax_rates.index'), 'fa fa-tachometer-alt', $this->equalRoute('tax_rates.index')); - $this->addLink('货币管理', admin_route('currencies.index'), 'fa fa-tachometer-alt', $this->equalRoute('currencies.index')); + $this->addLink('首页装修', 'design.index', 'fa fa-tachometer-alt', $this->equalRoute('design.index'), true); + $this->addLink('插件列表', 'plugins.index', 'fa fa-tachometer-alt', $this->equalRoute('plugins.index')); + $this->addLink('商品分类', 'categories.index', 'fa fa-tachometer-alt', $this->equalRoute('categories.index')); + $this->addLink('品牌管理', 'brands.index', 'fa fa-tachometer-alt', $this->equalRoute('brands.index')); + $this->addLink('税率设置', 'tax_rates.index', 'fa fa-tachometer-alt', $this->equalRoute('tax_rates.index')); + $this->addLink('语言管理', 'tax_rates.index', 'fa fa-tachometer-alt', $this->equalRoute('tax_rates.index')); + $this->addLink('货币管理', 'currencies.index', 'fa fa-tachometer-alt', $this->equalRoute('currencies.index')); } if (Str::startsWith($routeName, ['products.', 'categories.', 'brands.'])) { - $this->addLink('商品分类', admin_route('categories.index'), 'fa fa-tachometer-alt', $this->equalRoute('categories.index')); - $this->addLink('商品列表', admin_route('products.index'), 'fa fa-tachometer-alt', $this->equalRoute('products.index')); - $this->addLink('品牌管理', admin_route('brands.index'), 'fa fa-tachometer-alt', $this->equalRoute('brands.index')); - $this->addLink('回收站', admin_route('products.index', ['trashed' => 1]), 'fa fa-tachometer-alt', false); + $this->addLink('商品分类', 'categories.index', 'fa fa-tachometer-alt', $this->equalRoute('categories.index')); + $this->addLink('商品列表', 'products.index', 'fa fa-tachometer-alt', $this->equalRoute('products.index')); + $this->addLink('品牌管理', 'brands.index', 'fa fa-tachometer-alt', $this->equalRoute('brands.index')); + $this->addLink('回收站', 'products.trashed', 'fa fa-tachometer-alt', $this->equalRoute('products.trashed')); } if (Str::startsWith($routeName, ['customers.', 'customer_groups.'])) { - $this->addLink('会员管理', admin_route('customers.index'), 'fa fa-tachometer-alt', $this->equalRoute('customers.index')); - $this->addLink('用户组', admin_route('customer_groups.index'), 'fa fa-tachometer-alt', $this->equalRoute('customer_groups.index')); + $this->addLink('会员管理', 'customers.index', 'fa fa-tachometer-alt', $this->equalRoute('customers.index')); + $this->addLink('用户组', 'customer_groups.index', 'fa fa-tachometer-alt', $this->equalRoute('customer_groups.index')); } if (Str::startsWith($routeName, ['orders.'])) { - $this->addLink('订单列表', admin_route('orders.index'), 'fa fa-tachometer-alt', $this->equalRoute('orders.index')); + $this->addLink('订单列表', 'orders.index', 'fa fa-tachometer-alt', $this->equalRoute('orders.index')); } if (Str::startsWith($routeName, ['settings.', 'admin_users.', 'admin_roles.', 'plugins.', 'tax_classes', 'tax_rates', 'regions', 'currencies'])) { - $this->addLink('系统设置', admin_route('settings.index'), 'fa fa-tachometer-alt', $this->equalRoute('settings.index')); - $this->addLink('后台用户', admin_route('admin_users.index'), 'fa fa-tachometer-alt', $this->equalRoute('admin_users.index')); - $this->addLink('插件列表', admin_route('plugins.index'), 'fa fa-tachometer-alt', $this->equalRoute('plugins.index')); - $this->addLink('区域分组', admin_route('regions.index'), 'fa fa-tachometer-alt', $this->equalRoute('regions.index')); - $this->addLink('税率设置', admin_route('tax_rates.index'), 'fa fa-tachometer-alt', $this->equalRoute('tax_rates.index')); - $this->addLink('税费类别', admin_route('tax_classes.index'), 'fa fa-tachometer-alt', $this->equalRoute('tax_classes.index')); - $this->addLink('货币管理', admin_route('currencies.index'), 'fa fa-tachometer-alt', $this->equalRoute('currencies.index')); - $this->addLink('首页装修', admin_route('design.index'), 'fa fa-tachometer-alt', $this->equalRoute('design.index'), true); + $this->addLink('系统设置', 'settings.index', 'fa fa-tachometer-alt', $this->equalRoute('settings.index')); + $this->addLink('后台用户', 'admin_users.index', 'fa fa-tachometer-alt', $this->equalRoute('admin_users.index')); + $this->addLink('插件列表', 'plugins.index', 'fa fa-tachometer-alt', $this->equalRoute('plugins.index')); + $this->addLink('区域分组', 'regions.index', 'fa fa-tachometer-alt', $this->equalRoute('regions.index')); + $this->addLink('税率设置', 'tax_rates.index', 'fa fa-tachometer-alt', $this->equalRoute('tax_rates.index')); + $this->addLink('税费类别', 'tax_classes.index', 'fa fa-tachometer-alt', $this->equalRoute('tax_classes.index')); + $this->addLink('货币管理', 'currencies.index', 'fa fa-tachometer-alt', $this->equalRoute('currencies.index')); + $this->addLink('首页装修', 'design.index', 'fa fa-tachometer-alt', $this->equalRoute('design.index'), true); } return view('admin::components.sidebar'); @@ -75,16 +78,22 @@ class Sidebar extends Component /** - * 添加链接 + * 添加左侧菜单链接 * * @param $title - * @param $url + * @param $route * @param $icon * @param $active * @param false $newWindow */ - public function addLink($title, $url, $icon, $active, bool $newWindow = false) + public function addLink($title, $route, $icon, $active, bool $newWindow = false) { + $permissionRoute = str_replace('.', '_', $route); + if ($this->adminUser->cannot($permissionRoute)) { + return; + } + + $url = admin_route($route); $this->links[] = [ 'title' => $title, 'url' => $url,