This repository has been archived on 2024-07-11. You can view files and clone it, but cannot push or open issues or pull requests.
yoshop/source/application/store/service/Menus.php

213 lines
6.1 KiB
PHP
Raw Normal View History

2020-04-25 22:20:29 +08:00
<?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;
}
}