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

分支 权限页面 树形组件

Zhouzhendong 5 лет назад
Родитель
Сommit
9dfb97650c

+ 2 - 1
app/Authority.php

@@ -7,11 +7,12 @@ use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
 
 use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\SoftDeletes;
 
 class Authority extends Model
 {
     use ModelLogChanging;
-
+    use SoftDeletes;
     use ModelTimeFormat;
     protected $fillable = ['name','remark','id_parent','alias_name','type','relevance','permission'];
     function roles(){

+ 11 - 0
bootstrap/cache/packages.php

@@ -46,6 +46,17 @@
       'Image' => 'Intervention\\Image\\Facades\\Image',
     ),
   ),
+  'laravel/horizon' => 
+  array (
+    'providers' => 
+    array (
+      0 => 'Laravel\\Horizon\\HorizonServiceProvider',
+    ),
+    'aliases' => 
+    array (
+      'Horizon' => 'Laravel\\Horizon\\Horizon',
+    ),
+  ),
   'laravel/tinker' => 
   array (
     'providers' => 

+ 27 - 25
bootstrap/cache/services.php

@@ -28,19 +28,20 @@
     24 => 'Facade\\Ignition\\IgnitionServiceProvider',
     25 => 'Fideloper\\Proxy\\TrustedProxyServiceProvider',
     26 => 'Intervention\\Image\\ImageServiceProvider',
-    27 => 'Laravel\\Tinker\\TinkerServiceProvider',
-    28 => 'Laravel\\Ui\\UiServiceProvider',
-    29 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
-    30 => 'Carbon\\Laravel\\ServiceProvider',
-    31 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
-    32 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
-    33 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
-    34 => 'Yajra\\Oci8\\Oci8ServiceProvider',
-    35 => 'App\\Providers\\AppServiceProvider',
-    36 => 'App\\Providers\\AuthServiceProvider',
-    37 => 'App\\Providers\\BroadcastServiceProvider',
-    38 => 'App\\Providers\\EventServiceProvider',
-    39 => 'App\\Providers\\RouteServiceProvider',
+    27 => 'Laravel\\Horizon\\HorizonServiceProvider',
+    28 => 'Laravel\\Tinker\\TinkerServiceProvider',
+    29 => 'Laravel\\Ui\\UiServiceProvider',
+    30 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
+    31 => 'Carbon\\Laravel\\ServiceProvider',
+    32 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
+    33 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
+    34 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
+    35 => 'Yajra\\Oci8\\Oci8ServiceProvider',
+    36 => 'App\\Providers\\AppServiceProvider',
+    37 => 'App\\Providers\\AuthServiceProvider',
+    38 => 'App\\Providers\\BroadcastServiceProvider',
+    39 => 'App\\Providers\\EventServiceProvider',
+    40 => 'App\\Providers\\RouteServiceProvider',
   ),
   'eager' => 
   array (
@@ -59,18 +60,19 @@
     12 => 'Facade\\Ignition\\IgnitionServiceProvider',
     13 => 'Fideloper\\Proxy\\TrustedProxyServiceProvider',
     14 => 'Intervention\\Image\\ImageServiceProvider',
-    15 => 'Laravel\\Ui\\UiServiceProvider',
-    16 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
-    17 => 'Carbon\\Laravel\\ServiceProvider',
-    18 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
-    19 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
-    20 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
-    21 => 'Yajra\\Oci8\\Oci8ServiceProvider',
-    22 => 'App\\Providers\\AppServiceProvider',
-    23 => 'App\\Providers\\AuthServiceProvider',
-    24 => 'App\\Providers\\BroadcastServiceProvider',
-    25 => 'App\\Providers\\EventServiceProvider',
-    26 => 'App\\Providers\\RouteServiceProvider',
+    15 => 'Laravel\\Horizon\\HorizonServiceProvider',
+    16 => 'Laravel\\Ui\\UiServiceProvider',
+    17 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
+    18 => 'Carbon\\Laravel\\ServiceProvider',
+    19 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
+    20 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
+    21 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
+    22 => 'Yajra\\Oci8\\Oci8ServiceProvider',
+    23 => 'App\\Providers\\AppServiceProvider',
+    24 => 'App\\Providers\\AuthServiceProvider',
+    25 => 'App\\Providers\\BroadcastServiceProvider',
+    26 => 'App\\Providers\\EventServiceProvider',
+    27 => 'App\\Providers\\RouteServiceProvider',
   ),
   'deferred' => 
   array (

+ 37 - 0
database/migrations/2021_05_08_143922_change_authority_table_deleted_at_column.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeAuthorityTableDeletedAtColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table("authorities",function (Blueprint $table){
+            $table->timestamp("deleted_at")->nullable()->comment("软删除");
+            $table->dropUnique("authorities_name_unique");
+            $table->unique("alias_name");
+        });
+
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table("authorities",function (Blueprint $table){
+            $table->dropColumn("deleted_at");
+            $table->unique("name");
+            $table->dropUnique("authorities_alias_name_unique");
+        });
+    }
+}

+ 10 - 5
package-lock.json

@@ -1801,7 +1801,7 @@
     },
     "babel-runtime": {
       "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz",
       "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
       "requires": {
         "core-js": "^2.4.0",
@@ -3146,13 +3146,13 @@
     },
     "cyclist": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz",
       "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
       "dev": true
     },
     "davidshimjs-qrcodejs": {
       "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/davidshimjs-qrcodejs/-/davidshimjs-qrcodejs-0.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/davidshimjs-qrcodejs/download/davidshimjs-qrcodejs-0.0.2.tgz",
       "integrity": "sha1-LrRCpElWcQed9/eCDM/nT0Wp3sA="
     },
     "de-indent": {
@@ -4795,6 +4795,11 @@
         "micromatch": "^3.1.10"
       }
     },
+    "http-vue-loader": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npm.taobao.org/http-vue-loader/download/http-vue-loader-1.4.2.tgz",
+      "integrity": "sha1-mOjDME9cE1GFjqymDF2Av2okQZY="
+    },
     "https-browserify": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
@@ -5413,7 +5418,7 @@
     },
     "jquery.cookie": {
       "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jquery.cookie/-/jquery.cookie-1.4.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/jquery.cookie/download/jquery.cookie-1.4.1.tgz",
       "integrity": "sha1-1j3OIJ6raR/mMxbbCMqeR+D5OFs="
     },
     "js-cookie": {
@@ -6230,7 +6235,7 @@
     },
     "normalize-wheel": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz",
       "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
     },
     "npm-run-path": {

+ 1 - 0
package.json

@@ -29,6 +29,7 @@
     "davidshimjs-qrcodejs": "0.0.2",
     "echarts": "^4.9.0",
     "element-ui": "^2.14.1",
+    "http-vue-loader": "^1.4.2",
     "jquery.cookie": "^1.4.1",
     "js-cookie": "^2.2.1",
     "jsbarcode": "^3.11.3",

+ 1 - 0
resources/js/app.js

@@ -11,4 +11,5 @@ window.scanner=require('./utilities/scanner');
 window.datetimeRelating=require('./utilities/datetimeRelating');
 window.Vue.use(window.ElementUI);
 require('bootstrap-select');
+window.Vue.use(require('http-vue-loader'));
 

+ 71 - 0
resources/js/vue/tree.vue

@@ -0,0 +1,71 @@
+<template>
+    <ul class="tree">
+        <li v-for="item in list">
+            <div class="custom-control custom-checkbox mb-3">
+                <input @change="checkedData(item.id,$event)" type="checkbox" class="custom-control-input" :id="'check-'+item.id">
+                <label class="custom-control-label" :for="'check-'+item.id"></label>
+                <label style="cursor: pointer;" @click.prevent.stop="unfold(item.id)">{{item[column]}}</label>
+            </div>
+            <tree :id="'item-'+item.id" class="up" v-if="item.child && item.child.length>0" :list="item.child" :column="column"></tree>
+        </li>
+    </ul>
+</template>
+
+<script>
+    module.exports = {
+        name: "tree",
+        props:["list","column"],
+        mounted(){
+            $(".up").slideUp();
+        },
+        methods:{
+            unfold(id){
+                $('#item-'+id).slideToggle();
+            },
+            checkedData(id,e){
+                let nodes = document.getElementById('item-'+id).getElementsByClassName("custom-control-input");
+                if(nodes.length<1)return;
+                for(let i=0;i<nodes.length;i++)nodes[i].checked = e.target.checked;
+            },
+        },
+    }
+</script>
+
+<style scoped>
+    ul.tree ul {
+        margin: 0;
+        padding: 0 0 0 2em;
+    }
+
+    ul.tree li {
+        list-style: none;
+        position: relative;
+    }
+
+    ul.tree>li:first-child:before {
+        border-style: none none solid none;
+    }
+
+    ul.tree li:before {
+        position: absolute;
+        content: '';
+        top: -0.01em;
+        left: -0.7em;
+        width: 0.5em;
+        height: 0.615em;
+        border-style: none none solid solid;
+        border-width: 0.05em;
+        border-color: #aaa;
+    }
+
+    ul.tree li:not(:last-child):after {
+        position: absolute;
+        content: '';
+        top: 0.6em;
+        left: -0.7em;
+        bottom: -1em;
+        border-style: none none none solid;
+        border-width: 0.05em;
+        border-color: #aaa;
+    }
+</style>

+ 30 - 3
resources/views/maintenance/authority/index.blade.php

@@ -2,9 +2,36 @@
 @section('title')权限@endsection
 
 @section('content')
-
+    <div class="container-fluid" id="container">
+        <div class="card">
+            <div class="card-body">
+                <button class="btn btn-outline-info mb-1 mr-3" @click="openModal()"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>
+                <div class="btn-group pull-right">
+                    <button class="btn border btn-primary" @click="expand(true)">展开全部</button>
+                    <button class="btn border btn-primary" @click="expand(false)">收起全部</button>
+                </div>
+                <tree class="offset-2 h5 font-weight-bold" :list="list" :column="'name'"></tree>
+            </div>
+        </div>
+    </div>
 @stop
 
 @section('lastScript')
-
-@stop
+    <script type="text/javascript">
+        new Vue({
+            el:"#container",
+            data:{
+                list:[@foreach($authorities as $authority)@json($authority),@endforeach],
+            },
+            components:{
+                'tree':"url:{{asset("js/vue/tree.vue")}}"
+            },
+            methods:{
+                expand(isExpand){
+                    if (isExpand) $(".up").slideDown();
+                    else $(".up").slideUp();
+                },
+            },
+        })
+    </script>
+@stop

+ 2 - 2
resources/views/maintenance/menu/index.blade.php

@@ -6,8 +6,8 @@
         @include("maintenance.menu._modal")
         <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
+                <button class="btn btn-outline-info mb-1 mr-3" @click="openModal()"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>
+                <button class="btn border border-2 mb-1 mr-3" :class="isSaveSort ? 'btn-success' : 'text-secondary'" :disabled="!isSaveSort" @click="sort()"> 保 存 </button>
                 <div class="btn-group pull-right">
                     <button class="btn border btn-primary" @click="expand(true)">展开全部</button>
                     <button class="btn border btn-primary" @click="expand(false)">收起全部</button>