feat: menu

This commit is contained in:
2024-10-27 23:45:20 +08:00
parent 5285dd6972
commit b828d48672
9 changed files with 226 additions and 10 deletions

View File

@@ -0,0 +1,81 @@
<?php
namespace App\Cache\Redis\Admin;
use App\Cache\Redis\RedisCache;
use App\Constants\Admin\AuthCode;
use App\Model\AdminMenu;
use Hyperf\Di\Annotation\Inject;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use RedisException;
class MenuCache
{
/**
* @var RedisCache $redis
*/
#[Inject]
protected RedisCache $redis;
/**
* @var AdminMenu
*/
#[Inject]
protected AdminMenu $adminMenuModel;
/**
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws RedisException
*/
public function getMenu(): array
{
$key = AdminRedisKey::adminMenuList();
if ($this->redis->exists($key,'system')) {
return json_decode($this->redis->get($key,'system'),true);
}
$allMenuList = $this->adminMenuModel->getAllMenu();
$data = $this->getDbMenu($allMenuList);
$this->redis->set($key,json_encode($data));
return $data;
}
/**
* 递归生成合适的数据
* @param array $allMenuList
* @param int $parentId
* @return array
*/
private function getDbMenu(array $allMenuList, int $parentId = 0): array
{
$menuList = [];
foreach ($allMenuList as $menu) {
if ($menu['parent_id'] == $parentId) {
$children = $this->getDbMenu($allMenuList, (int)$menu['id']);
if (!empty($children)) {
//获取第一个 type 如何是菜单
if ($children[0]['type'] == AuthCode::MENU_TYPE_LIST) {
$menu['children'] = $children;
} else {
foreach ($children as $child) {
$menu['permissionList'][] = [
'id' => $child['id'],
'label' => $child['title'],
'value' => $child['value'],
];
}
}
}
$menuList[] = $menu;
}
}
return $menuList;
}
}