菜单功能更新

This commit is contained in:
ludj
2022-11-30 13:16:03 +08:00
parent 9a271d0f79
commit dc2bcc17eb
2 changed files with 99 additions and 31 deletions

View File

@@ -279,8 +279,12 @@ public class MenuServiceImpl implements MenuService {
} }
return menus; return menus;
} }
MenuDto dto = this.findById(menuDto.getPid()); //pid 不为null
menus.addAll((Collection<? extends MenuDto>) dto); JSONArray arr = menuTab.query("pid = '"+menuDto.getPid()+"'").getResultJSONArray(0);
for (int i = 0; i < arr.size(); i++) {
JSONObject json = arr.getJSONObject(i);
menus.add(this.menuJsonToMenuDto(json));
}
return getSuperior(findById(menuDto.getPid()), menus); return getSuperior(findById(menuDto.getPid()), menus);
} }

View File

@@ -4,13 +4,28 @@
<div class="head-container"> <div class="head-container">
<div v-if="crud.props.searchToggle"> <div v-if="crud.props.searchToggle">
<!-- 搜索 --> <!-- 搜索 -->
<el-input v-model="query.blurry" clearable size="mini" placeholder="模糊搜索" style="width: 200px;" class="filter-item" @keyup.enter.native="crud.toQuery" /> <el-input
v-model="query.blurry"
clearable
size="mini"
placeholder="模糊搜索"
style="width: 200px;"
class="filter-item"
@keyup.enter.native="crud.toQuery"
/>
<rrOperation /> <rrOperation />
</div> </div>
<crudOperation :permission="permission" /> <crudOperation :permission="permission" />
</div> </div>
<!--表单渲染--> <!--表单渲染-->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="650px"> <el-dialog
append-to-body
:close-on-click-modal="false"
:before-close="crud.cancelCU"
:visible.sync="crud.status.cu > 0"
:title="crud.status.title"
width="650px"
>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="mini" label-width="80px"> <el-form ref="form" :inline="true" :model="form" :rules="rules" size="mini" label-width="80px">
<el-form-item label="子系统" prop="type"> <el-form-item label="子系统" prop="type">
<el-radio-group v-model="form.system_type" size="mini" style="width: 190px"> <el-radio-group v-model="form.system_type" size="mini" style="width: 190px">
@@ -19,8 +34,8 @@
<el-radio-button label="3">按钮</el-radio-button> <el-radio-button label="3">按钮</el-radio-button>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="菜单分类" prop="type" > <el-form-item label="菜单分类" prop="type">
<el-radio-group v-model="form.category" size="mini" > <el-radio-group v-model="form.category" size="mini">
<el-radio-button label="1">LMSPC</el-radio-button> <el-radio-button label="1">LMSPC</el-radio-button>
<el-radio-button label="2">LMS手持</el-radio-button> <el-radio-button label="2">LMS手持</el-radio-button>
<el-radio-button label="3">ACSPC</el-radio-button> <el-radio-button label="3">ACSPC</el-radio-button>
@@ -43,13 +58,19 @@
> >
<IconSelect ref="iconSelect" @selected="selected" /> <IconSelect ref="iconSelect" @selected="selected" />
<el-input slot="reference" v-model="form.icon" style="width: 450px;" placeholder="点击选择图标" readonly> <el-input slot="reference" v-model="form.icon" style="width: 450px;" placeholder="点击选择图标" readonly>
<svg-icon v-if="form.icon" slot="prefix" :icon-class="form.icon" class="el-input__icon" style="height: 32px;width: 16px;" /> <svg-icon
v-if="form.icon"
slot="prefix"
:icon-class="form.icon"
class="el-input__icon"
style="height: 32px;width: 16px;"
/>
<i v-else slot="prefix" class="el-icon-search el-input__icon" /> <i v-else slot="prefix" class="el-icon-search el-input__icon" />
</el-input> </el-input>
</el-popover> </el-popover>
</el-form-item> </el-form-item>
<el-form-item v-show="form.type.toString() !== '2'" label="外链菜单" prop="iframe"> <el-form-item v-show="form.type.toString() !== '2'" label="外链菜单" prop="i_frame">
<el-radio-group v-model="form.iframe" size="mini"> <el-radio-group v-model="form.i_frame" size="mini">
<el-radio-button label="1">是</el-radio-button> <el-radio-button label="1">是</el-radio-button>
<el-radio-button label="0">否</el-radio-button> <el-radio-button label="0">否</el-radio-button>
</el-radio-group> </el-radio-group>
@@ -67,31 +88,43 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item v-if="form.type.toString() !== '2'" label="菜单标题" prop="title"> <el-form-item v-if="form.type.toString() !== '2'" label="菜单标题" prop="title">
<el-input v-model="form.title" :style=" form.type.toString() === '0' ? 'width: 450px' : 'width: 190px'" placeholder="菜单标题" /> <el-input
v-model="form.title"
:style=" form.type.toString() === '0' ? 'width: 450px' : 'width: 190px'"
placeholder="菜单标题"
/>
</el-form-item> </el-form-item>
<el-form-item v-if="form.type.toString() === '2'" label="按钮名称" prop="title"> <el-form-item v-if="form.type.toString() === '2'" label="按钮名称" prop="title">
<el-input v-model="form.title" placeholder="按钮名称" style="width: 190px;" /> <el-input v-model="form.title" placeholder="按钮名称" style="width: 190px;" />
</el-form-item> </el-form-item>
<el-form-item v-show="form.type.toString() !== '0'" label="权限标识" prop="permission"> <el-form-item v-show="form.type.toString() !== '0'" label="权限标识" prop="permission">
<el-input v-model="form.permission" :disabled="form.iframe" placeholder="权限标识" style="width: 190px;" /> <el-input v-model="form.permission" :disabled="form.i_frame=='1'" placeholder="权限标识" style="width: 190px;" />
</el-form-item> </el-form-item>
<el-form-item v-if="form.type.toString() !== '2'" label="路由地址" prop="path"> <el-form-item v-if="form.type.toString() !== '2'" label="路由地址" prop="path">
<el-input v-model="form.path" placeholder="路由地址" style="width: 190px;" /> <el-input v-model="form.path" placeholder="路由地址" style="width: 190px;" />
</el-form-item> </el-form-item>
<el-form-item label="菜单排序" prop="menuSort"> <el-form-item label="菜单排序" prop="menuSort">
<el-input-number v-model.number="form.menuSort" :min="0" :max="999" controls-position="right" style="width: 190px;" /> <el-input-number
v-model.number="form.menuSort"
:min="0"
:max="999"
controls-position="right"
style="width: 190px;"
/>
</el-form-item> </el-form-item>
<el-form-item v-show="!form.iframe && form.type.toString() === '1'" label="组件名称" prop="componentName"> <el-form-item v-show="!form.i_frame && form.type.toString() === '1'" label="组件名称" prop="componentName">
<el-input v-model="form.componentName" style="width: 190px;" placeholder="匹配组件内Name字段" /> <el-input v-model="form.componentName" style="width: 190px;" placeholder="匹配组件内Name字段" />
</el-form-item> </el-form-item>
<el-form-item v-show="!form.iframe && form.type.toString() === '1'" label="组件路径" prop="component"> <el-form-item v-show="!form.i_frame && form.type.toString() === '1'" label="组件路径" prop="component">
<el-input v-model="form.component" style="width: 190px;" placeholder="组件路径" /> <el-input v-model="form.component" style="width: 190px;" placeholder="组件路径" />
</el-form-item> </el-form-item>
<el-form-item label="上级类目" prop="pid"> <el-form-item label="上级类目" prop="pid">
<!-- normalizer转换-->
<treeselect <treeselect
v-model="form.pid" v-model="form.pid"
:options="menus" :options="menus"
:load-options="loadMenus" :load-options="loadMenus"
:normalizer="normalizer"
style="width: 450px;" style="width: 450px;"
placeholder="选择上级类目" placeholder="选择上级类目"
/> />
@@ -111,6 +144,7 @@
:data="crud.data" :data="crud.data"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}" :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
row-key="menu_id" row-key="menu_id"
@select="crud.selectChange" @select="crud.selectChange"
@select-all="crud.selectAllChange" @select-all="crud.selectAllChange"
@selection-change="crud.selectionChangeHandler" @selection-change="crud.selectionChangeHandler"
@@ -131,21 +165,21 @@
</el-table-column> </el-table-column>
<el-table-column show-overflow-tooltip prop="permission" label="权限标识" /> <el-table-column show-overflow-tooltip prop="permission" label="权限标识" />
<el-table-column show-overflow-tooltip prop="component" label="组件路径" /> <el-table-column show-overflow-tooltip prop="component" label="组件路径" />
<el-table-column prop="iframe" label="外链" width="75px"> <el-table-column prop="i_frame" label="外链" width="75px">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.iframe">是</span> <span v-if="scope.row.i_frame=='1'">是</span>
<span v-else>否</span> <span v-else>否</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="cache" label="缓存" width="75px"> <el-table-column prop="cache" label="缓存" width="75px">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.cache">是</span> <span v-if="scope.row.cache=='1'">是</span>
<span v-else>否</span> <span v-else>否</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="hidden" label="可见" width="75px"> <el-table-column prop="hidden" label="可见" width="75px">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.hidden">否</span> <span v-if="scope.row.hidden=='0'">否</span>
<span v-else>是</span> <span v-else>是</span>
</template> </template>
</el-table-column> </el-table-column>
@@ -154,7 +188,13 @@
<span>{{ parseTime(scope.row.createTime) }}</span> <span>{{ parseTime(scope.row.createTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-permission="['admin','menu:edit','menu:del']" label="操作" width="130px" align="center" fixed="right"> <el-table-column
v-permission="['admin','menu:edit','menu:del']"
label="操作"
width="130px"
align="center"
fixed="right"
>
<template slot-scope="scope"> <template slot-scope="scope">
<udOperation <udOperation
:data="scope.row" :data="scope.row"
@@ -180,7 +220,24 @@ import udOperation from '@crud/UD.operation'
import DateRangePicker from '@/components/DateRangePicker' import DateRangePicker from '@/components/DateRangePicker'
// crud交由presenter持有 // crud交由presenter持有
const defaultForm = { menu_id: null, title: null, menuSort: 999, path: null, system_type: null, category: null, component: null, componentName: null, iframe: 0, roles: [], pid: 0, icon: null, cache: 0, hidden: 0, type: 0, permission: null } const defaultForm = {
menu_id: null,
title: null,
menuSort: 999,
path: null,
system_type: null,
category: null,
component: null,
componentName: null,
i_frame: 0,
roles: [],
pid: 0,
icon: null,
cache: 0,
hidden: 0,
type: 0,
permission: null
}
export default { export default {
name: 'Menu', name: 'Menu',
components: { Treeselect, IconSelect, crudOperation, rrOperation, udOperation, DateRangePicker }, components: { Treeselect, IconSelect, crudOperation, rrOperation, udOperation, DateRangePicker },
@@ -196,6 +253,13 @@ export default {
edit: ['admin', 'menu:edit'], edit: ['admin', 'menu:edit'],
del: ['admin', 'menu:del'] del: ['admin', 'menu:del']
}, },
normalizer(node) {
return {
id: node.menu_id,
label: node.title,
children: node.children
}
},
rules: { rules: {
title: [ title: [
{ required: true, message: '请输入标题', trigger: 'blur' } { required: true, message: '请输入标题', trigger: 'blur' }
@@ -209,15 +273,14 @@ export default {
methods: { methods: {
// 新增与编辑前做的操作 // 新增与编辑前做的操作
[CRUD.HOOK.afterToCU](crud, form) { [CRUD.HOOK.afterToCU](crud, form) {
debugger
this.menus = [] this.menus = []
if (form.menu_id != null) { if (form.menu_id) {
if (form.pid === null) { if (form.pid === null) {
form.pid = 0 form.pid = 0
} }
this.getSupDepts(form.menu_id) this.getSupDepts(form.menu_id)
} else { } else {
this.menus.push({ menu_id: 0, label: '顶级类目', children: null }) this.menus.push({ menu_id: 0, title: '顶级类目', children: null })
} }
}, },
getMenus(tree, treeNode, resolve) { getMenus(tree, treeNode, resolve) {
@@ -236,7 +299,7 @@ export default {
} }
return obj return obj
}) })
this.menus = [{ menu_id: null, label: '顶级类目', children: children }] this.menus = [{ menu_id: 0, title: '顶级类目', children: children }]
}) })
}, },
loadMenus({ action, parentNode, callback }) { loadMenus({ action, parentNode, callback }) {
@@ -263,11 +326,12 @@ export default {
</script> </script>
<style rel="stylesheet/scss" lang="scss" scoped> <style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-input-number .el-input__inner { ::v-deep .el-input-number .el-input__inner {
text-align: left; text-align: left;
} }
::v-deep .vue-treeselect__control,::v-deep .vue-treeselect__placeholder,::v-deep .vue-treeselect__single-value {
height: 30px; ::v-deep .vue-treeselect__control, ::v-deep .vue-treeselect__placeholder, ::v-deep .vue-treeselect__single-value {
line-height: 30px; height: 30px;
} line-height: 30px;
}
</style> </style>