当前位置: 首页 > 后端技术 > PHP

fastadmin根据角色组设置权限

时间:2023-03-29 15:08:35 PHP

之前使用fastadmin,自定义角色组,找到编辑/删除/修改等权限可以在权限管理中直接选择,然后用不同的角色登录,相应的权限按钮将被显示。这时有新需求增加审计和批量审计,同时也增加相应的权限。添加按钮先不写函数,在相应位置添加评论按钮。置顶批量审核需要的样式如下:原来创建按钮的方法是:{:build_toolbar('refresh,edit,checkall')}有时候不使用buid_toolbar创建按钮,使用check('course/clabellong/del')?'':'hide'}"title="{:__('删除')}">{:__('Delete')}这种创建按钮的方式很直观,但实际使用起来很不方便,因为这里的权限判断可能会有问题。预期结果是直接使用build_toolbar方法,设置checkall为批量审核,check为审核方式,每个权限组直接调用即可。修改build_toolbar方法为如下结果:functionbuild_toolbar($btns=NULL,$attr=[]){$auth=\app\admin\library\Auth::instance();$controller=str_replace('.','/',strtolower(think\Request::instance()->controller()));$btns=$btns?$btns:['刷新','添加','编辑','删除','导入','checkall'];$btns=is_array($btns)?$btns:explode(',',$btns);$index=array_search('删除',$btns);如果($index!==FALSE){$btns[$index]='del';}$btnAttr=['refresh'=>['javascript:;','btnbtn-primarybtn-refresh','fafa-refresh','',__('Refresh')],'checkall'=>['javascript:;','btnbtn-successbtn-checkallbtn-disableddisabled','fafa-flag-checkered','batchreview','batchreview'],'add'=>['javascript:;','btnbtn-successbtn-add','fafa-plus',__('Add'),__('Add')],'edit'=>['javascript:;','btnbtn-成功btn-editbtn-disableddisabled','fafa-pencil',__('Edit'),__('Edit')],'del'=>['javascript:;','btnbtn-dangerbtn-delbtn-disableddisabled','fafa-trash',__('Delete'),__('Delete')],'import'=>['javascript:;','btnbtn-dangerbtn-import','fafa-上传',__('导入'),__('导入')],];$btnAttr=array_merge($btnAttr,$attr);$html=[];foreach($btnsas$k=>$v){//如果不确定或没有权限if(!isset($btnAttr[$v])||($v!=='refresh'&&!$auth->检查(“{$controller}/{$v}”))){继续;}list($href,$class,$icon,$text,$title)=$btnAttr[$v];$extend=$v=='导入'?'id="btn-import-file"data-url="ajax/upload"data-mimetype="csv,xls,xlsx"data-multiple="false"':'';$html[]='';}returnimplode('',$html);}具体修改有两个,第一个是数组$btns,在$btns数组元素中添加需要的,本例中添加checkall;二是修改$btnAttr,根据需要添加checkall元素,如下:'checkall'=>['javascript:;','btnbtn-successbtn-checkallbtn-disableddisabled','fafa-flag-checkered','batchreview','batchreview'],这里需要特别注意的地方,最好在类中加入btn-disableddisabled两个类,可以方便直接get是否选择。也就是说,如果没有选择项,那么所有的批量操作的按钮都应该是不可点击的。修改buildtoolbar后,在页面使用时应该直接调用,到这里就完成了第一步。修改js配置再修改require-table.js文件,因为所有后台js文件都继承这个文件。如果您使用的编辑器或IDE没有历史记录功能,您必须做好备份。首先是配置项。extend项表示每个url对应的方法。这里可以设置为默认为空,然后在需要使用的js文件中调用。添加checkall和检查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/weight',}你只需要根据自己的需要添加你要添加的public方法,在config中添加按钮对应的class即可,比如这里添加:checkallbtn:'.btn-checkall',绑定事件,在bindevent中添加事件如下://批量审核按钮事件$(toolbar).on('click',Table.config.checkallbtn,function(){varthat=this;varids=Table.api.selectedids(table);layer.msg('您正在批量修改审核状态,请选择结果',{time:20000,//20s后自动关闭btn:['通过','未通过','取消'],是: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':'classe小号'});Table.api.multi("checkall",ids,table,$(this));Layer.close(索引);},btn3:函数(索引){Layer.close(索引);}});});其中Table.config.checkallbtn是之前config中添加的按钮,绑定的类名必须在之前buildtollbar对应的按钮上。根据需要,这里设置一个弹窗。以clickthrough为例:鼠标选中几个item的结果后批量选中,如果选中通过,对应的回调为yes。这时候设置了两个数据,一个是对应的表,一个是审计状态。因为classes表主要是用来做审计的,所以默认值设置为classes表,如果要调用其他方法,可以在对应的js文件中重写绑定事件;(还有一种方法,在config中添加一个item作为tablename,然后直接传tablename,修改对应的classes到Table.config.tablename,每次页面js调用的时候修改config,但是因为大部分页面不需要重写config,这里就不写了)multi方法是批量操作的方法,这里直接调用即可。multi方法中有如下一句:varurl=typeofdata.url!=="undefined"?data.url:(action=="del"?options.extend.del_url:options.extend.multi_url);这里需要注意的是js调用url的时候打印的,可能是audit方法没有,因为其实multi方法是绑定dek_url或者multi_url的,这里有两种方法,一种是替换check_url,和另一种是直接绑定multi_url方法来检查,也可以直接Add,但是这个判断需要改一下。具体js进入controller对应的js调用方法。如果写在trait中,每个controller都会直接继承。如果用的地方少,可以直接使用。地址为admin/library/traits/Backend.phpcheckall方法如下:/****批量审核*/publicfunctioncheckall($ids=""){$row=$this->model->get($ids);if(!$row)$this->error(__('没有找到结果'));$adminIds=$this->getDataLimitAdminIds();if(is_array($adminIds)){if(!in_array($row[$this->dataLimitField],$adminIds)){$this->error(__('你没有权限'));}}if($this->request->isPost()){$values=$this->request->post()['params'];if($values){$res=Db::name($values['tablename'])->where('id','IN',$ids)->update(['check'=>$values['查看']]);$this->成功();其中$this->request->post()['params']可以获取刚才js传入的数据,这里是用户选择的审计状态和需要更新的表名;然后操作表返回$this->success();上述添加权限操作成功后会显示没有操作权限;首先进入规则管理,添加添加新添加的方法对应的规则。比如这里添加了check:只要在菜单中没有显示,那么就是状态正常;然后进入角色组,查看角色组对应的权限,然后就可以添加相应的权限了,这是很重要的一步:**接下来,在index页面添加验证即可,比如这里是:data-operate-check="{:$auth->check('course/clabellong/check')}"data-operate-checkall="{:$auth->check('course/clabellong/checkall')}"**在这次,登录到另一个用户。比如教师组没有批审权限,所以不能显示批审按钮。除了批量操作,单次操作权限也可以用于单次操作。单次操作和批量操作略有不同,但更简单。可以写成单元格元素事件,结果如下:'click.btn-checkone':function(e,value,row,index){e.stopPropagation();e.preventDefault();vartable=$(this).closest('table');varoptions=table.bootstrapTable('getOptions');varids=row[options.pk];row=$.extend({},row?row:{},{ids:ids});varurl=options.extend.check_url;Fast.api.open(Table.api.replaceurl(url,row,table),'check',$(this).data()||{});},直接绑定check_url,把check_url在extend中的位置写在相应方法的js文件中,添加相应的方法和视图,然后直接调用即可。当然,还涉及到权限。添加方法后,索引中还需要使用data-operate-check="{:$auth->check('course/clabellong/check')}";同时不要忘记在require-table.js中使用Add操作;我添加了以下代码:if(options.extend.check_url!==''){buttons.push({名称:'检查',图标:'fafa-flag-checkered',标题:'审计',类名:'btnbtn-xsbtn-successbtn-checkone',url:options.extend.check_url});}require-table可能还有一些改动,但关键是按照原来的Add.del等写法来引用,基本不会出错。