|
|
@@ -3,76 +3,188 @@ |
|
|
|
<!-- <doc-alert title="功能权限" url="https://doc.iocoder.cn/resource-permission" /> |
|
|
|
<doc-alert title="菜单路由" url="https://doc.iocoder.cn/vue2/route/" /> --> |
|
|
|
<!-- 搜索工作栏 --> |
|
|
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"> |
|
|
|
<el-form-item label="菜单名称" prop="name"> |
|
|
|
<el-input v-model="queryParams.name" placeholder="请输入菜单名称" clearable @keyup.enter.native="handleQuery"/> |
|
|
|
<el-form |
|
|
|
:model="queryParams" |
|
|
|
ref="queryForm" |
|
|
|
size="small" |
|
|
|
:inline="true" |
|
|
|
v-show="showSearch"> |
|
|
|
<el-form-item |
|
|
|
label="菜单名称" |
|
|
|
prop="name"> |
|
|
|
<el-input |
|
|
|
v-model="queryParams.name" |
|
|
|
placeholder="请输入菜单名称" |
|
|
|
clearable |
|
|
|
@keyup.enter.native="handleQuery" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="状态" prop="status"> |
|
|
|
<el-select v-model="queryParams.status" placeholder="菜单状态" clearable> |
|
|
|
<el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/> |
|
|
|
<el-form-item |
|
|
|
label="状态" |
|
|
|
prop="status"> |
|
|
|
<el-select |
|
|
|
v-model="queryParams.status" |
|
|
|
placeholder="菜单状态" |
|
|
|
clearable> |
|
|
|
<el-option |
|
|
|
v-for="dict in statusDictDatas" |
|
|
|
:key="parseInt(dict.value)" |
|
|
|
:label="dict.label" |
|
|
|
:value="parseInt(dict.value)" /> |
|
|
|
</el-select> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item> |
|
|
|
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button> |
|
|
|
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button> |
|
|
|
<el-button |
|
|
|
type="primary" |
|
|
|
icon="el-icon-search" |
|
|
|
@click="handleQuery"> |
|
|
|
搜索 |
|
|
|
</el-button> |
|
|
|
<el-button |
|
|
|
icon="el-icon-refresh" |
|
|
|
@click="resetQuery"> |
|
|
|
重置 |
|
|
|
</el-button> |
|
|
|
</el-form-item> |
|
|
|
</el-form> |
|
|
|
|
|
|
|
<el-row :gutter="10" class="mb8"> |
|
|
|
<el-row |
|
|
|
:gutter="10" |
|
|
|
class="mb8"> |
|
|
|
<el-col :span="1.5"> |
|
|
|
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" |
|
|
|
v-hasPermi="['system:menu:create']">新增</el-button> |
|
|
|
<el-button |
|
|
|
type="primary" |
|
|
|
plain |
|
|
|
icon="el-icon-plus" |
|
|
|
size="mini" |
|
|
|
@click="handleAdd" |
|
|
|
v-hasPermi="['system:menu:create']"> |
|
|
|
新增 |
|
|
|
</el-button> |
|
|
|
</el-col> |
|
|
|
<el-col :span="1.5"> |
|
|
|
<el-button type="info" plain icon="el-icon-sort" size="mini" @click="toggleExpandAll">展开/折叠</el-button> |
|
|
|
<el-button |
|
|
|
type="info" |
|
|
|
plain |
|
|
|
icon="el-icon-sort" |
|
|
|
size="mini" |
|
|
|
@click="toggleExpandAll"> |
|
|
|
展开/折叠 |
|
|
|
</el-button> |
|
|
|
</el-col> |
|
|
|
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> |
|
|
|
<right-toolbar |
|
|
|
:showSearch.sync="showSearch" |
|
|
|
@queryTable="getList"></right-toolbar> |
|
|
|
</el-row> |
|
|
|
|
|
|
|
<el-table v-if="refreshTable" v-loading="loading" :data="menuList" row-key="id" :default-expand-all="isExpandAll" |
|
|
|
<el-table |
|
|
|
v-if="refreshTable" |
|
|
|
v-loading="loading" |
|
|
|
:data="menuList" |
|
|
|
row-key="id" |
|
|
|
:default-expand-all="isExpandAll" |
|
|
|
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> |
|
|
|
<el-table-column prop="name" label="菜单名称" :show-overflow-tooltip="true" width="250"></el-table-column> |
|
|
|
<el-table-column |
|
|
|
prop="name" |
|
|
|
label="菜单名称" |
|
|
|
:show-overflow-tooltip="true" |
|
|
|
width="250"></el-table-column> |
|
|
|
<!-- <el-table-column prop="icon" label="图标" align="center" width="100"> |
|
|
|
<template v-slot="scope"> |
|
|
|
<svg-icon :icon-class="scope.row.icon" /> |
|
|
|
</template> |
|
|
|
</el-table-column> --> |
|
|
|
<el-table-column prop="sort" label="排序" width="60"></el-table-column> |
|
|
|
<el-table-column prop="permission" label="权限标识" :show-overflow-tooltip="true" /> |
|
|
|
<el-table-column prop="component" label="组件路径" :show-overflow-tooltip="true" /> |
|
|
|
<el-table-column prop="componentName" label="组件名称" :show-overflow-tooltip="true" /> |
|
|
|
<el-table-column prop="status" label="状态" width="80"> |
|
|
|
<el-table-column |
|
|
|
prop="sort" |
|
|
|
label="排序" |
|
|
|
width="60"></el-table-column> |
|
|
|
<el-table-column |
|
|
|
prop="permission" |
|
|
|
label="权限标识" |
|
|
|
:show-overflow-tooltip="true" /> |
|
|
|
<el-table-column |
|
|
|
prop="component" |
|
|
|
label="组件路径" |
|
|
|
:show-overflow-tooltip="true" /> |
|
|
|
<el-table-column |
|
|
|
prop="componentName" |
|
|
|
label="组件名称" |
|
|
|
:show-overflow-tooltip="true" /> |
|
|
|
<el-table-column |
|
|
|
prop="status" |
|
|
|
label="状态" |
|
|
|
width="80"> |
|
|
|
<template v-slot="scope"> |
|
|
|
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/> |
|
|
|
<dict-tag |
|
|
|
:type="DICT_TYPE.COMMON_STATUS" |
|
|
|
:value="scope.row.status" /> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
|
|
|
<el-table-column |
|
|
|
label="操作" |
|
|
|
align="center" |
|
|
|
class-name="small-padding fixed-width"> |
|
|
|
<template v-slot="scope"> |
|
|
|
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" |
|
|
|
v-hasPermi="['system:menu:update']">修改</el-button> |
|
|
|
<el-button size="mini" type="text" icon="el-icon-plus" @click="handleAdd(scope.row)" |
|
|
|
v-hasPermi="['system:menu:create']">新增</el-button> |
|
|
|
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" |
|
|
|
v-hasPermi="['system:menu:delete']">删除</el-button> |
|
|
|
<el-button |
|
|
|
size="mini" |
|
|
|
type="text" |
|
|
|
icon="el-icon-edit" |
|
|
|
@click="handleUpdate(scope.row)" |
|
|
|
v-hasPermi="['system:menu:update']"> |
|
|
|
修改 |
|
|
|
</el-button> |
|
|
|
<el-button |
|
|
|
size="mini" |
|
|
|
type="text" |
|
|
|
icon="el-icon-plus" |
|
|
|
@click="handleAdd(scope.row)" |
|
|
|
v-hasPermi="['system:menu:create']"> |
|
|
|
新增 |
|
|
|
</el-button> |
|
|
|
<el-button |
|
|
|
size="mini" |
|
|
|
type="text" |
|
|
|
icon="el-icon-delete" |
|
|
|
@click="handleDelete(scope.row)" |
|
|
|
v-hasPermi="['system:menu:delete']"> |
|
|
|
删除 |
|
|
|
</el-button> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table> |
|
|
|
|
|
|
|
<!-- 添加或修改菜单对话框 --> |
|
|
|
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body> |
|
|
|
<el-form ref="form" :model="form" :rules="rules" label-width="100px"> |
|
|
|
<el-dialog |
|
|
|
:title="title" |
|
|
|
:visible.sync="open" |
|
|
|
width="800px" |
|
|
|
append-to-body> |
|
|
|
<el-form |
|
|
|
ref="form" |
|
|
|
:model="form" |
|
|
|
:rules="rules" |
|
|
|
label-width="100px"> |
|
|
|
<el-row> |
|
|
|
<el-col :span="24"> |
|
|
|
<el-form-item label="上级菜单"> |
|
|
|
<treeselect v-model="form.parentId" :options="menuOptions" :normalizer="normalizer" :show-count="true" |
|
|
|
<treeselect |
|
|
|
v-model="form.parentId" |
|
|
|
:options="menuOptions" |
|
|
|
:normalizer="normalizer" |
|
|
|
:show-count="true" |
|
|
|
placeholder="选择上级菜单" /> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="24"> |
|
|
|
<el-form-item label="菜单类型" prop="type"> |
|
|
|
<el-form-item |
|
|
|
label="菜单类型" |
|
|
|
prop="type"> |
|
|
|
<el-radio-group v-model="form.type"> |
|
|
|
<el-radio v-for="dict in menuTypeDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)"> |
|
|
|
{{dict.label}}</el-radio> |
|
|
|
<el-radio |
|
|
|
v-for="dict in menuTypeDictDatas" |
|
|
|
:key="parseInt(dict.value)" |
|
|
|
:label="parseInt(dict.value)"> |
|
|
|
{{ dict.label }} |
|
|
|
</el-radio> |
|
|
|
</el-radio-group> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
@@ -89,107 +201,192 @@ |
|
|
|
</el-form-item> |
|
|
|
</el-col> --> |
|
|
|
<el-col :span="12"> |
|
|
|
<el-form-item label="菜单名称" prop="name"> |
|
|
|
<el-input v-model="form.name" placeholder="请输入菜单名称" /> |
|
|
|
<el-form-item |
|
|
|
label="菜单名称" |
|
|
|
prop="name"> |
|
|
|
<el-input |
|
|
|
v-model="form.name" |
|
|
|
placeholder="请输入菜单名称" /> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="12"> |
|
|
|
<el-form-item label="显示排序" prop="sort"> |
|
|
|
<el-input-number v-model="form.sort" controls-position="right" :min="0" /> |
|
|
|
<el-form-item |
|
|
|
label="显示排序" |
|
|
|
prop="sort"> |
|
|
|
<el-input-number |
|
|
|
v-model="form.sort" |
|
|
|
controls-position="right" |
|
|
|
:min="0" /> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="12"> |
|
|
|
<el-form-item v-if="form.type !== 3" label="路由地址" prop="path"> |
|
|
|
<el-form-item |
|
|
|
v-if="form.type !== 3" |
|
|
|
label="路由地址" |
|
|
|
prop="path"> |
|
|
|
<span slot="label"> |
|
|
|
<el-tooltip content="访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头" placement="top"> |
|
|
|
<el-tooltip |
|
|
|
content="访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头" |
|
|
|
placement="top"> |
|
|
|
<i class="el-icon-question" /> |
|
|
|
</el-tooltip> |
|
|
|
路由地址 |
|
|
|
</span> |
|
|
|
<el-input v-model="form.path" placeholder="请输入路由地址" /> |
|
|
|
<el-input |
|
|
|
v-model="form.path" |
|
|
|
placeholder="请输入路由地址" /> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="12"> |
|
|
|
<el-form-item v-if="form.type !== 1" label="权限标识"> |
|
|
|
<el-form-item |
|
|
|
v-if="form.type !== 1" |
|
|
|
label="权限标识"> |
|
|
|
<span slot="label"> |
|
|
|
<el-tooltip content="Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)" placement="top"> |
|
|
|
<el-tooltip |
|
|
|
content="Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)" |
|
|
|
placement="top"> |
|
|
|
<i class="el-icon-question" /> |
|
|
|
</el-tooltip> |
|
|
|
权限字符 |
|
|
|
</span> |
|
|
|
<el-input v-model="form.permission" placeholder="请权限标识" maxlength="50" /> |
|
|
|
<el-input |
|
|
|
v-model="form.permission" |
|
|
|
placeholder="请权限标识" |
|
|
|
maxlength="200" /> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="12" v-if="form.type === 2"> |
|
|
|
<el-form-item label="组件路径" prop="component"> |
|
|
|
<el-input v-model="form.component" placeholder="例如说:system/user/index" /> |
|
|
|
<el-col |
|
|
|
:span="12" |
|
|
|
v-if="form.type === 2"> |
|
|
|
<el-form-item |
|
|
|
label="组件路径" |
|
|
|
prop="component"> |
|
|
|
<el-input |
|
|
|
v-model="form.component" |
|
|
|
placeholder="例如说:system/user/index" /> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="12" v-if="form.type === 2"> |
|
|
|
<el-form-item label="组件名称" prop="componentName"> |
|
|
|
<el-input v-model="form.componentName" placeholder="例如说:SystemUser" /> |
|
|
|
<el-col |
|
|
|
:span="12" |
|
|
|
v-if="form.type === 2"> |
|
|
|
<el-form-item |
|
|
|
label="组件名称" |
|
|
|
prop="componentName"> |
|
|
|
<el-input |
|
|
|
v-model="form.componentName" |
|
|
|
placeholder="例如说:SystemUser" /> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="12"> |
|
|
|
<el-form-item label="菜单状态" prop="status"> |
|
|
|
<el-form-item |
|
|
|
label="菜单状态" |
|
|
|
prop="status"> |
|
|
|
<span slot="label"> |
|
|
|
<el-tooltip content="选择停用时,路由将不会出现在侧边栏,也不能被访问" placement="top"> |
|
|
|
<el-tooltip |
|
|
|
content="选择停用时,路由将不会出现在侧边栏,也不能被访问" |
|
|
|
placement="top"> |
|
|
|
<i class="el-icon-question" /> |
|
|
|
</el-tooltip> |
|
|
|
菜单状态 |
|
|
|
</span> |
|
|
|
<el-radio-group v-model="form.status"> |
|
|
|
<el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)" |
|
|
|
:key="dict.value" :label="parseInt(dict.value)">{{dict.label}}</el-radio> |
|
|
|
<el-radio |
|
|
|
v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)" |
|
|
|
:key="dict.value" |
|
|
|
:label="parseInt(dict.value)"> |
|
|
|
{{ dict.label }} |
|
|
|
</el-radio> |
|
|
|
</el-radio-group> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="12"> |
|
|
|
<el-form-item v-if="form.type !== 3" label="显示状态"> |
|
|
|
<el-form-item |
|
|
|
v-if="form.type !== 3" |
|
|
|
label="显示状态"> |
|
|
|
<span slot="label"> |
|
|
|
<el-tooltip content="选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问" placement="top"> |
|
|
|
<el-tooltip |
|
|
|
content="选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问" |
|
|
|
placement="top"> |
|
|
|
<i class="el-icon-question" /> |
|
|
|
</el-tooltip> |
|
|
|
是否显示 |
|
|
|
</span> |
|
|
|
<el-radio-group v-model="form.visible"> |
|
|
|
<el-radio :key="true" :label="true">显示</el-radio> |
|
|
|
<el-radio :key="false" :label="false">隐藏</el-radio> |
|
|
|
<el-radio |
|
|
|
:key="true" |
|
|
|
:label="true"> |
|
|
|
显示 |
|
|
|
</el-radio> |
|
|
|
<el-radio |
|
|
|
:key="false" |
|
|
|
:label="false"> |
|
|
|
隐藏 |
|
|
|
</el-radio> |
|
|
|
</el-radio-group> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="12"> |
|
|
|
<el-form-item v-if="form.type !== 3" label="总是显示"> |
|
|
|
<el-form-item |
|
|
|
v-if="form.type !== 3" |
|
|
|
label="总是显示"> |
|
|
|
<span slot="label"> |
|
|
|
<el-tooltip content="选择不是时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单" placement="top"> |
|
|
|
<el-tooltip |
|
|
|
content="选择不是时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单" |
|
|
|
placement="top"> |
|
|
|
<i class="el-icon-question" /> |
|
|
|
</el-tooltip> |
|
|
|
总是显示 |
|
|
|
</span> |
|
|
|
<el-radio-group v-model="form.alwaysShow"> |
|
|
|
<el-radio :key="true" :label="true">总是</el-radio> |
|
|
|
<el-radio :key="false" :label="false">不是</el-radio> |
|
|
|
<el-radio |
|
|
|
:key="true" |
|
|
|
:label="true"> |
|
|
|
总是 |
|
|
|
</el-radio> |
|
|
|
<el-radio |
|
|
|
:key="false" |
|
|
|
:label="false"> |
|
|
|
不是 |
|
|
|
</el-radio> |
|
|
|
</el-radio-group> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="12"> |
|
|
|
<el-form-item v-if="form.type === 2" label="是否缓存"> |
|
|
|
<el-form-item |
|
|
|
v-if="form.type === 2" |
|
|
|
label="是否缓存"> |
|
|
|
<span slot="label"> |
|
|
|
<el-tooltip content="选择缓存时,则会被 `keep-alive` 缓存,必须填写「组件名称」字段" placement="top"> |
|
|
|
<el-tooltip |
|
|
|
content="选择缓存时,则会被 `keep-alive` 缓存,必须填写「组件名称」字段" |
|
|
|
placement="top"> |
|
|
|
<i class="el-icon-question" /> |
|
|
|
</el-tooltip> |
|
|
|
是否缓存 |
|
|
|
</span> |
|
|
|
<el-radio-group v-model="form.keepAlive"> |
|
|
|
<el-radio :key="true" :label="true">缓存</el-radio> |
|
|
|
<el-radio :key="false" :label="false">不缓存</el-radio> |
|
|
|
<el-radio |
|
|
|
:key="true" |
|
|
|
:label="true"> |
|
|
|
缓存 |
|
|
|
</el-radio> |
|
|
|
<el-radio |
|
|
|
:key="false" |
|
|
|
:label="false"> |
|
|
|
不缓存 |
|
|
|
</el-radio> |
|
|
|
</el-radio-group> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
</el-row> |
|
|
|
</el-form> |
|
|
|
<div slot="footer" class="dialog-footer"> |
|
|
|
<el-button type="primary" @click="submitForm">确 定</el-button> |
|
|
|
<div |
|
|
|
slot="footer" |
|
|
|
class="dialog-footer"> |
|
|
|
<el-button |
|
|
|
type="primary" |
|
|
|
@click="submitForm"> |
|
|
|
确 定 |
|
|
|
</el-button> |
|
|
|
<el-button @click="cancel">取 消</el-button> |
|
|
|
</div> |
|
|
|
</el-dialog> |
|
|
@@ -197,17 +394,23 @@ |
|
|
|
</template> |
|
|
|
|
|
|
|
<script> |
|
|
|
import { listMenu, getMenu, delMenu, addMenu, updateMenu } from "@/api/system/menu"; |
|
|
|
import Treeselect from "@riophae/vue-treeselect"; |
|
|
|
import "@riophae/vue-treeselect/dist/vue-treeselect.css"; |
|
|
|
import IconSelect from "@/components/IconSelect"; |
|
|
|
import { |
|
|
|
listMenu, |
|
|
|
getMenu, |
|
|
|
delMenu, |
|
|
|
addMenu, |
|
|
|
updateMenu, |
|
|
|
} from '@/api/system/menu'; |
|
|
|
import Treeselect from '@riophae/vue-treeselect'; |
|
|
|
import '@riophae/vue-treeselect/dist/vue-treeselect.css'; |
|
|
|
import IconSelect from '@/components/IconSelect'; |
|
|
|
|
|
|
|
import { SystemMenuTypeEnum, CommonStatusEnum } from '@/utils/constants' |
|
|
|
import { getDictDatas, DICT_TYPE } from '@/utils/dict' |
|
|
|
import {isExternal} from "@/utils/validate"; |
|
|
|
import { SystemMenuTypeEnum, CommonStatusEnum } from '@/utils/constants'; |
|
|
|
import { getDictDatas, DICT_TYPE } from '@/utils/dict'; |
|
|
|
import { isExternal } from '@/utils/validate'; |
|
|
|
|
|
|
|
export default { |
|
|
|
name: "SystemMenu", |
|
|
|
name: 'SystemMenu', |
|
|
|
components: { Treeselect, IconSelect }, |
|
|
|
data() { |
|
|
|
return { |
|
|
@@ -220,7 +423,7 @@ export default { |
|
|
|
// 菜单树选项 |
|
|
|
menuOptions: [], |
|
|
|
// 弹出层标题 |
|
|
|
title: "", |
|
|
|
title: '', |
|
|
|
// 是否显示弹出层 |
|
|
|
open: false, |
|
|
|
// 是否展开,默认全部折叠 |
|
|
@@ -230,24 +433,22 @@ export default { |
|
|
|
// 查询参数 |
|
|
|
queryParams: { |
|
|
|
name: undefined, |
|
|
|
visible: undefined |
|
|
|
visible: undefined, |
|
|
|
}, |
|
|
|
// 表单参数 |
|
|
|
form: {}, |
|
|
|
// 表单校验 |
|
|
|
rules: { |
|
|
|
name: [ |
|
|
|
{ required: true, message: "菜单名称不能为空", trigger: "blur" } |
|
|
|
{ required: true, message: '菜单名称不能为空', trigger: 'blur' }, |
|
|
|
], |
|
|
|
sort: [ |
|
|
|
{ required: true, message: "菜单顺序不能为空", trigger: "blur" } |
|
|
|
{ required: true, message: '菜单顺序不能为空', trigger: 'blur' }, |
|
|
|
], |
|
|
|
path: [ |
|
|
|
{ required: true, message: "路由地址不能为空", trigger: "blur" } |
|
|
|
{ required: true, message: '路由地址不能为空', trigger: 'blur' }, |
|
|
|
], |
|
|
|
status: [ |
|
|
|
{ required: true, message: "状态不能为空", trigger: "blur" } |
|
|
|
] |
|
|
|
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }], |
|
|
|
}, |
|
|
|
|
|
|
|
// 枚举 |
|
|
@@ -255,7 +456,7 @@ export default { |
|
|
|
CommonStatusEnum: CommonStatusEnum, |
|
|
|
// 数据字典 |
|
|
|
menuTypeDictDatas: getDictDatas(DICT_TYPE.SYSTEM_MENU_TYPE), |
|
|
|
statusDictDatas: getDictDatas(DICT_TYPE.COMMON_STATUS) |
|
|
|
statusDictDatas: getDictDatas(DICT_TYPE.COMMON_STATUS), |
|
|
|
}; |
|
|
|
}, |
|
|
|
created() { |
|
|
@@ -269,8 +470,8 @@ export default { |
|
|
|
/** 查询菜单列表 */ |
|
|
|
getList() { |
|
|
|
this.loading = true; |
|
|
|
listMenu(this.queryParams).then(response => { |
|
|
|
this.menuList = this.handleTree(response.data, "id"); |
|
|
|
listMenu(this.queryParams).then((response) => { |
|
|
|
this.menuList = this.handleTree(response.data, 'id'); |
|
|
|
this.loading = false; |
|
|
|
}); |
|
|
|
}, |
|
|
@@ -282,15 +483,15 @@ export default { |
|
|
|
return { |
|
|
|
id: node.id, |
|
|
|
label: node.name, |
|
|
|
children: node.children |
|
|
|
children: node.children, |
|
|
|
}; |
|
|
|
}, |
|
|
|
/** 查询菜单下拉树结构 */ |
|
|
|
getTreeselect() { |
|
|
|
listMenu().then(response => { |
|
|
|
listMenu().then((response) => { |
|
|
|
this.menuOptions = []; |
|
|
|
const menu = { id: 0, name: '主类目', children: [] }; |
|
|
|
menu.children = this.handleTree(response.data, "id"); |
|
|
|
menu.children = this.handleTree(response.data, 'id'); |
|
|
|
this.menuOptions.push(menu); |
|
|
|
}); |
|
|
|
}, |
|
|
@@ -313,7 +514,7 @@ export default { |
|
|
|
keepAlive: true, |
|
|
|
alwaysShow: true, |
|
|
|
}; |
|
|
|
this.resetForm("form"); |
|
|
|
this.resetForm('form'); |
|
|
|
}, |
|
|
|
/** 搜索按钮操作 */ |
|
|
|
handleQuery() { |
|
|
@@ -321,7 +522,7 @@ export default { |
|
|
|
}, |
|
|
|
/** 重置按钮操作 */ |
|
|
|
resetQuery() { |
|
|
|
this.resetForm("queryForm"); |
|
|
|
this.resetForm('queryForm'); |
|
|
|
this.handleQuery(); |
|
|
|
}, |
|
|
|
/** 展开/折叠操作 */ |
|
|
@@ -342,49 +543,51 @@ export default { |
|
|
|
this.form.parentId = 0; |
|
|
|
} |
|
|
|
this.open = true; |
|
|
|
this.title = "添加菜单"; |
|
|
|
this.title = '添加菜单'; |
|
|
|
}, |
|
|
|
/** 修改按钮操作 */ |
|
|
|
handleUpdate(row) { |
|
|
|
this.reset(); |
|
|
|
this.getTreeselect(); |
|
|
|
getMenu(row.id).then(response => { |
|
|
|
getMenu(row.id).then((response) => { |
|
|
|
this.form = response.data; |
|
|
|
this.open = true; |
|
|
|
this.title = "修改菜单"; |
|
|
|
this.title = '修改菜单'; |
|
|
|
}); |
|
|
|
}, |
|
|
|
/** 提交按钮 */ |
|
|
|
submitForm: function () { |
|
|
|
this.$refs["form"].validate(valid => { |
|
|
|
this.$refs['form'].validate((valid) => { |
|
|
|
if (valid) { |
|
|
|
// 若权限类型为目录或者菜单时,进行 path 的校验,避免后续拼接出来的路由无法跳转 |
|
|
|
if (this.form.type === SystemMenuTypeEnum.DIR |
|
|
|
|| this.form.type === SystemMenuTypeEnum.MENU) { |
|
|
|
if ( |
|
|
|
this.form.type === SystemMenuTypeEnum.DIR || |
|
|
|
this.form.type === SystemMenuTypeEnum.MENU |
|
|
|
) { |
|
|
|
// 如果是外链,则不进行校验 |
|
|
|
const path = this.form.path |
|
|
|
const path = this.form.path; |
|
|
|
if (!isExternal(path)) { |
|
|
|
// 父权限为根节点,path 必须以 / 开头 |
|
|
|
if (this.form.parentId === 0 && path.charAt(0) !== '/') { |
|
|
|
this.$modal.msgSuccess('前端必须以 / 开头') |
|
|
|
return |
|
|
|
this.$modal.msgSuccess('前端必须以 / 开头'); |
|
|
|
return; |
|
|
|
} else if (this.form.parentId !== 0 && path.charAt(0) === '/') { |
|
|
|
this.$modal.msgSuccess('前端不能以 / 开头') |
|
|
|
return |
|
|
|
this.$modal.msgSuccess('前端不能以 / 开头'); |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 提交 |
|
|
|
if (this.form.id !== undefined) { |
|
|
|
updateMenu(this.form).then(response => { |
|
|
|
this.$modal.msgSuccess("修改成功"); |
|
|
|
updateMenu(this.form).then((response) => { |
|
|
|
this.$modal.msgSuccess('修改成功'); |
|
|
|
this.open = false; |
|
|
|
this.getList(); |
|
|
|
}); |
|
|
|
} else { |
|
|
|
addMenu(this.form).then(response => { |
|
|
|
this.$modal.msgSuccess("新增成功"); |
|
|
|
addMenu(this.form).then((response) => { |
|
|
|
this.$modal.msgSuccess('新增成功'); |
|
|
|
this.open = false; |
|
|
|
this.getList(); |
|
|
|
}); |
|
|
@@ -394,13 +597,17 @@ export default { |
|
|
|
}, |
|
|
|
/** 删除按钮操作 */ |
|
|
|
handleDelete(row) { |
|
|
|
this.$modal.confirm('是否确认删除名称为"' + row.name + '"的数据项?').then(function() { |
|
|
|
this.$modal |
|
|
|
.confirm('是否确认删除名称为"' + row.name + '"的数据项?') |
|
|
|
.then(function () { |
|
|
|
return delMenu(row.id); |
|
|
|
}).then(() => { |
|
|
|
}) |
|
|
|
.then(() => { |
|
|
|
this.getList(); |
|
|
|
this.$modal.msgSuccess("删除成功"); |
|
|
|
}).catch(() => {}); |
|
|
|
} |
|
|
|
} |
|
|
|
this.$modal.msgSuccess('删除成功'); |
|
|
|
}) |
|
|
|
.catch(() => {}); |
|
|
|
}, |
|
|
|
}, |
|
|
|
}; |
|
|
|
</script> |