Files
MrleeAdmin/backend/app/service/admin/member/MemberAuthService.php
T
2026-08-31 11:33:59 +08:00

225 lines
6.6 KiB
PHP

<?php
declare(strict_types=1);
/**
*+------------------
* madong
*+------------------
* Copyright (c) https://gitee.com/motion-code All rights reserved.
*+------------------
* Author: Mr. April (405784684@qq.com)
*+------------------
* Official Website: http://www.madong.tech
*/
namespace app\service\admin\member;
use app\dao\web\MenuDao;
use app\dao\member\MemberDao;
use app\service\admin\web\MenuService as SiteMenuService;
use core\base\BaseService;
use Illuminate\Database\Eloquent\Collection;
use support\Container;
class MemberAuthService extends BaseService
{
public function __construct(MemberDao $dao)
{
$this->dao = $dao;
}
/**
* 获取菜单
*
* @param string|int $memberId 会员ID
* @param bool $includeEmptyCode 是否包含权限码为空的菜单(不需要标签权限的公共菜单)
*
* @return \Illuminate\Database\Eloquent\Collection|null
* @throws \Exception
*/
public function getMenusByMemberTags(string|int $memberId, bool $includeEmptyCode = false): ?Collection
{
if (empty($memberId)) {
return null;
}
$member = $this->dao->find($memberId);
if (!$member) {
return null;
}
$menuIds = [];
$tags = $member->tags()->where('enabled', 1)->get();
foreach ($tags as $tag) {
$permissions = $tag->permissions()->get();
foreach ($permissions as $permission) {
$menuIds[] = $permission->id;
}
}
if (empty($menuIds) && !$includeEmptyCode) {
return null;
}
$menuIds = array_unique($menuIds);
$menuService = new SiteMenuService(new MenuDao());
$menus = $this->getMenusByIds($menuService, $menuIds, $includeEmptyCode);
return $menus->where('menu_type', '!=', 'button');
}
/**
* 根据标签ID获取菜单
*
* @param string|int $tagId 标签ID
* @param bool $includeEmptyCode 是否包含权限码为空的菜单(不需要标签权限的公共菜单)
*
* @return \Illuminate\Database\Eloquent\Collection|null
* @throws \Exception
*/
public function getMenusByTagId(string|int $tagId, bool $includeEmptyCode = false): ?Collection
{
if (empty($tagId)) {
return null;
}
$menuIds = [];
/** @var MemberTagService $memberTagService */
$memberTagService = Container::make(MemberTagService::class);
$memberTag = $memberTagService->get($tagId);
if (!$memberTag) {
return null;
}
$permissions = $memberTag->permissions()->get();
foreach ($permissions as $permission) {
$menuIds[] = $permission->id;
}
if (empty($menuIds) && !$includeEmptyCode) {
return null;
}
$menuIds = array_unique($menuIds);
$menuService = new SiteMenuService(new MenuDao());
return $this->getMenusByIds($menuService, $menuIds, $includeEmptyCode);
}
/**
* 获取所有菜单
*
* @param bool $includeEmptyCode 是否包含权限码为空的菜单(不需要标签权限的公共菜单)
*
* @return \Illuminate\Database\Eloquent\Collection
* @throws \Exception
*/
public function getAllMenus(bool $includeEmptyCode = false): Collection
{
/** @var $siteMenuService SiteMenuService */
$siteMenuService = Container::make(SiteMenuService::class);
$menuModel = $siteMenuService->dao->getModel();
if ($includeEmptyCode) {
return $menuModel->where('enabled', 1)
->orderBy('sort')
->get();
}
return $menuModel->where('enabled', 1)
->where(function ($q) {
$q->whereNotNull('code')->where('code', '!=', '');
})
->orderBy('sort')
->get();
}
/**
* 根据IDS输出菜单
*
* @param \app\service\admin\web\MenuService $menuService
* @param array $ids
* @param bool $includeEmptyCode 是否包含权限码为空的菜单
*
* @return \Illuminate\Database\Eloquent\Collection
* @throws \Exception
*/
private function getMenusByIds(SiteMenuService $menuService, array $ids, bool $includeEmptyCode = true): Collection
{
$menuModel = $menuService->dao->getModel();
// 如果需要包含权限码为空的菜单
if ($includeEmptyCode) {
$query = $menuModel->where('enabled', 1);
// 如果有指定菜单ID,则包含这些菜单和权限码为空的菜单
if (!empty($ids)) {
$query->where(function ($q) use ($ids) {
$q->whereIn('id', $ids)->orWhereNull('code')->orWhere('code', '');
});
} else {
// 没有指定菜单ID时,只返回权限码为空的菜单
$query->where(function ($q) {
$q->whereNull('code')->orWhere('code', '');
});
}
return $query->orderBy('sort')->get();
}
// 不包含权限码为空的菜单,只返回指定ID的菜单
if (empty($ids)) {
return new Collection();
}
$chunkSize = 200;
$chunks = array_chunk($ids, $chunkSize);
// 分块查询 + 批量合并(减少内存占用)
$allResults = new Collection();
foreach ($chunks as $chunk) {
$results = $menuModel
->whereIn('id', $chunk)
->where('enabled', 1)
->orderBy('sort')
->get();
$allResults = $allResults->merge($results);
}
return $allResults;
}
/**
* 获取用户角色-权限码codes
*
* @param $memberId
*
* @return array
* @throws \Exception
*/
public function getCodesByUserTags($memberId): array
{
if (empty($memberId)) {
return [];
}
$member = $this->dao->find($memberId);
if (!$member) {
return [];
}
$codes = [];
$tags = $member->tags()->where('enabled', 1)->get();
foreach ($tags as $tag) {
$permissions = $tag->permissions()->get();
foreach ($permissions as $permission) {
if (!empty($permission->code)) {
$codes[] = $permission->code;
}
}
}
return array_unique($codes);
}
}