diff --git a/src/Models/Administrator.php b/src/Models/Administrator.php index fe02699..89fd82c 100755 --- a/src/Models/Administrator.php +++ b/src/Models/Administrator.php @@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\URL; +use Illuminate\Support\Collection; /** * Class Administrator. @@ -24,6 +25,8 @@ class Administrator extends Model implements AuthenticatableContract const DEFAULT_ID = 1; + public const SESSION_KEY = 'user_permissions'; + protected $fillable = ['username', 'password', 'name', 'avatar']; /** @@ -89,6 +92,76 @@ class Administrator extends Model implements AuthenticatableContract */ public function canSeeMenu($menu) { - return true; + //通过权限判断, 是否有该菜单权限 + //该菜单是否是底级菜单 + if (isset($menu['children']) && !empty($menu['children'])) { + foreach ($menu['children'] as $item) { + if ($this->canSeeMenu($item)) { + return true; + } + } + } else { + //判断权限 + if (empty($menu['permissions'])) { + return true; + } else { + foreach ($menu['permissions'] as $permission) { + if ($this->hasPermission($permission['slug'])) { + return true; + } + } + return false; + } + } + return false; + } + + public function hasPermission(string $slug): bool + { + //判断是否是超级管理员 + if ($this->isAdministrator()) { + return true; + } + //判断是否有权限 + return in_array($slug, $this->getCachePermissions()->pluck('slug')->toArray()); + } + + /** + * 获取缓存权限 + * + * @return Collection|null + */ + public function getCachePermissions(): ?Collection + { + $key = self::SESSION_KEY; + if (session()->has($key)) { + return session($key); + } + //获取角色权限 + + $permissions = $this->getPermissions(); + + //缓存权限 + session([$key => $permissions]); + + return $permissions; + } + + public function getPermissions(): ?Collection + { + $permissions = []; + foreach ($this->roles()->with('permissions')->get() as $role) { + foreach ($role->permissions as $permission) { + $permissions[$permission->id] = $permission; + } + } + //转为集合 + $permissions = collect($permissions); + return $permissions; + } + + public function clearCachePermission() + { + session()->forget(self::SESSION_KEY); } } diff --git a/src/Models/Menu.php b/src/Models/Menu.php index 9cdff45..ffa4485 100755 --- a/src/Models/Menu.php +++ b/src/Models/Menu.php @@ -2,11 +2,12 @@ namespace Dcat\Admin\Models; -use Dcat\Admin\Traits\HasDateTimeFormatter; +use Dcat\Admin\Admin; use Dcat\Admin\Traits\ModelTree; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Spatie\EloquentSortable\Sortable; +use Illuminate\Database\Eloquent\Model; +use Dcat\Admin\Traits\HasDateTimeFormatter; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; /** * Class Menu. @@ -107,11 +108,14 @@ class Menu extends Model implements Sortable public function fetchAll() { return $this->withQuery(function ($query) { - if (static::withPermission()) { - $query = $query->with('permissions'); + return $query->with('permissions'); + if (!Admin::user()?->isAdministrator()) { + return $query->with('permissions')->whereHas('permissions', function ($q) { + $q->whereIn('id', Admin::user()?->getCachePermissions()->pluck('id')->toArray() ?? []); + }); + } else { + return $query->with('permissions'); } - - return $query->with('roles'); })->treeAllNodes(); }