AuthorityService.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. namespace App\Services;
  3. use App\Authority;
  4. use Illuminate\Database\Eloquent\Builder;
  5. use Illuminate\Database\Eloquent\Collection;
  6. use Illuminate\Support\Facades\Auth;
  7. use Illuminate\Support\Facades\Cache;
  8. use App\Traits\ServiceAppAop;
  9. use Illuminate\Support\Facades\DB;
  10. class AuthorityService
  11. {
  12. use ServiceAppAop;
  13. protected $modelClass=Authority::class;
  14. public function getUserAuthority()
  15. {
  16. if (!Auth::user())return new Collection();
  17. $key = "authorities:user_".Auth::id();
  18. $isAdmin = array_search(Auth::user()["name"],config("users.superAdmin"))!==false;
  19. $tag = $isAdmin ? "authorities:admin" : "authorities:user";
  20. if (!Cache::tags($tag)->has($key)){
  21. if ($isAdmin) Cache::tags("authorities:admin")->forever($key,Authority::query()->get());
  22. else Cache::tags("authorities:user")->forever($key,Authority::query()->whereHas("roles",function (Builder $query){
  23. $query->whereHas("users",function (Builder $query){
  24. $query->where(DB::raw("users.id"),Auth::id());
  25. });
  26. })->get());
  27. }
  28. return Cache::tags($tag)->get($key);
  29. }
  30. public function removeAdminAuth()
  31. {
  32. Cache::tags("authorities:admin")->flush();
  33. }
  34. public function removeAllAuth()
  35. {
  36. Cache::tags("authorities:admin")->flush();
  37. Cache::tags("authorities:user")->flush();
  38. }
  39. /**
  40. * 格式化为树状结构
  41. *
  42. * @param Collection $authorities
  43. * @return array
  44. */
  45. public function format($authorities)
  46. {
  47. $authMap = [];
  48. foreach ($authorities as $authority){
  49. $item = $authority->toArray();
  50. $item["child"] = [];
  51. $authMap[$authority->id] = $item;
  52. }
  53. foreach ($authorities as $authority){
  54. if ($authority->parent_id){
  55. if (!isset($authMap[$authority->parent_id])){
  56. $authTem = $this->formatAuthority($authMap,$authMap[$authority->id]);
  57. if ($authTem)$authMap = $authTem;
  58. } else $authMap[$authority->parent_id]["child"][] = $authMap[$authority->id];
  59. unset($authMap[$authority->id]);
  60. }
  61. }
  62. return $authMap;
  63. }
  64. /**
  65. * 递归格式化权限组
  66. *
  67. * @param array $authMap
  68. * @param array $authorities
  69. *
  70. * @return array|bool
  71. */
  72. private function formatAuthority(array $authMap,array $authorities)
  73. {
  74. foreach ($authMap as $index=>$data){
  75. if ($data["id"]==$authorities["parent_id"]){
  76. $authMap[$index]["child"][] = $authorities;
  77. unset($authMap[$authorities["id"]]);
  78. return $authMap;
  79. }else{
  80. if ($authMap[$index]["child"]){
  81. $re = $this->formatAuthority($authMap[$index]["child"],$authorities);
  82. if ($re){
  83. $authMap[$index]["child"] = $re;
  84. return $authMap;
  85. }
  86. }
  87. }
  88. }
  89. return false;
  90. }
  91. }