Skip to content

6.4 部门管理 ​

概述

部门管理维护组织架构数据,支持树形结构,是数据权限(按部门过滤)的基础。继承 BaseTenantLogic 实现租户隔离。

模块特点 ​

特性说明
基类BaseTenantLogic(租户隔离)
树形结构treeParentField='parent_id'
唯一校验name 全局唯一
删除校验beforeDelete 检查是否存在子部门
数据权限被 UserLogic 的 dataScopeDeptField='dept_id' 引用

数据库表结构 ​

sql
CREATE TABLE `think_dept` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(150) NOT NULL COMMENT '部门名称',
  `type` int DEFAULT 0 COMMENT '部门类型:1-公司 2-子公司 3-部门 4-小组',
  `parent_id` int DEFAULT 0 COMMENT '上级部门ID',
  `sort` int DEFAULT 0 COMMENT '部门排序',
  `note` varchar(255) 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/dept/listsys:dept:page树形列表
GET/api/dept/detail/:idsys:dept:detail详情
POST/api/dept/addsys:dept:add新增
PUT/api/dept/updatesys:dept:update修改
DELETE/api/dept/delete/:idsys:dept:delete删除

核心代码 ​

Logic 配置 ​

php
// app/logic/DeptLogic.php

class DeptLogic extends BaseTenantLogic
{
    /**
     * 关联的模型类
     *
     * @var string
     */
    protected string $modelClass = Dept::class;

    /**
     * LIKE 模糊匹配字段
     *
     * @var array
     */
    protected array $pageLikeFields = ['name'];

    /**
     * 精确匹配字段
     *
     * @var array
     */
    protected array $pageEqFields = ['type'];

    /**
     * 默认排序规则
     *
     * @var array
     */
    protected array $pageOrderBy = [
        ['field' => 'tenant_id', 'type' => 'asc'],
        ['field' => 'sort', 'type' => 'asc'],
    ];

    /**
     * 唯一性校验字段
     *
     * @var array
     */
    protected array $uniqueFields = ['name'];

    /**
     * 删除前处理:检查是否存在子部门
     *
     * @param int $id 待删除的部门 ID
     * @return void
     * @throws \Exception 当存在子部门时抛出
     */
    protected function beforeDelete(int $id): void
    {
        $childCount = Dept::where('parent_id', $id)->count();
        if ($childCount > 0) {
            throw new \Exception('该部门下存在子部门,不可删除');
        }
    }
}

树形接口

部门使用 _list() 而非 _index(),返回全量数据后由前端或 Logic 构建树形结构。

Controller 示例 ​

php
// app/controller/DeptController.php

class DeptController extends BaseController
{
    protected DeptLogic $logic;

    protected function initialize(): void
    {
        $this->logic = new DeptLogic();
    }

    #[Log('部门管理-查询树形列表', Log::TYPE_QUERY)]
    #[Permission('sys:dept:page', '部门列表')]
    public function list(): Json
    {
        return parent::_list($this->logic);
    }

    #[Log('部门管理-新增记录', Log::TYPE_ADD, '新增部门:{name}')]
    #[Permission('sys:dept:add', '添加部门')]
    public function add(): Json
    {
        return parent::_add($this->logic, $this->getJsonBody());
    }

    // ... 其他 CRUD 方法
}

小蚂蚁云团队 · 提供技术支持