Group.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <?php
  2. /**
  3. * ----------------------------------------------------------------------------
  4. * 行到水穷处,坐看云起时
  5. * 开发软件,找贵阳云起信息科技,官网地址:https://www.56q7.com/
  6. * ----------------------------------------------------------------------------
  7. * Author: 老成
  8. * email:85556713@qq.com
  9. */
  10. declare(strict_types=1);
  11. namespace app\admin\controller\auth;
  12. use app\admin\traits\Actions;
  13. use app\common\model\AuthGroup;
  14. use app\common\model\Admin;
  15. use app\common\controller\Backend;
  16. use app\common\model\AuthRule;
  17. use think\annotation\route\Group as GroupAnnotation;
  18. use think\annotation\route\Route;
  19. /**
  20. * 角色组
  21. */
  22. #[GroupAnnotation("auth/group")]
  23. class Group extends Backend
  24. {
  25. protected $noNeedRight=['roletree'];
  26. private $groupdata=null;
  27. use Actions{
  28. index as private _index;
  29. add as private _add;
  30. edit as private _edit;
  31. del as private _del;
  32. multi as private _multi;
  33. }
  34. public function _initialize()
  35. {
  36. parent::_initialize();
  37. $this->model=new AuthGroup();
  38. }
  39. private function getGroupData()
  40. {
  41. $groupids='*';
  42. if(!$this->auth->isSuperAdmin()){
  43. $groupids=$this->auth->getChildrenGroupIds();
  44. }
  45. return AuthGroup::getGroupListTree($groupids);
  46. }
  47. #[Route('GET,JSON','index')]
  48. public function index()
  49. {
  50. if (false === $this->request->isAjax()) {
  51. $this->assign('groupids',$this->auth->groupids);
  52. return $this->fetch();
  53. }
  54. $result = ['total' => 1000, 'rows' =>$this->getGroupData()];
  55. return json($result);
  56. }
  57. #[Route('GET,POST','add')]
  58. public function add()
  59. {
  60. if($this->request->isPost()){
  61. $this->volidate();
  62. }else{
  63. $this->assign('groupdata',$this->getGroupData());
  64. }
  65. return $this->_add();
  66. }
  67. #[Route('GET,POST','edit')]
  68. public function edit()
  69. {
  70. if($this->request->isPost()){
  71. $this->volidate();
  72. return $this->_edit();
  73. }else{
  74. $ids = $this->request->get('ids');
  75. $row = $this->model->find($ids);
  76. $count=0;
  77. $row->rules=implode(',',$this->getDiffRules($row->rules,$count));
  78. $this->assign('row', $row);
  79. $this->assign('groupdata',$this->getGroupData());
  80. return $this->fetch();
  81. }
  82. }
  83. private function getDiffRules($rules,&$count)
  84. {
  85. if(is_string($rules)){
  86. $rules=explode(',',$rules);
  87. }
  88. $ruleslist=AuthRule::field('id,pid')->select();
  89. $pids=[];
  90. foreach ($ruleslist as $rule){
  91. if(!in_array($rule->id,$rules) && $rule->pid){
  92. $pids[]=$rule->pid;
  93. }
  94. }
  95. $pids=array_unique($pids);
  96. //删除数组$rules中存在于$pids中的元素
  97. $rules=array_diff($rules,$pids);
  98. if(count($pids)!=$count){
  99. $count=count($pids);
  100. $rules=$this->getDiffRules($rules,$count);
  101. }
  102. return $rules;
  103. }
  104. #[Route('POST,GET','del')]
  105. public function del()
  106. {
  107. $ids = $this->request->param("ids");
  108. $ids=explode(',',$ids);
  109. foreach ($ids as $id){
  110. $count=Admin::where("FIND_IN_SET({$id},groupids)")->count();
  111. if($count>0){
  112. $this->error(__('请先删除该角色组下的管理员'));
  113. }
  114. }
  115. if(!$this->auth->isSuperAdmin()){
  116. $groupids=$this->auth->getChildrenGroupIds();
  117. foreach ($ids as $id){
  118. if(!in_array($id,$groupids)){
  119. $this->error(__('无权操作'));
  120. }
  121. }
  122. foreach ($ids as $id){
  123. if(in_array($id,$this->auth->groupids)){
  124. $this->error(__('无权操作'));
  125. }
  126. }
  127. }
  128. return $this->_del();
  129. }
  130. #[Route('POST,GET','multi')]
  131. public function multi()
  132. {
  133. $ids = $this->request->param('ids');
  134. $ids=is_string($ids)?explode(',',$ids):$ids;
  135. if(!$this->auth->isSuperAdmin()){
  136. $groupids=$this->auth->getChildrenGroupIds();
  137. foreach ($ids as $id){
  138. if(!in_array($id,$groupids)){
  139. $this->error(__('无权操作'));
  140. }
  141. }
  142. foreach ($ids as $id){
  143. if(in_array($id,$this->auth->groupids)){
  144. $this->error(__('无权操作'));
  145. }
  146. }
  147. }
  148. return $this->_multi();
  149. }
  150. #[Route('GET','roletree')]
  151. public function roletree($groupid=0)
  152. {
  153. if($groupid==1){
  154. $ruleids='*';
  155. }else{
  156. $ruleids=explode(',',AuthGroup::find($groupid)->auth_rules);
  157. }
  158. $list=AuthRule::getRuleList($ruleids);
  159. return json($list);
  160. }
  161. //验证加菜单的权限
  162. private function volidate()
  163. {
  164. $pid=$this->request->post('row.pid');
  165. $rules=$this->request->post('row.rules');
  166. $ids=$this->request->get('ids');
  167. if($pid==$ids){
  168. $this->error(__('上级不能是自己'));
  169. }
  170. if(empty($rules)){
  171. $this->error(__('角色操作权限不能为空'));
  172. }
  173. if(!$this->auth->isSuperAdmin()){
  174. $auth_rules=explode(',',$this->request->post('row.auth_rules'));
  175. $userrule=$this->auth->getUserRuleList();
  176. $usermenu=$this->auth->getUserMenuList();
  177. $arr=array_column(array_merge($userrule,$usermenu),'id');
  178. for($i=0;$i<count($auth_rules);$i++){
  179. if(!in_array($auth_rules[$i],$arr)){
  180. $this->error(__('无权操作'));
  181. }
  182. }
  183. $groupids=$this->auth->getChildrenGroupIds();
  184. if(!in_array($pid,$groupids)){
  185. $this->error(__('无权操作'));
  186. }
  187. }
  188. }
  189. }