Role.php 7.3 KB

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