From 2a37e7231776044ce6d86a8f682e595262de9fba Mon Sep 17 00:00:00 2001 From: jsasg <735273025@qq.com> Date: Thu, 6 Mar 2025 18:02:23 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BF=AE=E6=94=B9=E4=BA=A7?= =?UTF-8?q?=E5=93=81=E5=88=86=E7=B1=BB=E7=88=B6=E7=BA=A7=E4=B8=8D=E4=B8=BA?= =?UTF-8?q?=E8=87=AA=E8=BA=AB=E6=88=96=E5=AD=90=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/controller/v1/ProductCategory.php | 2 +- .../validate/v1/ProductCategoryValidate.php | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/app/admin/controller/v1/ProductCategory.php b/app/admin/controller/v1/ProductCategory.php index 15cc1aab..dca78851 100644 --- a/app/admin/controller/v1/ProductCategory.php +++ b/app/admin/controller/v1/ProductCategory.php @@ -82,7 +82,7 @@ class ProductCategory $data = array_merge($post, ['language_id' => request()->lang_id]); $validate = new ProductCategoryValidate; - if (!$validate->check($data)) { + if (!$validate->scene('add')->check($data)) { return error($validate->getError()); } diff --git a/app/admin/validate/v1/ProductCategoryValidate.php b/app/admin/validate/v1/ProductCategoryValidate.php index 93a4cf5d..52eaa7d0 100644 --- a/app/admin/validate/v1/ProductCategoryValidate.php +++ b/app/admin/validate/v1/ProductCategoryValidate.php @@ -3,6 +3,8 @@ declare (strict_types = 1); namespace app\admin\validate\v1; +use app\admin\model\v1\ProductCategoryModel; +use think\facade\Db; use think\Validate; class ProductCategoryValidate extends Validate @@ -14,8 +16,10 @@ class ProductCategoryValidate extends Validate * @var array */ protected $rule = [ + 'id' => 'require|integer', 'language_id' => 'require|integer', 'unique_id' => 'require', + 'pid' => 'integer|different:id|checkPidNotBeChildren', 'name' => 'require|max:64', 'icon' => 'max:125', 'desc' => 'max:255', @@ -35,9 +39,14 @@ class ProductCategoryValidate extends Validate * @var array */ protected $message = [ + 'id.require' => 'ID不能为空', + 'id.integer' => 'ID必须为整数', 'language_id.require' => '语言ID不能为空', 'language_id.integer' => '语言ID必须为整数', 'unique_id.require' => '唯一标识不能为空', + 'pid.different' => '父级ID不能为自身', + 'pid.checkPidNotBeChildren' => '父级ID不能为自身的子分类', + 'pid.integer' => '父级ID必须为整数', 'name.require' => '名称不能为空', 'name.max' => '名称最多不能超过64个字符', 'icon.max' => '图标最多不能超过125个字符', @@ -50,4 +59,36 @@ class ProductCategoryValidate extends Validate 'seo_keywords.max' => 'SEO关键字最多不能超过255个字符', 'seo_desc.max' => 'SEO描述最多不能超过255个字符', ]; + + // 验证pid + protected function checkPidNotBeChildren($value, $rule, $data = []) + { + if ($value == 0) { + return true; + } + $table_name = (new ProductCategoryModel)->getTable(); + $children = Db::query( + preg_replace( + '/\s+/u', + ' ', + "WITH RECURSIVE 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 tree_by t ON t.id = k.pid + ) + SELECT id FROM tree_by WHERE id <> {$data['id']};" + ) + ); + if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) { + return false; + } + + return true; + } + + // 新增场景 + public function sceneAdd() + { + return $this->remove('id', 'require|integer')->remove('pid', 'different|checkPidNotBeChildren'); + } }