调整管理员模型,后台菜单
parent
6a3b9d2613
commit
33e666f3dd
|
|
@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||||
use Illuminate\Support\Facades\Storage;
|
use Illuminate\Support\Facades\Storage;
|
||||||
use Illuminate\Support\Facades\URL;
|
use Illuminate\Support\Facades\URL;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Administrator.
|
* Class Administrator.
|
||||||
|
|
@ -24,6 +25,8 @@ class Administrator extends Model implements AuthenticatableContract
|
||||||
|
|
||||||
const DEFAULT_ID = 1;
|
const DEFAULT_ID = 1;
|
||||||
|
|
||||||
|
public const SESSION_KEY = 'user_permissions';
|
||||||
|
|
||||||
protected $fillable = ['username', 'password', 'name', 'avatar'];
|
protected $fillable = ['username', 'password', 'name', 'avatar'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -89,6 +92,76 @@ class Administrator extends Model implements AuthenticatableContract
|
||||||
*/
|
*/
|
||||||
public function canSeeMenu($menu)
|
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;
|
namespace Dcat\Admin\Models;
|
||||||
|
|
||||||
use Dcat\Admin\Traits\HasDateTimeFormatter;
|
use Dcat\Admin\Admin;
|
||||||
use Dcat\Admin\Traits\ModelTree;
|
use Dcat\Admin\Traits\ModelTree;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
|
||||||
use Spatie\EloquentSortable\Sortable;
|
use Spatie\EloquentSortable\Sortable;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Dcat\Admin\Traits\HasDateTimeFormatter;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Menu.
|
* Class Menu.
|
||||||
|
|
@ -107,11 +108,14 @@ class Menu extends Model implements Sortable
|
||||||
public function fetchAll()
|
public function fetchAll()
|
||||||
{
|
{
|
||||||
return $this->withQuery(function ($query) {
|
return $this->withQuery(function ($query) {
|
||||||
if (static::withPermission()) {
|
return $query->with('permissions');
|
||||||
$query = $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();
|
})->treeAllNodes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue