Role.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. namespace app\admin\controller\auth;
  3. use app\common\controller\AdminController;
  4. use app\http\IResponse;
  5. use Lettered\Support\Goeasy;
  6. class Role extends AdminController
  7. {
  8. private $permissions_idx = '';
  9. /**
  10. * 获取角色列表
  11. *
  12. * @author 许祖兴 < zuxing.xu@lettered.cn>
  13. * @date 2020/3/16 13:49
  14. *
  15. * @return \think\response\Json
  16. * @throws \think\exception\DbException
  17. */
  18. public function index()
  19. {
  20. $where = [];
  21. //组合搜索
  22. !empty(input('name')) && $where[]
  23. = ['name', 'like', '%' . input('name') . '%'];
  24. (!empty(input('status')) || input('status') == '0' ) &&
  25. $where[] = ['status', 'eq', input('status')];
  26. return IResponse::paginate(model('Roles')->where($where)
  27. ->paginate(input('limit'),false));
  28. }
  29. /**
  30. * 获取角色权限
  31. *
  32. * @author 许祖兴 < zuxing.xu@lettered.cn>
  33. * @date 2020/3/16 13:49
  34. *
  35. * @param $id
  36. * @return \think\response\Json
  37. */
  38. public function permission($id)
  39. {
  40. // 获取角色信息
  41. $role = model('Roles')->getBy($id);
  42. if ($role){
  43. // 全部权限
  44. $permissions = model('Permissions')->getAll();
  45. // 用户操作权限ID
  46. $permission_access = $this->enforcer::GetPermissionsForUser($role->name);
  47. // 用户菜单权限ID
  48. $permissions_role = model('PermissionsRole')->getBy(['role_id' => $role->id]);
  49. // 合并权限
  50. $permissions_idx = [];
  51. if (!empty($permission_access)){
  52. foreach ($permission_access as $item){
  53. $permissions_idx[] = model('Permissions')
  54. ->where(['url' => $item[1],'policy' => $item[2]])->value('id');
  55. }
  56. }
  57. if (!empty($permissions_role['permission_idx'])) {
  58. foreach (str2arr($permissions_role['permission_idx']) as $permId){
  59. $permissions_idx[] = model('Permissions')
  60. ->where(['id' => $permId])->value('id');
  61. }
  62. }
  63. foreach ($permissions as $k => $v){
  64. if (in_array($v['id'], array_unique($permissions_idx))){
  65. $v['checked'] = true;
  66. }else{
  67. $v['checked'] = false;
  68. }
  69. }
  70. return IResponse::success($permissions);
  71. }
  72. return IResponse::failure('角色不存在');
  73. }
  74. /**
  75. * 角色授权
  76. *
  77. * @author 许祖兴 < zuxing.xu@lettered.cn>
  78. * @date 2020/3/21 20:11
  79. *
  80. * @param int $id 角色ID
  81. * @return mixed
  82. */
  83. public function authority($id)
  84. {
  85. // 获取角色信息
  86. $role = model('Roles')->getBy($id);
  87. if ($role){
  88. // 原先存在的权限
  89. $user_permissions = $this->enforcer::GetPermissionsForUser($role->name);
  90. // 接收变更的数据数据
  91. $authIds = $this->request->param('authIds');
  92. $permissions = []; //操作权限
  93. $perm_roles_idx = ""; // 菜单权限id
  94. foreach (str2arr($authIds) as $permId){
  95. $permission = model('Permissions')->getBy($permId);
  96. if ($permission->type == 1){
  97. $permissions[] = $permission->id;
  98. if (!$this->enforcer::HasPermissionForUser($role->name,$permission->url,$permission->policy)){
  99. // 不存则新增
  100. $this->enforcer::AddPermissionForUser($role->name, $permission->url,$permission->policy);
  101. }
  102. }else {
  103. $perm_roles_idx .= ',' . $permission->id;
  104. }
  105. }
  106. // 更新角色权限
  107. foreach ($user_permissions as $item){
  108. $user_permission = model('Permissions')->getBy([
  109. 'url' => $item[1],
  110. 'policy' => $item[2]
  111. ]);
  112. if (!in_array($user_permission->id, $permissions)){
  113. // 要删掉的旧授权
  114. $this->enforcer::DeletePermissionForUser($role->name, $item[1], $item[2]);
  115. }
  116. }
  117. // 查再更新 菜单权限更新
  118. $pro = model('PermissionsRole')->getBy(['role_id' => $role->id]);
  119. if ($pro){
  120. model('PermissionsRole')->allowField(true)->save([
  121. 'permission_idx' => ltrim($perm_roles_idx,',')
  122. ],['role_id' => $role->id]);
  123. }else {
  124. model('PermissionsRole')::create([
  125. 'permission_idx' => ltrim($perm_roles_idx,','),
  126. 'role_id' => $role->id], true
  127. );
  128. }
  129. return IResponse::success([],'角色授权成功');
  130. }
  131. return IResponse::failure('角色不存在');
  132. }
  133. /**
  134. * 新增角色
  135. *
  136. * @author 许祖兴 < zuxing.xu@lettered.cn>
  137. * @date 2020/3/16 14:24
  138. *
  139. */
  140. public function save()
  141. {
  142. // 接收数据
  143. $params = $this->request->param();
  144. // 数据校验
  145. $valid = $this->validate($params,[
  146. 'name|角色名称' => 'require|alpha|unique:Roles',
  147. 'description|角色描述' => 'require'
  148. ],[
  149. 'name.alpha' => '角色名称仅支持英文!',
  150. 'name.unique' => '角色名称已存在!'
  151. ]);
  152. (true !== $valid) && IResponse::failure($valid);
  153. // 保存数据
  154. $res = model('Roles')->storeBy($params);
  155. return $res ? IResponse::success([],'新增角色成功'):
  156. IResponse::failure('新增角色异常');
  157. }
  158. /**
  159. * 更新数据
  160. *
  161. * @author 许祖兴 < zuxing.xu@lettered.cn>
  162. * @date 2020/3/16 14:24
  163. *
  164. * @param $id
  165. * @return \think\response\Json
  166. */
  167. public function update($id)
  168. {
  169. // 接收数据
  170. $params = $this->request->param();
  171. // 数据校验
  172. $valid = $this->validate($params,[
  173. 'name|角色名称' => 'require|alpha',
  174. 'description|角色描述' => 'require'
  175. ],[
  176. 'name.alpha' => '角色名称仅支持英文!'
  177. ]);
  178. // 校验失败
  179. (true !== $valid) && IResponse::failure($valid);
  180. // 查改
  181. $role = model('Roles')->findBy($id);
  182. $role->updateBy($id, $params);
  183. return IResponse::success('更新角色信息成功');
  184. }
  185. /**
  186. * 删除角色
  187. *
  188. * @author 许祖兴 < zuxing.xu@lettered.cn>
  189. * @date 2020/3/16 14:22
  190. *
  191. * @param $id
  192. * @return \think\response\Json
  193. */
  194. public function delete($id)
  195. {
  196. model('Roles')->deleteBy($id);
  197. return IResponse::success([],'删除角色成功');
  198. }
  199. }