最近在开发fastadmin框架中,遇到一个客户想要实现 子账号没有搜索功能,主账号有搜索功能。刚开始说到这个功能的时候,第一反应是开发不了,因为fastadmin框架并没有搜索框的权限管理功能,在官方的社区上对fastadmin的表格的介绍:https://ask.fastadmin.net/article/323.html ,上面只提到了显示隐藏,并没有权限相关管理,原文如下:

7.浏览模式、显示隐藏列、导出、通用搜索
浏览模式可以切换卡片视图和表格视图两种模式,如果不需要此功能,可以设置showToggle: false
显示隐藏列可以快速切换字段列的显示和隐藏,如果不需要此功能,可以设置showColumns: false,如果想要表格中的字段列默认隐藏可以设置字段属性visible: false即可默认隐藏
导出按钮默认将导出整个表的所有行,如果需要仅导出当前分页的数据,需要设置exportDataType: 'basic',如果想导出选中的行,则可以设置为exportDataType: 'selected',如果不需要此功能,可以设置showExport: false
通用搜索指表格上方的搜索,通用搜索的表单默认是隐藏的,如果需要默认显示,需要设置searchFormVisible: true,如果不需要通用搜索功能,可以设置commonSearch: false。如果想要控制字段列不参考搜索则可以设置字段列属性为operate: false即可。

那我怎么实现搜索框的权限管理呢?  严格的说,我只是实现了在子账号无法使用fastadmin的搜索功能,搜索框还是会显示在页面上的,以下是我的实现思路:前提是,子账号登录后台的时候,只查询和子账号ID相关的列表信息。通过admin_id来判断是否是子账号,子账号不使用系统自带的where条件,就实现了子账号登录搜索功能失效的目的。以下是代码:

 

 

if ($this->auth->id >1) {
    //1.   根据ID 寻找 该管理员对应的任务ID
    $task_ids = Db::name('task_content')->where('admin_id', $this->auth->id)->field('id')->select();
    $list = $this->model
        ->with(['user','content'])
        ->where('task_content_id', 'in', [implode(',', array_column($task_ids, 'id'))])
        // ->where($where)
        ->order($sort, $order)
        ->paginate($limit);
} else {
    $list = $this->model
        ->with(['user','content'])
        ->where($where)
        ->order($sort, $order)
        ->paginate($limit);
}

通过以上的where条件的修改,就实现了超级管理员账号可以有搜索功能,子账号没有搜索功能。通过ID的判断使用这个方法也可以指定子账号有搜索权限,其他账号没有搜索权限。