From 77a7cac830f2dd240cfd59751fd6cb7293050b65 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期四, 03 六月 2021 10:11:07 +0800
Subject: [PATCH] 同步 dev

---
 ruoyi-ui/src/views/demo/demo/index.vue                                          |   13 +
 ruoyi-generator/src/main/resources/vm/vue/index.vue.vm                          |   13 +
 ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java          |    8 
 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java  |   11 -
 ruoyi-ui/src/views/system/menu/index.vue                                        |    2 
 README.md                                                                       |    7 
 /dev/null                                                                       |  361 ---------------------------------------------
 ruoyi-ui/src/views/tool/build/RightPanel.vue                                    |    2 
 ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm                     |   13 +
 sql/test.sql                                                                    |    4 
 ruoyi-admin/src/main/resources/application-prod.yml                             |    2 
 ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java |    4 
 ruoyi-ui/src/views/demo/tree/index.vue                                          |   13 +
 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java          |    1 
 LICENSE                                                                         |    4 
 ruoyi-admin/src/main/resources/application-dev.yml                              |    2 
 16 files changed, 70 insertions(+), 390 deletions(-)

diff --git a/LICENSE b/LICENSE
index 8564f29..32b3071 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) 2018 RuoYi
+Copyright (c) 2019 RuoYi-Vue-Plus
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of
 this software and associated documentation files (the "Software"), to deal in
@@ -17,4 +17,4 @@
 FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
index 7aac0bf..b877e68 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,7 @@
 ## 骞冲彴绠�浠�
+[![鐮佷簯Gitee](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus)
+[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE)
+[![浣跨敤IntelliJ IDEA寮�鍙戠淮鎶(https://img.shields.io/badge/IntelliJ%20IDEA-鎻愪緵鏀寔-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
 
 鍩轰簬 RuoYi-Vue 闆嗘垚 Mybatis-Plus Lombok Hutool 绛変究鎹峰紑鍙戝伐鍏� 閫傞厤閲嶅啓鐩稿叧涓氬姟 渚夸簬寮�鍙� 瀹氭湡涓� RuoYi-Vue 鍚屾
 * 鍓嶇寮�鍙戞鏋� Vue銆丒lement UI
@@ -19,7 +22,7 @@
 
 ### 渚濊禆鏀瑰姩
 
-* ORM妗嗘灦 浣跨敤 Mybatis-Plus 3.4.2 绠�鍖朇RUD (涓嶆敮鎸佷富瀛愯〃)
+* ORM妗嗘灦 浣跨敤 Mybatis-Plus 绠�鍖朇RUD (涓嶆敮鎸佷富瀛愯〃)
 * Bean绠�鍖� 浣跨敤 Lombok 绠�鍖� get set toString 绛夌瓑
 * 瀹瑰櫒鏀瑰姩 Tomcat 鏀逛负 骞跺彂鎬ц兘鏇村ソ鐨� undertow
 * 鍒嗛〉绉婚櫎 pagehelper 鏀逛负 Mybatis-Plus 鍒嗛〉
@@ -49,7 +52,7 @@
 
 ## 鍏虫敞浣滆��(鎵爜璇峰娉�: "鍔犵兢")
 
-![](https://images.gitee.com/uploads/images/2021/0508/235345_5503356a_1766278.jpeg)
+![浣滆�呭浘鐗嘳(https://images.gitee.com/uploads/images/2021/0508/235345_5503356a_1766278.jpeg)
 
 ## 鎹愮尞浣滆��
 浣滆�呬负鍏艰亴鍋氬紑婧�,骞虫椂杩橀渶瑕佸伐浣�,濡傛灉甯埌浜嗘偍鍙互璇蜂綔鑰呭悆涓洅楗�  
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 71e5b6f..eb54d9c 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -81,7 +81,7 @@
   # 鍗曡妭鐐归厤缃�
   singleServerConfig:
     # 瀹㈡埛绔悕绉�
-    clientName: ${ruoyi-vue-plus.name}
+    clientName: ${ruoyi.name}
     # 鏈�灏忕┖闂茶繛鎺ユ暟
     connectionMinimumIdleSize: 32
     # 杩炴帴姹犲ぇ灏�
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index eba8a89..2ebdcbd 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -81,7 +81,7 @@
   # 鍗曡妭鐐归厤缃�
   singleServerConfig:
     # 瀹㈡埛绔悕绉�
-    clientName: ${ruoyi-vue-plus.name}
+    clientName: ${ruoyi.name}
     # 鏈�灏忕┖闂茶繛鎺ユ暟
     connectionMinimumIdleSize: 32
     # 杩炴帴姹犲ぇ灏�
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java
index 9b37921..317b92e 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java
@@ -13,7 +13,7 @@
 
 /**
  * web灞傞�氱敤鏁版嵁澶勭悊
- * 
+ *
  * @author ruoyi
  */
 public class BaseController
@@ -39,7 +39,7 @@
 
     /**
      * 鍝嶅簲杩斿洖缁撴灉
-     * 
+     *
      * @param rows 褰卞搷琛屾暟
      * @return 鎿嶄綔缁撴灉
      */
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
index 6c4c239..3c8bc92 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
@@ -96,8 +96,12 @@
 	 * @param collection 澶氫釜瀵硅薄
 	 * @return
 	 */
-	public long deleteObject(final Collection collection) {
-		return redissonClient.getKeys().delete(Arrays.toString(collection.toArray()));
+	public void deleteObject(final Collection collection) {
+		RBatch batch = redissonClient.createBatch();
+		collection.forEach(t->{
+			batch.getBucket(t.toString()).deleteAsync();
+		});
+		batch.execute();
 	}
 
 	/**
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java
index d918a48..94dcf45 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java
@@ -95,6 +95,7 @@
         }
         finally
         {
+            IOUtils.closeQuietly(in);
             IOUtils.closeQuietly(baos);
         }
     }
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
index 383f4b6..830dbe5 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
@@ -8,6 +8,7 @@
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.ServletUtils;
+import com.ruoyi.common.utils.reflect.ReflectUtils;
 import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.framework.web.service.TokenService;
 import org.aspectj.lang.JoinPoint;
@@ -159,7 +160,6 @@
 		}
 	}
 
-	@SuppressWarnings("unchecked")
 	private static void putDataScope(JoinPoint joinPoint, String sql) {
 		Object params = joinPoint.getArgs()[0];
 		if (Validator.isNotNull(params)) {
@@ -167,13 +167,8 @@
 				BaseEntity baseEntity = (BaseEntity) params;
 				baseEntity.getParams().put(DATA_SCOPE, sql);
 			} else {
-				try {
-					Method getParams = params.getClass().getDeclaredMethod("getParams");
-					Map<String, Object> invoke = (Map<String, Object>) getParams.invoke(params);
-					invoke.put(DATA_SCOPE, sql);
-				} catch (Exception e) {
-					// 鏂规硶鏈壘鍒� 涓嶅鐞�
-				}
+				Map<String, Object> invoke = ReflectUtils.invokeGetter(params, "params");
+				invoke.put(DATA_SCOPE, sql);
 			}
 		}
 	}
diff --git a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
index 969dba8..f1247ab 100644
--- a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
+++ b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
@@ -247,7 +247,7 @@
 #end
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button>
         <el-button @click="cancel">鍙� 娑�</el-button>
       </div>
     </el-dialog>
@@ -302,6 +302,8 @@
   },
   data() {
     return {
+	  //鎸夐挳loading
+	  buttonLoading: false,
       // 閬僵灞�
       loading: true,
       // 鏄剧ず鎼滅储鏉′欢
@@ -480,12 +482,14 @@
     },
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
+	  this.loading = true;
       this.reset();
       this.getTreeselect();
       if (row != null) {
         this.form.${treeParentCode} = row.${treeCode};
       }
       get${BusinessName}(row.${pkColumn.javaField}).then(response => {
+	    this.loading = false;
         this.form = response.data;
 #foreach ($column in $columns)
 #if($column.htmlType == "checkbox")
@@ -500,6 +504,7 @@
     submitForm() {
       this.#[[$]]#refs["form"].validate(valid => {
         if (valid) {
+		  this.buttonLoading = true;
 #foreach ($column in $columns)
 #if($column.htmlType == "checkbox")
           this.form.$column.javaField = this.form.${column.javaField}.join(",");
@@ -507,12 +512,14 @@
 #end
           if (this.form.${pkColumn.javaField} != null) {
             update${BusinessName}(this.form).then(response => {
+			  this.buttonLoading = false;
               this.msgSuccess("淇敼鎴愬姛");
               this.open = false;
               this.getList();
             });
           } else {
             add${BusinessName}(this.form).then(response => {
+			  this.buttonLoading = false;
               this.msgSuccess("鏂板鎴愬姛");
               this.open = false;
               this.getList();
@@ -527,9 +534,11 @@
           confirmButtonText: "纭畾",
           cancelButtonText: "鍙栨秷",
           type: "warning"
-        }).then(function() {
+        }).then(() => {
+		  this.loading = true;
           return del${BusinessName}(row.${pkColumn.javaField});
         }).then(() => {
+		  this.loading = false;
           this.getList();
           this.msgSuccess("鍒犻櫎鎴愬姛");
         })
diff --git a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm
index b384ba5..9f58575 100644
--- a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm
+++ b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm
@@ -301,7 +301,7 @@
 #end
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button>
         <el-button @click="cancel">鍙� 娑�</el-button>
       </div>
     </el-dialog>
@@ -353,6 +353,8 @@
   },
   data() {
     return {
+	  //鎸夐挳loading
+	  buttonLoading: false,
       // 閬僵灞�
       loading: true,
       // 瀵煎嚭閬僵灞�
@@ -534,9 +536,11 @@
     },
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
+      this.loading = true;
       this.reset();
       const ${pkColumn.javaField} = row.${pkColumn.javaField} || this.ids
       get${BusinessName}(${pkColumn.javaField}).then(response => {
+        this.loading = false;
         this.form = response.data;
 #foreach ($column in $columns)
 #if($column.htmlType == "checkbox")
@@ -554,6 +558,7 @@
     submitForm() {
       this.#[[$]]#refs["form"].validate(valid => {
         if (valid) {
+          this.buttonLoading = true;
 #foreach ($column in $columns)
 #if($column.htmlType == "checkbox")
           this.form.$column.javaField = this.form.${column.javaField}.join(",");
@@ -564,12 +569,14 @@
 #end
           if (this.form.${pkColumn.javaField} != null) {
             update${BusinessName}(this.form).then(response => {
+              this.buttonLoading = false;
               this.msgSuccess("淇敼鎴愬姛");
               this.open = false;
               this.getList();
             });
           } else {
             add${BusinessName}(this.form).then(response => {
+              this.buttonLoading = false;
               this.msgSuccess("鏂板鎴愬姛");
               this.open = false;
               this.getList();
@@ -585,9 +592,11 @@
           confirmButtonText: "纭畾",
           cancelButtonText: "鍙栨秷",
           type: "warning"
-        }).then(function() {
+        }).then(() => {
+          this.loading = true;
           return del${BusinessName}(${pkColumn.javaField}s);
         }).then(() => {
+          this.loading = false;
           this.getList();
           this.msgSuccess("鍒犻櫎鎴愬姛");
         })
diff --git a/ruoyi-ui/src/views/demo/demo/index.vue b/ruoyi-ui/src/views/demo/demo/index.vue
index b831ad9..48fa368 100644
--- a/ruoyi-ui/src/views/demo/demo/index.vue
+++ b/ruoyi-ui/src/views/demo/demo/index.vue
@@ -152,7 +152,7 @@
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button>
         <el-button @click="cancel">鍙� 娑�</el-button>
       </div>
     </el-dialog>
@@ -168,6 +168,8 @@
   },
   data() {
     return {
+      //鎸夐挳loading
+      buttonLoading: false,
       // 閬僵灞�
       loading: true,
       // 瀵煎嚭閬僵灞�
@@ -277,9 +279,11 @@
     },
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
+      this.loading = true;
       this.reset();
       const id = row.id || this.ids
       getDemo(id).then(response => {
+        this.loading = false;
         this.form = response.data;
         this.open = true;
         this.title = "淇敼娴嬭瘯鍗曡〃";
@@ -289,14 +293,17 @@
     submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
+          this.buttonLoading = true;
           if (this.form.id != null) {
             updateDemo(this.form).then(response => {
+              this.buttonLoading = false;
               this.msgSuccess("淇敼鎴愬姛");
               this.open = false;
               this.getList();
             });
           } else {
             addDemo(this.form).then(response => {
+              this.buttonLoading = false;
               this.msgSuccess("鏂板鎴愬姛");
               this.open = false;
               this.getList();
@@ -312,9 +319,11 @@
         confirmButtonText: "纭畾",
         cancelButtonText: "鍙栨秷",
         type: "warning"
-      }).then(function() {
+      }).then(() => {
+        this.loading = true;
         return delDemo(ids);
       }).then(() => {
+        this.loading = false;
         this.getList();
         this.msgSuccess("鍒犻櫎鎴愬姛");
       })
diff --git a/ruoyi-ui/src/views/demo/test/index.vue b/ruoyi-ui/src/views/demo/test/index.vue
deleted file mode 100644
index 897e54e..0000000
--- a/ruoyi-ui/src/views/demo/test/index.vue
+++ /dev/null
@@ -1,361 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="key閿�" prop="testKey">
-        <el-input
-          v-model="queryParams.testKey"
-          placeholder="璇疯緭鍏ey閿�"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="鍊�" prop="value">
-        <el-input
-          v-model="queryParams.value"
-          placeholder="璇疯緭鍏ュ��"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="鐗堟湰" prop="version">
-        <el-input
-          v-model="queryParams.version"
-          placeholder="璇疯緭鍏ョ増鏈�"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿">
-        <el-date-picker
-          v-model="daterangeCreateTime"
-          size="small"
-          style="width: 240px"
-          value-format="yyyy-MM-dd"
-          type="daterange"
-          range-separator="-"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-        ></el-date-picker>
-      </el-form-item>
-      <el-form-item label="鍒犻櫎鏍囧織" prop="deleted">
-        <el-input
-          v-model="queryParams.deleted"
-          placeholder="璇疯緭鍏ュ垹闄ゆ爣蹇�"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="鐖秈d" prop="parentId">
-        <el-input
-          v-model="queryParams.parentId"
-          placeholder="璇疯緭鍏ョ埗id"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="鎺掑簭鍙�" prop="orderNum">
-        <el-input
-          v-model="queryParams.orderNum"
-          placeholder="璇疯緭鍏ユ帓搴忓彿"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['demo:test:add']"
-        >鏂板</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['demo:test:edit']"
-        >淇敼</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['demo:test:remove']"
-        >鍒犻櫎</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['demo:test:export']"
-        >瀵煎嚭</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="testList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="涓婚敭" align="center" prop="id" v-if="false"/>
-      <el-table-column label="key閿�" align="center" prop="testKey" />
-      <el-table-column label="鍊�" align="center" prop="value" />
-      <el-table-column label="鐗堟湰" align="center" prop="version" />
-      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="鍒犻櫎鏍囧織" align="center" prop="deleted" />
-      <el-table-column label="鐖秈d" align="center" prop="parentId" />
-      <el-table-column label="鎺掑簭鍙�" align="center" prop="orderNum" />
-      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['demo:test:edit']"
-          >淇敼</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['demo:test:remove']"
-          >鍒犻櫎</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 娣诲姞鎴栦慨鏀规祴璇曞璇濇 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="key閿�" prop="testKey">
-          <el-input v-model="form.testKey" placeholder="璇疯緭鍏ey閿�" />
-        </el-form-item>
-        <el-form-item label="鍊�" prop="value">
-          <el-input v-model="form.value" placeholder="璇疯緭鍏ュ��" />
-        </el-form-item>
-        <el-form-item label="鐗堟湰" prop="version">
-          <el-input v-model="form.version" placeholder="璇疯緭鍏ョ増鏈�" />
-        </el-form-item>
-        <el-form-item label="鍒犻櫎鏍囧織" prop="deleted">
-          <el-input v-model="form.deleted" placeholder="璇疯緭鍏ュ垹闄ゆ爣蹇�" />
-        </el-form-item>
-        <el-form-item label="鐖秈d" prop="parentId">
-          <el-input v-model="form.parentId" placeholder="璇疯緭鍏ョ埗id" />
-        </el-form-item>
-        <el-form-item label="鎺掑簭鍙�" prop="orderNum">
-          <el-input v-model="form.orderNum" placeholder="璇疯緭鍏ユ帓搴忓彿" />
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
-        <el-button @click="cancel">鍙� 娑�</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import { listTest, getTest, delTest, addTest, updateTest, exportTest } from "@/api/demo/test";
-
-export default {
-  name: "Test",
-  components: {
-  },
-  data() {
-    return {
-      // 閬僵灞�
-      loading: true,
-      // 閫変腑鏁扮粍
-      ids: [],
-      // 闈炲崟涓鐢�
-      single: true,
-      // 闈炲涓鐢�
-      multiple: true,
-      // 鏄剧ず鎼滅储鏉′欢
-      showSearch: true,
-      // 鎬绘潯鏁�
-      total: 0,
-      // 娴嬭瘯琛ㄦ牸鏁版嵁
-      testList: [],
-      // 寮瑰嚭灞傛爣棰�
-      title: "",
-      // 鏄惁鏄剧ず寮瑰嚭灞�
-      open: false,
-      // 鍒涘缓鏃堕棿鏃堕棿鑼冨洿
-      daterangeCreateTime: [],
-      // 鏌ヨ鍙傛暟
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        testKey: undefined,
-        value: undefined,
-        version: undefined,
-        createTime: undefined,
-        deleted: undefined,
-        parentId: undefined,
-        orderNum: undefined
-      },
-      // 琛ㄥ崟鍙傛暟
-      form: {},
-      // 琛ㄥ崟鏍¢獙
-      rules: {
-      }
-    };
-  },
-  created() {
-    this.getList();
-  },
-  methods: {
-    /** 鏌ヨ娴嬭瘯鍒楄〃 */
-    getList() {
-      this.loading = true;
-      this.queryParams.params = {};
-      if (null != this.daterangeCreateTime && '' != this.daterangeCreateTime) {
-        this.queryParams.params["beginCreateTime"] = this.daterangeCreateTime[0];
-        this.queryParams.params["endCreateTime"] = this.daterangeCreateTime[1];
-      }
-      listTest(this.queryParams).then(response => {
-        this.testList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
-    },
-    // 鍙栨秷鎸夐挳
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 琛ㄥ崟閲嶇疆
-    reset() {
-      this.form = {
-        id: undefined,
-        testKey: undefined,
-        value: undefined,
-        version: undefined,
-        createTime: undefined,
-        deleted: undefined,
-        parentId: undefined,
-        orderNum: undefined
-      };
-      this.resetForm("form");
-    },
-    /** 鎼滅储鎸夐挳鎿嶄綔 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    /** 閲嶇疆鎸夐挳鎿嶄綔 */
-    resetQuery() {
-      this.daterangeCreateTime = [];
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    // 澶氶�夋閫変腑鏁版嵁
-    handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id)
-      this.single = selection.length!==1
-      this.multiple = !selection.length
-    },
-    /** 鏂板鎸夐挳鎿嶄綔 */
-    handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "娣诲姞娴嬭瘯";
-    },
-    /** 淇敼鎸夐挳鎿嶄綔 */
-    handleUpdate(row) {
-      this.reset();
-      const id = row.id || this.ids
-      getTest(id).then(response => {
-        this.form = response.data;
-        this.open = true;
-        this.title = "淇敼娴嬭瘯";
-      });
-    },
-    /** 鎻愪氦鎸夐挳 */
-    submitForm() {
-      this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.id != null) {
-            updateTest(this.form).then(response => {
-              this.msgSuccess("淇敼鎴愬姛");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addTest(this.form).then(response => {
-              this.msgSuccess("鏂板鎴愬姛");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$confirm('鏄惁纭鍒犻櫎娴嬭瘯缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
-          confirmButtonText: "纭畾",
-          cancelButtonText: "鍙栨秷",
-          type: "warning"
-        }).then(function() {
-          return delTest(ids);
-        }).then(() => {
-          this.getList();
-          this.msgSuccess("鍒犻櫎鎴愬姛");
-        })
-    },
-    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
-    handleExport() {
-      const queryParams = this.queryParams;
-      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋祴璇曟暟鎹」?', "璀﹀憡", {
-          confirmButtonText: "纭畾",
-          cancelButtonText: "鍙栨秷",
-          type: "warning"
-        }).then(function() {
-          return exportTest(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-        })
-    }
-  }
-};
-</script>
diff --git a/ruoyi-ui/src/views/demo/tree/index.vue b/ruoyi-ui/src/views/demo/tree/index.vue
index ddf7677..afe96c4 100644
--- a/ruoyi-ui/src/views/demo/tree/index.vue
+++ b/ruoyi-ui/src/views/demo/tree/index.vue
@@ -102,7 +102,7 @@
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button>
         <el-button @click="cancel">鍙� 娑�</el-button>
       </div>
     </el-dialog>
@@ -121,6 +121,8 @@
   },
   data() {
     return {
+      //鎸夐挳loading
+      buttonLoading: false,
       // 閬僵灞�
       loading: true,
       // 鏄剧ず鎼滅储鏉′欢
@@ -233,12 +235,14 @@
     },
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
+      this.loading = true;
       this.reset();
       this.getTreeselect();
       if (row != null) {
         this.form.parentId = row.id;
       }
       getTree(row.id).then(response => {
+        this.loading = false;
         this.form = response.data;
         this.open = true;
         this.title = "淇敼娴嬭瘯鏍戣〃";
@@ -248,14 +252,17 @@
     submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
+          this.buttonLoading = true;
           if (this.form.id != null) {
             updateTree(this.form).then(response => {
+              this.buttonLoading = false;
               this.msgSuccess("淇敼鎴愬姛");
               this.open = false;
               this.getList();
             });
           } else {
             addTree(this.form).then(response => {
+              this.buttonLoading = false;
               this.msgSuccess("鏂板鎴愬姛");
               this.open = false;
               this.getList();
@@ -270,9 +277,11 @@
         confirmButtonText: "纭畾",
         cancelButtonText: "鍙栨秷",
         type: "warning"
-      }).then(function() {
+      }).then(() => {
+        this.loading = true;
         return delTree(row.id);
       }).then(() => {
+        this.loading = false;
         this.getList();
         this.msgSuccess("鍒犻櫎鎴愬姛");
       })
diff --git a/ruoyi-ui/src/views/system/menu/index.vue b/ruoyi-ui/src/views/system/menu/index.vue
index 094a706..8d2137a 100644
--- a/ruoyi-ui/src/views/system/menu/index.vue
+++ b/ruoyi-ui/src/views/system/menu/index.vue
@@ -163,7 +163,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item v-if="form.menuType != 'M'" label="鏉冮檺鏍囪瘑">
-              <el-input v-model="form.perms" placeholder="璇锋潈闄愭爣璇�" maxlength="50" />
+              <el-input v-model="form.perms" placeholder="璇锋潈闄愭爣璇�" maxlength="100" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
diff --git a/ruoyi-ui/src/views/tool/build/RightPanel.vue b/ruoyi-ui/src/views/tool/build/RightPanel.vue
index 1acdc57..88013a5 100644
--- a/ruoyi-ui/src/views/tool/build/RightPanel.vue
+++ b/ruoyi-ui/src/views/tool/build/RightPanel.vue
@@ -573,6 +573,7 @@
 
 <script>
 import { isArray } from 'util'
+import draggable from 'vuedraggable'
 import TreeNodeDialog from './TreeNodeDialog'
 import { isNumberStr } from '@/utils/index'
 import IconsDialog from './IconsDialog'
@@ -595,6 +596,7 @@
 
 export default {
   components: {
+    draggable,
     TreeNodeDialog,
     IconsDialog
   },
diff --git a/sql/test.sql b/sql/test.sql
index b7003ce2..601360a 100644
--- a/sql/test.sql
+++ b/sql/test.sql
@@ -12,7 +12,7 @@
     create_by   varchar(64) NULL DEFAULT NULL COMMENT '鍒涘缓浜�',
     update_time datetime(0) NULL DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
     update_by   varchar(64) NULL DEFAULT NULL COMMENT '鏇存柊浜�',
-    del_flag    int(0) NULL DEFAULT NULL COMMENT '鍒犻櫎鏍囧織',
+    del_flag    int(0) NULL DEFAULT 0 COMMENT '鍒犻櫎鏍囧織',
     PRIMARY KEY (id) USING BTREE
 ) ENGINE = InnoDB COMMENT = '娴嬭瘯鍗曡〃';
 
@@ -29,7 +29,7 @@
     create_by   varchar(64) NULL DEFAULT NULL COMMENT '鍒涘缓浜�',
     update_time datetime(0) NULL DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
     update_by   varchar(64) NULL DEFAULT NULL COMMENT '鏇存柊浜�',
-    del_flag    int(0) NULL DEFAULT NULL COMMENT '鍒犻櫎鏍囧織',
+    del_flag    int(0) NULL DEFAULT 0 COMMENT '鍒犻櫎鏍囧織',
     PRIMARY KEY (id) USING BTREE
 ) ENGINE = InnoDB COMMENT = '娴嬭瘯鏍戣〃';
 

--
Gitblit v1.9.3