From b43048a589d61994039faa8de55c825c53767b1f Mon Sep 17 00:00:00 2001
From: RuoYi <yzz_ivy@163.com>
Date: Sat, 21 Mar 2026 22:54:21 +0800
Subject: [PATCH] 菜单管理支持批量保存排序
---
ruoyi-ui/src/views/system/menu/index.vue | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/ruoyi-ui/src/views/system/menu/index.vue b/ruoyi-ui/src/views/system/menu/index.vue
index a6b2f9c..6510a8e 100644
--- a/ruoyi-ui/src/views/system/menu/index.vue
+++ b/ruoyi-ui/src/views/system/menu/index.vue
@@ -38,6 +38,16 @@
</el-col>
<el-col :span="1.5">
<el-button
+ type="warning"
+ plain
+ icon="el-icon-check"
+ size="mini"
+ @click="handleSaveSort"
+ v-hasPermi="['system:menu:edit']"
+ >保存排序</el-button>
+ </el-col>
+ <el-col :span="1.5">
+ <el-button
type="info"
plain
icon="el-icon-sort"
@@ -62,7 +72,11 @@
<svg-icon :icon-class="scope.row.icon" />
</template>
</el-table-column>
- <el-table-column prop="orderNum" label="排序" width="60"></el-table-column>
+ <el-table-column prop="orderNum" label="排序" width="200">
+ <template slot-scope="scope">
+ <el-input-number v-model="scope.row.orderNum" controls-position="right" :min="0" size="mini" style="width: 88px" />
+ </template>
+ </el-table-column>
<el-table-column prop="perms" label="权限标识" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="component" label="组件路径" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="status" label="状态" width="80">
@@ -299,7 +313,7 @@
</template>
<script>
-import { listMenu, getMenu, delMenu, addMenu, updateMenu } from "@/api/system/menu"
+import { listMenu, getMenu, delMenu, addMenu, updateMenu, updateMenuSort } from "@/api/system/menu"
import Treeselect from "@riophae/vue-treeselect"
import "@riophae/vue-treeselect/dist/vue-treeselect.css"
import IconSelect from "@/components/IconSelect"
@@ -326,6 +340,8 @@
isExpandAll: false,
// 重新渲染表格状态
refreshTable: true,
+ // 记录原始排序,用于对比变更
+ originalOrders: {},
// 查询参数
queryParams: {
menuName: undefined,
@@ -360,6 +376,8 @@
this.loading = true
listMenu(this.queryParams).then(response => {
this.menuList = this.handleTree(response.data, "menuId")
+ // 记录原始排序值
+ this.recordOriginalOrders(this.menuList)
this.loading = false
})
},
@@ -463,6 +481,40 @@
}
})
},
+ /** 递归记录原始排序 */
+ recordOriginalOrders(list) {
+ list.forEach(item => {
+ this.originalOrders[item.menuId] = item.orderNum
+ if (item.children && item.children.length) {
+ this.recordOriginalOrders(item.children)
+ }
+ })
+ },
+ /** 保存排序 */
+ handleSaveSort() {
+ const changedMenuIds = []
+ const changedOrderNums = []
+ const collectChanged = (list) => {
+ list.forEach(item => {
+ if (String(this.originalOrders[item.menuId]) !== String(item.orderNum)) {
+ changedMenuIds.push(item.menuId)
+ changedOrderNums.push(item.orderNum)
+ }
+ if (item.children && item.children.length) {
+ collectChanged(item.children)
+ }
+ })
+ }
+ collectChanged(this.menuList)
+ if (changedMenuIds.length === 0) {
+ this.$modal.msgWarning("未检测到排序修改")
+ return
+ }
+ updateMenuSort({ menuIds: changedMenuIds.join(","), orderNums: changedOrderNums.join(",") }).then(() => {
+ this.$modal.msgSuccess("排序保存成功")
+ this.recordOriginalOrders(this.menuList)
+ })
+ },
/** 删除按钮操作 */
handleDelete(row) {
this.$modal.confirm('是否确认删除名称为"' + row.menuName + '"的数据项?').then(function() {
--
Gitblit v1.9.3