| | |
| | | console.error(error); |
| | | } |
| | | }; |
| | | |
| | | // function buildCascaderOptions(menuList) { |
| | | // // 创建一个映射来快速查找父项 |
| | | // const parentIdMap = {}; |
| | | // // 初始化最终的级联选项数组 |
| | | // const options = []; |
| | | // // 遍历所有菜单项,将它们添加到映射中,并构建顶级菜单项 |
| | | // menuList.forEach(item => { |
| | | // // 如果parentId为0,则为顶级菜单项 |
| | | // if (item.parentId === 0) { |
| | | // // 初始化children数组 |
| | | // item.children = []; |
| | | // // 添加到最终的选项中 |
| | | // options.push({ |
| | | // value: item.id, |
| | | // label: item.menuName, |
| | | // children: item.children |
| | | // }); |
| | | // // 将顶级菜单项添加到映射中(虽然在这个特定场景中可能不是必需的,但可以用于其他目的) |
| | | // parentIdMap[item.id] = item; |
| | | // } else { |
| | | // // 如果parentId不是0,则查找父项并添加到其children数组中 |
| | | // // 注意:这里假设parentIdMap在之前已经填充了所有顶级菜单项 |
| | | // if (!parentIdMap[item.parentId]) { |
| | | // // 如果父项不存在,则可能是数据不完整或错误,需要处理这种情况 |
| | | // console.error(`Parent item with ID ${item.parentId} not found for child item with ID ${item.id}`); |
| | | // } else { |
| | | // parentIdMap[item.parentId].children.push({ |
| | | // value: item.id, |
| | | // label: item.menuName |
| | | // // 这里不需要嵌套的children,除非你的菜单有多于两级的结构 |
| | | // }); |
| | | // } |
| | | // } |
| | | // }); |
| | | // return options; |
| | | // } |
| | | function handleEdit(row) { |
| | | name.value = row.name; |
| | | adda.value = true; |
| | | window.localStorage.setItem('ids', row.id); |
| | | const parentIdMap = {}; |
| | | const menuItems = row.menuList.map(item => { |
| | | let parentId = item.parentId || null; // 或者使用 0,如果你的系统是这样设计的 |
| | | const menuItemsById = {}; // 快速查找菜单项 |
| | | let topLevelItems = []; // 存储顶级菜单项 |
| | | row.menuList.forEach(item => { |
| | | const parentId = item.parentId === 0 ? null : item.parentId; |
| | | const menuItem = { |
| | | id: item.id, |
| | | parentId: parentId, |
| | | menuName: item.menuName, |
| | | children: [] |
| | | }; |
| | | menuItemsById[item.id] = menuItem; |
| | | // 初始化或更新parentIdMap中的数组 |
| | | if (!parentIdMap[parentId]) { |
| | | parentIdMap[parentId] = []; |
| | | } |
| | | parentIdMap[parentId].push({ |
| | | id: item.id, |
| | | menuName: item.menuName, |
| | | children: [] // 初始为空,稍后会填充子项 |
| | | }); |
| | | return { id: item.id, menuName: item.menuName, parentId: parentId }; |
| | | }); |
| | | |
| | | // 现在,我们遍历所有项,并将它们分配给它们的父项(如果有的话) |
| | | menuItems.forEach(item => { |
| | | if (item.parentId !== null && parentIdMap[item.parentId]) { |
| | | // 将当前项添加到其父项的 children 数组中 |
| | | parentIdMap[item.parentId].push({ |
| | | ...item, // 复制除了 parentId 之外的所有属性 |
| | | children: [] // 这里我们不需要再次添加 children,因为它已经在 parentIdMap 中被初始化了 |
| | | }); |
| | | // 注意:这里实际上是一个错误,因为我们不应该向 parentIdMap[item.parentId] 数组中添加整个项, |
| | | // 而应该只更新它的 children 数组。但上面的代码示例了如何访问父项。 |
| | | // 正确的做法是在构建 parentIdMap 时就设置好 children 数组,并在后面不再修改 parentIdMap[item.parentId] 数组。 |
| | | if (parentId === null) { |
| | | // 顶级菜单项直接添加到topLevelItems |
| | | topLevelItems.push(menuItem); |
| | | } else { |
| | | // 非顶级菜单项添加到parentIdMap中 |
| | | parentIdMap[parentId].push(menuItem); |
| | | } |
| | | // 注意:上面的代码逻辑有误,因为我们在构建 parentIdMap 时已经为每个项设置了 children 数组。 |
| | | // 我们应该直接修改这些 children 数组,而不是向 parentIdMap[item.parentId] 数组添加新项。 |
| | | }); |
| | | |
| | | // 但是,由于我们在构建 parentIdMap 时已经为每个项(包括其父项)设置了 children 数组, |
| | | // 我们实际上不需要上面的循环来重新分配子项。 |
| | | // 我们只需要找到顶级项(parentId 为 null 或 0 的项),并将它们设置为 selectedOptions.value |
| | | |
| | | // 假设顶级项的 parentId 为 null(或 0,根据你的系统) |
| | | const topLevelItems = parentIdMap[null] || parentIdMap[0] || []; |
| | | |
| | | // selectedOptions.value 应该是顶级项的数组,但首先我们需要将它们从 parentIdMap 的值中提取出来 |
| | | // 由于我们在构建 parentIdMap 时已经为每个顶级项设置了 children,所以我们可以直接使用这些项 |
| | | selectedOptions.value = topLevelItems; |
| | | |
| | | // 注意:selectedOptions.value 的具体格式应该与你的级联选择器组件所期望的格式相匹配 |
| | | // 如果你的级联选择器组件期望的是一个包含 value 和 label 的数组数组,你可能还需要进一步转换 topLevelItems |
| | | adda.value = true; // 显示对话框 |
| | | |
| | | } |
| | | |
| | | // 注意:上面的代码可能仍然需要根据你的具体数据结构进行调整 |
| | | // 特别是关于 parentId 的处理,以及如何将菜单项正确地分配给它们的父项 |
| | | // 处理编辑按钮点击 |
| | | // function handleEdit(row) { |
| | | // name.value = row.name; |
| | | // let cascaderOptions = buildCascaderOptions(row.menuList); |
| | | // selectedOptions.value = cascaderOptions; // 假设selectedOptions是v-model绑定的级联选择器的值 |
| | | // console.log(cascaderOptions); // 查看构建后的级联选项 |
| | | // // let transformedMenuList = row.menuList.map(item => ({ |
| | | // // id: item.id, // 假设每个项都有一个id作为唯一标识 |
| | | // // menuName: item.menuName, // 显示给用户的文本 |
| | | // // // children: item.children ? item.children.map(child => ({ value: child.id, label: child.name })) : [] |
| | | // // })); |
| | | // // selectedOptions.value = transformedMenuList |
| | | // console.log(transformedMenuList); |
| | | // adda.value = true; // 显示对话框 |
| | | // window.localStorage.setItem('id', row.id) |
| | | // } |
| | | for (const parentId in parentIdMap) { |
| | | if (parentId !== 'null') { // 跳过顶级菜单项 |
| | | parentIdMap[parentId].forEach(child => { |
| | | // 查找父项并添加子项 |
| | | if (menuItemsById[parentId]) { |
| | | menuItemsById[parentId].children.push(child); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | if (selectedOptions.value !== topLevelItems) { |
| | | selectedOptions.value = topLevelItems; |
| | | } |
| | | console.log(topLevelItems); |
| | | // selectedOptions.value = topLevelItems; |
| | | const topLevelItemsWithChildren = topLevelItems; // 包含顶级菜单项及其子菜单项的数组 |
| | | let selectedPath = []; |
| | | // 循环遍历 topLevelItemsWithChildren 数组 |
| | | for (let i = 0; i < topLevelItemsWithChildren.length; i++) { |
| | | // 添加顶级菜单项的 id |
| | | selectedPath.push(topLevelItemsWithChildren[i].id); |
| | | // 如果有子菜单项,添加第一个子菜单项的 id |
| | | if (topLevelItemsWithChildren[i].children && topLevelItemsWithChildren[i].children.length > 0) { |
| | | for (let j = 0; j < topLevelItemsWithChildren[i].children.length; j++) { |
| | | // 将每个子菜单项的 id 添加到 selectedPath 中 |
| | | selectedPath.push(topLevelItemsWithChildren[i].children[j].id); |
| | | } |
| | | } |
| | | } |
| | | console.log(selectedPath); |
| | | selectedOptions.value = selectedPath; |
| | | } |
| | | // 编辑 |
| | | const getTableRowa = async () => { |
| | | let id = window.localStorage.getItem('id') |
| | | let ids = window.localStorage.getItem('ids') |
| | | try { |
| | | let menuList = []; |
| | | let parentIdMap = {}; // 用于存储已经添加的父项 |
| | |
| | | } |
| | | }); |
| | | const dataToSend = { |
| | | id:id, |
| | | id:ids, |
| | | name: name.value, |
| | | menuList: menuList |
| | | }; |
| | |
| | | console.error(error); |
| | | } |
| | | }; |
| | | function closeDialog(row) { |
| | | add.value = false; |
| | | name.value = ''; |
| | | selectedOptions.value = ''; |
| | | } |
| | | function closeDialoga(row) { |
| | | adda.value = false; |
| | | name.value = ''; |
| | | selectedOptions.value = ''; |
| | | } |
| | | // 删除 |
| | | const opena = async(row) => { |
| | | try { |
| | |
| | | <el-button type="primary" style="margin-top: 10px;margin-left: 10px;" size="mini" id="searchButton" @click="add = true">{{ $t('delivery.addrole') }}</el-button> |
| | | <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading"> |
| | | <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;"> |
| | | <el-table height="240" ref="table" |
| | | <el-table height="500" ref="table" |
| | | @selection-change="handleSelectionChange" |
| | | :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"> |
| | | <el-table-column prop="name" align="center" :label="$t('delivery.role')" min-width="180" /> |
| | |
| | | <el-button type="primary" @click="getTableRow"> |
| | | {{ $t('delivery.sure') }} |
| | | </el-button> |
| | | <el-button @click="add = false"> {{ $t('delivery.cancel') }}</el-button> |
| | | <el-button @click="closeDialog"> {{ $t('delivery.cancel') }}</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | |
| | | <el-button type="primary" @click="getTableRowa"> |
| | | {{ $t('delivery.sure') }} |
| | | </el-button> |
| | | <el-button @click="adda = false">{{ $t('delivery.cancel') }}</el-button> |
| | | <el-button @click="closeDialoga">{{ $t('delivery.cancel') }}</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |