Zhouzhendong 5 سال پیش
والد
کامیت
2a076c1eca

+ 1 - 1
app/Http/Controllers/Auth/LoginController.php

@@ -86,7 +86,7 @@ class LoginController extends Controller
             if(env('DB_USERNAME')!='developer')
                 app('LogService')->log(__METHOD__,__FUNCTION__,'',Auth::user()['id']);
             if($request['is_json']){
-                return ['success'=>true,'url'=>url($this->redirectTo)];
+                return ['success'=>true,'url'=>url($this->redirectTo),'menus'=>app("MenuService")->getVisibleFunctionList()];
             }
             return $this->sendLoginResponse($request)->header('Cache-Control','no-store');
         }

+ 1 - 1
app/Menu.php

@@ -13,6 +13,6 @@ class Menu extends Model
 
     use ModelTimeFormat;
     protected $fillable=[
-        'name','level', 'parent_id', 'route','sequence',
+        'name','level', 'parent_id', 'route','sequence',"font","font_style"
     ];
 }

+ 14 - 7
app/Services/MenuService.php

@@ -28,8 +28,10 @@ class MenuService
 
     public function setMenu()
     {
-        Cache::forever("menus",Menu::query()->select("id","name","parent_id","route")->orderByRaw("level DESC,sequence")->get());
-        Cache::tags("menu")->flush();
+        //如果需要热更新 为所有用户个人菜单锁定缓存 标记TAGS 在此清除 Cache::tag("tags")->flush()
+        Cache::forever("menus",Menu::query()
+            ->select("id","name","parent_id","route","font","font_style")
+            ->orderByRaw("level DESC,sequence")->get());
     }
 
     public function appendMenu(Menu $menu)
@@ -43,6 +45,7 @@ class MenuService
 
     public function getVisibleFunctionList()
     {
+        Cache::flush();
         /** @var Collection $authorities */
         $authorities = app("AuthorityService")->getUserAuthority();
         if (!$authorities)$authorities = [];
@@ -62,9 +65,13 @@ class MenuService
         $menus = $this->getMenu();
         $menuMap = [];
         foreach ($menus as $menu){
-            $item = $menu->toArray();
-            $item["child"] = [];
-            $menuMap[$menu->id] = $item;
+            $menuMap[$menu->id] = [
+                "child" => [],
+                "name"  => $menu->name,
+                "font"  => $menu->font,
+                "fontStyle"  => $menu->font_style,
+                "route" => $menu->route,
+            ];
         }
         foreach ($menus as $menu){
             if ($menu->parent_id){
@@ -72,7 +79,7 @@ class MenuService
                 unset($menuMap[$menu->id]);
             }
         }
-        return $this->formatMenu(array_values($menuMap),$authMap);
+        return array_values($this->formatMenu($menuMap,$authMap));
     }
 
     /**
@@ -120,7 +127,7 @@ class MenuService
                     $mark = true;
                     $menus[$index]["authority"] = $j;
                     $authorities[$j]["mark"] = true;
-                    if ($authority["child"])$menus[$index]["child"] = $this->formatMenu($menu["child"],$authority["child"]);
+                    if ($authority["child"])$menus[$index]["child"] = array_values($this->formatMenu($menu["child"],$authority["child"]));
                 }
             }
             if (!$mark)unset($menus[$index]);

+ 34 - 0
database/migrations/2021_04_27_104357_change_menus_table_add_font_column.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeMenusTableAddFontColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('menus', function (Blueprint $table) {
+            $table->string("font")->nullable()->comment("font图标");
+            $table->string("font_style")->nullable()->comment("font图标样式");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('menus', function (Blueprint $table) {
+            $table->dropColumn("font");
+            $table->dropColumn("font_style");
+        });
+    }
+}

+ 1 - 0
resources/views/auth/login.blade.php

@@ -115,6 +115,7 @@
                 }else{
                     tempTip.setDuration(99999);
                     tempTip.waitingTip('页面跳转中');
+                    localStorage.setItem("menus",JSON.stringify(response.data.menus));
                     location=response.data.url;
                 }
             }).catch(function(response){

+ 87 - 2
resources/views/layouts/app.blade.php

@@ -25,6 +25,7 @@
             @component('layouts.menu')@endcomponent
         </div>
     </nav>
+    <div id="menu"></div>
     @yield('content')
     <hr>
 </div>
@@ -32,6 +33,90 @@
 <!-- Scripts -->
 @yield('script')
 {{-- 必须在app.js前边--}}
+<script type="text/javascript">
+    let menuList = JSON.parse(localStorage.getItem("menus"));
+    let baseUrl = "{{url('')}}";
+    let relativeUrl = window.location.href.slice(baseUrl.length+1).split(/[/?]/);
+    (function () {
+        if ("{{\Illuminate\Support\Facades\Auth::id()}}")createMenu();
+    }());
+    function createMenu(type = 1,menus=menuList) {
+        return new Promise(function () {
+            let dom = createBeforeMenu(type);
+            for (let i=0;i<menus.length;i++){
+                if (!menus[i].route)continue;
+                let uri = menus[i].route.split(/[/?]/)[type-1];
+                let isEquals = uri==='*' || uri===relativeUrl[type-1];
+                dom.appendChild(createChildElement(type,menus[i],isEquals));
+                if (isEquals && menus[i].child && menus[i].child.length>0){
+                    createMenu(type+1,menus[i].child);
+                }
+            }
+        });
+    }
+    function createBeforeMenu(type) {
+        let dom = undefined;
+        switch (type) {
+            case 2:
+                dom = document.createElement("div");
+                dom.className="container-fluid nav2";
+                let div = document.createElement("div");
+                div.className="card";
+                let ul = document.createElement("ul");
+                ul.className="nav nav-pills";
+                div.appendChild(ul);
+                dom.appendChild(div);
+                document.getElementById("menu").appendChild(dom);
+                return ul;
+            case 3:
+                dom = document.createElement("div");
+                dom.className="container-fluid nav3";
+                let dom2 = document.createElement("div");
+                dom2.className = "card menu-third";
+                let dom3 = document.createElement("ul");
+                dom3.className="nav nav-pills";
+                dom2.appendChild(dom3);
+                dom.appendChild(dom2);
+                document.getElementById("menu").appendChild(dom);
+                return dom3;
+            default:
+                dom = document.createElement("ul");
+                dom.className = "navbar-nav mr-auto nav-tabs nav font-weight-bold";
+                dom.style.paddingTop = "10px";
+                document.getElementById("mainMenu").appendChild(dom);
+                return dom;
+        }
+    }
+    function createChildElement(type,menu,isEquals) {
+        let li = document.createElement("li");
+        let a = document.createElement("a");
+        li.className="nav-item";
+        a.href = baseUrl+'/'+menu.route;
+        a.className = "nav-link";
+        if (isEquals)a.className += " active";
+        a.target = menu.route;
+        switch (type) {
+            case 2:
+                a.innerText = menu.name;
+                li.appendChild(a);
+                return li;
+            case 3:
+                a.innerText = menu.name;
+                li.appendChild(a);
+                return li;
+            default:
+                if (menu.font){
+                    let span = document.createElement("span");
+                    span.className = menu.font;
+                    span.style.cssText = menu.fontStyle;
+                    a.appendChild(span);
+                }
+                a.appendChild(document.createTextNode(menu.name));
+                li.appendChild(a);
+                return li;
+        }
+    }
+</script>
 <script src="{{ mix('js/app.js') }}"></script>
 <script>
     let isActive=function (name,atSlashLevel) {
@@ -43,12 +128,12 @@
         if(atSlashLevel>uriParts.length||!atSlashLevel)return false;
         return uriParts[atSlashLevel]===name;
     };
-    new Vue({
+    /*new Vue({
         el:'#nav1',
         methods:{
             isActive:isActive,
         }
-    });
+    });*/
     if($('#nav2').length>0)
         new Vue({
             el:'#nav2',

+ 3 - 2
resources/views/layouts/menu.blade.php

@@ -1,6 +1,7 @@
 <div class="collapse navbar-collapse nav1" id="navbarSupportedContent">
     <!-- Left Side Of Navbar -->
-    <ul class="navbar-nav mr-auto nav-tabs nav font-weight-bold" id="nav1" style="padding-top: 10px">
+    <div id="mainMenu"></div>
+    {{--<ul class="navbar-nav mr-auto nav-tabs nav font-weight-bold" id="nav1" style="padding-top: 10px">
         @can('退货管理')
             <li class="nav-item"><a href="{{url("rejected/index/general")}}" class="nav-link" target="rejected/index/general"
                                     :class="{active:isActive('rejected',1)}">
@@ -67,7 +68,7 @@
                                     :class="{active:isActive('maintenance',1)}">
                     <span class="fa fa-server"></span>
                     基础设置</a></li> @endcan
-    </ul>
+    </ul>--}}
 
     <!-- Right Side Of Navbar -->
     <ul class="navbar-nav ml-auto">

+ 1 - 1
resources/views/order/index/delivering.blade.php

@@ -2,7 +2,7 @@
 @section('title')查询-订单管理@endsection
 
 @section('content')
-    @component('order.index.menu')@endcomponent
+    {{--@component('order.index.menu')@endcomponent--}}
     <div class="container-fluid">
         <div style="min-width: 4120px;">{{--4070--}}
             <div id="list" class="d-none">