213 lines
6.1 KiB
PHP
213 lines
6.1 KiB
PHP
<?php
|
||
|
||
namespace app\store\service;
|
||
|
||
use think\Config;
|
||
|
||
/**
|
||
* 商家后台菜单业务
|
||
* Class Menus
|
||
* @package app\store\service
|
||
*/
|
||
class Menus
|
||
{
|
||
/** @var self $instance 存放实例 */
|
||
static public $instance;
|
||
|
||
/** @var Auth $auth 商家后台权限 */
|
||
private $auth;
|
||
|
||
/**
|
||
* 公有化获取实例方法
|
||
* @return Menus
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
public static function getInstance()
|
||
{
|
||
if (!(self::$instance instanceof Auth)) {
|
||
self::$instance = new self;
|
||
}
|
||
return self::$instance;
|
||
}
|
||
|
||
/**
|
||
* 私有化构造方法
|
||
* Menus constructor.
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
private function __construct()
|
||
{
|
||
$this->auth = Auth::getInstance();
|
||
}
|
||
|
||
/**
|
||
* 私有化克隆方法
|
||
*/
|
||
private function __clone()
|
||
{
|
||
}
|
||
|
||
/**
|
||
* 后台菜单配置
|
||
* @param $routeUri
|
||
* @param $group
|
||
* @return array|mixed
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
public function getMenus($routeUri, $group)
|
||
{
|
||
// 菜单列表数据
|
||
$menus = Config::get('menus');
|
||
$this->first($menus, $routeUri, $group);
|
||
// pre($menus);
|
||
return $menus;
|
||
}
|
||
|
||
/**
|
||
* 一级菜单
|
||
* @param $menus
|
||
* @param $routeUri
|
||
* @param $group
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
private function first(&$menus, $routeUri, $group)
|
||
{
|
||
foreach ($menus as $key => &$first) :
|
||
// 一级菜单索引url
|
||
$indexData = $this->getMenusIndexUrls($first, 1);
|
||
// 权限验证
|
||
$first['index'] = $this->getAuthUrl($indexData);
|
||
if ($first['index'] === false) {
|
||
unset($menus[$key]);
|
||
continue;
|
||
}
|
||
// 菜单聚焦
|
||
$first['active'] = $key === $group;
|
||
// 遍历:二级菜单
|
||
if (isset($first['submenu'])) {
|
||
$this->second($first['submenu'], $routeUri);
|
||
}
|
||
endforeach;
|
||
}
|
||
|
||
/**
|
||
* 二级菜单
|
||
* @param array $menus
|
||
* @param $routeUri
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
public function second(&$menus, $routeUri)
|
||
{
|
||
foreach ($menus as $key => &$second) :
|
||
// 二级菜单索引url
|
||
$indexData = $this->getMenusIndexUrls($second, 2);
|
||
// 权限验证
|
||
$second['index'] = $this->getAuthUrl($indexData);
|
||
if ($second['index'] === false) {
|
||
unset($menus[$key]);
|
||
continue;
|
||
}
|
||
// 二级菜单所有uri
|
||
$secondUris = [];
|
||
// 遍历:三级菜单
|
||
if (isset($second['submenu'])) {
|
||
$this->third($second['submenu'], $routeUri, $secondUris);
|
||
} else {
|
||
if (isset($second['uris']))
|
||
$secondUris = array_merge($secondUris, $second['uris']);
|
||
else
|
||
$secondUris[] = $second['index'];
|
||
}
|
||
// 二级菜单:active
|
||
!isset($second['active']) && $second['active'] = in_array($routeUri, $secondUris);
|
||
endforeach;
|
||
// 删除空数组
|
||
$menus = array_filter($menus);
|
||
}
|
||
|
||
/**
|
||
* 三级菜单
|
||
* @param array $menus
|
||
* @param $routeUri
|
||
* @param $secondUris
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
private function third(&$menus, $routeUri, &$secondUris)
|
||
{
|
||
foreach ($menus as $key => &$third):
|
||
// 三级菜单索引url
|
||
$indexData = $this->getMenusIndexUrls($third, 3);
|
||
// 权限验证
|
||
$third['index'] = $this->getAuthUrl($indexData);
|
||
if ($third['index'] === false) {
|
||
unset($menus[$key]);
|
||
continue;
|
||
}
|
||
// 三级菜单所有uri
|
||
$thirdUris = [];
|
||
if (isset($third['uris'])) {
|
||
$secondUris = array_merge($secondUris, $third['uris']);
|
||
$thirdUris = array_merge($thirdUris, $third['uris']);
|
||
} else {
|
||
$secondUris[] = $third['index'];
|
||
$thirdUris[] = $third['index'];
|
||
}
|
||
$third['active'] = in_array($routeUri, $thirdUris);
|
||
endforeach;
|
||
}
|
||
|
||
/**
|
||
* 获取指定菜单下的所有索引url
|
||
* @param array $menus
|
||
* @param int $level
|
||
* @return array|null
|
||
*/
|
||
private function getMenusIndexUrls(&$menus, $level = 1)
|
||
{
|
||
// // 三级
|
||
// if ($level === 3) {
|
||
// return isset($menus['index']) ? [$menus['index']] : null;
|
||
// }
|
||
// 判断是否存在url
|
||
if (!isset($menus['index']) && !isset($menus['submenu'])) {
|
||
return null;
|
||
}
|
||
$data = [];
|
||
if (isset($menus['index']) && !empty($menus['index'])) {
|
||
$data[] = $menus['index'];
|
||
}
|
||
if (isset($menus['submenu']) && !empty($menus['submenu'])) {
|
||
foreach ($menus['submenu'] as $submenu) {
|
||
$submenuIndex = $this->getMenusIndexUrls($submenu, ++$level);
|
||
!is_null($submenuIndex) && $data = array_merge($data, $submenuIndex);
|
||
}
|
||
}
|
||
return array_unique($data);
|
||
}
|
||
|
||
/**
|
||
* 取出通过权限验证urk作为index
|
||
* @param $urls
|
||
* @return bool
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
private function getAuthUrl($urls)
|
||
{
|
||
// 取出通过权限验证urk作为index
|
||
foreach ($urls as $url) {
|
||
if ($this->auth->checkPrivilege($url)) return $url;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
} |