Zhouzhendong 5 yıl önce
ebeveyn
işleme
fe323cc9b0

+ 29 - 1
app/Http/Controllers/MenuController.php

@@ -2,8 +2,14 @@
 
 
 namespace App\Http\Controllers;
 namespace App\Http\Controllers;
 
 
+use App\Authority;
+use App\Components\AsyncResponse;
+use App\Menu;
+use Illuminate\Support\Facades\DB;
+
 class MenuController extends Controller
 class MenuController extends Controller
 {
 {
+    use AsyncResponse;
     /**
     /**
      * Display a listing of the resource.
      * Display a listing of the resource.
      *
      *
@@ -16,6 +22,28 @@ class MenuController extends Controller
 
 
     public function update()
     public function update()
     {
     {
-
+        $update = [];
+        if (request()->has("parent_id"))$update["parent_id"] = request("parent_id");
+        if (request()->has("level"))$update["level"] = request("level");
+        if (request()->has("name"))$update["name"] = request("name");
+        if (request()->has("font"))$update["font"] = request("font");
+        if (request()->has("font_style"))$update["font_style"] = request("font_style");
+        if (request()->has("route"))$update["route"] = request("route");
+        if (request()->has("diff")){
+            $diff = request("diff");
+            Menu::query()->whereIn("id",request("child"))->update(["level"=>DB::raw("level - {$diff}")]);
+        }
+        if ($update && Menu::query()->where("id",request("id"))->update($update)){
+            app("MenuService")->setMenu();//重建菜单缓存
+            $mapping = app("MenuService")->getMenuAndAuthorityMapping();
+            $authorityUpdate = [];
+            if (request()->has("parent_id"))$authorityUpdate["id_parent"] = $mapping[request("parent_id")];
+            if (request()->has("name"))$authorityUpdate["name"] = $mapping[request("name")];
+            if ($authorityUpdate){
+                Authority::query()->where("id",$mapping[request("id")])->update($authorityUpdate);
+                app("AuthorityService")->removeAllAuth();//移除所有用户权限缓存,这将在用户下次访问时重新建立
+            }
+        }
+        $this->success();
     }
     }
 }
 }

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

@@ -189,7 +189,7 @@ class TestController extends Controller
     public function zzd()
     public function zzd()
     {
     {
         $ser = new MenuService();
         $ser = new MenuService();
-        dd($ser->getVisibleFunctionList());
+        dd($ser->getMenuAndAuthorityMapping());
     }
     }
 
 
     public function updateLaborRemark()
     public function updateLaborRemark()

+ 1 - 0
app/Services/AuthorityService.php

@@ -8,6 +8,7 @@ use App\Authority;
 use App\Role;
 use App\Role;
 use Exception;
 use Exception;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Cache;
 use App\Traits\ServiceAppAop;
 use App\Traits\ServiceAppAop;

+ 18 - 6
app/Services/MenuService.php

@@ -2,6 +2,7 @@
 
 
 namespace App\Services;
 namespace App\Services;
 
 
+use App\Authority;
 use App\Traits\ServiceAppAop;
 use App\Traits\ServiceAppAop;
 use App\Menu;
 use App\Menu;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Database\Eloquent\Collection;
@@ -43,11 +44,11 @@ class MenuService
         }
         }
     }
     }
 
 
-    public function getVisibleFunctionList()
+    //菜单与权限关联依据为 name与parent_id字段 当两个表中任意此字段发生变更 必须刷掉缓存
+    public function getVisibleFunctionList($authorities = null,&$mapping = [])
     {
     {
         /** @var Collection $authorities */
         /** @var Collection $authorities */
-        $authorities = app("AuthorityService")->getUserAuthority();
-        if (!$authorities)$authorities = [];
+        if (!$authorities)$authorities = app("AuthorityService")->getUserAuthority();
         $authMap = [];
         $authMap = [];
         foreach ($authorities as $authority){
         foreach ($authorities as $authority){
             $item = $authority->toArray();
             $item = $authority->toArray();
@@ -65,6 +66,7 @@ class MenuService
         $menuMap = [];
         $menuMap = [];
         foreach ($menus as $menu){
         foreach ($menus as $menu){
             $menuMap[$menu->id] = [
             $menuMap[$menu->id] = [
+                "id" => $menu->id,
                 "child" => [],
                 "child" => [],
                 "name"  => $menu->name,
                 "name"  => $menu->name,
                 "font"  => $menu->font,
                 "font"  => $menu->font,
@@ -78,7 +80,7 @@ class MenuService
                 unset($menuMap[$menu->id]);
                 unset($menuMap[$menu->id]);
             }
             }
         }
         }
-        return array_values($this->formatMenu($menuMap,$authMap));
+        return array_values($this->formatMenu($menuMap,$authMap,$mapping));
     }
     }
 
 
     /**
     /**
@@ -114,17 +116,18 @@ class MenuService
      *
      *
      * @param array $menus
      * @param array $menus
      * @param array $authorities
      * @param array $authorities
+     * @param array $mapping
      *
      *
      * @return array|bool
      * @return array|bool
      */
      */
-    private function formatMenu(array $menus,array $authorities)
+    private function formatMenu(array $menus,array $authorities,&$mapping=[])
     {
     {
         foreach ($menus as $index=>$menu){
         foreach ($menus as $index=>$menu){
             $mark = false;
             $mark = false;
             foreach ($authorities as $j=>$authority){
             foreach ($authorities as $j=>$authority){
                 if ($menu["name"] == $authority["name"]){
                 if ($menu["name"] == $authority["name"]){
+                    $mapping[$menu["id"]] = $authority["id"];
                     $mark = true;
                     $mark = true;
-                    $menus[$index]["authority"] = $j;
                     $authorities[$j]["mark"] = true;
                     $authorities[$j]["mark"] = true;
                     if ($authority["child"])$menus[$index]["child"] = array_values($this->formatMenu($menu["child"],$authority["child"]));
                     if ($authority["child"])$menus[$index]["child"] = array_values($this->formatMenu($menu["child"],$authority["child"]));
                 }
                 }
@@ -141,4 +144,13 @@ class MenuService
         }
         }
         return $menus;
         return $menus;
     }
     }
+
+    /**
+     * 获取菜单与权限映射
+     */
+    public function getMenuAndAuthorityMapping()
+    {
+        $this->getVisibleFunctionList(Authority::query()->get(),$mapping);
+        return $mapping;
+    }
 }
 }

+ 13 - 9
resources/views/maintenance/menu/index.blade.php

@@ -140,6 +140,7 @@
                         }();
                         }();
                         if (oldParent!==newParent){
                         if (oldParent!==newParent){
                             dom.setAttribute("data-parent",newParent);
                             dom.setAttribute("data-parent",newParent);
+                            params.id = id;
                             params.parent_id = newParent;
                             params.parent_id = newParent;
                             let oldLevel = dom.getAttribute("data-level");
                             let oldLevel = dom.getAttribute("data-level");
                             let newLevel = parent ? parent.getAttribute("data-level") : 1;
                             let newLevel = parent ? parent.getAttribute("data-level") : 1;
@@ -147,9 +148,9 @@
                             if (diff!=0){
                             if (diff!=0){
                                 dom.setAttribute("data-level",newLevel);
                                 dom.setAttribute("data-level",newLevel);
                                 params.level = newLevel;
                                 params.level = newLevel;
-                                params.diff = diff;
                                 let child = dom.getElementsByTagName("LI");
                                 let child = dom.getElementsByTagName("LI");
                                 if (child.length>0){
                                 if (child.length>0){
+                                    params.diff = diff;
                                     params.child = [];
                                     params.child = [];
                                     for (let i=0;i<child.length;i++){
                                     for (let i=0;i<child.length;i++){
                                         params.child.push(child[i].getAttribute("data-id"));
                                         params.child.push(child[i].getAttribute("data-id"));
@@ -165,18 +166,21 @@
                     });
                     });
                 },
                 },
                 sort(){
                 sort(){
-                    let parent = document.getElementById("parent").children;
+                    let nodes = document.getElementsByTagName("LI");
                     let update = [["id","sequence"]];
                     let update = [["id","sequence"]];
-                    for (let i=0;i<parent.length;i++){
-                        let order = parent[i].getAttribute("data-order");
-                        let id = parent[i].getAttribute("data-id");
-                        if (id && order !== i+1)update.push({id:id,sequence:i+1});
+                    for (let i=0;i<nodes.length;i++){
+                        let oldOrder = nodes[i].getAttribute("data-order");
+                        let newOrder = i+1;
+                        let id = nodes[i].getAttribute("data-id");
+                        if (id && oldOrder != newOrder){
+                            nodes[i].setAttribute("data-order",newOrder);
+                            update.push({id:id,sequence:newOrder});
+                        }
                     }
                     }
                     if (update.length > 1){
                     if (update.length > 1){
-                        let url = "{{url('maintenance/unit/sort')}}";
-                        window.tempTip.postBasicRequest(url,{"update":update},res=>{
+                        let url = "{{url('maintenance/menu/sort')}}";
+                        window.tempTip.postBasicRequest(url,{"update":update},()=>{
                             this.isSaveSort = false;
                             this.isSaveSort = false;
-                            return "";
                         });
                         });
                     }else this.isSaveSort = false;
                     }else this.isSaveSort = false;
                 },
                 },