调整管理员模型,后台菜单
parent
6a3b9d2613
commit
33e666f3dd
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue