From b7bfdfd2bcdbbd5b29390eeb85dc936258fce52a Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Sat, 7 Mar 2026 12:13:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E9=A1=B9=E7=9B=AE=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- screen-vue/src/api/bizRole.js | 11 +++ screen-vue/src/components/Layout/index.vue | 5 +- screen-vue/src/views/system/role/form.vue | 95 ++++++++++++++++++- screen-vue/src/views/system/role/index.vue | 2 +- screen-vue/src/views/system/role/list.vue | 41 ++++---- screen-vue/src/views/system/role/role.vue | 71 ++++++++++---- screen-vue/src/views/system/user/list.vue | 4 +- .../biz/controller/HomeMenuController.java | 59 +++++++----- .../biz/controller/HomeRoleController.java | 5 +- 9 files changed, 222 insertions(+), 71 deletions(-) diff --git a/screen-vue/src/api/bizRole.js b/screen-vue/src/api/bizRole.js index d43568d..c1432df 100644 --- a/screen-vue/src/api/bizRole.js +++ b/screen-vue/src/api/bizRole.js @@ -33,6 +33,17 @@ export function getHomeRoleAssign(data) { }) } +/** + * 保存角色信息列表 + */ +export function getHomeRoleSave(data) { + return request({ + url: '/biz/homeRole/save', + method: 'post', + data + }) +} + /** * 删除角色信息 diff --git a/screen-vue/src/components/Layout/index.vue b/screen-vue/src/components/Layout/index.vue index 2f8a199..a891ab2 100644 --- a/screen-vue/src/components/Layout/index.vue +++ b/screen-vue/src/components/Layout/index.vue @@ -191,7 +191,10 @@ const openedSubMenuKeys = ref([]) const getMenuList = async () => { if (!isMounted.value) return try { - const res = await getUserMenuList(); + const reqParams = { + roleId: userStore.loginUser.roleId, + } + const res = await getUserMenuList(reqParams); menuList.value = res || []; const setMenuNameMap = (menus) => { menus.forEach(menu => { diff --git a/screen-vue/src/views/system/role/form.vue b/screen-vue/src/views/system/role/form.vue index 02409e3..ff24ba4 100644 --- a/screen-vue/src/views/system/role/form.vue +++ b/screen-vue/src/views/system/role/form.vue @@ -1,8 +1,99 @@ - - \ No newline at end of file diff --git a/screen-vue/src/views/system/role/index.vue b/screen-vue/src/views/system/role/index.vue index a54ea29..4fc3d3f 100644 --- a/screen-vue/src/views/system/role/index.vue +++ b/screen-vue/src/views/system/role/index.vue @@ -20,7 +20,7 @@ diff --git a/screen-vue/src/views/system/role/list.vue b/screen-vue/src/views/system/role/list.vue index ae70c80..e2cc700 100644 --- a/screen-vue/src/views/system/role/list.vue +++ b/screen-vue/src/views/system/role/list.vue @@ -67,18 +67,6 @@ - - - @@ -86,6 +74,7 @@ { ElMessage.success('开始导出数据...') } -const handleDelete = (row) => { - ElMessage.warning(`删除ID为 ${row.id} 的数据`) -} - const handleSizeChange = (val) => { pagination.pageSize = val getDataList() @@ -222,12 +210,21 @@ const handleSave = async () => { return } } - - setTimeout(() => { - ElMessage.success(isEdit.value ? '编辑成功' : '新增成功') - dialogVisible.value = false - getDataList() - }, 500) + + try { + saveLoading.value = true; + const reqParams = { + ...formData.value + } + const res = await getHomeRoleSave(reqParams); + ElMessage.success(res.msg) + dialogVisible.value = false + emit('refresh-role-list') + } catch (error) { + console.error('获取数据失败:', error); + } finally { + saveLoading.value = false; + } } onMounted(() => { diff --git a/screen-vue/src/views/system/role/role.vue b/screen-vue/src/views/system/role/role.vue index 6c008a8..e2c526f 100644 --- a/screen-vue/src/views/system/role/role.vue +++ b/screen-vue/src/views/system/role/role.vue @@ -63,13 +63,31 @@ const loading = ref(false) const menuTreeRef = ref(null) const selectedMenuIds = ref([]) +const getLeafNodeIds = (treeData, leafIds = []) => { + treeData.forEach(node => { + if (!node.children || node.children.length === 0) { + leafIds.push(String(node.id)) + } else { + getLeafNodeIds(node.children, leafIds) + } + }) + return leafIds +} + +const filterOnlyLeafIds = (allIds, treeData) => { + const allLeafIds = getLeafNodeIds(treeData) + return allIds.filter(id => allLeafIds.includes(id)) +} + const getTreeListData = async () => { try { const res = await getTreeMenuList() menuTreeData.value = res ?? [] + return menuTreeData.value } catch (error) { console.error('加载菜单树失败:', error) menuTreeData.value = [] + return [] } } @@ -90,21 +108,38 @@ const treeProps = reactive({ disabled: 'disabled' }) +function getIndeterminateKeys(node) { + let keys = [] + if (node.indeterminate) { + keys.push(node.key) + } + if (node.childNodes) { + node.childNodes.forEach(c => keys.push(...getIndeterminateKeys(c))) + } + return keys +} + +function getCheckedAndIndeterminateKeys() { + if (!menuTreeRef.value) return [] + const checked = menuTreeRef.value.getCheckedKeys(false) + const indeterminate = getIndeterminateKeys(menuTreeRef.value.root) + return [...new Set([...checked, ...indeterminate])] +} + onMounted(async () => { loading.value = true try { - const [_, roleMenuIds] = await Promise.all([ - getTreeListData(), - getRoleMenuIds() - ]) - + const treeData = await getTreeListData() + const roleMenuIds = await getRoleMenuIds() const propsMenuIds = (props.formData?.menuIds ?? []).map(id => String(id)).filter(id => id) - const defaultCheckedIds = roleMenuIds.length > 0 ? roleMenuIds : propsMenuIds - if (defaultCheckedIds.length > 0) { - selectedMenuIds.value = [...defaultCheckedIds] + const allMenuIds = roleMenuIds.length > 0 ? roleMenuIds : propsMenuIds + const leafMenuIds = filterOnlyLeafIds(allMenuIds, treeData) + + if (leafMenuIds.length > 0) { + selectedMenuIds.value = [...leafMenuIds] setTimeout(() => { - if (menuTreeRef.value && menuTreeData.value.length) { - menuTreeRef.value.setCheckedKeys(defaultCheckedIds, false) + if (menuTreeRef.value && treeData.length) { + menuTreeRef.value.setCheckedKeys(leafMenuIds, false) } }, 300) } @@ -116,12 +151,14 @@ onMounted(async () => { }) watch(() => props.formData.menuIds, (newVal) => { - if (!newVal || !newVal.length || !menuTreeRef.value) return + if (!newVal || !newVal.length || !menuTreeRef.value || !menuTreeData.value.length) return - const menuIds = newVal.map(id => String(id)).filter(id => id) - if (menuIds.length) { - selectedMenuIds.value = [...menuIds] - menuTreeRef.value.setCheckedKeys(menuIds, false) + const allMenuIds = newVal.map(id => String(id)).filter(id => id) + const leafMenuIds = filterOnlyLeafIds(allMenuIds, menuTreeData.value) + + if (leafMenuIds.length) { + selectedMenuIds.value = [...leafMenuIds] + menuTreeRef.value.setCheckedKeys(leafMenuIds, false) } }, { deep: true }) @@ -130,7 +167,7 @@ const handleCheck = () => { selectedMenuIds.value = menuTreeRef.value.getCheckedKeys(false) } -const handleCheckChange = (data, checked, indeterminate) => { +const handleCheckChange = () => { handleCheck() } @@ -152,7 +189,7 @@ const resetForm = () => { defineExpose({ validate, resetForm, - getSelectedMenuIds: () => selectedMenuIds.value, + getSelectedMenuIds: () => getCheckedAndIndeterminateKeys(), getLeafMenuIds: () => menuTreeRef.value ? menuTreeRef.value.getCheckedKeys(true) : [] }) diff --git a/screen-vue/src/views/system/user/list.vue b/screen-vue/src/views/system/user/list.vue index 9da77b6..daca23d 100644 --- a/screen-vue/src/views/system/user/list.vue +++ b/screen-vue/src/views/system/user/list.vue @@ -138,12 +138,12 @@ const dialogVisible = ref(false) async function getDataList() { loading.value = true try { - const reqParmas = { + const reqParams = { ... searchForm, pageNum: pagination.pageNum, pageSize: pagination.pageSize, } - const res = await getHomeUserList(reqParmas); + const res = await getHomeUserList(reqParams); pagination.total = res.total; tableData.value = res.list || []; } catch (error) { diff --git a/src/main/java/com/mini/mybigscreen/biz/controller/HomeMenuController.java b/src/main/java/com/mini/mybigscreen/biz/controller/HomeMenuController.java index 9fe4e35..0173803 100644 --- a/src/main/java/com/mini/mybigscreen/biz/controller/HomeMenuController.java +++ b/src/main/java/com/mini/mybigscreen/biz/controller/HomeMenuController.java @@ -3,11 +3,15 @@ package com.mini.mybigscreen.biz.controller; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mini.mybigscreen.Model.Menu; import com.mini.mybigscreen.Model.Message; import com.mini.mybigscreen.Model.Result; import com.mini.mybigscreen.Model.TreeMenu; import com.mini.mybigscreen.biz.domain.HomeMenu; +import com.mini.mybigscreen.biz.domain.HomeModule; +import com.mini.mybigscreen.biz.domain.HomeRoleMenu; +import com.mini.mybigscreen.biz.mapper.HomeMenuMapper; import com.mini.mybigscreen.biz.service.HomeMenuService; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.*; @@ -28,6 +32,9 @@ import java.util.stream.Collectors; public class HomeMenuController { + @Resource + private HomeMenuMapper homeMenuMapper; + @Resource private HomeMenuService menuService; @@ -124,7 +131,6 @@ public class HomeMenuController { return treeMenu; }) .collect(Collectors.toList()); - menuList.add(new TreeMenu(menu.getMenuId(), menu.getMenuName(), treeMenus)); } return Result.success(menuList); @@ -135,33 +141,38 @@ public class HomeMenuController { * 用户角色菜单 */ @GetMapping("userList") - public Result getUserList() { - List menuList = new ArrayList<>(); - LambdaQueryWrapper parentQuery = new LambdaQueryWrapper() - .eq(HomeMenu::getUstatus, "1") - .eq(HomeMenu::getParentId, "0") + public Result getUserList(String roleId) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(HomeMenu.class) + .leftJoin(HomeRoleMenu.class, + HomeRoleMenu::getMenuId, + HomeMenu::getMenuId) + .eq(HomeRoleMenu::getRoleId, roleId) + .eq(HomeRoleMenu::getUstatus, "1") + .isNotNull(HomeMenu::getMenuId) .orderByAsc(HomeMenu::getSort); - List pMenus = menuService.list(parentQuery); - for (HomeMenu menu : pMenus) { - LambdaQueryWrapper childQuery = new LambdaQueryWrapper() - .eq(HomeMenu::getParentId, menu.getMenuId()); - List childMenus = menuService.list(childQuery); - menuList.add(new Menu( - menu.getMenuId(), - menu.getParentId(), - menu.getMenuName(), - menu.getMenuType(), - menu.getPath(), - menu.getMenuIcon(), - menu.getSort(), - menu.getIsIframe(), - menu.getUstatus(), - childMenus - )); - } + List allMenus = homeMenuMapper.selectJoinList(HomeMenu.class, wrapper); + Map> parentIdMap = allMenus.stream() + .collect(Collectors.groupingBy(HomeMenu::getParentId)); + List menuList = allMenus.stream() + .filter(menu -> menu.getParentId().equals("0")) + .map(homeMenu -> new Menu( + homeMenu.getMenuId(), + homeMenu.getParentId(), + homeMenu.getMenuName(), + homeMenu.getMenuType(), + homeMenu.getPath(), + homeMenu.getMenuIcon(), + homeMenu.getSort(), + homeMenu.getIsIframe(), + homeMenu.getUstatus(), + parentIdMap.getOrDefault(homeMenu.getMenuId(), new ArrayList<>()) + )) + .collect(Collectors.toList()); return Result.success(menuList); } + /** * 新增/修改 */ diff --git a/src/main/java/com/mini/mybigscreen/biz/controller/HomeRoleController.java b/src/main/java/com/mini/mybigscreen/biz/controller/HomeRoleController.java index fdd7e7c..929b975 100644 --- a/src/main/java/com/mini/mybigscreen/biz/controller/HomeRoleController.java +++ b/src/main/java/com/mini/mybigscreen/biz/controller/HomeRoleController.java @@ -77,8 +77,9 @@ public class HomeRoleController { return Result.success(roleMenuService.list(query)); } - - public Result save() { + @PostMapping("save") + public Result save(@RequestBody HomeRole homeRole) { + roleService.save(homeRole); return Result.success(new Message("数据新增成功", 200)); }