# 6.10 分类管理 :::tip 概述 分类管理支持树形分类数据,可用于文章分类、商品分类等场景。`CategoryService` 继承 `BaseTenantService` 实现租户隔离。 ::: ## 模块特点 | 特性 | 说明 | |------|------| | 基类 | `BaseTenantService`(租户隔离) | | Trait 组合 | `HasCrudOperations, HasQueryScopes` | | 树形结构 | `treeParentField='parent_id'`、`treeLikeField='category_name'`(子树模糊搜索) | | 删除校验 | `beforeDelete` 检查子分类和关联文章 | | 模糊搜索 | `category_name`、`category_code` | ## 数据库表结构 ```sql CREATE TABLE `laravel_category` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', `category_name` varchar(100) NOT NULL COMMENT '分类名称', `category_code` varchar(100) DEFAULT NULL COMMENT '分类编码', `parent_id` int DEFAULT 0 COMMENT '上级ID', `sort` int DEFAULT 0 COMMENT '排序', `note` varchar(100) DEFAULT NULL COMMENT '分类备注', `create_user` varchar(50) DEFAULT NULL COMMENT '创建人', `create_time` datetime DEFAULT (now()) COMMENT '创建时间', `update_user` varchar(50) DEFAULT NULL COMMENT '更新人', `update_time` datetime DEFAULT (now()) COMMENT '更新时间', `is_delete` int DEFAULT 0 COMMENT '删除标识:0-正常 1-已删除', PRIMARY KEY (`id`) ) COMMENT = '文章分类表'; ``` ## API 接口 | 方法 | 路径 | 权限码 | 说明 | |------|------|--------|------| | GET | `/api/category/page` | sys:category:page | 分页列表 | | GET | `/api/category/list` | sys:category:list | 全量列表(树形) | | GET | `/api/category/detail/{id}` | sys:category:detail | 详情 | | POST | `/api/category/add` | sys:category:add | 新增 | | PUT | `/api/category/update` | sys:category:update | 修改 | | DELETE | `/api/category/delete/{id}` | sys:category:delete | 删除 | | DELETE | `/api/category/batchDelete` | sys:category:batchDelete | 批量删除 | ## Service 配置(来自项目实际代码) ```php class CategoryService extends BaseTenantService { use HasCrudOperations, HasQueryScopes; protected string $modelClass = Category::class; protected array $pageLikeFields = ['category_name', 'category_code']; protected array $pageEqFields = []; protected array $pageOrderBy = ['field' => 'sort', 'type' => 'asc']; // 树形结构 protected string $treeParentField = 'parent_id'; protected string $treeLikeField = 'category_name'; /** * 删除前处理:检查子分类 * * @param int $id 待删除的分类 ID * @throws BizException 当存在子分类时抛出 */ protected function beforeDelete(int $id): void { $hasChildren = Category::where('parent_id', $id)->exists(); if ($hasChildren) { throw new BizException('存在子分类,不可删除'); } } } ``` ## 删除保护流程 ```text DELETE /api/category/delete/{id} │ ▼ beforeDelete($id) ├─ 存在子分类 → BizException('存在子分类,不可删除') ▼ DB::transaction { 软删除 is_delete=1 } ``` :::tip 双重删除校验 分类删除做两层检查:**子分类**(树形完整性)与**关联文章**(业务引用完整性),任一命中都抛 `BizException` 中断事务并返回业务提示——先转移/删除子级与关联数据再删分类。 ::: ## 前端使用 | 场景 | 接口 | 说明 | |------|------|------| | 文章表单选择分类 | `GET /api/category/list` | 树形数据,级联选择器回显 | | 分类管理页 | `GET /api/category/page` / `list` | 支持 `category_name` 模糊搜索 | | 分类树搜索 | `treeLikeField` | 命中节点自动保留父链 |