From 16d2a38e7bb7a31d6e355d031115a58bffd0109d Mon Sep 17 00:00:00 2001 From: ludc Date: 星期三, 26 七月 2023 15:01:39 +0800 Subject: [PATCH] 增加菜单管理中,从其他菜单克隆按钮功能、 --- Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java | 8 + Source/UBCS-WEB/src/views/system/menu.vue | 290 +++++++++++++++++++++++++++++++++++++--- Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java | 2 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java | 12 + Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/ButtonCloneVO.java | 18 ++ Source/UBCS-WEB/vue.config.js | 4 Source/UBCS-WEB/src/api/system/menu.js | 6 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java | 40 +++++ 8 files changed, 350 insertions(+), 30 deletions(-) diff --git a/Source/UBCS-WEB/src/api/system/menu.js b/Source/UBCS-WEB/src/api/system/menu.js index 7547aa0..ba197bb 100644 --- a/Source/UBCS-WEB/src/api/system/menu.js +++ b/Source/UBCS-WEB/src/api/system/menu.js @@ -106,3 +106,9 @@ topMenuId, } }); + +export const cloneMenuButton = (data) => request({ + url: '/api/ubcs-system/menu/cloneMenuButton', + method: 'post', + data: data +}); \ No newline at end of file diff --git a/Source/UBCS-WEB/src/views/system/menu.vue b/Source/UBCS-WEB/src/views/system/menu.vue index bbc8ff1..710ca16 100644 --- a/Source/UBCS-WEB/src/views/system/menu.vue +++ b/Source/UBCS-WEB/src/views/system/menu.vue @@ -32,7 +32,7 @@ size="small" icon="el-icon-connection" plain - @click="cloneButton">浠庡叾浠栬彍鍗曞厠闅嗘寜閽� + @click="cloneMenuButton">浠庡叾浠栬彍鍗曞厠闅嗘寜閽� </el-button> </template> <template slot-scope="scope" slot="menu"> @@ -52,25 +52,40 @@ </div> </template> </avue-crud> - <!-- 浠庡叾浠栬彍鍗曞厠闅嗘寜閽� --> <el-dialog title="浠庡叾浠栬彍鍗曞厠闅嗘寜閽�" append-to-body - :visible.sync="cloneButtonSettingBox" - width="800px" - style="height: 116vh; margin-top: -10vh;"> - <avue-crud - :option="dialogeOption" - :table-loading="dialogLoading" - :data="useRangeData" - @refresh-change="refreshUseRangeChange"> + :visible.sync="cloneOtherMenuButtons.cloneButtonSettingBox" + width="1100px" + @close="cleanCloneSelections" + style="height: 110vh; margin-top: -10vh;"> + <avue-crud :option="cloneOtherMenuButtons.cloneOption" + :table-loading="cloneOtherMenuButtons.cloneLoading" + :data="cloneOtherMenuButtons.cloneData" + ref="cloneCrud" + @search-change="searchCloneChange" + @search-reset="searchCloneReset" + @selection-change="selectionCloneChange" + @row-click="clickRowCloneChange" + @refresh-change="refreshCloneChange" + @on-load="cloneOnLoad" + @tree-load="treeLoad"> + <template slot-scope="{row}" slot="source"> + <div style="text-align:center"> + <i :class="row.source"/> + </div> + </template> </avue-crud> - </el-dialog> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="cloneButtonsToMenu">淇� 瀛�</el-button> + <el-button @click="cloneOtherMenuButtons.cloneButtonSettingBox = false">鍙� 娑�</el-button> + </div> + </el-dialog> </basic-container> </template> <script> - import {getLazyList, remove, update, add, getMenu} from "@/api/system/menu"; + import {getLazyList, remove, update, add, getMenu ,cloneMenuButton} from "@/api/system/menu"; import {mapGetters} from "vuex"; import iconList from "@/config/iconList"; import func from "@/util/func"; @@ -275,7 +290,130 @@ // 浠庡叾浠栬彍鍗曞厠闅嗘寜閽� cloneOtherMenuButtons: { cloneButtonSettingBox: false, - + selectCloneButtons: [], + cloneOption: { + height: "auto", + menu: false, + addBtn: false, + lazy: true, + tip: false, + simplePage: true, + searchShow: true, + searchMenuSpan: 6, + dialogWidth: "60%", + tree: true, + border: true, + index: true, + selection: true, + columnBtn: false, + searchShowBtn: false, + menuWidth: 300, + dialogClickModal: false, + highlightCurrentRow: true, //琛岄�変腑鏃堕珮浜� + column: [ + { + label: "鑿滃崟鍚嶇О", + prop: "name", + search: true, + }, + { + label: "璺敱鍦板潃", + prop: "path", + }, + { + label: "涓婄骇鑿滃崟", + prop: "parentId", + type: "tree", + hide: true, + addDisabled: false, + props: { + label: "title" + }, + }, + { + label: "鑿滃崟鍥炬爣", + prop: "source", + type: "icon", + slot: true, + iconList: iconList, + }, + { + label: "鑿滃崟缂栧彿", + prop: "code", + search: true, + }, + { + label: "鑿滃崟绫诲瀷", + prop: "category", + type: "radio", + dicData: [ + { + label: "鑿滃崟", + value: 1 + }, + { + label: "鎸夐挳", + value: 2 + } + ], + }, + { + label: "鑿滃崟鍒悕", + prop: "alias", + search: true, + }, + { + label: "鏂扮獥鍙�", + prop: "isOpen", + type: "radio", + dicData: [ + { + label: "鍚�", + value: 1 + }, + { + label: "鏄�", + value: 2 + } + ], + }, + { + label: "鑿滃崟鎺掑簭", + prop: "sort", + type: "number", + }, + { + label: "璺敱缂撳瓨", + prop: "keepAlive", + type: "switch", + dicData: [ + { + label: "鍚�", + value: "false" + }, + { + label: "鏄�", + value: "true" + } + ], + }, + { + label: "鑿滃崟澶囨敞", + prop: "remark", + type: "textarea", + span: 24, + minRows: 2, + } + ] + }, + cloneLoading: false, + cloneData: [], + cloneQuery: {}, + clonePage: { + pageSize: 10, + currentPage: 1, + total: 0, + }, } }; }, @@ -311,6 +449,108 @@ } }, methods: { + + /** 浠庡叾浠栬彍鍗曞厠闅嗘寜閽� */ + cloneMenuButton(){ + if(this.selectionList.length != 1 || this.selectionList[0].category === 2){ + this.$message({ + type: "warning", + message: "璇烽�夋嫨涓�鏉¢潪鎸夐挳绫诲瀷鐨勬暟鎹�!" + }); + return; + } + this.cloneOtherMenuButtons.cloneButtonSettingBox = true; + }, + /** 鍏嬮殕鎸夐挳鍒伴�変腑鐨勮彍鍗曚笅 */ + cloneButtonsToMenu(){ + if(this.selectionList.length != 1){ + this.$message({ + type: "warning", + message: "瑕佸厠闅嗘寜閽殑鑿滃崟淇℃伅宸蹭涪澶憋紝璇烽噸鏂伴�夋嫨!" + }); + return; + } + if(this.cloneOtherMenuButtons.selectCloneButtons.length <= 0){ + this.$message({ + type: "warning", + message: "璇烽�夋嫨瑕佸厠闅嗘寜閽暟鎹�!" + }); + return; + } + this.$confirm("纭畾灏嗛�変腑鐨勬寜閽厠闅嗗埌銆�"+this.selectionList[0].name+"銆戣彍鍗曚腑?", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "info" + }) + .then(() => { + let buttonIds = []; + let flag = true; + this.cloneOtherMenuButtons.selectCloneButtons.forEach(function(item) { + if(item.category != 2){ + flag = false; + }else { + buttonIds.push(item.id); + } + }); + // 閫夋嫨浜嗛潪鎸夐挳绫诲瀷鐨勬暟鎹� + if(!flag){ + this.$message({ + type: "warning", + message: "鍙兘閫夋嫨鎸夐挳绫诲瀷鐨勮〃鏍艰!" + }); + return; + } + // console.log(buttonIds); + return cloneMenuButton({"menuId":this.selectionList[0].id,"buttonIds": buttonIds}); + }) + .then(res => { + this.$message({ + type: res.data.success ? "success":"error", + message: res.data.msg, + }); + this.cloneOtherMenuButtons.cloneButtonSettingBox = false; + // 鏁版嵁鍥炶皟杩涜鍒锋柊 + this.onLoad(this.page); + }); + }, + /** 閫変腑琚厠闅嗙殑鎸夐挳鏃惰Е鍙� */ + selectionCloneChange(list) { + this.cloneOtherMenuButtons.selectCloneButtons = list; + this.$refs.cloneCrud.setCurrentRow(this.cloneOtherMenuButtons.selectCloneButtons[list.length-1]); + }, + clickRowCloneChange(row){ + this.cloneOtherMenuButtons.selectCloneButtons.push(row); + this.$refs.cloneCrud.setCurrentRow(row); + this.$refs.cloneCrud.toggleRowSelection(row); //閫変腑褰撳墠琛� + }, + /** 鍏抽棴瀵硅瘽妗嗘椂娓呯┖閫変腑鐨勫垪琛� */ + cleanCloneSelections(){ + this.cloneOtherMenuButtons.selectCloneButtons = []; + this.$refs.cloneCrud.toggleSelection(); + }, + cloneOnLoad(page, params = {}) { + this.cloneOtherMenuButtons.cloneLoading = true; + getLazyList(this.parentId, Object.assign(params, this.cloneOtherMenuButtons.cloneQuery)).then(res => { + this.cloneOtherMenuButtons.cloneData = res.data.data; + this.cloneOtherMenuButtons.cloneLoading = false; + }); + }, + searchCloneChange(params, done){ + this.cloneOtherMenuButtons.cloneQuery = params; + this.parentId = ''; + this.cloneOtherMenuButtons.clonePage.currentPage = 1; + this.cloneOnLoad(this.cloneOtherMenuButtons.clonePage, params); + done(); + }, + searchCloneReset(){ + this.cloneOtherMenuButtons.cloneQuery = {}; + this.parentId = 0; + this.cloneOnLoad(this.cloneOtherMenuButtons.clonePage); + }, + refreshCloneChange(){ + this.onLoad(this.cloneOtherMenuButtons.clonePage, this.cloneOtherMenuButtons.cloneQuery); + }, + initData() { getMenuTree().then(res => { const column = this.findObject(this.option.column, "parentId"); @@ -359,17 +599,17 @@ cancelButtonText: "鍙栨秷", type: "warning" }) - .then(() => { - return remove(row.id); - }) - .then(() => { - this.$message({ - type: "success", - message: "鎿嶄綔鎴愬姛!" - }); - // 鏁版嵁鍥炶皟杩涜鍒锋柊 - done(row); + .then(() => { + return remove(row.id); + }) + .then(() => { + this.$message({ + type: "success", + message: "鎿嶄綔鎴愬姛!" }); + // 鏁版嵁鍥炶皟杩涜鍒锋柊 + done(row); + }); }, handleDelete() { if (this.selectionList.length === 0) { @@ -397,10 +637,6 @@ message: "鎿嶄綔鎴愬姛!" }); }); - }, - /** 浠庡叾浠栬彍鍗曞厠闅嗘寜閽� */ - cloneButton(){ - }, searchReset() { this.query = {}; diff --git a/Source/UBCS-WEB/vue.config.js b/Source/UBCS-WEB/vue.config.js index 0991057..ad43a75 100644 --- a/Source/UBCS-WEB/vue.config.js +++ b/Source/UBCS-WEB/vue.config.js @@ -26,10 +26,10 @@ proxy: { '/api': { //鏈湴鏈嶅姟鎺ュ彛鍦板潃 - // target: 'http://localhost:37000', + target: 'http://localhost:37000', // target: 'http://192.168.1.51:37000', // target: 'http://192.168.1.46:37000', - target: 'http://dev.vci-tech.com:37000', + // target: 'http://dev.vci-tech.com:37000', // target: 'http://192.168.1.51:37000/', // target: 'http://192.168.1.104:37000', // target: 'http://192.168.1.63:37000', diff --git a/Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/ButtonCloneVO.java b/Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/ButtonCloneVO.java new file mode 100644 index 0000000..75bc58c --- /dev/null +++ b/Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/ButtonCloneVO.java @@ -0,0 +1,18 @@ +package com.vci.ubcs.system.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @author ludc + * @date 2023/7/26 12:11 + */ +@Data +public class ButtonCloneVO { + + private Long menuId; + + private List<String> buttonIds; + +} diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java index 82ae965..0023217 100644 --- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java +++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java @@ -712,7 +712,7 @@ return dataGrid; } //杩欎釜涓氬姟绫诲瀷涓嬬殑鎵�鏈夊睘鎬� - R<BtmTypeVO> btmTypeVOR = btmTypeClient.getAllAttributeByBtmOid(codeClassifyTemplateDO.getBtmTypeId()); + R<BtmTypeVO> btmTypeVOR = btmTypeClient.getAllAttributeByBtmId(codeClassifyTemplateDO.getBtmTypeId()); if(!btmTypeVOR.isSuccess()){ throw new ServiceException("涓氬姟绫诲瀷feign璋冪敤閿欒锛�"); } diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java index 6204bfc..92e402f 100644 --- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java +++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java @@ -24,6 +24,7 @@ import com.vci.ubcs.system.entity.TopMenu; import com.vci.ubcs.system.service.IMenuService; import com.vci.ubcs.system.service.ITopMenuService; +import com.vci.ubcs.system.vo.ButtonCloneVO; import com.vci.ubcs.system.vo.CheckedTreeVO; import com.vci.ubcs.system.vo.GrantTreeVO; import com.vci.ubcs.system.vo.MenuVO; @@ -285,4 +286,15 @@ } return R.data(menuService.authRoutes(user)); } + + /** + * 鍏嬮殕鍏朵粬鑿滃崟涓嬫寜閽� + * @param buttonCloneVO 瑕佸厠闅嗙殑鑿滃崟鎸夐挳涓婚敭 琚厠闅嗙殑鎸夐挳涓婚敭 + * @return + */ + @PostMapping("/cloneMenuButton") + public R cloneMenuButton(@RequestBody ButtonCloneVO buttonCloneVO) { + return menuService.cloneMenuButton(buttonCloneVO.getMenuId(), buttonCloneVO.getButtonIds()); + } + } diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java index 48cc81b..8c799fb 100644 --- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java +++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java @@ -182,4 +182,12 @@ */ void handleKeepAlive(List<MenuVO> childMenu); + /** + * 鍏嬮殕鍏朵粬鑿滃崟涓嬫寜閽� + * @param menuId 瑕佸厠闅嗙殑鑿滃崟鎸夐挳涓婚敭 + * @param buttonIds 琚厠闅嗙殑鎸夐挳涓婚敭 + * @return + */ + R cloneMenuButton(Long menuId, List<String> buttonIds); + } diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java index 07612e6..aa566ac 100644 --- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java +++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java @@ -323,4 +323,44 @@ }); } + /** + * 鍏嬮殕鍏朵粬鑿滃崟涓嬫寜閽� + * @param menuId 瑕佸厠闅嗙殑鑿滃崟鎸夐挳涓婚敭 + * @param buttonIds 琚厠闅嗙殑鎸夐挳涓婚敭 + * @return + */ + @Override + public R cloneMenuButton(Long menuId, List<String> buttonIds) { + if(Func.isEmpty(menuId)){ + return R.fail("瑕佸厠闅嗙殑鑿滃崟涓婚敭涓嶈兘涓虹┖锛�"); + } + if(buttonIds.isEmpty() || buttonIds.size() <= 0){ + return R.fail("琚厠闅嗙殑鎸夐挳涓婚敭涓嶈兘涓虹┖锛�"); + } + // 鍏堟牴鎹富閿煡璇㈠嚭鎵�鏈夋寜閽殑淇℃伅 + List<Menu> buttons = this.listByIds(buttonIds); + List<Menu> newButtons = new ArrayList<>(); + List<String> addButtonCodes = new ArrayList(); + buttons.parallelStream().forEach(item->{ + // 鍒ゆ柇鏄惁涓烘寜閽紝闈炴寜閽笉澶勭悊 + if(item.getCategory().equals(2)){ + // 鏀瑰彉鐖惰妭鐐逛俊鎭� + item.setParentId(menuId); + // 灏嗕富閿祴绌� + item.setId(null); + addButtonCodes.add(item.getCode()); + newButtons.add(item); + } + }); + //妫�楠屾槸鍚﹂噸澶嶈彍鍗曞埆鍚嶏紝鍙牎楠屽悓涓�鐖跺垎绫昏彍鍗曚笅鐨勭紪鍙锋槸鍚﹂噸澶� + LambdaQueryWrapper<Menu> menuQueryWrapper = Wrappers.<Menu>lambdaQuery() + .eq(Menu::getParentId,menuId) + .and(a -> a.in( Menu::getCode, addButtonCodes)); + Long cnt = baseMapper.selectCount(menuQueryWrapper); + if (cnt > 0L) { + return R.fail("璇ヨ彍鍗曚笅宸插瓨鍦ㄧ殑缂栧彿涓庤鍏嬮殕鐨勬寜閽紪鍙峰瓨鍦ㄩ噸澶�!"); + } + return this.saveBatch(newButtons) ? R.success("鎸夐挳鍏嬮殕鎴愬姛锛�"):R.fail("鎸夐挳鍏嬮殕澶辫触锛�"); + } + } -- Gitblit v1.9.3