PermissionController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. <?php
  2. /**
  3. * 管理权限分配.
  4. *
  5. * @author jim <jim458734573@gmail.com>
  6. * @date 2020-01-23 23:55:52
  7. */
  8. declare(strict_types=1);
  9. namespace Modules\Manage\Controllers;
  10. use App\Constants\CommonConstant;
  11. use App\Model\ManagerModel;
  12. use App\Repositories\Criterias\OrderLimitCriteria;
  13. use App\Repositories\PermissionResourceRepository;
  14. use App\Repositories\PermissionRoleRepository;
  15. use Hyperf\Validation\Contract\ValidatorFactoryInterface;
  16. use Modules\Manage\Responses\CommonPagesResponse;
  17. use Modules\Manage\Responses\CommonSuccessPkResponse;
  18. use Modules\Manage\Responses\PermissionRoleDetailResponse;
  19. use Modules\Manage\Responses\PermissionRolePagesResponse;
  20. use Hyperf\DbConnection\Db;
  21. class PermissionController extends BaseController
  22. {
  23. /**
  24. * 分页列表.
  25. * @param ValidatorFactoryInterface $validatorFactory
  26. * @return mixed|CommonPagesResponse
  27. */
  28. public function resourceLists(ValidatorFactoryInterface $validatorFactory)
  29. {
  30. $inputData = $this->getJsonData();
  31. $rules = [
  32. 'page' => 'nullable|integer',
  33. 'page_size' => 'nullable|integer',
  34. ];
  35. $validator = $validatorFactory->make($inputData, $rules);
  36. if ($validator->fails()) {
  37. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  38. return json_fail($validator->errors()->first());
  39. }
  40. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  41. if ($pageSize > 500) {
  42. $pageSize = CommonConstant::PAGE_SIZE;
  43. }
  44. $page = format_page($inputData['page']);
  45. $orders = [
  46. ['id', 'ASC'],
  47. ];
  48. $lists = make(PermissionResourceRepository::class)->pushCriteria(new OrderLimitCriteria($orders))->paginate($pageSize, ['*'], $page);
  49. return new CommonPagesResponse($lists);
  50. }
  51. /**
  52. * 删除.
  53. * @param ValidatorFactoryInterface $validatorFactory
  54. * @return mixed
  55. */
  56. public function resourceDelete(ValidatorFactoryInterface $validatorFactory)
  57. {
  58. $inputData = $this->getJsonData();
  59. $rules = [
  60. 'id' => 'required',
  61. ];
  62. $validator = $validatorFactory->make($inputData, $rules);
  63. if ($validator->fails()) {
  64. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  65. return json_fail($validator->errors()->first());
  66. }
  67. $item = make(PermissionResourceRepository::class)->find($inputData['id']);
  68. if (empty($item)) {
  69. return json_fail(trans('common.err_resource_not_found'));
  70. }
  71. $oldItem = clone $item;
  72. $result = $item->delete();
  73. if (!$result) {
  74. return json_fail('删除失败');
  75. } else {
  76. $logSubject = '删除一个权限资源,id:'. $oldItem->id;
  77. $logSvalue = $oldItem->id;
  78. $logDbData = [
  79. 'after_items' => [
  80. ],
  81. 'before_items' => [
  82. $oldItem->toArray(),
  83. ],
  84. ];
  85. $this->log($logSubject, $logSvalue, $logDbData);
  86. return new CommonSuccessPkResponse($inputData['id']);
  87. }
  88. }
  89. /**
  90. * 详情角色.
  91. * @param ValidatorFactoryInterface $validatorFactory
  92. * @return mixed
  93. */
  94. public function roleDetail(ValidatorFactoryInterface $validatorFactory)
  95. {
  96. $inputData = $this->getJsonData();
  97. $rules = [
  98. 'id' => 'required',
  99. ];
  100. $validator = $validatorFactory->make($inputData, $rules);
  101. if ($validator->fails()) {
  102. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  103. return json_fail($validator->errors()->first());
  104. }
  105. $item = make(PermissionRoleRepository::class)->find($inputData['id']);
  106. return new PermissionRoleDetailResponse($item);
  107. }
  108. /**
  109. * 添加角色.
  110. * @param ValidatorFactoryInterface $validatorFactory
  111. * @return mixed
  112. */
  113. public function roleAdd(ValidatorFactoryInterface $validatorFactory)
  114. {
  115. $inputData = $this->getJsonData();
  116. $rules = [
  117. 'name' => 'required|max:60',
  118. 'permissions' => 'required|array',
  119. 'squad' => 'nullable|integer',
  120. ];
  121. $validator = $validatorFactory->make($inputData, $rules);
  122. if ($validator->fails()) {
  123. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  124. return json_fail($validator->errors()->first());
  125. }
  126. if (isset($inputData['permissions'])) {
  127. $permissions = !empty($inputData['permissions']) ? implode(',', $inputData['permissions']) : '';
  128. } else {
  129. $permissions = '';
  130. }
  131. if (!isset($inputData['squad'])) {
  132. $squad = 1000;
  133. } else {
  134. $squad = intval($inputData['squad']);
  135. }
  136. $setarr = [
  137. 'name' => trim($inputData['name']),
  138. 'permissions' => $permissions,
  139. 'squad' => $squad,
  140. ];
  141. $result = make(PermissionRoleRepository::class)->create($setarr);
  142. if (!$result) {
  143. return json_fail('创建失败');
  144. } else {
  145. $logSubject = '添加一个角色, 新名称:'. $result->name;
  146. $logSvalue = $result->id;
  147. $logDbData = [
  148. 'after_items' => [
  149. $result->toArray(),
  150. ],
  151. 'before_items' => [
  152. ],
  153. ];
  154. $this->log($logSubject, $logSvalue, $logDbData);
  155. return new CommonSuccessPkResponse($result->id);
  156. }
  157. }
  158. /**
  159. * 修改角色.
  160. * @param ValidatorFactoryInterface $validatorFactory
  161. * @return mixed|CommonSuccessPkResponse
  162. */
  163. public function roleModify(
  164. ValidatorFactoryInterface $validatorFactory
  165. ) {
  166. $inputData = $this->getJsonData();
  167. $rules = [
  168. 'id' => 'required',
  169. 'name' => 'required|max:60',
  170. 'permissions' => 'required|array',
  171. 'squad' => 'nullable|integer',
  172. ];
  173. $validator = $validatorFactory->make($inputData, $rules);
  174. if ($validator->fails()) {
  175. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  176. return json_fail($validator->errors()->first());
  177. }
  178. $item = make(PermissionRoleRepository::class)->find($inputData['id']);
  179. if (empty($item)) {
  180. return json_fail(trans('common.err_resource_not_found'));
  181. }
  182. $oldItem = clone $item;
  183. if (isset($inputData['permissions'])) {
  184. $permissions = !empty($inputData['permissions']) ? implode(',', $inputData['permissions']) : '';
  185. } else {
  186. $permissions = '';
  187. }
  188. if (!isset($inputData['squad'])) {
  189. $squad = 1000;
  190. } else {
  191. $squad = intval($inputData['squad']);
  192. }
  193. $oldName = $item->name;
  194. $name = trim($inputData['name']);
  195. $item->name = $name;
  196. $item->permissions = $permissions;
  197. $item->squad = $squad;
  198. $result = false;
  199. Db::beginTransaction();
  200. try {
  201. $result = $item->save();
  202. if ($result) {
  203. if ($name != $oldName) {
  204. // 批量替换冗余的管理角色名称.
  205. $rows = ManagerModel::where('role_id', $inputData['id'])->update(['role_name' => $name]);
  206. }
  207. }
  208. Db::commit();
  209. } catch (\Throwable $e) {
  210. Db::rollBack();
  211. }
  212. if (!$result) {
  213. return json_fail('修改失败');
  214. } else {
  215. $logSubject = '修改一个角色, 新名称:'. $item->name;
  216. $logSvalue = $item->id;
  217. $logDbData = [
  218. 'after_items' => [
  219. $item->toArray(),
  220. ],
  221. 'before_items' => [
  222. $oldItem->toArray(),
  223. ],
  224. ];
  225. $this->log($logSubject, $logSvalue, $logDbData);
  226. return new CommonSuccessPkResponse($item->id);
  227. }
  228. }
  229. /**
  230. * 删除角色.
  231. * @param ValidatorFactoryInterface $validatorFactory
  232. * @return mixed|CommonSuccessPkResponse
  233. */
  234. public function roleDelete(ValidatorFactoryInterface $validatorFactory)
  235. {
  236. $inputData = $this->getJsonData();
  237. $rules = [
  238. 'id' => 'required',
  239. ];
  240. $validator = $validatorFactory->make($inputData, $rules);
  241. if ($validator->fails()) {
  242. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  243. return json_fail($validator->errors()->first());
  244. }
  245. $item = make(PermissionRoleRepository::class)->find($inputData['id']);
  246. if (empty($item)) {
  247. return json_fail(trans('common.err_resource_not_found'));
  248. }
  249. $oldItem = clone $item;
  250. $result = $item->delete();
  251. if (!$result) {
  252. return json_fail('删除失败');
  253. } else {
  254. $logSubject = '删除一个角色, 名称:'. $oldItem->name;
  255. $logSvalue = $oldItem->id;
  256. $logDbData = [
  257. 'after_items' => [
  258. ],
  259. 'before_items' => [
  260. $oldItem->toArray(),
  261. ],
  262. ];
  263. $this->log($logSubject, $logSvalue, $logDbData);
  264. return new CommonSuccessPkResponse($inputData['id']);
  265. }
  266. }
  267. /**
  268. * 角色页列表.
  269. * @param ValidatorFactoryInterface $validatorFactory
  270. * @return mixed|CommonPagesResponse
  271. */
  272. public function roleLists(ValidatorFactoryInterface $validatorFactory)
  273. {
  274. $inputData = $this->getJsonData();
  275. $rules = [
  276. 'page' => 'nullable|integer',
  277. 'page_size' => 'nullable|integer',
  278. ];
  279. $validator = $validatorFactory->make($inputData, $rules);
  280. if ($validator->fails()) {
  281. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  282. return json_fail($validator->errors()->first());
  283. }
  284. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  285. if ($pageSize > 500) {
  286. $pageSize = CommonConstant::PAGE_SIZE;
  287. }
  288. $page = format_page($inputData['page']);
  289. $orders = [
  290. ['squad', 'DESC'],
  291. ['id', 'DESC'],
  292. ];
  293. // 注意,单例分页一定要克隆一个(保证前面没用使用到paginate);
  294. $lists = make(PermissionRoleRepository::class)->pushCriteria(new OrderLimitCriteria($orders))->paginate($pageSize, ['*'], $page);
  295. return new PermissionRolePagesResponse($lists);
  296. }
  297. /**
  298. * 获取有效树形权限.
  299. * @return mixed
  300. */
  301. public function allTree()
  302. {
  303. // $rTree = make(PermissionResourceRepository::class)->getAllEnableTree();
  304. $rTree = make(PermissionResourceRepository::class)->getAllEnableTreeName();
  305. return json_success($rTree);
  306. }
  307. }