Zhouzhendong 5 лет назад
Родитель
Сommit
326ca985e0

+ 19 - 7
app/Http/Controllers/MenuController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Authority;
 use App\Components\AsyncResponse;
 use App\Menu;
+use App\Services\common\BatchUpdateService;
 use Illuminate\Support\Facades\DB;
 
 class MenuController extends Controller
@@ -17,15 +18,23 @@ class MenuController extends Controller
      */
     public function index()
     {
-        return \view("maintenance.menu.index",["menus"=>app("MenuService")->getMenu()]);
+        return \view("maintenance.menu.index",["menus"=>Menu::query()->orderByRaw("level DESC,sequence")->get()]);
     }
 
     public function update()
     {
         $update = [];
-        if (request()->has("parent_id"))$update["parent_id"] = request("parent_id");
+        $mapping = app("MenuService")->getMenuAndAuthorityMapping();
+        $authorityUpdate = [];
+        if (request()->has("parent_id")){
+            $update["parent_id"] = request("parent_id");
+            $authorityUpdate["id_parent"] = request("parent_id") ? $mapping[request("parent_id")] : null;
+        }
         if (request()->has("level"))$update["level"] = request("level");
-        if (request()->has("name"))$update["name"] = request("name");
+        if (request()->has("name")){
+            $update["name"] = request("name");
+            $authorityUpdate["name"] = $mapping[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");
@@ -35,10 +44,6 @@ class MenuController extends Controller
         }
         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();//移除所有用户权限缓存,这将在用户下次访问时重新建立
@@ -46,4 +51,11 @@ class MenuController extends Controller
         }
         $this->success();
     }
+
+    public function sort()
+    {
+        app(BatchUpdateService::class)->batchUpdate("menus",request("update"));
+        app("MenuService")->setMenu();//重建菜单缓存
+        $this->success();
+    }
 }

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

@@ -188,6 +188,7 @@ class TestController extends Controller
 
     public function zzd()
     {
+        Cache::flush();
         $ser = new MenuService();
         dd($ser->getMenuAndAuthorityMapping());
     }

+ 1 - 1
app/Services/MenuService.php

@@ -129,7 +129,7 @@ class MenuService
                     $mapping[$menu["id"]] = $authority["id"];
                     $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"],$mapping));
                 }
             }
             if (!$mark)unset($menus[$index]);

+ 922 - 0
resources/js/utilities/icons.json

@@ -0,0 +1,922 @@
+[
+  "fa-address-book",
+  "fa-address-book-o",
+  "fa-address-card",
+  "fa-address-card-o",
+  "fa-adjust",
+  "fa-american-sign-language-interpreting",
+  "fa-anchor",
+  "fa-archive",
+  "fa-area-chart",
+  "fa-arrows",
+  "fa-arrows-h",
+  "fa-arrows-v",
+  "fa-asl-interpreting",
+  "fa-assistive-listening-systems",
+  "fa-asterisk",
+  "fa-at",
+  "fa-audio-description",
+  "fa-automobile",
+  "fa-balance-scale",
+  "fa-ban",
+  "fa-bank",
+  "fa-bar-chart",
+  "fa-bar-chart-o",
+  "fa-barcode",
+  "fa-bars",
+  "fa-bath",
+  "fa-bathtub",
+  "fa-battery",
+  "fa-battery-0",
+  "fa-battery-1",
+  "fa-battery-2",
+  "fa-battery-3",
+  "fa-battery-4",
+  "fa-battery-empty",
+  "fa-battery-full",
+  "fa-battery-half",
+  "fa-battery-quarter",
+  "fa-battery-three-quarters",
+  "fa-bed",
+  "fa-beer",
+  "fa-bell",
+  "fa-bell-o",
+  "fa-bell-slash",
+  "fa-bell-slash-o",
+  "fa-bicycle",
+  "fa-binoculars",
+  "fa-birthday-cake",
+  "fa-blind",
+  "fa-bluetooth",
+  "fa-bluetooth-b",
+  "fa-bolt",
+  "fa-bomb",
+  "fa-book",
+  "fa-bookmark",
+  "fa-bookmark-o",
+  "fa-braille",
+  "fa-briefcase",
+  "fa-bug",
+  "fa-building",
+  "fa-building-o",
+  "fa-bullhorn",
+  "fa-bullseye",
+  "fa-bus",
+  "fa-cab",
+  "fa-calculator",
+  "fa-calendar",
+  "fa-calendar-check-o",
+  "fa-calendar-minus-o",
+  "fa-calendar-o",
+  "fa-calendar-plus-o",
+  "fa-calendar-times-o",
+  "fa-camera",
+  "fa-camera-retro",
+  "fa-car",
+  "fa-caret-square-o-down",
+  "fa-caret-square-o-left",
+  "fa-caret-square-o-right",
+  "fa-caret-square-o-up",
+  "fa-cart-arrow-down",
+  "fa-cart-plus",
+  "fa-cc",
+  "fa-certificate",
+  "fa-check",
+  "fa-check-circle",
+  "fa-check-circle-o",
+  "fa-check-square",
+  "fa-check-square-o",
+  "fa-child",
+  "fa-circle",
+  "fa-circle-o",
+  "fa-circle-o-notch",
+  "fa-circle-thin",
+  "fa-clock-o",
+  "fa-clone",
+  "fa-close",
+  "fa-cloud",
+  "fa-cloud-download",
+  "fa-cloud-upload",
+  "fa-code",
+  "fa-code-fork",
+  "fa-coffee",
+  "fa-cog",
+  "fa-cogs",
+  "fa-comment",
+  "fa-comment-o",
+  "fa-commenting",
+  "fa-commenting-o",
+  "fa-comments",
+  "fa-comments-o",
+  "fa-compass",
+  "fa-copyright",
+  "fa-creative-commons",
+  "fa-credit-card",
+  "fa-credit-card-alt",
+  "fa-crop",
+  "fa-crosshairs",
+  "fa-cube",
+  "fa-cubes",
+  "fa-cutlery",
+  "fa-dashboard",
+  "fa-database",
+  "fa-deaf",
+  "fa-deafness",
+  "fa-desktop",
+  "fa-diamond",
+  "fa-dot-circle-o",
+  "fa-download",
+  "fa-drivers-license",
+  "fa-drivers-license-o",
+  "fa-edit",
+  "fa-ellipsis-h",
+  "fa-ellipsis-v",
+  "fa-envelope",
+  "fa-envelope-o",
+  "fa-envelope-open",
+  "fa-envelope-open-o",
+  "fa-envelope-square",
+  "fa-eraser",
+  "fa-exchange",
+  "fa-exclamation",
+  "fa-exclamation-circle",
+  "fa-exclamation-triangle",
+  "fa-external-link",
+  "fa-external-link-square",
+  "fa-eye",
+  "fa-eye-slash",
+  "fa-eyedropper",
+  "fa-fax",
+  "fa-feed",
+  "fa-female",
+  "fa-fighter-jet",
+  "fa-file-archive-o",
+  "fa-file-audio-o",
+  "fa-file-code-o",
+  "fa-file-excel-o",
+  "fa-file-image-o",
+  "fa-file-movie-o",
+  "fa-file-pdf-o",
+  "fa-file-photo-o",
+  "fa-file-picture-o",
+  "fa-file-powerpoint-o",
+  "fa-file-sound-o",
+  "fa-file-video-o",
+  "fa-file-word-o",
+  "fa-file-zip-o",
+  "fa-film",
+  "fa-filter",
+  "fa-fire",
+  "fa-fire-extinguisher",
+  "fa-flag",
+  "fa-flag-checkered",
+  "fa-flag-o",
+  "fa-flash",
+  "fa-flask",
+  "fa-folder",
+  "fa-folder-o",
+  "fa-folder-open",
+  "fa-folder-open-o",
+  "fa-frown-o",
+  "fa-futbol-o",
+  "fa-gamepad",
+  "fa-gavel",
+  "fa-gear",
+  "fa-gears",
+  "fa-gift",
+  "fa-glass",
+  "fa-globe",
+  "fa-graduation-cap",
+  "fa-group",
+  "fa-hand-grab-o",
+  "fa-hand-lizard-o",
+  "fa-hand-paper-o",
+  "fa-hand-peace-o",
+  "fa-hand-pointer-o",
+  "fa-hand-rock-o",
+  "fa-hand-scissors-o",
+  "fa-hand-spock-o",
+  "fa-hand-stop-o",
+  "fa-handshake-o",
+  "fa-hard-of-hearing",
+  "fa-hashtag",
+  "fa-hdd-o",
+  "fa-headphones",
+  "fa-heart",
+  "fa-heart-o",
+  "fa-heartbeat",
+  "fa-history",
+  "fa-home",
+  "fa-hotel",
+  "fa-hourglass",
+  "fa-hourglass-1",
+  "fa-hourglass-2",
+  "fa-hourglass-3",
+  "fa-hourglass-end",
+  "fa-hourglass-half",
+  "fa-hourglass-o",
+  "fa-hourglass-start",
+  "fa-i-cursor",
+  "fa-id-badge",
+  "fa-id-card",
+  "fa-id-card-o",
+  "fa-image",
+  "fa-inbox",
+  "fa-industry",
+  "fa-info",
+  "fa-info-circle",
+  "fa-institution",
+  "fa-key",
+  "fa-keyboard-o",
+  "fa-language",
+  "fa-laptop",
+  "fa-leaf",
+  "fa-legal",
+  "fa-lemon-o",
+  "fa-level-down",
+  "fa-level-up",
+  "fa-life-bouy",
+  "fa-life-buoy",
+  "fa-life-ring",
+  "fa-life-saver",
+  "fa-lightbulb-o",
+  "fa-line-chart",
+  "fa-location-arrow",
+  "fa-lock",
+  "fa-low-vision",
+  "fa-magic",
+  "fa-magnet",
+  "fa-mail-forward",
+  "fa-mail-reply",
+  "fa-mail-reply-all",
+  "fa-male",
+  "fa-map",
+  "fa-map-marker",
+  "fa-map-o",
+  "fa-map-pin",
+  "fa-map-signs",
+  "fa-meh-o",
+  "fa-microchip",
+  "fa-microphone",
+  "fa-microphone-slash",
+  "fa-minus",
+  "fa-minus-circle",
+  "fa-minus-square",
+  "fa-minus-square-o",
+  "fa-mobile",
+  "fa-mobile-phone",
+  "fa-money",
+  "fa-moon-o",
+  "fa-mortar-board",
+  "fa-motorcycle",
+  "fa-mouse-pointer",
+  "fa-music",
+  "fa-navicon",
+  "fa-newspaper-o",
+  "fa-object-group",
+  "fa-object-ungroup",
+  "fa-paint-brush",
+  "fa-paper-plane",
+  "fa-paper-plane-o",
+  "fa-paw",
+  "fa-pencil",
+  "fa-pencil-square",
+  "fa-pencil-square-o",
+  "fa-percent",
+  "fa-phone",
+  "fa-phone-square",
+  "fa-photo",
+  "fa-picture-o",
+  "fa-pie-chart",
+  "fa-plane",
+  "fa-plug",
+  "fa-plus",
+  "fa-plus-circle",
+  "fa-plus-square",
+  "fa-plus-square-o",
+  "fa-podcast",
+  "fa-power-off",
+  "fa-print",
+  "fa-puzzle-piece",
+  "fa-qrcode",
+  "fa-question",
+  "fa-question-circle",
+  "fa-question-circle-o",
+  "fa-quote-left",
+  "fa-quote-right",
+  "fa-random",
+  "fa-recycle",
+  "fa-refresh",
+  "fa-registered",
+  "fa-remove",
+  "fa-reorder",
+  "fa-reply",
+  "fa-reply-all",
+  "fa-retweet",
+  "fa-road",
+  "fa-rocket",
+  "fa-rss",
+  "fa-rss-square",
+  "fa-s15",
+  "fa-search",
+  "fa-search-minus",
+  "fa-search-plus",
+  "fa-send",
+  "fa-send-o",
+  "fa-server",
+  "fa-share",
+  "fa-share-alt",
+  "fa-share-alt-square",
+  "fa-share-square",
+  "fa-share-square-o",
+  "fa-shield",
+  "fa-ship",
+  "fa-shopping-bag",
+  "fa-shopping-basket",
+  "fa-shopping-cart",
+  "fa-shower",
+  "fa-sign-in",
+  "fa-sign-language",
+  "fa-sign-out",
+  "fa-signal",
+  "fa-signing",
+  "fa-sitemap",
+  "fa-sliders",
+  "fa-smile-o",
+  "fa-snowflake-o",
+  "fa-soccer-ball-o",
+  "fa-sort",
+  "fa-sort-alpha-asc",
+  "fa-sort-alpha-desc",
+  "fa-sort-amount-asc",
+  "fa-sort-amount-desc",
+  "fa-sort-asc",
+  "fa-sort-desc",
+  "fa-sort-down",
+  "fa-sort-numeric-asc",
+  "fa-sort-numeric-desc",
+  "fa-sort-up",
+  "fa-space-shuttle",
+  "fa-spinner",
+  "fa-spoon",
+  "fa-square",
+  "fa-square-o",
+  "fa-star",
+  "fa-star-half",
+  "fa-star-half-empty",
+  "fa-star-half-full",
+  "fa-star-half-o",
+  "fa-star-o",
+  "fa-sticky-note",
+  "fa-sticky-note-o",
+  "fa-street-view",
+  "fa-suitcase",
+  "fa-sun-o",
+  "fa-support",
+  "fa-tablet",
+  "fa-tachometer",
+  "fa-tag",
+  "fa-tags",
+  "fa-tasks",
+  "fa-taxi",
+  "fa-television",
+  "fa-terminal",
+  "fa-thermometer",
+  "fa-thermometer-0",
+  "fa-thermometer-1",
+  "fa-thermometer-2",
+  "fa-thermometer-3",
+  "fa-thermometer-4",
+  "fa-thermometer-empty",
+  "fa-thermometer-full",
+  "fa-thermometer-half",
+  "fa-thermometer-quarter",
+  "fa-thermometer-three-quarters",
+  "fa-thumb-tack",
+  "fa-thumbs-down",
+  "fa-thumbs-o-down",
+  "fa-thumbs-o-up",
+  "fa-thumbs-up",
+  "fa-ticket",
+  "fa-times",
+  "fa-times-circle",
+  "fa-times-circle-o",
+  "fa-times-rectangle",
+  "fa-times-rectangle-o",
+  "fa-tint",
+  "fa-toggle-down",
+  "fa-toggle-left",
+  "fa-toggle-off",
+  "fa-toggle-on",
+  "fa-toggle-right",
+  "fa-toggle-up",
+  "fa-trademark",
+  "fa-trash",
+  "fa-trash-o",
+  "fa-tree",
+  "fa-trophy",
+  "fa-truck",
+  "fa-tty",
+  "fa-tv",
+  "fa-umbrella",
+  "fa-universal-access",
+  "fa-university",
+  "fa-unlock",
+  "fa-unlock-alt",
+  "fa-unsorted",
+  "fa-upload",
+  "fa-user",
+  "fa-user-circle",
+  "fa-user-circle-o",
+  "fa-user-o",
+  "fa-user-plus",
+  "fa-user-secret",
+  "fa-user-times",
+  "fa-users",
+  "fa-vcard",
+  "fa-vcard-o",
+  "fa-video-camera",
+  "fa-volume-control-phone",
+  "fa-volume-down",
+  "fa-volume-off",
+  "fa-volume-up",
+  "fa-warning",
+  "fa-wheelchair",
+  "fa-wheelchair-alt",
+  "fa-wifi",
+  "fa-window-close",
+  "fa-window-close-o",
+  "fa-window-maximize",
+  "fa-window-minimize",
+  "fa-window-restore",
+  "fa-wrench",
+  "fa-hand-grab-o",
+  "fa-hand-lizard-o",
+  "fa-hand-o-down",
+  "fa-hand-o-left",
+  "fa-hand-o-right",
+  "fa-hand-o-up",
+  "fa-hand-paper-o",
+  "fa-hand-peace-o",
+  "fa-hand-pointer-o",
+  "fa-hand-rock-o",
+  "fa-hand-scissors-o",
+  "fa-hand-spock-o",
+  "fa-hand-stop-o",
+  "fa-thumbs-down",
+  "fa-thumbs-o-down",
+  "fa-thumbs-o-up",
+  "fa-thumbs-up",
+  "fa-american-sign-language-interpreting",
+  "fa-asl-interpreting",
+  "fa-assistive-listening-systems",
+  "fa-audio-description",
+  "fa-blind",
+  "fa-braille",
+  "fa-cc",
+  "fa-deaf",
+  "fa-deafness",
+  "fa-hard-of-hearing",
+  "fa-low-vision",
+  "fa-question-circle-o",
+  "fa-sign-language",
+  "fa-signing",
+  "fa-tty",
+  "fa-universal-access",
+  "fa-volume-control-phone",
+  "fa-wheelchair",
+  "fa-wheelchair-alt",
+  "fa-ambulance",
+  "fa-automobile",
+  "fa-bicycle",
+  "fa-bus",
+  "fa-cab",
+  "fa-car",
+  "fa-fighter-jet",
+  "fa-motorcycle",
+  "fa-plane",
+  "fa-rocket",
+  "fa-ship",
+  "fa-space-shuttle",
+  "fa-subway",
+  "fa-taxi",
+  "fa-train",
+  "fa-truck",
+  "fa-wheelchair",
+  "fa-wheelchair-alt",
+  "fa-genderless",
+  "fa-intersex",
+  "fa-mars",
+  "fa-mars-double",
+  "fa-mars-stroke",
+  "fa-mars-stroke-h",
+  "fa-mars-stroke-v",
+  "fa-mercury",
+  "fa-neuter",
+  "fa-transgender",
+  "fa-transgender-alt",
+  "fa-venus",
+  "fa-venus-double",
+  "fa-venus-mars",
+  "fa-file",
+  "fa-file-archive-o",
+  "fa-file-audio-o",
+  "fa-file-code-o",
+  "fa-file-excel-o",
+  "fa-file-image-o",
+  "fa-file-movie-o",
+  "fa-file-o",
+  "fa-file-pdf-o",
+  "fa-file-photo-o",
+  "fa-file-picture-o",
+  "fa-file-powerpoint-o",
+  "fa-file-sound-o",
+  "fa-file-text",
+  "fa-file-text-o",
+  "fa-file-video-o",
+  "fa-file-word-o",
+  "fa-file-zip-o",
+  "fa-circle-o-notch",
+  "fa-cog",
+  "fa-gear",
+  "fa-refresh",
+  "fa-spinner",
+  "fa-check-square",
+  "fa-check-square-o",
+  "fa-circle",
+  "fa-circle-o",
+  "fa-dot-circle-o",
+  "fa-minus-square",
+  "fa-minus-square-o",
+  "fa-plus-square",
+  "fa-plus-square-o",
+  "fa-square",
+  "fa-square-o",
+  "fa-cc-amex",
+  "fa-cc-diners-club",
+  "fa-cc-discover",
+  "fa-cc-jcb",
+  "fa-cc-mastercard",
+  "fa-cc-paypal",
+  "fa-cc-stripe",
+  "fa-cc-visa",
+  "fa-credit-card",
+  "fa-credit-card-alt",
+  "fa-google-wallet",
+  "fa-paypal",
+  "fa-area-chart",
+  "fa-bar-chart",
+  "fa-bar-chart-o",
+  "fa-line-chart",
+  "fa-pie-chart",
+  "fa-bitcoin",
+  "fa-btc",
+  "fa-cny",
+  "fa-dollar",
+  "fa-eur",
+  "fa-euro",
+  "fa-gbp",
+  "fa-gg",
+  "fa-gg-circle",
+  "fa-ils",
+  "fa-inr",
+  "fa-jpy",
+  "fa-krw",
+  "fa-money",
+  "fa-rmb",
+  "fa-rouble",
+  "fa-rub",
+  "fa-ruble",
+  "fa-rupee",
+  "fa-shekel",
+  "fa-sheqel",
+  "fa-try",
+  "fa-turkish-lira",
+  "fa-usd",
+  "fa-won",
+  "fa-yen",
+  "fa-align-center",
+  "fa-align-justify",
+  "fa-align-left",
+  "fa-align-right",
+  "fa-bold",
+  "fa-chain",
+  "fa-chain-broken",
+  "fa-clipboard",
+  "fa-columns",
+  "fa-copy",
+  "fa-cut",
+  "fa-dedent",
+  "fa-eraser",
+  "fa-file",
+  "fa-file-o",
+  "fa-file-text",
+  "fa-file-text-o",
+  "fa-files-o",
+  "fa-floppy-o",
+  "fa-font",
+  "fa-header",
+  "fa-indent",
+  "fa-italic",
+  "fa-link",
+  "fa-list",
+  "fa-list-alt",
+  "fa-list-ol",
+  "fa-list-ul",
+  "fa-outdent",
+  "fa-paperclip",
+  "fa-paragraph",
+  "fa-paste",
+  "fa-repeat",
+  "fa-rotate-left",
+  "fa-rotate-right",
+  "fa-save",
+  "fa-scissors",
+  "fa-strikethrough",
+  "fa-subscript",
+  "fa-superscript",
+  "fa-table",
+  "fa-text-height",
+  "fa-text-width",
+  "fa-th",
+  "fa-th-large",
+  "fa-th-list",
+  "fa-underline",
+  "fa-undo",
+  "fa-unlink",
+  "fa-angle-double-down",
+  "fa-angle-double-left",
+  "fa-angle-double-right",
+  "fa-angle-double-up",
+  "fa-angle-down",
+  "fa-angle-left",
+  "fa-angle-right",
+  "fa-angle-up",
+  "fa-arrow-circle-down",
+  "fa-arrow-circle-left",
+  "fa-arrow-circle-o-down",
+  "fa-arrow-circle-o-left",
+  "fa-arrow-circle-o-right",
+  "fa-arrow-circle-o-up",
+  "fa-arrow-circle-right",
+  "fa-arrow-circle-up",
+  "fa-arrow-down",
+  "fa-arrow-left",
+  "fa-arrow-right",
+  "fa-arrow-up",
+  "fa-arrows",
+  "fa-arrows-alt",
+  "fa-arrows-h",
+  "fa-arrows-v",
+  "fa-caret-down",
+  "fa-caret-left",
+  "fa-caret-right",
+  "fa-caret-square-o-down",
+  "fa-caret-square-o-left",
+  "fa-caret-square-o-right",
+  "fa-caret-square-o-up",
+  "fa-caret-up",
+  "fa-chevron-circle-down",
+  "fa-chevron-circle-left",
+  "fa-chevron-circle-right",
+  "fa-chevron-circle-up",
+  "fa-chevron-down",
+  "fa-chevron-left",
+  "fa-chevron-right",
+  "fa-chevron-up",
+  "fa-exchange",
+  "fa-hand-o-down",
+  "fa-hand-o-left",
+  "fa-hand-o-right",
+  "fa-hand-o-up",
+  "fa-long-arrow-down",
+  "fa-long-arrow-left",
+  "fa-long-arrow-right",
+  "fa-long-arrow-up",
+  "fa-toggle-down",
+  "fa-toggle-left",
+  "fa-toggle-right",
+  "fa-toggle-up",
+  "fa-arrows-alt",
+  "fa-backward",
+  "fa-compress",
+  "fa-eject",
+  "fa-expand",
+  "fa-fast-backward",
+  "fa-fast-forward",
+  "fa-forward",
+  "fa-pause",
+  "fa-pause-circle",
+  "fa-pause-circle-o",
+  "fa-play",
+  "fa-play-circle",
+  "fa-play-circle-o",
+  "fa-random",
+  "fa-step-backward",
+  "fa-step-forward",
+  "fa-stop",
+  "fa-stop-circle",
+  "fa-stop-circle-o",
+  "fa-youtube-play",
+  "fa-500px",
+  "fa-adn",
+  "fa-amazon",
+  "fa-android",
+  "fa-angellist",
+  "fa-apple",
+  "fa-bandcamp",
+  "fa-behance",
+  "fa-behance-square",
+  "fa-bitbucket",
+  "fa-bitbucket-square",
+  "fa-bitcoin",
+  "fa-black-tie",
+  "fa-bluetooth",
+  "fa-bluetooth-b",
+  "fa-btc",
+  "fa-buysellads",
+  "fa-cc-amex",
+  "fa-cc-diners-club",
+  "fa-cc-discover",
+  "fa-cc-jcb",
+  "fa-cc-mastercard",
+  "fa-cc-paypal",
+  "fa-cc-stripe",
+  "fa-cc-visa",
+  "fa-chrome",
+  "fa-codepen",
+  "fa-codiepie",
+  "fa-connectdevelop",
+  "fa-contao",
+  "fa-css3",
+  "fa-dashcube",
+  "fa-delicious",
+  "fa-deviantart",
+  "fa-digg",
+  "fa-dribbble",
+  "fa-dropbox",
+  "fa-drupal",
+  "fa-edge",
+  "fa-eercast",
+  "fa-empire",
+  "fa-envira",
+  "fa-etsy",
+  "fa-expeditedssl",
+  "fa-fa",
+  "fa-facebook",
+  "fa-facebook-f",
+  "fa-facebook-official",
+  "fa-facebook-square",
+  "fa-firefox",
+  "fa-first-order",
+  "fa-flickr",
+  "fa-font-awesome",
+  "fa-fonticons",
+  "fa-fort-awesome",
+  "fa-forumbee",
+  "fa-foursquare",
+  "fa-free-code-camp",
+  "fa-ge",
+  "fa-get-pocket",
+  "fa-gg",
+  "fa-gg-circle",
+  "fa-git",
+  "fa-git-square",
+  "fa-github",
+  "fa-github-alt",
+  "fa-github-square",
+  "fa-gitlab",
+  "fa-gittip",
+  "fa-glide",
+  "fa-glide-g",
+  "fa-google",
+  "fa-google-plus",
+  "fa-google-plus-circle",
+  "fa-google-plus-official",
+  "fa-google-plus-square",
+  "fa-google-wallet",
+  "fa-gratipay",
+  "fa-grav",
+  "fa-hacker-news",
+  "fa-houzz",
+  "fa-html5",
+  "fa-imdb",
+  "fa-instagram",
+  "fa-internet-explorer",
+  "fa-ioxhost",
+  "fa-joomla",
+  "fa-jsfiddle",
+  "fa-lastfm",
+  "fa-lastfm-square",
+  "fa-leanpub",
+  "fa-linkedin",
+  "fa-linkedin-square",
+  "fa-linode",
+  "fa-linux",
+  "fa-maxcdn",
+  "fa-meanpath",
+  "fa-medium",
+  "fa-meetup",
+  "fa-mixcloud",
+  "fa-modx",
+  "fa-odnoklassniki",
+  "fa-odnoklassniki-square",
+  "fa-opencart",
+  "fa-openid",
+  "fa-opera",
+  "fa-optin-monster",
+  "fa-pagelines",
+  "fa-paypal",
+  "fa-pied-piper",
+  "fa-pied-piper-alt",
+  "fa-pied-piper-pp",
+  "fa-pinterest",
+  "fa-pinterest-p",
+  "fa-pinterest-square",
+  "fa-product-hunt",
+  "fa-qq",
+  "fa-quora",
+  "fa-ra",
+  "fa-ravelry",
+  "fa-rebel",
+  "fa-reddit",
+  "fa-reddit-alien",
+  "fa-reddit-square",
+  "fa-renren",
+  "fa-resistance",
+  "fa-safari",
+  "fa-scribd",
+  "fa-sellsy",
+  "fa-share-alt",
+  "fa-share-alt-square",
+  "fa-shirtsinbulk",
+  "fa-simplybuilt",
+  "fa-skyatlas",
+  "fa-skype",
+  "fa-slack",
+  "fa-slideshare",
+  "fa-snapchat",
+  "fa-snapchat-ghost",
+  "fa-snapchat-square",
+  "fa-soundcloud",
+  "fa-spotify",
+  "fa-stack-exchange",
+  "fa-stack-overflow",
+  "fa-steam",
+  "fa-steam-square",
+  "fa-stumbleupon",
+  "fa-stumbleupon-circle",
+  "fa-superpowers",
+  "fa-telegram",
+  "fa-tencent-weibo",
+  "fa-themeisle",
+  "fa-trello",
+  "fa-tripadvisor",
+  "fa-tumblr",
+  "fa-tumblr-square",
+  "fa-twitch",
+  "fa-twitter",
+  "fa-twitter-square",
+  "fa-usb",
+  "fa-viacoin",
+  "fa-viadeo",
+  "fa-viadeo-square",
+  "fa-vimeo",
+  "fa-vimeo-square",
+  "fa-vine",
+  "fa-vk",
+  "fa-wechat",
+  "fa-weibo",
+  "fa-weixin",
+  "fa-whatsapp",
+  "fa-wikipedia-w",
+  "fa-windows",
+  "fa-wordpress",
+  "fa-wpbeginner",
+  "fa-wpexplorer",
+  "fa-wpforms",
+  "fa-xing",
+  "fa-xing-square",
+  "fa-y-combinator",
+  "fa-y-combinator-square",
+  "fa-yahoo",
+  "fa-yc",
+  "fa-yc-square",
+  "fa-yelp",
+  "fa-yoast",
+  "fa-youtube",
+  "fa-youtube-play",
+  "fa-youtube-square",
+  "fa-ambulance",
+  "fa-h-square",
+  "fa-heart",
+  "fa-heart-o",
+  "fa-heartbeat",
+  "fa-hospital-o",
+  "fa-medkit",
+  "fa-plus-square",
+  "fa-stethoscope",
+  "fa-user-md",
+  "fa-wheelchair",
+  "fa-wheelchair-alt"
+]

+ 56 - 18
resources/views/maintenance/menu/index.blade.php

@@ -4,29 +4,31 @@
 @section('content')
     <div class="container-fluid" id="container" @drop="drop($event)" @dragover="dragover($event, false)">
         @include("maintenance.menu._modal")
-        <div class="card">
+        <div class="card" id="content">
             <div class="card-body">
                 @can("计量单位-录入")<button class="btn btn-outline-info mb-1 mr-3" @click="openModal()"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>@endcan
                 @can("计量单位-录入")<button class="btn border border-2 mb-1 mr-3" :class="isSaveSort ? 'btn-success' : 'text-secondary'" :disabled="!isSaveSort" @click="sort()"> 保 存 </button>@endcan
-                <div class="row text-nowrap" style="cursor: move;">
-                    <ul class="list-group col-9 offset-1">
+                <div class="row text-nowrap">
+                    <ul class="list-group col-9 offset-1" style="cursor: move;">
                         <li class="list-group-item" v-for="menu in menus" draggable="true" :id="'menu-'+menu.id"
                             :data-order="menu.sequence" :data-id="menu.id" :data-parent="menu.parent_id" :data-level="menu.level"
                             @drop="drop($event)" @dragover="dragover($event)" @dragstart.stop="dragstart(menu.id)">
-                            <span v-if="menu.font" :class="menu.font" :style="menu.font_style"></span>@{{ menu.name }}
-                            <div class="row">
+                            <i v-if="menu.font" :class="menu.font" :style="menu.font_style"></i>&nbsp;@{{ menu.name }}
+                            <span class="fa fa-close pull-right text-danger" style="cursor: pointer"></span>
+                            <span class="fa fa-edit pull-right text-primary mr-2" style="cursor: pointer"></span>
+                            <div class="row" v-if="menu.child.length>0">
                                 <ul class="list-group col-9 offset-1">
                                     <li class="list-group-item" v-for="menu2 in menu.child" draggable="true" :id="'menu-'+menu2.id"
                                         :data-order="menu2.sequence" :data-id="menu2.id" :data-parent="menu2.parent_id" :data-level="menu2.level"
                                         @drop="drop($event)" @dragover="dragover($event,dragoverId!=menu.id)" @dragstart.stop="dragstart(menu2.id)">
                                         @{{ menu2.name }}
-                                        <div class="row" style="margin-left: 50px">
+                                        <div class="row" v-if="menu2.child.length>0">
                                             <ul class="list-group col-9 offset-1">
                                                 <li class="list-group-item" v-for="menu3 in menu2.child" draggable="true" :id="'menu-'+menu3.id"
                                                     :data-order="menu3.sequence" :data-id="menu3.id" :data-parent="menu3.parent_id" :data-level="menu3.level"
                                                     @drop="drop($event)" @dragover="dragover($event,dragoverId!=menu2.id && dragoverId!=menu.id)" @dragstart.stop="dragstart(menu3.id)">
                                                     @{{ menu3.name }}
-                                                    <div class="row" style="margin-left: 50px">
+                                                    <div class="row" v-if="menu3.child.length>0">
                                                         <ul class="list-group col-9 offset-1">
                                                             <li class="list-group-item" v-for="menu4 in menu3.child" draggable="true" :id="'menu-'+menu4.id"
                                                                 :data-order="menu4.sequence" :data-id="menu4.id" :data-parent="menu4.parent_id" :data-level="menu4.level"
@@ -63,23 +65,56 @@
                 dragoverId:"",
                 isDragover : false,
                 isSaveSort : false,
+                menuList:[],
+                icons:[],
             },
             mounted(){
                 let menus = [@foreach($menus as $menu)@json($menu),@endforeach];
                 let menuMap = {};
                 menus.forEach(menu=>{
                     menu["child"] = [];
-                    menuMap[menu.id] = menu;
+                    menuMap["_"+menu.id] = menu;
                 });
                 menus.forEach(menu=>{
                     if (menu.parent_id){
-                        menuMap[menu.parent_id].child.push(menu);
-                        delete menuMap[menu.id];
+                        menuMap["_"+menu.parent_id].child.push(menu);
+                        delete menuMap["_"+menu.id];
                     }
                 });
                 this.menus = menuMap;
+                this._formatSelected();
             },
             methods:{
+                _formatSelected(){
+                    new Promise(()=>{
+                        this.menuList = this._mergeArray(this.menus);
+                        this._getIcons()
+                    });
+                },
+                _getIcons(){
+                    let url = "{{url('')}}"+"/js/utilities/icons.json";
+                    let request = new XMLHttpRequest();
+                    request.open("get", url);
+                    request.send(null);
+                    request.onload = function () {
+                        if (request.status == 200) {
+                            this.icons = JSON.parse(request.responseText);
+                        }
+                    }
+                },
+                _mergeArray(obj,arr=[]){
+                    for (let key in obj){
+                        let name = "";
+                        for (let i=1;i<obj[key]["level"];i++){
+                            name += "  ";
+                        }
+                        if (obj[key]['level']!==1)name += "└─";
+                        name += obj[key]["name"];
+                        arr.push({name:name,id:obj[key]["id"],level:obj[key]["level"]});
+                        if (obj[key].child)arr = this._mergeArray(obj[key].child,arr);
+                    }
+                    return arr;
+                },
                 openModal(unit = null){
                     if (unit) this.unit={id:unit.id,name:unit.name};
                     else this.tag={id:"",name:""};
@@ -124,12 +159,13 @@
                     e.preventDefault();
                     e.stopPropagation();
                     $("#dragover-container").after($("#menu-"+this.dragoverId));
+                    this.handleDrag(this.dragoverId);
                     this.dragoverId = "";
                     this.isDragover = false;
                     this.isSaveSort = true;
                 },
                 handleDrag(id){
-                    return new Promise((resolve, reject)=>{
+                    return new Promise(()=>{
                         let params = {};
                         let dom = document.getElementById("menu-"+id);
                         let oldParent = dom.getAttribute("data-parent");
@@ -143,7 +179,7 @@
                             params.id = id;
                             params.parent_id = newParent;
                             let oldLevel = dom.getAttribute("data-level");
-                            let newLevel = parent ? parent.getAttribute("data-level") : 1;
+                            let newLevel = parent ? Number(parent.getAttribute("data-level"))+1 : 1;
                             let diff = oldLevel-newLevel;
                             if (diff!=0){
                                 dom.setAttribute("data-level",newLevel);
@@ -166,16 +202,18 @@
                     });
                 },
                 sort(){
-                    let nodes = document.getElementsByTagName("LI");
+                    let nodes = document.getElementById("content").getElementsByTagName("LI");
                     let update = [["id","sequence"]];
+                    let index = 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 (!id)continue;
+                        let oldOrder = nodes[i].getAttribute("data-order");
+                        if (oldOrder != index){
+                            nodes[i].setAttribute("data-order",index);
+                            update.push({id:id,sequence:index});
                         }
+                        index++;
                     }
                     if (update.length > 1){
                         let url = "{{url('maintenance/menu/sort')}}";

Разница между файлами не показана из-за своего большого размера
+ 2801 - 337
resources/views/test.blade.php


+ 2 - 1
routes/web.php

@@ -37,7 +37,8 @@ Route::group(['prefix'=>'maintenance'],function(){
     /** 菜单 */
     Route::get('menu', 'MenuController@index');
     Route::group(['prefix'=>"menu"],function (){
-        Route::get('update', 'MenuController@update');
+        Route::post('update', 'MenuController@update');
+        Route::post('sort', 'MenuController@sort');
     });
 
     /** 商品 */

+ 1 - 0
webpack.mix.js

@@ -25,6 +25,7 @@ mix.copy('resources/js/queryForm/export.js','public/js/queryForm/export.js');
 mix.js('resources/js/queryForm/header.js','public/js/queryForm/header.js');
 mix.js('resources/js/utilities/barcode.js','public/js/utilities/barcode.js');
 mix.js('resources/js/utilities/qrcode.js','public/js/utilities/qrcode.js');
+mix.copy('resources/js/utilities/icons.json','public/js/utilities/icons.json');
 
 mix.copy('resources/sound/','public/sound');
 mix.js('resources/js/elementUi.js','public/js/element-ui.js')

Некоторые файлы не были показаны из-за большого количества измененных файлов