Files
2026-10-08 17:50:29 +08:00

3.6 KiB

6.10 分类管理

:::tip 概述 分类管理支持树形分类数据,可用于文章分类、商品分类等场景。CategoryService 继承 BaseTenantService 实现租户隔离。 :::

模块特点

特性 说明
基类 BaseTenantService(租户隔离)
Trait 组合 HasCrudOperations, HasQueryScopes
树形结构 treeParentField='parent_id'、treeLikeField='category_name'(子树模糊搜索)
删除校验 beforeDelete 检查子分类和关联文章
模糊搜索 category_name、category_code

数据库表结构

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 配置(来自项目实际代码)

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('存在子分类,不可删除');
        }
    }
}

删除保护流程

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 命中节点自动保留父链