PermissionController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. <?php
  2. /**
  3. * 管理权限分配.
  4. *
  5. * @author nj
  6. * @date 2021-01-23 23:55:52
  7. */
  8. namespace Modules\ManageApi\Controllers;
  9. use App\Constants\CommonConstant;
  10. use App\Repositories\Criterias\OrderLimitCriteria;
  11. use App\Models\Mysql\ManagerModel;
  12. use App\Models\Mysql\PermissionResourceModel;
  13. use App\Models\Mysql\PermissionRoleModel;
  14. use App\Repositories\ManagerRepository;
  15. use App\Repositories\PermissionResourceRepository;
  16. use App\Repositories\PermissionRoleRepository;
  17. use Modules\ManageApi\Responses\CommonPagesResponse;
  18. use Modules\ManageApi\Responses\CommonSuccessPkResponse;
  19. use Modules\ManageApi\Responses\PermissionRoleDetailResponse;
  20. use Modules\ManageApi\Responses\PermissionRolePagesResponse;
  21. use Validator;
  22. use DB;
  23. class PermissionController extends BaseController
  24. {
  25. /**
  26. * 分页列表.
  27. * @return \Illuminate\Http\JsonResponse|CommonPagesResponse
  28. */
  29. public function resourceLists()
  30. {
  31. /**
  32. * @var Validator $validatorFactory
  33. */
  34. $validatorFactory = app('validator');
  35. /**
  36. * @var PermissionResourceRepository $permissionResourceRepo
  37. */
  38. $permissionResourceRepo = make(PermissionResourceRepository::class);
  39. $inputData = $this->getJsonData();
  40. // 针对layui table自动分页请求参数,优先GET值.
  41. $queryPage = request()->has('page') ? request()->input('page', 1) : null;
  42. $queryPageSize = request()->has('page_size') ? request()->input('page_size', 10) : null;
  43. if (!is_null($queryPage)) {
  44. $inputData['page'] = $queryPage;
  45. }
  46. if (!is_null($queryPageSize)) {
  47. $inputData['page_size'] = $queryPageSize;
  48. }
  49. $rules = [
  50. 'page' => 'nullable|integer',
  51. 'page_size' => 'nullable|integer',
  52. ];
  53. $validator = $validatorFactory->make($inputData, $rules);
  54. if ($validator->fails()) {
  55. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  56. return json_fail($validator->errors()->first());
  57. }
  58. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  59. if ($pageSize > 500) {
  60. $pageSize = CommonConstant::PAGE_SIZE;
  61. }
  62. $page = format_page($inputData['page']);
  63. $orders = [
  64. ['id', 'DESC'],
  65. ];
  66. $lists = $permissionResourceRepo->pushCriteria(new OrderLimitCriteria($orders))->paginate($pageSize, ['*'], $page);
  67. return new CommonPagesResponse($lists);
  68. }
  69. /**
  70. * 删除.
  71. * @return \Illuminate\Http\JsonResponse|CommonSuccessPkResponse
  72. * @throws \Exception
  73. */
  74. public function resourceDelete()
  75. {
  76. /**
  77. * @var Validator $validatorFactory
  78. */
  79. $validatorFactory = app('validator');
  80. /**
  81. * @var PermissionResourceRepository $permissionResourceRepo
  82. */
  83. $permissionResourceRepo = make(PermissionResourceRepository::class);
  84. $inputData = $this->getJsonData();
  85. $rules = [
  86. 'id' => 'required',
  87. ];
  88. $validator = $validatorFactory->make($inputData, $rules);
  89. if ($validator->fails()) {
  90. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  91. return json_fail($validator->errors()->first());
  92. }
  93. $item = $permissionResourceRepo->find($inputData['id']);
  94. if (empty($item)) {
  95. return json_fail(trans('common.err_resource_not_found'));
  96. }
  97. $oldItem = clone $item;
  98. $result = $item->delete();
  99. if (!$result) {
  100. return json_fail('删除失败');
  101. } else {
  102. $logSubject = '删除一个权限资源,id:'. $oldItem->id;
  103. $logSvalue = $oldItem->id;
  104. $logDbData = [
  105. 'after_items' => [
  106. ],
  107. 'before_items' => [
  108. $oldItem->toArray(),
  109. ],
  110. ];
  111. $this->log($logSubject, $logSvalue, $logDbData);
  112. return new CommonSuccessPkResponse($inputData['id']);
  113. }
  114. }
  115. /**
  116. * 详情角色.
  117. * @return mixed
  118. */
  119. public function roleDetail()
  120. {
  121. /**
  122. * @var Validator $validatorFactory
  123. */
  124. $validatorFactory = app('validator');
  125. /**
  126. * @var PermissionRoleRepository $permissionRoleRepository
  127. */
  128. $permissionRoleRepository = make(PermissionRoleRepository::class);
  129. $inputData = $this->getJsonData();
  130. $rules = [
  131. 'id' => 'required',
  132. ];
  133. $validator = $validatorFactory->make($inputData, $rules);
  134. if ($validator->fails()) {
  135. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  136. return json_fail($validator->errors()->first());
  137. }
  138. $item = $permissionRoleRepository->find($inputData['id']);
  139. return new PermissionRoleDetailResponse($item);
  140. }
  141. /**
  142. * 添加角色.
  143. * @return mixed
  144. */
  145. public function roleAdd()
  146. {
  147. /**
  148. * @var Validator $validatorFactory
  149. */
  150. $validatorFactory = app('validator');
  151. /**
  152. * @var PermissionRoleRepository $permissionRoleRepository
  153. */
  154. $permissionRoleRepository = make(PermissionRoleRepository::class);
  155. $inputData = $this->getJsonData();
  156. $rules = [
  157. 'name' => 'required|max:60',
  158. 'permissions' => 'required|array',
  159. 'squad' => 'nullable|integer',
  160. ];
  161. $validator = $validatorFactory->make($inputData, $rules);
  162. if ($validator->fails()) {
  163. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  164. return json_fail($validator->errors()->first());
  165. }
  166. if (isset($inputData['permissions'])) {
  167. $permissions = !empty($inputData['permissions']) ? implode(',', $inputData['permissions']) : '';
  168. } else {
  169. $permissions = '';
  170. }
  171. if (!isset($inputData['squad'])) {
  172. $squad = 1000;
  173. } else {
  174. $squad = intval($inputData['squad']);
  175. }
  176. $setarr = [
  177. 'name' => trim($inputData['name']),
  178. 'permissions' => $permissions,
  179. 'squad' => $squad,
  180. ];
  181. $result = $permissionRoleRepository->create($setarr);
  182. if (!$result) {
  183. return json_fail('创建失败');
  184. } else {
  185. $logSubject = '添加一个角色, 新名称:'. $result->name;
  186. $logSvalue = $result->id;
  187. $logDbData = [
  188. 'after_items' => [
  189. $result->toArray(),
  190. ],
  191. 'before_items' => [
  192. ],
  193. ];
  194. $this->log($logSubject, $logSvalue, $logDbData);
  195. return new CommonSuccessPkResponse($result->id);
  196. }
  197. }
  198. /**
  199. * 修改角色.
  200. * @return mixed|CommonSuccessPkResponse
  201. */
  202. public function roleModify()
  203. {
  204. /**
  205. * @var Validator $validatorFactory
  206. */
  207. $validatorFactory = app('validator');
  208. /**
  209. * @var PermissionRoleRepository $permissionRoleRepository
  210. */
  211. $permissionRoleRepository = make(PermissionRoleRepository::class);
  212. /**
  213. * @var ManagerRepository $managerRepository
  214. */
  215. $managerRepository = make(ManagerRepository::class);
  216. $inputData = $this->getJsonData();
  217. $rules = [
  218. 'id' => 'required',
  219. 'name' => 'required|max:60',
  220. 'permissions' => 'required|array',
  221. 'squad' => 'nullable|integer',
  222. ];
  223. $validator = $validatorFactory->make($inputData, $rules);
  224. if ($validator->fails()) {
  225. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  226. return json_fail($validator->errors()->first());
  227. }
  228. $item = $permissionRoleRepository->find($inputData['id']);
  229. if (empty($item)) {
  230. return json_fail(trans('common.err_resource_not_found'));
  231. }
  232. $oldItem = clone $item;
  233. if (isset($inputData['permissions'])) {
  234. $permissions = !empty($inputData['permissions']) ? implode(',', $inputData['permissions']) : '';
  235. } else {
  236. $permissions = '';
  237. }
  238. if (!isset($inputData['squad'])) {
  239. $squad = 1000;
  240. } else {
  241. $squad = intval($inputData['squad']);
  242. }
  243. $oldName = $item->name;
  244. $name = trim($inputData['name']);
  245. $item->name = $name;
  246. $item->permissions = $permissions;
  247. $item->squad = $squad;
  248. $result = false;
  249. DB::beginTransaction();
  250. try {
  251. $result = $item->save();
  252. if ($result) {
  253. if ($name != $oldName) {
  254. // 批量替换冗余的管理角色名称.
  255. $rows = $managerRepository->update(['role_name' => $name], 'role_id', $inputData['id']);
  256. }
  257. }
  258. DB::commit();
  259. } catch (\Throwable $e) {
  260. DB::rollBack();
  261. }
  262. if (!$result) {
  263. return json_fail('修改失败');
  264. } else {
  265. $logSubject = '修改一个角色, 新名称:'. $item->name;
  266. $logSvalue = $item->id;
  267. $logDbData = [
  268. 'after_items' => [
  269. $item->toArray(),
  270. ],
  271. 'before_items' => [
  272. $oldItem->toArray(),
  273. ],
  274. ];
  275. $this->log($logSubject, $logSvalue, $logDbData);
  276. return new CommonSuccessPkResponse($item->id);
  277. }
  278. }
  279. /**
  280. * 删除角色.
  281. * @return \Illuminate\Http\JsonResponse|CommonSuccessPkResponse
  282. * @throws \Exception
  283. */
  284. public function roleDelete()
  285. {
  286. /**
  287. * @var Validator $validatorFactory
  288. */
  289. $validatorFactory = app('validator');
  290. /**
  291. * @var PermissionRoleRepository $permissionRoleRepository
  292. */
  293. $permissionRoleRepository = make(PermissionRoleRepository::class);
  294. $inputData = $this->getJsonData();
  295. $rules = [
  296. 'id' => 'required',
  297. ];
  298. $validator = $validatorFactory->make($inputData, $rules);
  299. if ($validator->fails()) {
  300. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  301. return json_fail($validator->errors()->first());
  302. }
  303. $item = $permissionRoleRepository->find($inputData['id']);
  304. if (empty($item)) {
  305. return json_fail(trans('common.err_resource_not_found'));
  306. }
  307. $oldItem = clone $item;
  308. $result = $item->delete();
  309. if (!$result) {
  310. return json_fail('删除失败');
  311. } else {
  312. $logSubject = '删除一个角色, 名称:'. $oldItem->name;
  313. $logSvalue = $oldItem->id;
  314. $logDbData = [
  315. 'after_items' => [
  316. ],
  317. 'before_items' => [
  318. $oldItem->toArray(),
  319. ],
  320. ];
  321. $this->log($logSubject, $logSvalue, $logDbData);
  322. return new CommonSuccessPkResponse($inputData['id']);
  323. }
  324. }
  325. /**
  326. * 角色页列表.
  327. * @return mixed|CommonPagesResponse
  328. */
  329. public function roleLists()
  330. {
  331. /**
  332. * @var Validator $validatorFactory
  333. */
  334. $validatorFactory = app('validator');
  335. /**
  336. * @var PermissionRoleRepository $permissionRoleRepository
  337. */
  338. $permissionRoleRepository = make(PermissionRoleRepository::class);
  339. $inputData = $this->getJsonData();
  340. // 针对layui table自动分页请求参数,优先GET值.
  341. $queryPage = request()->has('page') ? request()->input('page', 1) : null;
  342. $queryPageSize = request()->has('page_size') ? request()->input('page_size', 10) : null;
  343. if (!is_null($queryPage)) {
  344. $inputData['page'] = $queryPage;
  345. }
  346. if (!is_null($queryPageSize)) {
  347. $inputData['page_size'] = $queryPageSize;
  348. }
  349. $rules = [
  350. 'page' => 'nullable|integer',
  351. 'page_size' => 'nullable|integer',
  352. ];
  353. $validator = $validatorFactory->make($inputData, $rules);
  354. if ($validator->fails()) {
  355. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  356. return json_fail($validator->errors()->first());
  357. }
  358. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  359. if ($pageSize > 500) {
  360. $pageSize = CommonConstant::PAGE_SIZE;
  361. }
  362. $page = format_page($inputData['page']);
  363. $orders = [
  364. ['squad', 'DESC'],
  365. ['id', 'DESC'],
  366. ];
  367. // 注意,单例分页一定要克隆一个(保证前面没用使用到paginate);
  368. $lists = $permissionRoleRepository->pushCriteria(new OrderLimitCriteria($orders))->paginate($pageSize, ['*'], $page);
  369. return new PermissionRolePagesResponse($lists);
  370. }
  371. /**
  372. * 获取有效树形权限.
  373. * @return mixed
  374. */
  375. public function allTree()
  376. {
  377. /**
  378. * @var PermissionResourceRepository $obj
  379. */
  380. $obj = make(PermissionResourceRepository::class);
  381. $rTree = $obj->getAllEnableTree();
  382. return json_success($rTree);
  383. }
  384. }