fastadmin根據角色組設置權限

以前使用fastadmin,自定義角色組,發現編輯/刪除/修改等等權限能夠直接權限管理中選擇,而後用不一樣的角色登錄,會顯示對應的權限按鈕。此時有一個新的需求就是增長審覈和批量審覈,而且也增長對應的權限。javascript


添加按鈕php

先不寫功能,在對應的位置上加上審覈按鈕。在頂頭位置的批量審覈須要獲得的樣式以下:

clipboard.png

原先的建立按鈕方法爲:html

{:build_toolbar('refresh,edit,checkall')}

有時候不使用buid_toolbar來建立按鈕,而是直接使用的java

<a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('course/clabelong/del')?'':'hide'}"

title="{:__('Delete')}" >
{:__('Delete')}ajax

這種方式來建立按鈕,這樣雖然很直觀,可是實際上使用卻很不方便,由於這裏對於權限的斷定多是有問題的。期待的結果是直接使用build_toolbar方法,設置checkall爲批量審覈,check爲審覈方法,對於各個權限組能夠直接調用。
修改build_toolbar方法到以下結果:bootstrap

function build_toolbar($btns = NULL, $attr = [])
    {
        $auth = \app\admin\library\Auth::instance();
        $controller = str_replace('.', '/', strtolower(think\Request::instance()->controller()));
        $btns = $btns ? $btns : ['refresh', 'add', 'edit', 'del', 'import','checkall'];
        $btns = is_array($btns) ? $btns : explode(',', $btns);
        $index = array_search('delete', $btns);
        if ($index !== FALSE) {
            $btns[$index] = 'del';
        }
        $btnAttr = [
            'refresh' => ['javascript:;', 'btn btn-primary btn-refresh', 'fa fa-refresh', '', __('Refresh')],
            'checkall'=> ['javascript:;', 'btn btn-success btn-checkall btn-disabled disabled', 'fa fa-flag-checkered', ' 批量審覈', '批量審覈'],
            'add'     => ['javascript:;', 'btn btn-success btn-add', 'fa fa-plus', __('Add'), __('Add')],
            'edit'    => ['javascript:;', 'btn btn-success btn-edit btn-disabled disabled', 'fa fa-pencil', __('Edit'), __('Edit')],
            'del'     => ['javascript:;', 'btn btn-danger btn-del btn-disabled disabled', 'fa fa-trash', __('Delete'), __('Delete')],
            'import'  => ['javascript:;', 'btn btn-danger btn-import', 'fa fa-upload', __('Import'), __('Import')],
        ];
        $btnAttr = array_merge($btnAttr, $attr);
        $html = [];
        foreach ($btns as $k => $v) {
            //若是未定義或沒有權限
            if (!isset($btnAttr[$v]) || ($v !== 'refresh' && !$auth->check("{$controller}/{$v}"))) {
                continue;
            }
            list($href, $class, $icon, $text, $title) = $btnAttr[$v];
            $extend = $v == 'import' ? 'id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"' : '';
            $html[] = '<a href="' . $href . '" class="' . $class . '" title="' . $title . '" ' . $extend . '><i class="' . $icon . '"></i> ' . $text . '</a>';
        }
        return implode(' ', $html);
    }

具體修改的就是兩個地方,第一個是數組$btns,在$btns數組中添加須要的元素,在本例中添加checkall;第二就是修改$btnAttr,根據須要添加一個checkall元素,以下所示:api

'checkall'=> ['javascript:;', 'btn btn-success btn-checkall
btn-disabled disabled', 'fa fa-flag-checkered', ' 批量審覈', '批量審覈'],

這裏有須要特別注意的地方是,最好在類中加上btn-disabled disabled兩個class,這樣能夠方便直接獲取是否選擇。也就是說,在沒有選擇項的狀況下,全部批量操做的按鈕都應該是不能點擊的。
在修改完buildtoolbar以後在頁面上使用應該就是能夠直接調用出來了,到此第一步完成。數組


修改js配置app

接下來修改require-table.js文件,由於全部的後臺js文件都繼承了這個文件,若是用的編輯器或IDE沒有歷史記錄功能那就必定要作好備份。編輯器

首先是配置項,extend項表明每一個url對應的方法,這裏能夠設置成缺省爲空,而後在須要用到的js文件中再調用。加上checkall和check的URL,最好命名一致,修改完成的extend以下:
extend: {
            index_url: '',
            add_url: '',
            edit_url: '',
            del_url: '',
            import_url: '',
            multi_url: '',
            check_url:'',
            checkall_url:'',
            check_classes_url:'',
            dragsort_url: 'ajax/weigh',
        }

只須要按本身的需求把想加的公共方法加上,在config中添加按鈕對應的class,好比這裏添加:

checkallbtn: '.btn-checkall',

綁定事件
在bindevent中添加事件以下:

// 批量審覈按鈕事件
$(toolbar).on('click', Table.config.checkallbtn, function () {
    var that = this;
    var ids = Table.api.selectedids(table);
    layer.msg('您正在批量修改審覈狀態,請選擇結果', {
        time: 20000, //20s後自動關閉
        btn: ['經過', '不經過', '取消']
        ,yes: function(index){
            $(this).data({'check':1,'tablename':'classes'});
            Table.api.multi("checkall", ids, table, $(this));
            Layer.close(index);
              }
        ,btn2: function(index){
            $(this).data({'check':2,'tablename':'classes'});
            Table.api.multi("checkall", ids, table, $(this));
            Layer.close(index);
             }
        ,btn3: function(index){
            Layer.close(index);
        }
    });
});

其中Table.config.checkallbtn即以前在config中添加的按鈕,其中綁定的類名必須在以前的buildtollbar的對應按鈕上有,根據需求,這裏設置一個彈窗,以點擊經過爲例:
鼠標選擇幾項結果以後進行批量審覈,若是選擇經過,對應回調yes,此時設置兩個數據,一個是對應的表,一個是審覈狀態。由於主要是classes表會用到審覈,默認值設置爲classes表,若是其餘方法調用,能夠在對應的js文件中重寫綁定事件;(還有另外一種方法,config中添加一項爲tablename,而後直接傳tablename,將對應的classes修改成Table.config.tablename,每次頁面js調用的時候修改config,可是由於大部分頁面用不着重寫config,所以這裏不這麼寫)
multi方法即批量操做方法,所以這裏應該直接調用,在multi方法中有如下的一句:
var url = typeof data.url !== "undefined" ? data.url : (action == "del" ? options.extend.del_url : options.extend.multi_url);

這裏要注意的是,在js調用的時候打印url,可能審覈方法不在,由於實際上multi方法是綁定到dek_url或者multi_url的,這裏有兩種方法,一種是把check_url替換上去,一種是直接把multi_url方法綁定到check上,也能夠直接加上,可是這個判斷就要改。

具體js
進入到控制器對應的js中調用方法,若是寫在trait中,每一個控制器都會直接繼承,若是使用的地方較少,能夠直接使用。地址是admin/library/traits/Backend.php
checkall方法以下:

/**
     *
     * 批量審覈
     */
    public function checkall($ids = "")
    {
        $row = $this->model->get($ids);
        if (!$row)
            $this->error(__('No Results were found'));
        $adminIds = $this->getDataLimitAdminIds();
        if (is_array($adminIds)) {
            if (!in_array($row[$this->dataLimitField], $adminIds)) {
                $this->error(__('You have no permission'));
            }
        }
        if ($this->request->isPost()) {
            $values = $this->request->post()['params'];
            if($values)
            {
                $res =Db::name($values['tablename'])->where('id','IN',$ids)->update(['check'=>$values['check']]);
                $this->success();
            }
        }
    }

其中$this->request->post()['params']能夠獲取到剛纔在js中傳遞的數據,這裏是用戶選擇的審覈狀態和須要更新的表名;以後對錶進行操做返回$this->success()就能夠了;

添加權限
以上操做順利完成以後顯示的會是沒有操做權限;首先進入規則管理,添加剛纔新增的方法對應的規則,例如這裏添加的是check:

clipboard.png

只要不以菜單方式顯示,而後狀態正常就能夠了;
以後進入角色組,在角色組對應的權限中勾選,此時就能夠加上對應的權限,這是很重要的一步:

**接下來在index頁面中加上驗證就行,例如這裏是:
data-operate-check="{:$auth->check('course/clabelong/check')}"
data-operate-checkall="{:$auth->check('course/clabelong/checkall')}"**

此時再登陸不一樣的用戶,例如教師組沒有批量審覈權限,那麼沒法顯示批量審覈按鈕。

單個操做權限
除了批量操做,其實還能夠單個操做,單個操做和批量操做稍有不一樣,可是更簡單。能夠仿照單元格元素事件來寫,結果以下:

'click .btn-checkone': function (e, value, row, index) {
                        e.stopPropagation();
                        e.preventDefault();
                        var table = $(this).closest('table');
                        var options = table.bootstrapTable('getOptions');
                        var ids = row[options.pk];
                        row = $.extend({}, row ? row : {}, {ids: ids});
                        var url = options.extend.check_url;
                        Fast.api.open(Table.api.replaceurl(url, row, table), '審覈', $(this).data() || {});
                    },

直接綁定到check_url,在對應方法的js文件中的extend寫出check_url的位置,添加對應的方法和視圖,就能夠直接調用。固然,一樣涉及到權限的問題,加了方法以後在index中依然要用data-operate-check="{:$auth->check('course/clabelong/check')}";同時,不要忘記在require-table.js中添加operate;我添加以下代碼:

if (options.extend.check_url !== '') {
                        buttons.push({
                            name: 'check',
                            icon: 'fa fa-flag-checkered',
                            title: '審覈',
                            classname: 'btn btn-xs btn-success btn-checkone',
                            url: options.extend.check_url
                        });
                    }

在require-table中可能還有須要修改的地方,可是關鍵是按照原先的add.del等寫好的方法來參照,基本上就不會出錯了。

相關文章
相關標籤/搜索