From d60ba64a5efe8b165d8f9da98c6e9121cb08146e Mon Sep 17 00:00:00 2001 From: jsasg <735273025@qq.com> Date: Thu, 6 Mar 2025 17:52:03 +0800 Subject: [PATCH] =?UTF-8?q?rrefactor:=20=E4=BF=AE=E6=94=B9=E8=8F=9C?= =?UTF-8?q?=E7=88=B6=E7=BA=A7=E4=B8=8D=E8=83=BD=E4=B8=BA=E8=87=AA=E8=BA=AB?= =?UTF-8?q?=E6=88=96=E5=AD=90=E5=AD=99=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/validate/v1/SysMenuValidate.php | 34 +++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/app/admin/validate/v1/SysMenuValidate.php b/app/admin/validate/v1/SysMenuValidate.php index c93f0b2d..9d9eaede 100644 --- a/app/admin/validate/v1/SysMenuValidate.php +++ b/app/admin/validate/v1/SysMenuValidate.php @@ -3,6 +3,8 @@ declare (strict_types = 1); namespace app\admin\validate\v1; +use app\admin\model\v1\SysMenuModel; +use think\facade\Db; use think\Validate; class SysMenuValidate extends Validate @@ -15,7 +17,7 @@ class SysMenuValidate extends Validate */ protected $rule = [ 'id' => 'require|integer', - 'pid' => 'integer', + 'pid' => 'integer|different:id|checkPidNotBeChildren', 'title' => 'require|max:64', 'name' => 'require|unique:sys_menu|max:64', 'path' => 'require|max:128', @@ -43,6 +45,8 @@ class SysMenuValidate extends Validate 'id.require' => '菜单ID不能为空', 'id.integer' => '菜单ID必须为整数', 'pid.integer' => '父级菜单ID必须为整数', + 'pid.different' => '父级菜单ID不能为自身', + 'pid.checkPidNotBeChildren' => '父级菜单不能为自身的子菜单', 'title.require' => '菜单名称不能为空', 'title.max' => '菜单名称最多64个字符', 'name.require' => '菜单Name不能为空', @@ -64,9 +68,35 @@ class SysMenuValidate extends Validate 'menu_ability_permission.*.sort.integer' => '菜单能力权限排序必须为整数', ]; + // 验证pid + protected function checkPidNotBeChildren($value, $rule, $data = []) + { + if ($value == 0) { + return true; + } + $table_name = (new SysMenuModel)->getTable(); + $children = Db::query( + preg_replace( + '/\s+/u', + ' ', + "WITH RECURSIVE menu_tree_by AS ( + SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} + UNION ALL + SELECT k.id, k.pid FROM $table_name k INNER JOIN menu_tree_by t ON t.id = k.pid + ) + SELECT id FROM menu_tree_by WHERE id <> {$data['id']};" + ) + ); + if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) { + return false; + } + + return true; + } + // 新增验证场景 public function sceneCreate() { - return $this->remove('id', 'require|integer'); + return $this->remove('id', 'require|integer')->remove('pid', 'different|checkPidNotBeChildren'); } }