소스 검색

菜单允许绑定多个权限

Jiang qinghua 6 년 전
부모
커밋
8a2b4f9c41

+ 1 - 0
config/admin.php

@@ -243,6 +243,7 @@ return [
         'role_users_table'       => 'admin_role_users',
         'role_permissions_table' => 'admin_role_permissions',
         'role_menu_table'        => 'admin_role_menu',
+        'permission_menu_table'  => 'admin_permission_menu',
     ],
 
     /*

+ 7 - 1
database/migrations/2016_01_04_173148_create_admin_tables.php

@@ -49,7 +49,6 @@ class CreateAdminTables extends Migration
             $table->string('title', 50);
             $table->string('icon', 50);
             $table->string('uri', 50)->nullable();
-            $table->string('permission_id')->nullable();
 
             $table->timestamps();
         });
@@ -75,6 +74,13 @@ class CreateAdminTables extends Migration
             $table->timestamps();
         });
 
+        Schema::connection($connection)->create(config('admin.database.permission_menu_table'), function (Blueprint $table) {
+            $table->integer('permission_id');
+            $table->integer('menu_id');
+            $table->index(['permission_id', 'menu_id']);
+            $table->timestamps();
+        });
+
         Schema::connection($connection)->create(config('admin.database.operation_log_table'), function (Blueprint $table) {
             $table->increments('id');
             $table->integer('user_id');

+ 4 - 7
resources/views/partials/menu.blade.php

@@ -1,7 +1,4 @@
-@if(
-    (empty($item['roles']) && empty($item['permission_id'])) ||
-    (Dcat\Admin\Admin::user()->visible($item['roles'] ?? []) || (Dcat\Admin\Admin::user()->can($item['permission_id'] ?? null)))
-)
+@if(Dcat\Admin\Admin::Menu()->show($item))
     @if(!isset($item['children']))
         @php
             $url = Dcat\Admin\Admin::menu()->getFullUri($item['uri']);
@@ -20,9 +17,9 @@
         </li>
     @else
         @php
-            $selected = Dcat\Admin\Admin::Menu()->isActive($item);
+            $active = Dcat\Admin\Admin::Menu()->isActive($item);
         @endphp
-        <li class="treeview {!! $selected ? 'active' : '' !!}">
+        <li class="treeview {!! $active ? 'active' : '' !!}">
             <a href="#">
                 <i class="fa {{ $item['icon'] }}"></i>
                 @if (Lang::has($titleTranslation = 'admin.menu_titles.' . trim(str_replace(' ', '_', strtolower($item['title'])))))
@@ -32,7 +29,7 @@
                 @endif
                 <i class="fa fa-angle-left pull-right"></i>
             </a>
-            <ul class="treeview-menu {!! $selected ? 'menu-open' : '' !!}">
+            <ul class="treeview-menu {!! $active ? 'menu-open' : '' !!}">
                 @foreach($item['children'] as $item)
                     @include('admin::partials.menu', $item)
                 @endforeach

+ 14 - 21
src/Controllers/MenuController.php

@@ -42,10 +42,10 @@ class MenuController extends Controller
                     $form->text('title', trans('admin.title'))->rules('required');
                     $form->icon('icon', trans('admin.icon'))->default('fa-bars')->rules('required')->help($this->iconHelp());
                     $form->text('uri', trans('admin.uri'));
-                    $form->select('roles', trans('admin.roles'))
+                    $form->multipleSelect('roles', trans('admin.roles'))
                         ->options($roleModel::all()->pluck('name', 'id'));
                     if ($menuModel::withPermission()) {
-                        $form->select('permission_id', trans('admin.permission'))->options($permissionModel::selectOptions());
+                        $form->multipleSelect('permissions', trans('admin.permission'))->options($permissionModel::selectOptions());
                     }
                     $form->hidden('_token')->default(csrf_token());
 
@@ -67,7 +67,7 @@ class MenuController extends Controller
 
         if ($menuModel::withPermission()) {
             $tree->query(function ($model) {
-                return $model->with('permission');
+                return $model->with('permissions');
             });
         }
         $tree->disableCreateButton();
@@ -89,21 +89,6 @@ class MenuController extends Controller
                 $payload .= "&nbsp;&nbsp;&nbsp;<a href=\"$uri\" class=\"dd-nodrag\">$uri</a>";
             }
 
-            if (!empty($branch['roles'])) {
-                $roles = collect($branch['roles'])
-                    ->pluck('name')
-                    ->join('&nbsp;');
-
-                $slug = current($branch['roles'])['slug'] ?? '';
-                $payload .= str_repeat('&nbsp;', 6)."<span title='$slug'>[{$roleText}: $roles]</span>";
-            }
-
-            if (!empty($branch['permission'])) {
-
-                $payload .= str_repeat('&nbsp;', empty($branch['roles']) ? 6 : 3)
-                    . "<span>[{$permissionText}: {$branch['permission']['slug']}]</span>";
-            }
-
             return $payload;
         });
 
@@ -149,13 +134,21 @@ class MenuController extends Controller
         $form->text('title', trans('admin.title'))->rules('required');
         $form->icon('icon', trans('admin.icon'))->default('fa-bars')->rules('required')->help($this->iconHelp());
         $form->text('uri', trans('admin.uri'));
-        $form->select('roles', trans('admin.roles'))
+        $form->multipleSelect('roles', trans('admin.roles'))
             ->options($roleModel::all()->pluck('name', 'id'))
             ->customFormat(function ($v) {
-                return join(',', array_column($v, 'id'));
+                return array_column($v, 'id');
             });
         if ($menuModel::withPermission()) {
-            $form->select('permission_id', trans('admin.permission'))->options($permissionModel::selectOptions());
+            $form->tree('permissions', trans('admin.permission'))
+                ->nodes((new $permissionModel)->allNodes())
+                ->customFormat(function ($v) {
+                    if (!$v) {
+                        return [];
+                    }
+
+                    return array_column($v, 'id');
+                });
         }
 
         $form->display('created_at', trans('admin.created_at'));

+ 2 - 2
src/Grid.php

@@ -35,8 +35,8 @@ class Grid
         Concerns\MultipleHeader,
         Concerns\QuickSearch,
         Macroable {
-        __call as macroCall;
-    }
+            __call as macroCall;
+        }
 
     /**
      * The grid data model instance.

+ 49 - 1
src/Layout/Menu.php

@@ -2,6 +2,7 @@
 
 namespace Dcat\Admin\Layout;
 
+use Dcat\Admin\Admin;
 use Dcat\Admin\Support\Helper;
 
 class Menu
@@ -103,12 +104,26 @@ class Menu
     {
         $html = '';
         foreach (Helper::buildNestedArray($nodes) as $item) {
-            $html .= view('admin::partials.menu', ['item' => &$item])->render();
+            $html .= $this->renderMenu($item);
         }
 
         return $html;
     }
 
+    /**
+     * @param array $item
+     * @return array|string
+     */
+    protected function renderMenu(array $item)
+    {
+        return view('admin::partials.menu', ['item' => &$item])->render();
+    }
+
+    /**
+     * @param array $item
+     * @param null|string $path
+     * @return bool
+     */
     public function isActive(array $item, ?string $path = null)
     {
         if (empty($path)) {
@@ -136,6 +151,39 @@ class Menu
         return false;
     }
 
+    /**
+     * @param array $menuItem
+     * @return bool
+     */
+    public function show(array $menuItem)
+    {
+        $permissionIds = $menuItem['permission_id'] ?? null;
+        $roles = array_column($menuItem['roles'] ?? [], 'slug');
+        $permissions = array_column($menuItem['permissions'] ?? [], 'slug');
+
+        if (!$permissionIds && !$roles && !$permissions) {
+            return true;
+        }
+
+        $user = Admin::user();
+
+        if ($user->visible($roles)) {
+            return true;
+        }
+
+        foreach (array_merge(Helper::array($permissionIds), $permissions) as $permission) {
+            if ($user->can($permission)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * @param $uri
+     * @return string
+     */
     public function getFullUri($uri)
     {
         if (!$uri) return $uri;

+ 0 - 25
src/Models/AdminTablesSeeder.php

@@ -93,24 +93,6 @@ class AdminTablesSeeder extends Seeder
                 'created_at'  => $createdAt,
             ],
 
-            [
-                'id'          => 7,
-                'name'        => 'Root menus',
-                'slug'        => 'root.menus',
-                'http_method' => '',
-                'http_path'   => '',
-                'parent_id'   => 0,
-                'created_at'  => $createdAt,
-            ],
-            [
-                'id'          => 8,
-                'name'        => 'Admin',
-                'slug'        => 'root.menu.admin',
-                'http_method' => '',
-                'http_path'   => '',
-                'parent_id'   => 7,
-                'created_at'  => $createdAt,
-            ],
         ]);
 
 //        Role::first()->permissions()->save(Permission::first());
@@ -125,7 +107,6 @@ class AdminTablesSeeder extends Seeder
                 'icon'          => 'fa-bar-chart',
                 'uri'           => '/',
                 'created_at'    => $createdAt,
-                'permission_id' => null,
             ],
             [
                 'parent_id'     => 0,
@@ -134,7 +115,6 @@ class AdminTablesSeeder extends Seeder
                 'icon'          => 'fa-tasks',
                 'uri'           => '',
                 'created_at'    => $createdAt,
-                'permission_id' => 8,
             ],
             [
                 'parent_id'     => 2,
@@ -143,7 +123,6 @@ class AdminTablesSeeder extends Seeder
                 'icon'          => 'fa-users',
                 'uri'           => 'auth/users',
                 'created_at'    => $createdAt,
-                'permission_id' => 2,
             ],
             [
                 'parent_id'     => 2,
@@ -152,7 +131,6 @@ class AdminTablesSeeder extends Seeder
                 'icon'          => 'fa-user',
                 'uri'           => 'auth/roles',
                 'created_at'    => $createdAt,
-                'permission_id' => 3,
             ],
             [
                 'parent_id'     => 2,
@@ -161,7 +139,6 @@ class AdminTablesSeeder extends Seeder
                 'icon'          => 'fa-ban',
                 'uri'           => 'auth/permissions',
                 'created_at'    => $createdAt,
-                'permission_id' => 4,
             ],
             [
                 'parent_id'     => 2,
@@ -170,7 +147,6 @@ class AdminTablesSeeder extends Seeder
                 'icon'          => 'fa-bars',
                 'uri'           => 'auth/menu',
                 'created_at'    => $createdAt,
-                'permission_id' => 5,
             ],
             [
                 'parent_id'     => 2,
@@ -179,7 +155,6 @@ class AdminTablesSeeder extends Seeder
                 'icon'          => 'fa-history',
                 'uri'           => 'auth/logs',
                 'created_at'    => $createdAt,
-                'permission_id' => 6,
             ],
         ]);
 

+ 1 - 10
src/Models/HasPermissions.php

@@ -2,6 +2,7 @@
 
 namespace Dcat\Admin\Models;
 
+use Dcat\Admin\Support\Helper;
 use Illuminate\Support\Collection;
 
 trait HasPermissions
@@ -121,16 +122,6 @@ trait HasPermissions
         if ($this->isAdministrator()) {
             return true;
         }
-        $roles = (array)$roles;
-
-        if (!$roles) {
-            return false;
-        }
-
-        if (is_array(current($roles))) {
-            return $this->inRoles(array_column($roles, 'slug'))
-                || $this->inRoles(array_column($roles, 'id'));
-        }
 
         return $this->inRoles($roles);
     }

+ 6 - 3
src/Models/Menu.php

@@ -59,11 +59,13 @@ class Menu extends Model
         return $this->belongsToMany($relatedModel, $pivotTable, 'menu_id', 'role_id');
     }
 
-    public function permission(): BelongsTo
+    public function permissions(): BelongsToMany
     {
+        $pivotTable = config('admin.database.permission_menu_table');
+
         $relatedModel = config('admin.database.permissions_model');
 
-        return $this->belongsTo($relatedModel, 'permission_id', 'id');
+        return $this->belongsToMany($relatedModel, $pivotTable, 'menu_id', 'permission_id');
     }
 
     /**
@@ -95,7 +97,7 @@ class Menu extends Model
             $self = call_user_func($this->queryCallback, $self);
         }
 
-        return $self->with('roles')->orderByRaw($byOrder)->get()->toArray();
+        return $self->with('roles')->with('permissions')->orderByRaw($byOrder)->get()->toArray();
     }
 
     /**
@@ -119,6 +121,7 @@ class Menu extends Model
 
         static::deleting(function ($model) {
             $model->roles()->detach();
+            $model->permissions()->detach();
 
             $model->destroyCache();