修改菜单url

This commit is contained in:
2025-07-21 16:43:43 +08:00
parent 8adc9d2612
commit be96c742ff
14 changed files with 408 additions and 529 deletions
-106
View File
@@ -1,106 +0,0 @@
<?php
namespace app\common\logic;
use app\common\utils\CrudUtil;
use Illuminate\Database\Eloquent\Model;
class CrudLogic_bak
{
protected string $modelClass;
/**
* @param string $modelClass 完整模型类名,例如 \app\common\model\User::class
*/
public function __construct(string $modelClass)
{
$this->modelClass = $modelClass;
}
/**
* 列表(带分页)
* @param array $config CrudUtil::buildQuery 接受的配置
* @param int $limit
* @param int $page
*/
public function list(array $config, int $limit, int $page)
{
$config['model'] = $this->modelClass;
$query = CrudUtil::buildQuery($config);
return CrudUtil::paginate($query, $limit, $page);
}
/**
* 列表(不分页)
*/
public function listAll(array $config)
{
$config['model'] = $this->modelClass;
$query = CrudUtil::buildQuery($config);
return CrudUtil::getAll($query);
}
/**
* 根据主键查询单条
*/
public function show($id, array $with = [])
{
return CrudUtil::findByPk($this->modelClass, $id, $with);
}
/**
* 根据任意条件查询单条(可带 dataLimit)
*/
public function showBy(array $where, array $with = [], array $dataLimit = [])
{
return CrudUtil::findOneBy($this->modelClass, $where, $with, $dataLimit);
}
/**
* 创建(可带 dataLimit)
*/
public function create(array $data, array $dataLimit = [])
{
return CrudUtil::create($this->modelClass, $data, $dataLimit);
}
/**
* 主键更新(可带 dataLimit)
*/
public function updateByPk($id, array $data, array $dataLimit = [])
{
return CrudUtil::updateByPk($this->modelClass, $id, $data, $dataLimit);
}
/**
* 任意条件更新(可带 dataLimit)
*/
public function updateBy(array $where, array $data, array $dataLimit = [])
{
return CrudUtil::updateBy($this->modelClass, $where, $data, $dataLimit);
}
/**
* 主键删除
*/
public function deleteByPk(array $ids)
{
return CrudUtil::deleteByPk($this->modelClass, $ids);
}
/**
* 任意条件删除(可带 dataLimit)
*/
public function deleteBy(array $where, array $dataLimit = [])
{
return CrudUtil::deleteBy($this->modelClass, $where, $dataLimit);
}
/**
* 复杂查询回调
* @param callable $cb function(Builder $q){ ... }
*/
public function complex(callable $cb)
{
return CrudUtil::executeComplex($this->modelClass, $cb);
}
}
+82 -1
View File
@@ -60,7 +60,7 @@ class PermLogic
* @param string $parentPath
* @return array
*/
public function buildTree($resources, int $parentId = 0, string $parentPath = ''): array
public function buildTree_bak($resources, int $parentId = 0, string $parentPath = ''): array
{
$tree = [];
foreach ($resources as $node) {
@@ -121,6 +121,87 @@ class PermLogic
}
return $tree;
}
/**
* 构建目录/菜单树,节点包含权限与打开方式,拼接完整路径,并对子级菜单 component 处理
*
* @param \Illuminate\Support\Collection $resources 全部资源集合
* @param int $parentId 当前父级资源 ID
* @param string $parentPath 父级完整路径(用于递归)
* @return array
*/
public function buildTree($resources, int $parentId = 0, string $parentPath = ''): array
{
$tree = [];
foreach ($resources as $node) {
if ($node->parent_id !== $parentId) {
continue;
}
// —— 拼接当前节点的完整路径 ——
$currentPath = $parentPath;
// 去掉末尾多余 slash
$currentPath = rtrim($currentPath, '/');
if (!empty($node->url)) {
// 如果当前节点有 url,则拼接
$urlSegment = ltrim($node->url, '/');
$currentPath = $currentPath === ''
? $urlSegment
: "{$currentPath}/{$urlSegment}";
}
// —— 递归构建子节点 ——
$children = [];
if ($node->type === 'directory') {
$children = $this->buildTree($resources, $node->id, $currentPath);
}
// —— 收集本级的 permission 权限列表 ——
$authList = $resources
->filter(fn($r) => $r->type === 'permission' && $r->parent_id === $node->id)
->map(fn($r) => [
'id' => $r->id,
'title' => $r->name,
'auth_mark' => $r->code,
])
->values()
->all();
// —— 判断是否有子菜单/目录 ——
$hasChildrenMenu = $resources
->where('parent_id', $node->id)
->whereIn('type', ['directory', 'menu'])
->isNotEmpty();
// —— 计算 component 字段 ——
if ($hasChildrenMenu) {
// 只要有子项,就一律显示顶层 Layout 组件
$componentValue = '/index/index';
} else {
// 叶子节点:如果定义了 url,就使用拼接后的路径;否则用占位符(这里用空串,你可替换)
$componentValue = $currentPath !== '' ? $currentPath : '';
}
$tree[] = [
'id' => $node->id,
'name' => $node->name,
'path' => $node->url,
'component' => $componentValue,
'meta' => [
'title' => $node->name,
'icon' => $node->icon,
'keepAlive' => true,
'authList' => $authList,
'openType' => $node->open_type,
],
'children' => $children,
];
}
return $tree;
}
/**
* 获取用户所有权限code