Просмотр исходного кода

优化了权限读取效率,使用了缓存

LD 5 лет назад
Родитель
Сommit
fd646f1f72

+ 1 - 1
app/Http/Controllers/OrderTrackingOwnerController.php

@@ -37,7 +37,7 @@ class OrderTrackingOwnerController extends Controller
             return ['success' => false, 'fail_info' => '权限不足'];
         }
         $user = Auth::user();
-        $owner_ids = $user ? $user->getPermittingOwnerIdsAttribute() : [];
+        $owner_ids = $user ? app('UserService')->getPermittingOwnerIds($user) : [];
         $owner = Owner::query()->with('orderTrackingOwner')
             ->whereIn('id',$owner_ids)
             ->whereHas('orderTrackingOwner',function ($query){$query->where('status','启用');})

+ 2 - 2
app/Http/Controllers/RejectedBillController.php

@@ -69,7 +69,7 @@ class RejectedBillController extends Controller
             return ['success'=>'false','fail_info'=>'没有权限'];}
         $user=Auth::user();
         $rejectedBills = RejectedBill::query()->orderByDesc('id')->whereIn('id_owner',
-            $user?$user->getPermittingOwnerIdsAttribute():[])->limit(20)->get();
+            $user?app('UserService')->getPermittingOwnerIds($user):[])->limit(20)->get();
         return ['success'=>'true','rejectedBills'=>$rejectedBills->toArray()];
     }
 
@@ -233,7 +233,7 @@ class RejectedBillController extends Controller
         if(!Gate::allows('退货管理-编辑')){ return redirect(url('/'));  }
         $user=Auth::user();
         $owners=Owner::all()->whereIn('id',
-            $user?$user->getPermittingOwnerIdsAttribute():[])->sortBy('name');
+            $user?app('UserService')->getPermittingOwnerIds($user):[])->sortBy('name');
         $logistics=Logistic::all()->sortBy('name');
         $qualityLabels=QualityLabel::all()->sortBy('name');
         $rejectedBill['is_loaded'] = $rejectedBill['is_loaded_null'];

+ 4 - 4
app/Http/Controllers/RejectedController.php

@@ -67,7 +67,7 @@ class RejectedController extends Controller
         $paginateParams = $this->packFilterParams($request);
         $paginateParams['paginate']=$paginate;
         $rejectedQuery=$this->buildFilteredQuery($paginateParams)->orderBy('id','desc')->whereIn('id_owner',
-            $user?$user->getPermittingOwnerIdsAttribute():[])->withTrashed()->whereNotNull('deleted_at');
+            $user?app('UserService')->getPermittingOwnerIds($user):[])->withTrashed()->whereNotNull('deleted_at');
         $total = $rejectedQuery->count();
         $rejectedBills=$rejectedQuery->paginate($paginate);
         return view('rejected.recycle',compact('rejectedBills','total','paginateParams'));
@@ -233,11 +233,11 @@ class RejectedController extends Controller
         if(!Gate::allows('退货管理-录入')){ return redirect(url('/'));}
         $user=Auth::user();
         $owners=Owner::all()->whereIn('id',
-            $user?$user->getPermittingOwnerIdsAttribute():[])->sortBy('name');
+            $user?app('UserService')->getPermittingOwnerIds($user):[])->sortBy('name');
         $logistics=Logistic::all()->sortBy('name');
         $qualityLabels=QualityLabel::all()->sortBy('name');
         $rejectedBills = RejectedBill::query()->orderByDesc('id')->whereIn('id_owner',
-            $user?$user->getPermittingOwnerIdsAttribute():[])->limit(20)->get();
+            $user?app('UserService')->getPermittingOwnerIds($user):[])->limit(20)->get();
         foreach($rejectedBills as $bill){
             $bill['is_loaded'] = $bill['is_loaded_null'];
             $bill['isEditing'] = false;
@@ -436,7 +436,7 @@ class RejectedController extends Controller
         $filterParams=json_decode($request->input('filterParams'),true);
         $user=Auth::user();
         $rejectedBills=$this->buildFilteredQuery($filterParams)->orderBy('id','desc')->whereIn('id_owner',
-            $user?$user->getPermittingOwnerIdsAttribute():[]);
+            $user?app('UserService')->getPermittingOwnerIds($user):[]);
         if($rejectedBills->count()>RejectedExport::$max){
             $rejectedBills->where('is_finished',false);
         }

+ 1 - 1
app/Owner.php

@@ -21,7 +21,7 @@ class Owner extends Model
         if(!$user){
             return $query->where('id','0');
         }
-        $ownerIds=$user->getPermittingOwnerIdsAttribute();
+        $ownerIds=app('UserService')->getPermittingOwnerIds($user);
         return $query->whereIn('id',$ownerIds);
     }
 

+ 1 - 1
app/Process.php

@@ -23,7 +23,7 @@ class Process extends Model
         if(!$user){
             return (new static)->newQuery()->where('processes.owner_id','0');
         }
-        $ownerIds=$user->getPermittingOwnerIdsAttribute();
+        $ownerIds=app('UserService')->getPermittingOwnerIds($user);
         return (new static)->newQuery()->whereIn('processes.owner_id',$ownerIds);
     }
 

+ 4 - 1
app/Providers/AuthServiceProvider.php

@@ -5,6 +5,7 @@ namespace App\Providers;
 use App\Authority;
 use App\Services\AuthorityService;
 use App\Services\CacheService;
+use App\Services\UserService;
 use App\User;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
@@ -60,7 +61,9 @@ class AuthServiceProvider extends ServiceProvider
                 $authorityRoles=$cacheService->getOrExecute("authority{$authority['id']}->roles",function ()use($authority){
                     return $authority->roles;
                 });
-                return $user->hasRole($authorityRoles);
+                /** @var UserService $userService */
+                $userService = app('UserService');
+                return $userService->hasRoles($user,$authorityRoles);
             });
         }
     }

+ 1 - 1
app/Services/OrderIssueService.php

@@ -36,7 +36,7 @@ class OrderIssueService
             $condition = $arr;
         }
         $user = Auth::user();
-        $owner_ids = $user ? $user->getPermittingOwnerIdsAttribute() : [];
+        $owner_ids = $user ? app('UserService')->getPermittingOwnerIds($user) : [];
         if ($condition['owner_id'] ?? false) {
             $owner_ids = explode(',', $condition['owner_id']);
         }

+ 2 - 2
app/Services/OrderIssueWorkLoadService.php

@@ -16,7 +16,7 @@ class OrderIssueWorkLoadService
     public function getQuery(array $queryParam)
     {
         $user = Auth::user();
-        $owner_ids = $user ? $user->getPermittingOwnerIdsAttribute() : [];
+        $owner_ids = $user ? app('UserService')->getPermittingOwnerIds($user) : [];
         $query = OrderIssue::with(['logs.user','order' => function ($query) {
             $query->with(['packages', 'owner']);
         }])->whereHas('order', function ($query) use (&$queryParam, $owner_ids) {
@@ -84,7 +84,7 @@ class OrderIssueWorkLoadService
     }
 
     public function getOwners(){
-        $owner_ids = Auth::user()->getPermittingOwnerIdsAttribute()??[];
+        $owner_ids = app('UserService')->getPermittingOwnerIds($user)??[];
         return Owner::whereIn('id', $owner_ids)->get();
     }
 

+ 1 - 1
app/Services/OrderTrackingService.php

@@ -28,7 +28,7 @@ class OrderTrackingService
     public function getQuery($params)
     {
         $user = Auth::user();
-        $owner_ids = $user ? $user->getPermittingOwnerIdsAttribute() : [];
+        $owner_ids = $user ? app('UserService')->getPermittingOwnerIds($user) : [];
         if ($params['owner_id'] ?? false) {
             $ownerids = explode(",", $params['owner_id']);
             $owner_ids = array_intersect($owner_ids, $ownerids);

+ 1 - 1
app/Services/OwnerService.php

@@ -134,7 +134,7 @@ Class OwnerService
 
     public function getAuthorizedOwners(){
         $user = Auth::user();
-        return Owner::query()->whereIn('id',$user->getPermittingOwnerIdsAttribute()??[])->get();
+        return Owner::query()->whereIn('id',app('UserService')->getPermittingOwnerIds($user)??[])->get();
     }
 
 }

+ 4 - 4
app/Services/PackageStatisticsService.php

@@ -1,6 +1,6 @@
-<?php 
+<?php
 
-namespace App\Services; 
+namespace App\Services;
 
 use App\OrderPackage;
 use App\Services\common\QueryService;
@@ -15,7 +15,7 @@ Class PackageStatisticsService
      * @return Builder
      */
     private function conditionQuery(array $params){
-        $ownerIds = Auth::user()->getPermittingOwnerIdsAttribute();
+        $ownerIds = app('UserService')->getPermittingOwnerIds(auth()->user());
         $query = DB::table('order_packages')->select(DB::raw('COUNT(*) AS count'))
             ->whereIn('owner_id',$ownerIds)
             ->whereNotNull('logistic_id')
@@ -47,4 +47,4 @@ Class PackageStatisticsService
             ->get();
     }
 
-}
+}

+ 1 - 1
app/Services/RejectedService.php

@@ -22,7 +22,7 @@ class RejectedService
     {
         $user = Auth::user();
         $rejectedBills = RejectedBill::query()->with('user','owner', 'logistic', 'items.quality')->orderBy('rejected_bills.id', 'desc')->whereIn('rejected_bills.id_owner',
-            $user ? $user->getPermittingOwnerIdsAttribute() : []);
+            $user ? app('UserService')->getPermittingOwnerIds($user) : []);
         $columnQueryRules = [
             'created_at_start' => ['alias' => 'created_at', 'startDate' => ' 00:00:00'],
             'created_at_end' => ['alias' => 'created_at', 'endDate' => ' 23:59:59'],

+ 19 - 8
app/Services/UserService.php

@@ -4,18 +4,29 @@
 namespace App\Services;
 
 
+use App\Authority;
+use App\Owner;
 use App\User;
 use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Gate;
 
 class UserService
 {
-    function getRoles(User $user){
-        if(!$user['id']??'') throw new \Exception('User对象或id不能为空');
-        $roles = Cache::get('userGetRoles'.$user['id']);
-        if(!$roles){
-            $roles=$user->roles;
-            Cache::put('userGetRoles'.$user['id'],$roles,config('cache.expirations.default'));
-        }
-        return $roles;
+    /** @var CacheService $cacheService */
+    private $cacheService;
+    function __construct(){
+        $this->cacheService = app('CacheService');
+    }
+
+    function hasRoles(User $user, $roles){
+        $thisRoles=$this->cacheService->getOrExecute("user{$user['id']}->roles",function()use($user){
+            return $user->roles;
+        });
+        return !!$roles->intersect($thisRoles)->count();
+    }
+    function getPermittingOwnerIds($user){
+        return $this->cacheService->getOrExecute("user{$user['id']}->getPermittingOwnerIds",function()use($user){
+            return $user->getPermittingOwnerIdsAttribute();
+        });
     }
 }

+ 8 - 10
app/User.php

@@ -45,11 +45,9 @@ class User extends Authenticatable
     protected $casts = [
         'email_verified_at' => 'datetime',
     ];
-    function hasRole($roles){
-        /** @var UserService $userService */
-        $userService = app('UserService');
-        return !!$roles->intersect($userService->getRoles())->count();
-    }
+//    function hasRole($roles){
+//        return !!$roles->intersect($this->roles()->get())->count();
+//    }
     function isSuperAdmin(){
         $superAdmins=config("users.superAdmin");
         foreach ($superAdmins as $superAdmin){
@@ -95,14 +93,14 @@ class User extends Authenticatable
 
     function authorities(){
         $authorities = new Collection([]);
-        $this->roles()->each(function ($role)use(&$authorities){
-            if($role->authorities()->get()->isNotEmpty()){
+        $user=User::query()->where('id',$this['id'])->with('roles.authorities')->first();
+        $user->roles->each(function ($role)use(&$authorities){
+            if($role->authorities){
                 if(!$authorities){
-                    $authorities=$role->authorities()->get();
+                    $authorities=$role->authorities;
                 }else{
-                    $authorities=$authorities->merge($role->authorities()->get());
+                    $authorities=$authorities->merge($role->authorities);
                 }
-
             }
         });
         return $authorities;

+ 2 - 2
app/Waybill.php

@@ -2,6 +2,7 @@
 
 namespace App;
 
+use App\Services\UserService;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
@@ -79,8 +80,7 @@ class Waybill extends Model
      * @return Builder
      */
     public static function filterAuthorities(){
-        $user = Auth::user();
-        $owner_ids=$user->getPermittingOwnerIdsAttribute();
+        $owner_ids=app('UserService')->getPermittingOwnerIds(auth()->user());
         return (new static)->newQuery()->whereIn('owner_id',$owner_ids);
     }