# 6.10 分类管理 :::tip 概述 分类模块(goframe_category,租户级表)管理文章/商品等树形分类:ModuleSpec 树形声明(IsTree + ParentOf)、租户内名称唯一、删除守卫。是三个树形模块(menu/dept/category)之一。 ::: ## 接口清单 ```text 七件套:sys:category:{page|list|detail|add|update|delete|batchDelete} List 返回树形(IsTree + ParentOf) ``` ## 树形声明(spec 模式) ```go // categorySpec 树形声明(模式示意) var categorySpec = ModuleSpec[...]{ ..., IsTree: true, ParentOf: func(item *v1.CategoryItem) int { return item.ParentId }, // ChildSetter 或 DTO 的 Children 字段(叶子预置 [] 而非 null) } ``` 基座 List 末尾自动建树;DTO 必须含 Id 字段;缺 ParentOf 时 fail-fast(启动即报)。 ## 模块特征 | 特征 | 实现 | |------|------| | 树形 | IsTree + ParentOf,List 建树(叶子 Children 预置空数组) | | 唯一性 | 租户内分类名唯一(uk_tenant_name);未声明预检,1062 兜底 | | 排序 | sort 列(有 sort 列时生成器默认 "sort asc") | | 引用方 | article.category_id(文章归属分类) | ## 树构建的两条路线 ```text 路线一(后端建树,本模块采用): spec.IsTree=true → List 返回树形 JSON → 前端直接渲染树 路线二(前端建树): 后端返回平铺列表 → 前端 buildTree 组装 (example 模块即此模式:"data 直接为数组,树形结构由前端 buildTree 构建") 选择:菜单/部门/分类走后端建树(权限/守卫与树结构耦合); 简单展示树可走前端建树(后端更轻)。 ``` ## 删除守卫与引用 + 删除分类前检查子分类(树形守卫,1011 语义) + 删除被文章引用的分类前,先调整文章归属(避免悬挂引用) + 批量删除逐条守卫 ## 管理建议 + 分类层级控制在 3 层内(文章分类场景足够;更深考虑是否该拆多套分类) + sort 控制同级排序(间隔 5/10 留出插入空间,生成器同款策略) + 租户内独立分类体系;跨租户共享分类不在设计内(平台共享行 tenant_id=0 为扩展方向)