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