4
0
Fork 0

调整管理员模型,后台菜单

master
vine_liutk 2022-08-09 16:32:50 +08:00
parent 6a3b9d2613
commit 33e666f3dd
2 changed files with 85 additions and 8 deletions

View File

@ -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);
}
}

View File

@ -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();
}