feat: 一级菜单只存一级

This commit is contained in:
fit2cloud-chenyw 2021-05-06 14:43:57 +08:00
parent afc46f0c47
commit d1f3d3a7f0
9 changed files with 51 additions and 19 deletions

View File

@ -27,6 +27,8 @@ public class DynamicMenuDto implements Serializable {
private Boolean hidden;
private Integer type;
private List<DynamicMenuDto> children;
}

View File

@ -36,6 +36,7 @@ public class DynamicMenuServiceImpl implements DynamicMenuService {
dynamicMenuDto.setName(sysMenu.getName());
dynamicMenuDto.setPath(sysMenu.getPath());
dynamicMenuDto.setRedirect(null);
dynamicMenuDto.setType(sysMenu.getType());
dynamicMenuDto.setComponent(sysMenu.getComponent());
MenuMeta menuMeta = new MenuMeta();
menuMeta.setTitle(sysMenu.getTitle());

View File

@ -31,6 +31,7 @@ public class SysMenuController {
@PostMapping("/childNodes/{pid}")
public List<MenuNodeResponse> childNodes(@PathVariable("pid") Long pid){
List<SysMenu> nodes = menuService.nodesByPid(pid);
nodes = nodes.stream().filter(node -> !node.getHidden()).collect(Collectors.toList());
return menuService.convert(nodes);
}

View File

@ -84,7 +84,12 @@ const filterRouter = routers => {
}
const tempResults = routers.filter(router => hasPermission(router, user_permissions))
// 如果是一级菜单(目录) 没有字菜单 那就移除
return tempResults.filter(item => item.children && item.children.length)
return tempResults.filter(item => {
if (item.type === 0 && (!item.children || item.children.length === 0)) {
return false
}
return true
})
}
const hasPermission = (router, user_permissions) => {
// 菜单要求权限 但是当前用户权限没有包含菜单权限

View File

@ -31,7 +31,11 @@ const actions = {
}
export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由字符串,转换为组件对象
return routers.filter(router => {
return routers.map(router => {
// 如果是菜单类型 且 是一级菜单 需要包装一层父级目录
if (router.type === 1 && router.pid === 0 && router.component && router.component !== 'Layout') {
router = decorate(router)
}
if (router.component) {
if (router.component === 'Layout') { // Layout组件特殊处理
router.component = Layout
@ -43,9 +47,8 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由
if (router.children && router.children.length) {
router.children = filterAsyncRouter(router.children)
}
return true
}).map(router => {
router.hasOwnProperty('id') && delete router.id
router.hasOwnProperty('type') && delete router.type
router.hasOwnProperty('pid') && delete router.pid
router.hasOwnProperty('children') && (!router['children'] || !router['children'].length) && delete router.children
router.hasOwnProperty('redirect') && !router['redirect'] && delete router.redirect
@ -53,6 +56,25 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由
})
}
// 包装一层父级目录
export const decorate = (router) => {
const parent = {
id: router.id + 1000000,
path: router.path,
component: 'Layout'
}
const current = {}
Object.assign(current, router)
current.type = 1
current.path = 'index'
current.pid = parent.id
parent.children = [current]
if (router.hidden) {
parent.hidden = router.hidden
}
return parent
}
export const loadView = (view) => {
return (resolve) => require([`@/views/${view}`], resolve)
}

View File

@ -1,5 +1,5 @@
<template>
<layout-content :header="formType=='add' ? $t('datasource.create') : $t('datasource.modify')" back-name="数据源1">
<layout-content :header="formType=='add' ? $t('datasource.create') : $t('datasource.modify')" back-name="数据源">
<el-form ref="dsForm" :model="form" :rules="rule" size="small" label-width="auto" label-position="right">
<el-form-item :label="$t('commons.name')" prop="name">
<el-input v-model="form.name" autocomplete="off" />
@ -128,7 +128,7 @@ export default {
}
},
backToList() {
this.$router.push({ name: '数据源1' })
this.$router.push({ name: '数据源' })
}
}
}

View File

@ -11,7 +11,8 @@
>
<template #toolbar>
<fu-table-button v-permission="['datasource:add']" icon="el-icon-circle-plus-outline" :label="$t('datasource.create')" @click="create" />
<!-- <fu-table-button v-permission="['datasource:add']" icon="el-icon-circle-plus-outline" :label="$t('datasource.create')" @click="create" /> -->
<el-button v-permission="['datasource:add']" icon="el-icon-circle-plus-outline" @click="create">{{ $t('datasource.create') }}</el-button>
</template>
<!-- <el-table-column type="selection" fix /> -->

View File

@ -8,7 +8,7 @@
<el-radio-button label="2">按钮</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.type!== 2" label="菜单图标" prop="icon">
<el-form-item v-if="form.type=== 1 && form.icon" label="菜单图标" prop="icon">
<el-popover
placement="bottom-start"
width="425"
@ -29,21 +29,21 @@
<el-form-item v-if="form.type === 2" label="按钮名称" prop="title">
<el-input v-model="form.title" placeholder="按钮名称" />
</el-form-item>
<el-form-item v-if="form.type !== 0" label="权限标识" prop="permission">
<!-- <el-form-item v-if="form.type !== 0" label="权限标识" prop="permission">
<el-input v-model="form.permission" :disabled="form.iframe || formType!=='add'" placeholder="权限标识" />
</el-form-item>
<el-form-item v-if="form.type !== 2" label="路由地址" prop="path">
<el-input v-model="form.path" placeholder="路由地址" :disabled="formType!=='add'" />
</el-form-item>
<el-form-item label="菜单排序" prop="menuSort">
</el-form-item> -->
<el-form-item v-if="form.type !== 2" label="菜单排序" prop="menuSort">
<el-input-number v-model.number="form.menuSort" :min="0" :max="999" controls-position="right" />
</el-form-item>
<el-form-item v-if="!form.iframe && form.type === 1" label="组件名称" prop="componentName">
<!-- <el-form-item v-if="!form.iframe && form.type === 1" label="组件名称" prop="componentName">
<el-input v-model="form.componentName" :disabled="formType!=='add'" placeholder="匹配组件内Name字段" />
</el-form-item>
<el-form-item v-if="!form.iframe && form.type === 1" label="组件路径" prop="component">
<el-input v-model="form.component" :disabled="formType!=='add'" placeholder="组件路径" />
</el-form-item>
</el-form-item> -->
<el-form-item label="上级类目" prop="pid">
<treeselect
v-model="form.pid"

View File

@ -15,23 +15,23 @@
:data="tableData"
lazy
:load="initTableData"
style="width: 100%"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
row-key="menuId"
>
<!-- <el-table-column type="selection" fix /> -->
<el-table-column :show-overflow-tooltip="true" label="菜单标题" width="150px" prop="title" />
<el-table-column prop="icon" label="图标" align="center" width="60px">
<el-table-column :show-overflow-tooltip="true" label="菜单标题" prop="title" />
<el-table-column prop="icon" label="图标" align="center">
<template slot-scope="scope">
<svg-icon :icon-class="scope.row.icon ? scope.row.icon : ''" />
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="permission" label="权限标识" />
<el-table-column :show-overflow-tooltip="true" prop="component" label="组件路径" />
<!-- <el-table-column :show-overflow-tooltip="true" prop="permission" label="权限标识" />
<el-table-column :show-overflow-tooltip="true" prop="component" label="组件路径" /> -->
<el-table-column prop="createTime" label="创建日期" width="160px">
<el-table-column prop="createTime" label="创建日期">
<template v-slot:default="scope">
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
</template>