refactor: 增加店铺菜单维护页面
parent
ef92bcfe3a
commit
525838468c
|
@ -0,0 +1,576 @@
|
||||||
|
<template>
|
||||||
|
<div class="search">
|
||||||
|
<Card>
|
||||||
|
<!-- 筛选项和操作按钮 -->
|
||||||
|
<Row class="operation">
|
||||||
|
<i-switch
|
||||||
|
v-model="strict"
|
||||||
|
class="selectModel"
|
||||||
|
size="large"
|
||||||
|
style="margin-right: 5px"
|
||||||
|
>
|
||||||
|
<span slot="open">级联</span>
|
||||||
|
<span slot="close">单选</span>
|
||||||
|
</i-switch>
|
||||||
|
<Button @click="addRootMenu">添加顶级菜单</Button>
|
||||||
|
<Button @click="addMenu" type="primary">添加子菜单</Button>
|
||||||
|
<Button @click="delAll">批量删除</Button>
|
||||||
|
<Dropdown @on-click="handleDropdown">
|
||||||
|
<Button>
|
||||||
|
更多操作
|
||||||
|
<Icon type="md-arrow-dropdown"></Icon>
|
||||||
|
</Button>
|
||||||
|
<DropdownMenu slot="list">
|
||||||
|
<DropdownItem name="refresh">刷新</DropdownItem>
|
||||||
|
<DropdownItem name="expandOne">收合所有</DropdownItem>
|
||||||
|
<DropdownItem name="expandTwo">展开一级</DropdownItem>
|
||||||
|
<DropdownItem name="expandThree">展开两级</DropdownItem>
|
||||||
|
<DropdownItem name="expandAll">展开所有</DropdownItem>
|
||||||
|
</DropdownMenu>
|
||||||
|
</Dropdown>
|
||||||
|
</Row>
|
||||||
|
<!-- 页面主体,左侧树结构,右侧表单项 -->
|
||||||
|
<Row type="flex" justify="start">
|
||||||
|
<Col :md="8" :lg="8" :xl="6">
|
||||||
|
<Alert show-icon>
|
||||||
|
当前选择编辑:
|
||||||
|
<span class="select-title">{{ editTitle }}</span>
|
||||||
|
<a class="select-clear" v-if="form.id" @click="cancelEdit">取消选择</a>
|
||||||
|
</Alert>
|
||||||
|
<Input
|
||||||
|
v-model="searchKey"
|
||||||
|
suffix="ios-search"
|
||||||
|
@on-change="search"
|
||||||
|
placeholder="输入菜单名搜索"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
<div class="tree-bar" :style="{ maxHeight: maxHeight }">
|
||||||
|
<Tree
|
||||||
|
ref="tree"
|
||||||
|
:data="data"
|
||||||
|
show-checkbox
|
||||||
|
:render="renderContent"
|
||||||
|
@on-select-change="selectTree"
|
||||||
|
@on-check-change="changeSelect"
|
||||||
|
:check-strictly="!strict"
|
||||||
|
></Tree>
|
||||||
|
<Spin size="large" fix v-if="loading"></Spin>
|
||||||
|
</div>
|
||||||
|
</Col>
|
||||||
|
<Col :md="15" :lg="13" :xl="9" style="margin-left: 10px">
|
||||||
|
<Form ref="form" :model="form" :label-width="110" :rules="formValidate">
|
||||||
|
<FormItem label="类型" prop="type">
|
||||||
|
<div v-show="form.level == 0">
|
||||||
|
<Icon
|
||||||
|
type="ios-navigate-outline"
|
||||||
|
size="16"
|
||||||
|
style="margin-right: 5px"
|
||||||
|
></Icon>
|
||||||
|
<span>顶级菜单</span>
|
||||||
|
</div>
|
||||||
|
<div v-show="form.level == 1 || form.level == 2">
|
||||||
|
<Icon
|
||||||
|
type="ios-list-box-outline"
|
||||||
|
size="16"
|
||||||
|
style="margin-right: 5px"
|
||||||
|
></Icon>
|
||||||
|
<span>页面菜单</span>
|
||||||
|
</div>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="菜单名称" prop="title">
|
||||||
|
<Input class="menu-input" v-model="form.title" />
|
||||||
|
</FormItem>
|
||||||
|
<FormItem
|
||||||
|
label="路由地址"
|
||||||
|
prop="path"
|
||||||
|
v-if="form.level != 0"
|
||||||
|
class="block-tool"
|
||||||
|
>
|
||||||
|
<Tooltip
|
||||||
|
placement="right"
|
||||||
|
content="路由地址,英文唯一,跳转页面,路径展示用 "
|
||||||
|
>
|
||||||
|
<Input class="menu-input" v-model="form.path" />
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="路由名称" prop="name" class="block-tool">
|
||||||
|
<Tooltip
|
||||||
|
placement="right"
|
||||||
|
content="路由name,需英文唯一,跳转页面用"
|
||||||
|
transfer
|
||||||
|
>
|
||||||
|
<Input class="menu-input" v-model="form.name" />
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="文件路径" prop="frontRoute" v-if="form.level != 0">
|
||||||
|
<Input class="menu-input" v-model="form.frontRoute" />
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="权限url" v-if="form.level != 0" class="block-tool">
|
||||||
|
<Tooltip placement="right" content="*号模糊匹配,逗号分割" transfer>
|
||||||
|
<Input class="menu-input" v-model="form.permission" type="textarea" />
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="排序值" prop="sortOrder">
|
||||||
|
<Tooltip trigger="hover" placement="right" content="值越小越靠前,支持小数">
|
||||||
|
<InputNumber :max="1000" :min="0" v-model="form.sortOrder"></InputNumber>
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
<Form-item>
|
||||||
|
<Button
|
||||||
|
style="margin-right: 5px"
|
||||||
|
@click="submitEdit"
|
||||||
|
:loading="submitLoading"
|
||||||
|
type="primary"
|
||||||
|
>保存
|
||||||
|
</Button>
|
||||||
|
<Button @click="handleReset">重置</Button>
|
||||||
|
</Form-item>
|
||||||
|
</Form>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</Card>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
draggable
|
||||||
|
:title="modalTitle"
|
||||||
|
v-model="menuModalVisible"
|
||||||
|
:mask-closable="false"
|
||||||
|
:width="500"
|
||||||
|
:styles="{ top: '30px' }"
|
||||||
|
>
|
||||||
|
<Form ref="formAdd" :model="formAdd" :label-width="100" :rules="formValidate">
|
||||||
|
<div v-if="showParent">
|
||||||
|
<FormItem label="上级节点:">{{ parentTitle }}</FormItem>
|
||||||
|
</div>
|
||||||
|
<FormItem label="类型" prop="type">
|
||||||
|
<div v-show="formAdd.level == 0">
|
||||||
|
<Icon type="ios-navigate-outline" size="16" style="margin-right: 5px"></Icon>
|
||||||
|
<span>顶级菜单</span>
|
||||||
|
</div>
|
||||||
|
<div v-show="formAdd.level != 0">
|
||||||
|
<Icon type="ios-list-box-outline" size="16" style="margin-right: 5px"></Icon>
|
||||||
|
<span>页面菜单</span>
|
||||||
|
</div>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="菜单名称" prop="title">
|
||||||
|
<Input class="menu-input" v-model="formAdd.title" />
|
||||||
|
</FormItem>
|
||||||
|
|
||||||
|
<FormItem label="路由地址" prop="path" v-if="formAdd.level != 0">
|
||||||
|
<Input v-model="formAdd.path" />
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="路由名称" prop="name" class="block-tool">
|
||||||
|
<Tooltip placement="right" content="路由name,需英文唯一,跳转页面用">
|
||||||
|
<Input v-model="formAdd.name" />
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="文件路径" prop="frontRoute" v-if="formAdd.level != 0">
|
||||||
|
<Input v-model="formAdd.frontRoute" />
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="权限url" v-if="formAdd.level != 0">
|
||||||
|
<Input v-model="formAdd.permission" type="textarea" />
|
||||||
|
<div class="desc">*号模糊匹配,逗号分割</div>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="排序值" prop="sortOrder">
|
||||||
|
<Tooltip trigger="hover" placement="right" content="值越小越靠前,支持小数">
|
||||||
|
<InputNumber :max="1000" :min="0" v-model="formAdd.sortOrder"></InputNumber>
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
</Form>
|
||||||
|
<div slot="footer">
|
||||||
|
<Button type="text" @click="menuModalVisible = false">取消</Button>
|
||||||
|
<Button type="primary" :loading="submitLoading" @click="submitAdd">提交</Button>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
getAllPermissionList,
|
||||||
|
addPermission,
|
||||||
|
editPermission,
|
||||||
|
deletePermission,
|
||||||
|
searchPermission,
|
||||||
|
} from "@/api/index";
|
||||||
|
import util from "@/libs/util.js";
|
||||||
|
import Cookies from "js-cookie";
|
||||||
|
export default {
|
||||||
|
name: "menu-manage",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loading: true, // 加载状态
|
||||||
|
strict: true, // 级联 单选
|
||||||
|
maxHeight: "500px", // 最大高度
|
||||||
|
expandLevel: 1, // 展开层级
|
||||||
|
menuModalVisible: false, // 添加菜单modal
|
||||||
|
selectList: [], // 已选列表
|
||||||
|
selectCount: 0, // 所选数量
|
||||||
|
showParent: false, // 展示父级
|
||||||
|
searchKey: "", // 搜索关键词
|
||||||
|
parentTitle: "", // 父级标题
|
||||||
|
editTitle: "", // 编辑标题
|
||||||
|
modalTitle: "", // modal标题
|
||||||
|
form: {
|
||||||
|
// 表单数据
|
||||||
|
id: "",
|
||||||
|
title: "",
|
||||||
|
name: "",
|
||||||
|
path: "",
|
||||||
|
frontRoute: "",
|
||||||
|
parentId: "",
|
||||||
|
sortOrder: 0,
|
||||||
|
level: 0,
|
||||||
|
permission: "",
|
||||||
|
},
|
||||||
|
formAdd: {
|
||||||
|
// 添加表单
|
||||||
|
},
|
||||||
|
formValidate: {
|
||||||
|
// 验证规则
|
||||||
|
title: [{ required: true, message: "菜单名称名称不能为空", trigger: "blur" }],
|
||||||
|
name: [{ required: true, message: "路由名称不能为空", trigger: "blur" }],
|
||||||
|
path: [{ required: true, message: "路由地址不能为空", trigger: "blur" }],
|
||||||
|
frontRoute: [{ required: true, message: "文件地址不能为空", trigger: "blur" }],
|
||||||
|
sortOrder: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
type: "number",
|
||||||
|
message: "排序值不能为空",
|
||||||
|
trigger: "blur",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
submitLoading: false, // 提交状态
|
||||||
|
data: [], // 数据
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 初始化数据
|
||||||
|
init() {
|
||||||
|
this.getAllList();
|
||||||
|
},
|
||||||
|
|
||||||
|
renderContent(h, { root, node, data }) {
|
||||||
|
// 渲染树形结构前面图标
|
||||||
|
let icon = "";
|
||||||
|
if (data.level == 0) {
|
||||||
|
icon = "ios-navigate";
|
||||||
|
} else if (data.level == 1) {
|
||||||
|
icon = "md-list-box";
|
||||||
|
} else if (data.level == 2) {
|
||||||
|
icon = "md-list";
|
||||||
|
}
|
||||||
|
return h("span", [
|
||||||
|
h("span", [
|
||||||
|
h("Icon", {
|
||||||
|
props: {
|
||||||
|
type: icon,
|
||||||
|
size: "16",
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
"margin-right": "8px",
|
||||||
|
"margin-bottom": "3px",
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
h("span", data.title),
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
// 更多操作
|
||||||
|
handleDropdown(name) {
|
||||||
|
if (name == "expandOne") {
|
||||||
|
this.expandLevel = 1;
|
||||||
|
this.getAllList();
|
||||||
|
} else if (name == "expandTwo") {
|
||||||
|
this.expandLevel = 2;
|
||||||
|
this.getAllList();
|
||||||
|
} else if (name == "expandThree") {
|
||||||
|
this.expandLevel = 3;
|
||||||
|
this.getAllList();
|
||||||
|
}
|
||||||
|
if (name == "expandAll") {
|
||||||
|
this.expandLevel = 4;
|
||||||
|
this.getAllList();
|
||||||
|
} else if (name == "refresh") {
|
||||||
|
this.getAllList();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 获取所有菜单
|
||||||
|
getAllList() {
|
||||||
|
this.loading = true;
|
||||||
|
getAllPermissionList().then((res) => {
|
||||||
|
this.loading = false;
|
||||||
|
if (res.success) {
|
||||||
|
// 仅展开指定级数 默认后台已展开所有
|
||||||
|
let expandLevel = this.expandLevel;
|
||||||
|
res.result.forEach(function (e) {
|
||||||
|
if (expandLevel == 1) {
|
||||||
|
if (e.level == 0) {
|
||||||
|
e.expand = false;
|
||||||
|
}
|
||||||
|
if (e.children && e.children.length > 0) {
|
||||||
|
e.children.forEach(function (c) {
|
||||||
|
if (c.level == 1) {
|
||||||
|
c.expand = false;
|
||||||
|
}
|
||||||
|
if (c.children && c.children.length > 0) {
|
||||||
|
c.children.forEach(function (b) {
|
||||||
|
if (b.level == 2) {
|
||||||
|
b.expand = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (expandLevel == 2) {
|
||||||
|
if (e.level == 0) {
|
||||||
|
e.expand = true;
|
||||||
|
}
|
||||||
|
if (e.children && e.children.length > 0) {
|
||||||
|
e.children.forEach(function (c) {
|
||||||
|
if (c.level == 1) {
|
||||||
|
c.expand = false;
|
||||||
|
}
|
||||||
|
if (c.children && c.children.length > 0) {
|
||||||
|
c.children.forEach(function (b) {
|
||||||
|
if (b.level == 2) {
|
||||||
|
b.expand = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (expandLevel == 3) {
|
||||||
|
if (e.level == 0) {
|
||||||
|
e.expand = true;
|
||||||
|
}
|
||||||
|
if (e.children && e.children.length > 0) {
|
||||||
|
e.children.forEach(function (c) {
|
||||||
|
if (c.level == 1) {
|
||||||
|
c.expand = true;
|
||||||
|
}
|
||||||
|
if (c.children && c.children.length > 0) {
|
||||||
|
c.children.forEach(function (b) {
|
||||||
|
if (b.level == 2) {
|
||||||
|
b.expand = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (expandLevel == 4) {
|
||||||
|
if (e.level == 0) {
|
||||||
|
e.expand = true;
|
||||||
|
}
|
||||||
|
if (e.children && e.children.length > 0) {
|
||||||
|
e.children.forEach(function (c) {
|
||||||
|
if (c.level == 1) {
|
||||||
|
c.expand = true;
|
||||||
|
}
|
||||||
|
if (c.children && c.children.length > 0) {
|
||||||
|
c.children.forEach(function (b) {
|
||||||
|
if (b.level == 2) {
|
||||||
|
b.expand = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.data = res.result;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 选择菜单
|
||||||
|
selectTree(v) {
|
||||||
|
if (v.length > 0) {
|
||||||
|
let str = JSON.stringify(v);
|
||||||
|
let menu = JSON.parse(str);
|
||||||
|
this.form = menu[0];
|
||||||
|
console.log(this.form);
|
||||||
|
this.editTitle = menu[0].title;
|
||||||
|
} else {
|
||||||
|
this.cancelEdit();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 搜索菜单
|
||||||
|
search() {
|
||||||
|
if (this.searchKey) {
|
||||||
|
this.loading = true;
|
||||||
|
searchPermission({ title: this.searchKey }).then((res) => {
|
||||||
|
this.loading = false;
|
||||||
|
if (res.success) {
|
||||||
|
this.data = res.result;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.getAllList();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 取消选择
|
||||||
|
cancelEdit() {
|
||||||
|
let data = this.$refs.tree.getSelectedNodes()[0];
|
||||||
|
if (data) {
|
||||||
|
data.selected = false;
|
||||||
|
}
|
||||||
|
this.$refs.form.resetFields();
|
||||||
|
this.form.id = "";
|
||||||
|
this.editTitle = "";
|
||||||
|
},
|
||||||
|
// 重置表单
|
||||||
|
handleReset() {
|
||||||
|
this.$refs.form.resetFields();
|
||||||
|
this.form.frontRoute = "";
|
||||||
|
},
|
||||||
|
// 保存
|
||||||
|
submitEdit() {
|
||||||
|
this.$refs.form.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
if (!this.form.id) {
|
||||||
|
this.$Message.warning("请先点击选择要修改的菜单节点");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.submitLoading = true;
|
||||||
|
if (this.form.sortOrder == null) {
|
||||||
|
this.form.sortOrder = 0;
|
||||||
|
}
|
||||||
|
// 删除一些之前添加的无用字段
|
||||||
|
delete this.form.icon;
|
||||||
|
delete this.form.frontComponent;
|
||||||
|
delete this.form.buttonType;
|
||||||
|
delete this.form.updateTime;
|
||||||
|
delete this.form.selected;
|
||||||
|
delete this.form.description;
|
||||||
|
delete this.form.children;
|
||||||
|
delete this.form.children;
|
||||||
|
|
||||||
|
editPermission(this.form).then((res) => {
|
||||||
|
this.submitLoading = false;
|
||||||
|
if (res.success) {
|
||||||
|
this.$Message.success("编辑成功");
|
||||||
|
// 标记重新获取菜单数据
|
||||||
|
this.$store.commit("setAdded", false);
|
||||||
|
util.initRouter(this);
|
||||||
|
this.init();
|
||||||
|
this.menuModalVisible = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 添加
|
||||||
|
submitAdd() {
|
||||||
|
this.$refs.formAdd.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.submitLoading = true;
|
||||||
|
|
||||||
|
addPermission(this.formAdd).then((res) => {
|
||||||
|
this.submitLoading = false;
|
||||||
|
if (res.success) {
|
||||||
|
this.$Message.success("添加成功");
|
||||||
|
// 标记重新获取菜单数据
|
||||||
|
this.$store.commit("setAdded", false);
|
||||||
|
util.initRouter(this);
|
||||||
|
this.init();
|
||||||
|
this.menuModalVisible = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 添加子菜单
|
||||||
|
addMenu() {
|
||||||
|
if (!this.form.id) {
|
||||||
|
this.$Message.warning("请先点击选择一个菜单权限节点");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.parentTitle = this.form.title;
|
||||||
|
this.modalTitle = "添加子节点";
|
||||||
|
this.showParent = true;
|
||||||
|
if (this.form.level == 2) {
|
||||||
|
this.$Modal.warning({
|
||||||
|
title: "抱歉,不能添加啦",
|
||||||
|
content: "仅支持2级菜单目录",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.formAdd = {
|
||||||
|
parentId: this.form.id,
|
||||||
|
level: Number(this.form.level) + 1,
|
||||||
|
sortOrder: 0,
|
||||||
|
permission: "", // 权限url
|
||||||
|
};
|
||||||
|
if (this.form.level == 0) {
|
||||||
|
this.formAdd.path = "/";
|
||||||
|
this.formAdd.frontRoute = "Main";
|
||||||
|
}
|
||||||
|
this.menuModalVisible = true;
|
||||||
|
},
|
||||||
|
// 添加顶级菜单
|
||||||
|
addRootMenu() {
|
||||||
|
this.modalTitle = "添加顶级菜单";
|
||||||
|
this.showParent = false;
|
||||||
|
this.formAdd = {
|
||||||
|
level: 0,
|
||||||
|
sortOrder: 0,
|
||||||
|
};
|
||||||
|
this.menuModalVisible = true;
|
||||||
|
},
|
||||||
|
// 选中菜单赋值
|
||||||
|
changeSelect(v) {
|
||||||
|
this.selectCount = v.length;
|
||||||
|
this.selectList = v;
|
||||||
|
},
|
||||||
|
// 批量删除菜单
|
||||||
|
delAll() {
|
||||||
|
if (this.selectCount <= 0) {
|
||||||
|
this.$Message.warning("您还未勾选要删除的数据");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.$Modal.confirm({
|
||||||
|
title: "确认删除",
|
||||||
|
content: "您确认要删除所选的 " + this.selectCount + " 条数据?",
|
||||||
|
loading: true,
|
||||||
|
onOk: () => {
|
||||||
|
let ids = "";
|
||||||
|
this.selectList.forEach(function (e) {
|
||||||
|
ids += e.id + ",";
|
||||||
|
});
|
||||||
|
ids = ids.substring(0, ids.length - 1);
|
||||||
|
deletePermission(ids).then((res) => {
|
||||||
|
this.$Modal.remove();
|
||||||
|
if (res.success) {
|
||||||
|
this.$Message.success("删除成功");
|
||||||
|
// 标记重新获取菜单数据
|
||||||
|
this.$store.commit("setAdded", false);
|
||||||
|
util.initRouter(this);
|
||||||
|
this.selectList = [];
|
||||||
|
this.selectCount = 0;
|
||||||
|
this.cancelEdit();
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
// 计算高度
|
||||||
|
let height = document.documentElement.clientHeight;
|
||||||
|
this.maxHeight = Number(height - 287) + "px";
|
||||||
|
this.init();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import "@/styles/tree-common.scss";
|
||||||
|
.desc {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
.menu-input {
|
||||||
|
width: 362px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,576 +1,24 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="search">
|
<Tabs value="name1">
|
||||||
<Card>
|
<TabPane label="平台菜单" name="name1">
|
||||||
<!-- 筛选项和操作按钮 -->
|
<managerMenu></managerMenu>
|
||||||
<Row class="operation">
|
|
||||||
<i-switch
|
|
||||||
v-model="strict"
|
|
||||||
class="selectModel"
|
|
||||||
size="large"
|
|
||||||
style="margin-right: 5px"
|
|
||||||
>
|
|
||||||
<span slot="open">级联</span>
|
|
||||||
<span slot="close">单选</span>
|
|
||||||
</i-switch>
|
|
||||||
<Button @click="addRootMenu">添加顶级菜单</Button>
|
|
||||||
<Button @click="addMenu" type="primary">添加子菜单</Button>
|
|
||||||
<Button @click="delAll">批量删除</Button>
|
|
||||||
<Dropdown @on-click="handleDropdown">
|
|
||||||
<Button>
|
|
||||||
更多操作
|
|
||||||
<Icon type="md-arrow-dropdown"></Icon>
|
|
||||||
</Button>
|
|
||||||
<DropdownMenu slot="list">
|
|
||||||
<DropdownItem name="refresh">刷新</DropdownItem>
|
|
||||||
<DropdownItem name="expandOne">收合所有</DropdownItem>
|
|
||||||
<DropdownItem name="expandTwo">展开一级</DropdownItem>
|
|
||||||
<DropdownItem name="expandThree">展开两级</DropdownItem>
|
|
||||||
<DropdownItem name="expandAll">展开所有</DropdownItem>
|
|
||||||
</DropdownMenu>
|
|
||||||
</Dropdown>
|
|
||||||
</Row>
|
|
||||||
<!-- 页面主体,左侧树结构,右侧表单项 -->
|
|
||||||
<Row type="flex" justify="start">
|
|
||||||
<Col :md="8" :lg="8" :xl="6">
|
|
||||||
<Alert show-icon>
|
|
||||||
当前选择编辑:
|
|
||||||
<span class="select-title">{{ editTitle }}</span>
|
|
||||||
<a class="select-clear" v-if="form.id" @click="cancelEdit">取消选择</a>
|
|
||||||
</Alert>
|
|
||||||
<Input
|
|
||||||
v-model="searchKey"
|
|
||||||
suffix="ios-search"
|
|
||||||
@on-change="search"
|
|
||||||
placeholder="输入菜单名搜索"
|
|
||||||
clearable
|
|
||||||
/>
|
|
||||||
<div class="tree-bar" :style="{ maxHeight: maxHeight }">
|
|
||||||
<Tree
|
|
||||||
ref="tree"
|
|
||||||
:data="data"
|
|
||||||
show-checkbox
|
|
||||||
:render="renderContent"
|
|
||||||
@on-select-change="selectTree"
|
|
||||||
@on-check-change="changeSelect"
|
|
||||||
:check-strictly="!strict"
|
|
||||||
></Tree>
|
|
||||||
<Spin size="large" fix v-if="loading"></Spin>
|
|
||||||
</div>
|
|
||||||
</Col>
|
|
||||||
<Col :md="15" :lg="13" :xl="9" style="margin-left: 10px">
|
|
||||||
<Form ref="form" :model="form" :label-width="110" :rules="formValidate">
|
|
||||||
<FormItem label="类型" prop="type">
|
|
||||||
<div v-show="form.level == 0">
|
|
||||||
<Icon
|
|
||||||
type="ios-navigate-outline"
|
|
||||||
size="16"
|
|
||||||
style="margin-right: 5px"
|
|
||||||
></Icon>
|
|
||||||
<span>顶级菜单</span>
|
|
||||||
</div>
|
|
||||||
<div v-show="form.level == 1 || form.level == 2">
|
|
||||||
<Icon
|
|
||||||
type="ios-list-box-outline"
|
|
||||||
size="16"
|
|
||||||
style="margin-right: 5px"
|
|
||||||
></Icon>
|
|
||||||
<span>页面菜单</span>
|
|
||||||
</div>
|
|
||||||
</FormItem>
|
|
||||||
<FormItem label="菜单名称" prop="title">
|
|
||||||
<Input class="menu-input" v-model="form.title" />
|
|
||||||
</FormItem>
|
|
||||||
<FormItem
|
|
||||||
label="路由地址"
|
|
||||||
prop="path"
|
|
||||||
v-if="form.level != 0"
|
|
||||||
class="block-tool"
|
|
||||||
>
|
|
||||||
<Tooltip
|
|
||||||
placement="right"
|
|
||||||
content="路由地址,英文唯一,跳转页面,路径展示用 "
|
|
||||||
>
|
|
||||||
<Input class="menu-input" v-model="form.path" />
|
|
||||||
</Tooltip>
|
|
||||||
</FormItem>
|
|
||||||
<FormItem label="路由名称" prop="name" class="block-tool">
|
|
||||||
<Tooltip
|
|
||||||
placement="right"
|
|
||||||
content="路由name,需英文唯一,跳转页面用"
|
|
||||||
transfer
|
|
||||||
>
|
|
||||||
<Input class="menu-input" v-model="form.name" />
|
|
||||||
</Tooltip>
|
|
||||||
</FormItem>
|
|
||||||
<FormItem label="文件路径" prop="frontRoute" v-if="form.level != 0">
|
|
||||||
<Input class="menu-input" v-model="form.frontRoute" />
|
|
||||||
</FormItem>
|
|
||||||
<FormItem label="权限url" v-if="form.level != 0" class="block-tool">
|
|
||||||
<Tooltip placement="right" content="*号模糊匹配,逗号分割" transfer>
|
|
||||||
<Input class="menu-input" v-model="form.permission" type="textarea" />
|
|
||||||
</Tooltip>
|
|
||||||
</FormItem>
|
|
||||||
<FormItem label="排序值" prop="sortOrder">
|
|
||||||
<Tooltip trigger="hover" placement="right" content="值越小越靠前,支持小数">
|
|
||||||
<InputNumber :max="1000" :min="0" v-model="form.sortOrder"></InputNumber>
|
|
||||||
</Tooltip>
|
|
||||||
</FormItem>
|
|
||||||
<Form-item>
|
|
||||||
<Button
|
|
||||||
style="margin-right: 5px"
|
|
||||||
@click="submitEdit"
|
|
||||||
:loading="submitLoading"
|
|
||||||
type="primary"
|
|
||||||
>保存
|
|
||||||
</Button>
|
|
||||||
<Button @click="handleReset">重置</Button>
|
|
||||||
</Form-item>
|
|
||||||
</Form>
|
|
||||||
</Col>
|
|
||||||
</Row>
|
|
||||||
</Card>
|
|
||||||
|
|
||||||
<Modal
|
</TabPane>
|
||||||
draggable
|
<TabPane label="店铺菜单" name="name2">
|
||||||
:title="modalTitle"
|
<storeMenu></storeMenu>
|
||||||
v-model="menuModalVisible"
|
|
||||||
:mask-closable="false"
|
|
||||||
:width="500"
|
|
||||||
:styles="{ top: '30px' }"
|
|
||||||
>
|
|
||||||
<Form ref="formAdd" :model="formAdd" :label-width="100" :rules="formValidate">
|
|
||||||
<div v-if="showParent">
|
|
||||||
<FormItem label="上级节点:">{{ parentTitle }}</FormItem>
|
|
||||||
</div>
|
|
||||||
<FormItem label="类型" prop="type">
|
|
||||||
<div v-show="formAdd.level == 0">
|
|
||||||
<Icon type="ios-navigate-outline" size="16" style="margin-right: 5px"></Icon>
|
|
||||||
<span>顶级菜单</span>
|
|
||||||
</div>
|
|
||||||
<div v-show="formAdd.level != 0">
|
|
||||||
<Icon type="ios-list-box-outline" size="16" style="margin-right: 5px"></Icon>
|
|
||||||
<span>页面菜单</span>
|
|
||||||
</div>
|
|
||||||
</FormItem>
|
|
||||||
<FormItem label="菜单名称" prop="title">
|
|
||||||
<Input class="menu-input" v-model="formAdd.title" />
|
|
||||||
</FormItem>
|
|
||||||
|
|
||||||
<FormItem label="路由地址" prop="path" v-if="formAdd.level != 0">
|
</TabPane>
|
||||||
<Input v-model="formAdd.path" />
|
</Tabs>
|
||||||
</FormItem>
|
|
||||||
<FormItem label="路由名称" prop="name" class="block-tool">
|
|
||||||
<Tooltip placement="right" content="路由name,需英文唯一,跳转页面用">
|
|
||||||
<Input v-model="formAdd.name" />
|
|
||||||
</Tooltip>
|
|
||||||
</FormItem>
|
|
||||||
<FormItem label="文件路径" prop="frontRoute" v-if="formAdd.level != 0">
|
|
||||||
<Input v-model="formAdd.frontRoute" />
|
|
||||||
</FormItem>
|
|
||||||
<FormItem label="权限url" v-if="formAdd.level != 0">
|
|
||||||
<Input v-model="formAdd.permission" type="textarea" />
|
|
||||||
<div class="desc">*号模糊匹配,逗号分割</div>
|
|
||||||
</FormItem>
|
|
||||||
<FormItem label="排序值" prop="sortOrder">
|
|
||||||
<Tooltip trigger="hover" placement="right" content="值越小越靠前,支持小数">
|
|
||||||
<InputNumber :max="1000" :min="0" v-model="formAdd.sortOrder"></InputNumber>
|
|
||||||
</Tooltip>
|
|
||||||
</FormItem>
|
|
||||||
</Form>
|
|
||||||
<div slot="footer">
|
|
||||||
<Button type="text" @click="menuModalVisible = false">取消</Button>
|
|
||||||
<Button type="primary" :loading="submitLoading" @click="submitAdd">提交</Button>
|
|
||||||
</div>
|
|
||||||
</Modal>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {
|
|
||||||
getAllPermissionList,
|
import managerMenu from "./menu";
|
||||||
addPermission,
|
import storeMenu from "./storeMenu";
|
||||||
editPermission,
|
|
||||||
deletePermission,
|
|
||||||
searchPermission,
|
|
||||||
} from "@/api/index";
|
|
||||||
import util from "@/libs/util.js";
|
|
||||||
import Cookies from "js-cookie";
|
|
||||||
export default {
|
export default {
|
||||||
name: "menu-manage",
|
components: {
|
||||||
data() {
|
managerMenu, storeMenu
|
||||||
return {
|
|
||||||
loading: true, // 加载状态
|
|
||||||
strict: true, // 级联 单选
|
|
||||||
maxHeight: "500px", // 最大高度
|
|
||||||
expandLevel: 1, // 展开层级
|
|
||||||
menuModalVisible: false, // 添加菜单modal
|
|
||||||
selectList: [], // 已选列表
|
|
||||||
selectCount: 0, // 所选数量
|
|
||||||
showParent: false, // 展示父级
|
|
||||||
searchKey: "", // 搜索关键词
|
|
||||||
parentTitle: "", // 父级标题
|
|
||||||
editTitle: "", // 编辑标题
|
|
||||||
modalTitle: "", // modal标题
|
|
||||||
form: {
|
|
||||||
// 表单数据
|
|
||||||
id: "",
|
|
||||||
title: "",
|
|
||||||
name: "",
|
|
||||||
path: "",
|
|
||||||
frontRoute: "",
|
|
||||||
parentId: "",
|
|
||||||
sortOrder: 0,
|
|
||||||
level: 0,
|
|
||||||
permission: "",
|
|
||||||
},
|
|
||||||
formAdd: {
|
|
||||||
// 添加表单
|
|
||||||
},
|
|
||||||
formValidate: {
|
|
||||||
// 验证规则
|
|
||||||
title: [{ required: true, message: "菜单名称名称不能为空", trigger: "blur" }],
|
|
||||||
name: [{ required: true, message: "路由名称不能为空", trigger: "blur" }],
|
|
||||||
path: [{ required: true, message: "路由地址不能为空", trigger: "blur" }],
|
|
||||||
frontRoute: [{ required: true, message: "文件地址不能为空", trigger: "blur" }],
|
|
||||||
sortOrder: [
|
|
||||||
{
|
|
||||||
required: true,
|
|
||||||
type: "number",
|
|
||||||
message: "排序值不能为空",
|
|
||||||
trigger: "blur",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
submitLoading: false, // 提交状态
|
|
||||||
data: [], // 数据
|
|
||||||
};
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
// 初始化数据
|
|
||||||
init() {
|
|
||||||
this.getAllList();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
renderContent(h, { root, node, data }) {
|
}
|
||||||
// 渲染树形结构前面图标
|
|
||||||
let icon = "";
|
|
||||||
if (data.level == 0) {
|
|
||||||
icon = "ios-navigate";
|
|
||||||
} else if (data.level == 1) {
|
|
||||||
icon = "md-list-box";
|
|
||||||
} else if (data.level == 2) {
|
|
||||||
icon = "md-list";
|
|
||||||
}
|
|
||||||
return h("span", [
|
|
||||||
h("span", [
|
|
||||||
h("Icon", {
|
|
||||||
props: {
|
|
||||||
type: icon,
|
|
||||||
size: "16",
|
|
||||||
},
|
|
||||||
style: {
|
|
||||||
"margin-right": "8px",
|
|
||||||
"margin-bottom": "3px",
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
h("span", data.title),
|
|
||||||
]),
|
|
||||||
]);
|
|
||||||
},
|
|
||||||
// 更多操作
|
|
||||||
handleDropdown(name) {
|
|
||||||
if (name == "expandOne") {
|
|
||||||
this.expandLevel = 1;
|
|
||||||
this.getAllList();
|
|
||||||
} else if (name == "expandTwo") {
|
|
||||||
this.expandLevel = 2;
|
|
||||||
this.getAllList();
|
|
||||||
} else if (name == "expandThree") {
|
|
||||||
this.expandLevel = 3;
|
|
||||||
this.getAllList();
|
|
||||||
}
|
|
||||||
if (name == "expandAll") {
|
|
||||||
this.expandLevel = 4;
|
|
||||||
this.getAllList();
|
|
||||||
} else if (name == "refresh") {
|
|
||||||
this.getAllList();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// 获取所有菜单
|
|
||||||
getAllList() {
|
|
||||||
this.loading = true;
|
|
||||||
getAllPermissionList().then((res) => {
|
|
||||||
this.loading = false;
|
|
||||||
if (res.success) {
|
|
||||||
// 仅展开指定级数 默认后台已展开所有
|
|
||||||
let expandLevel = this.expandLevel;
|
|
||||||
res.result.forEach(function (e) {
|
|
||||||
if (expandLevel == 1) {
|
|
||||||
if (e.level == 0) {
|
|
||||||
e.expand = false;
|
|
||||||
}
|
|
||||||
if (e.children && e.children.length > 0) {
|
|
||||||
e.children.forEach(function (c) {
|
|
||||||
if (c.level == 1) {
|
|
||||||
c.expand = false;
|
|
||||||
}
|
|
||||||
if (c.children && c.children.length > 0) {
|
|
||||||
c.children.forEach(function (b) {
|
|
||||||
if (b.level == 2) {
|
|
||||||
b.expand = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else if (expandLevel == 2) {
|
|
||||||
if (e.level == 0) {
|
|
||||||
e.expand = true;
|
|
||||||
}
|
|
||||||
if (e.children && e.children.length > 0) {
|
|
||||||
e.children.forEach(function (c) {
|
|
||||||
if (c.level == 1) {
|
|
||||||
c.expand = false;
|
|
||||||
}
|
|
||||||
if (c.children && c.children.length > 0) {
|
|
||||||
c.children.forEach(function (b) {
|
|
||||||
if (b.level == 2) {
|
|
||||||
b.expand = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else if (expandLevel == 3) {
|
|
||||||
if (e.level == 0) {
|
|
||||||
e.expand = true;
|
|
||||||
}
|
|
||||||
if (e.children && e.children.length > 0) {
|
|
||||||
e.children.forEach(function (c) {
|
|
||||||
if (c.level == 1) {
|
|
||||||
c.expand = true;
|
|
||||||
}
|
|
||||||
if (c.children && c.children.length > 0) {
|
|
||||||
c.children.forEach(function (b) {
|
|
||||||
if (b.level == 2) {
|
|
||||||
b.expand = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else if (expandLevel == 4) {
|
|
||||||
if (e.level == 0) {
|
|
||||||
e.expand = true;
|
|
||||||
}
|
|
||||||
if (e.children && e.children.length > 0) {
|
|
||||||
e.children.forEach(function (c) {
|
|
||||||
if (c.level == 1) {
|
|
||||||
c.expand = true;
|
|
||||||
}
|
|
||||||
if (c.children && c.children.length > 0) {
|
|
||||||
c.children.forEach(function (b) {
|
|
||||||
if (b.level == 2) {
|
|
||||||
b.expand = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.data = res.result;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
// 选择菜单
|
|
||||||
selectTree(v) {
|
|
||||||
if (v.length > 0) {
|
|
||||||
let str = JSON.stringify(v);
|
|
||||||
let menu = JSON.parse(str);
|
|
||||||
this.form = menu[0];
|
|
||||||
console.log(this.form);
|
|
||||||
this.editTitle = menu[0].title;
|
|
||||||
} else {
|
|
||||||
this.cancelEdit();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// 搜索菜单
|
|
||||||
search() {
|
|
||||||
if (this.searchKey) {
|
|
||||||
this.loading = true;
|
|
||||||
searchPermission({ title: this.searchKey }).then((res) => {
|
|
||||||
this.loading = false;
|
|
||||||
if (res.success) {
|
|
||||||
this.data = res.result;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.getAllList();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// 取消选择
|
|
||||||
cancelEdit() {
|
|
||||||
let data = this.$refs.tree.getSelectedNodes()[0];
|
|
||||||
if (data) {
|
|
||||||
data.selected = false;
|
|
||||||
}
|
|
||||||
this.$refs.form.resetFields();
|
|
||||||
this.form.id = "";
|
|
||||||
this.editTitle = "";
|
|
||||||
},
|
|
||||||
// 重置表单
|
|
||||||
handleReset() {
|
|
||||||
this.$refs.form.resetFields();
|
|
||||||
this.form.frontRoute = "";
|
|
||||||
},
|
|
||||||
// 保存
|
|
||||||
submitEdit() {
|
|
||||||
this.$refs.form.validate((valid) => {
|
|
||||||
if (valid) {
|
|
||||||
if (!this.form.id) {
|
|
||||||
this.$Message.warning("请先点击选择要修改的菜单节点");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.submitLoading = true;
|
|
||||||
if (this.form.sortOrder == null) {
|
|
||||||
this.form.sortOrder = 0;
|
|
||||||
}
|
|
||||||
// 删除一些之前添加的无用字段
|
|
||||||
delete this.form.icon;
|
|
||||||
delete this.form.frontComponent;
|
|
||||||
delete this.form.buttonType;
|
|
||||||
delete this.form.updateTime;
|
|
||||||
delete this.form.selected;
|
|
||||||
delete this.form.description;
|
|
||||||
delete this.form.children;
|
|
||||||
delete this.form.children;
|
|
||||||
|
|
||||||
editPermission(this.form).then((res) => {
|
|
||||||
this.submitLoading = false;
|
|
||||||
if (res.success) {
|
|
||||||
this.$Message.success("编辑成功");
|
|
||||||
// 标记重新获取菜单数据
|
|
||||||
this.$store.commit("setAdded", false);
|
|
||||||
util.initRouter(this);
|
|
||||||
this.init();
|
|
||||||
this.menuModalVisible = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
// 添加
|
|
||||||
submitAdd() {
|
|
||||||
this.$refs.formAdd.validate((valid) => {
|
|
||||||
if (valid) {
|
|
||||||
this.submitLoading = true;
|
|
||||||
|
|
||||||
addPermission(this.formAdd).then((res) => {
|
|
||||||
this.submitLoading = false;
|
|
||||||
if (res.success) {
|
|
||||||
this.$Message.success("添加成功");
|
|
||||||
// 标记重新获取菜单数据
|
|
||||||
this.$store.commit("setAdded", false);
|
|
||||||
util.initRouter(this);
|
|
||||||
this.init();
|
|
||||||
this.menuModalVisible = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
// 添加子菜单
|
|
||||||
addMenu() {
|
|
||||||
if (!this.form.id) {
|
|
||||||
this.$Message.warning("请先点击选择一个菜单权限节点");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.parentTitle = this.form.title;
|
|
||||||
this.modalTitle = "添加子节点";
|
|
||||||
this.showParent = true;
|
|
||||||
if (this.form.level == 2) {
|
|
||||||
this.$Modal.warning({
|
|
||||||
title: "抱歉,不能添加啦",
|
|
||||||
content: "仅支持2级菜单目录",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.formAdd = {
|
|
||||||
parentId: this.form.id,
|
|
||||||
level: Number(this.form.level) + 1,
|
|
||||||
sortOrder: 0,
|
|
||||||
permission: "", // 权限url
|
|
||||||
};
|
|
||||||
if (this.form.level == 0) {
|
|
||||||
this.formAdd.path = "/";
|
|
||||||
this.formAdd.frontRoute = "Main";
|
|
||||||
}
|
|
||||||
this.menuModalVisible = true;
|
|
||||||
},
|
|
||||||
// 添加顶级菜单
|
|
||||||
addRootMenu() {
|
|
||||||
this.modalTitle = "添加顶级菜单";
|
|
||||||
this.showParent = false;
|
|
||||||
this.formAdd = {
|
|
||||||
level: 0,
|
|
||||||
sortOrder: 0,
|
|
||||||
};
|
|
||||||
this.menuModalVisible = true;
|
|
||||||
},
|
|
||||||
// 选中菜单赋值
|
|
||||||
changeSelect(v) {
|
|
||||||
this.selectCount = v.length;
|
|
||||||
this.selectList = v;
|
|
||||||
},
|
|
||||||
// 批量删除菜单
|
|
||||||
delAll() {
|
|
||||||
if (this.selectCount <= 0) {
|
|
||||||
this.$Message.warning("您还未勾选要删除的数据");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.$Modal.confirm({
|
|
||||||
title: "确认删除",
|
|
||||||
content: "您确认要删除所选的 " + this.selectCount + " 条数据?",
|
|
||||||
loading: true,
|
|
||||||
onOk: () => {
|
|
||||||
let ids = "";
|
|
||||||
this.selectList.forEach(function (e) {
|
|
||||||
ids += e.id + ",";
|
|
||||||
});
|
|
||||||
ids = ids.substring(0, ids.length - 1);
|
|
||||||
deletePermission(ids).then((res) => {
|
|
||||||
this.$Modal.remove();
|
|
||||||
if (res.success) {
|
|
||||||
this.$Message.success("删除成功");
|
|
||||||
// 标记重新获取菜单数据
|
|
||||||
this.$store.commit("setAdded", false);
|
|
||||||
util.initRouter(this);
|
|
||||||
this.selectList = [];
|
|
||||||
this.selectCount = 0;
|
|
||||||
this.cancelEdit();
|
|
||||||
this.init();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
// 计算高度
|
|
||||||
let height = document.documentElement.clientHeight;
|
|
||||||
this.maxHeight = Number(height - 287) + "px";
|
|
||||||
this.init();
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
|
||||||
@import "@/styles/tree-common.scss";
|
|
||||||
.desc {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
.menu-input {
|
|
||||||
width: 362px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -0,0 +1,576 @@
|
||||||
|
<template>
|
||||||
|
<div class="search">
|
||||||
|
<Card>
|
||||||
|
<!-- 筛选项和操作按钮 -->
|
||||||
|
<Row class="operation">
|
||||||
|
<i-switch
|
||||||
|
v-model="strict"
|
||||||
|
class="selectModel"
|
||||||
|
size="large"
|
||||||
|
style="margin-right: 5px"
|
||||||
|
>
|
||||||
|
<span slot="open">级联</span>
|
||||||
|
<span slot="close">单选</span>
|
||||||
|
</i-switch>
|
||||||
|
<Button @click="addRootMenu">添加顶级菜单</Button>
|
||||||
|
<Button @click="addMenu" type="primary">添加子菜单</Button>
|
||||||
|
<Button @click="delAll">批量删除</Button>
|
||||||
|
<Dropdown @on-click="handleDropdown">
|
||||||
|
<Button>
|
||||||
|
更多操作
|
||||||
|
<Icon type="md-arrow-dropdown"></Icon>
|
||||||
|
</Button>
|
||||||
|
<DropdownMenu slot="list">
|
||||||
|
<DropdownItem name="refresh">刷新</DropdownItem>
|
||||||
|
<DropdownItem name="expandOne">收合所有</DropdownItem>
|
||||||
|
<DropdownItem name="expandTwo">展开一级</DropdownItem>
|
||||||
|
<DropdownItem name="expandThree">展开两级</DropdownItem>
|
||||||
|
<DropdownItem name="expandAll">展开所有</DropdownItem>
|
||||||
|
</DropdownMenu>
|
||||||
|
</Dropdown>
|
||||||
|
</Row>
|
||||||
|
<!-- 页面主体,左侧树结构,右侧表单项 -->
|
||||||
|
<Row type="flex" justify="start">
|
||||||
|
<Col :md="8" :lg="8" :xl="6">
|
||||||
|
<Alert show-icon>
|
||||||
|
当前选择编辑:
|
||||||
|
<span class="select-title">{{ editTitle }}</span>
|
||||||
|
<a class="select-clear" v-if="form.id" @click="cancelEdit">取消选择</a>
|
||||||
|
</Alert>
|
||||||
|
<Input
|
||||||
|
v-model="searchKey"
|
||||||
|
suffix="ios-search"
|
||||||
|
@on-change="search"
|
||||||
|
placeholder="输入菜单名搜索"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
<div class="tree-bar" :style="{ maxHeight: maxHeight }">
|
||||||
|
<Tree
|
||||||
|
ref="tree"
|
||||||
|
:data="data"
|
||||||
|
show-checkbox
|
||||||
|
:render="renderContent"
|
||||||
|
@on-select-change="selectTree"
|
||||||
|
@on-check-change="changeSelect"
|
||||||
|
:check-strictly="!strict"
|
||||||
|
></Tree>
|
||||||
|
<Spin size="large" fix v-if="loading"></Spin>
|
||||||
|
</div>
|
||||||
|
</Col>
|
||||||
|
<Col :md="15" :lg="13" :xl="9" style="margin-left: 10px">
|
||||||
|
<Form ref="form" :model="form" :label-width="110" :rules="formValidate">
|
||||||
|
<FormItem label="类型" prop="type">
|
||||||
|
<div v-show="form.level == 0">
|
||||||
|
<Icon
|
||||||
|
type="ios-navigate-outline"
|
||||||
|
size="16"
|
||||||
|
style="margin-right: 5px"
|
||||||
|
></Icon>
|
||||||
|
<span>顶级菜单</span>
|
||||||
|
</div>
|
||||||
|
<div v-show="form.level == 1 || form.level == 2">
|
||||||
|
<Icon
|
||||||
|
type="ios-list-box-outline"
|
||||||
|
size="16"
|
||||||
|
style="margin-right: 5px"
|
||||||
|
></Icon>
|
||||||
|
<span>页面菜单</span>
|
||||||
|
</div>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="菜单名称" prop="title">
|
||||||
|
<Input class="menu-input" v-model="form.title" />
|
||||||
|
</FormItem>
|
||||||
|
<FormItem
|
||||||
|
label="路由地址"
|
||||||
|
prop="path"
|
||||||
|
v-if="form.level != 0"
|
||||||
|
class="block-tool"
|
||||||
|
>
|
||||||
|
<Tooltip
|
||||||
|
placement="right"
|
||||||
|
content="路由地址,英文唯一,跳转页面,路径展示用 "
|
||||||
|
>
|
||||||
|
<Input class="menu-input" v-model="form.path" />
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="路由名称" prop="name" class="block-tool">
|
||||||
|
<Tooltip
|
||||||
|
placement="right"
|
||||||
|
content="路由name,需英文唯一,跳转页面用"
|
||||||
|
transfer
|
||||||
|
>
|
||||||
|
<Input class="menu-input" v-model="form.name" />
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="文件路径" prop="frontRoute" v-if="form.level != 0">
|
||||||
|
<Input class="menu-input" v-model="form.frontRoute" />
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="权限url" v-if="form.level != 0" class="block-tool">
|
||||||
|
<Tooltip placement="right" content="*号模糊匹配,逗号分割" transfer>
|
||||||
|
<Input class="menu-input" v-model="form.permission" type="textarea" />
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="排序值" prop="sortOrder">
|
||||||
|
<Tooltip trigger="hover" placement="right" content="值越小越靠前,支持小数">
|
||||||
|
<InputNumber :max="1000" :min="0" v-model="form.sortOrder"></InputNumber>
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
<Form-item>
|
||||||
|
<Button
|
||||||
|
style="margin-right: 5px"
|
||||||
|
@click="submitEdit"
|
||||||
|
:loading="submitLoading"
|
||||||
|
type="primary"
|
||||||
|
>保存
|
||||||
|
</Button>
|
||||||
|
<Button @click="handleReset">重置</Button>
|
||||||
|
</Form-item>
|
||||||
|
</Form>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</Card>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
draggable
|
||||||
|
:title="modalTitle"
|
||||||
|
v-model="menuModalVisible"
|
||||||
|
:mask-closable="false"
|
||||||
|
:width="500"
|
||||||
|
:styles="{ top: '30px' }"
|
||||||
|
>
|
||||||
|
<Form ref="formAdd" :model="formAdd" :label-width="100" :rules="formValidate">
|
||||||
|
<div v-if="showParent">
|
||||||
|
<FormItem label="上级节点:">{{ parentTitle }}</FormItem>
|
||||||
|
</div>
|
||||||
|
<FormItem label="类型" prop="type">
|
||||||
|
<div v-show="formAdd.level == 0">
|
||||||
|
<Icon type="ios-navigate-outline" size="16" style="margin-right: 5px"></Icon>
|
||||||
|
<span>顶级菜单</span>
|
||||||
|
</div>
|
||||||
|
<div v-show="formAdd.level != 0">
|
||||||
|
<Icon type="ios-list-box-outline" size="16" style="margin-right: 5px"></Icon>
|
||||||
|
<span>页面菜单</span>
|
||||||
|
</div>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="菜单名称" prop="title">
|
||||||
|
<Input class="menu-input" v-model="formAdd.title" />
|
||||||
|
</FormItem>
|
||||||
|
|
||||||
|
<FormItem label="路由地址" prop="path" v-if="formAdd.level != 0">
|
||||||
|
<Input v-model="formAdd.path" />
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="路由名称" prop="name" class="block-tool">
|
||||||
|
<Tooltip placement="right" content="路由name,需英文唯一,跳转页面用">
|
||||||
|
<Input v-model="formAdd.name" />
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="文件路径" prop="frontRoute" v-if="formAdd.level != 0">
|
||||||
|
<Input v-model="formAdd.frontRoute" />
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="权限url" v-if="formAdd.level != 0">
|
||||||
|
<Input v-model="formAdd.permission" type="textarea" />
|
||||||
|
<div class="desc">*号模糊匹配,逗号分割</div>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem label="排序值" prop="sortOrder">
|
||||||
|
<Tooltip trigger="hover" placement="right" content="值越小越靠前,支持小数">
|
||||||
|
<InputNumber :max="1000" :min="0" v-model="formAdd.sortOrder"></InputNumber>
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
|
</Form>
|
||||||
|
<div slot="footer">
|
||||||
|
<Button type="text" @click="menuModalVisible = false">取消</Button>
|
||||||
|
<Button type="primary" :loading="submitLoading" @click="submitAdd">提交</Button>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
getStoreAllPermissionList,
|
||||||
|
addStorePermission,
|
||||||
|
editStorePermission,
|
||||||
|
deleteStorePermission,
|
||||||
|
searchStorePermission,
|
||||||
|
} from "@/api/index";
|
||||||
|
import util from "@/libs/util.js";
|
||||||
|
import Cookies from "js-cookie";
|
||||||
|
export default {
|
||||||
|
name: "store-menu-manage",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loading: true, // 加载状态
|
||||||
|
strict: true, // 级联 单选
|
||||||
|
maxHeight: "500px", // 最大高度
|
||||||
|
expandLevel: 1, // 展开层级
|
||||||
|
menuModalVisible: false, // 添加菜单modal
|
||||||
|
selectList: [], // 已选列表
|
||||||
|
selectCount: 0, // 所选数量
|
||||||
|
showParent: false, // 展示父级
|
||||||
|
searchKey: "", // 搜索关键词
|
||||||
|
parentTitle: "", // 父级标题
|
||||||
|
editTitle: "", // 编辑标题
|
||||||
|
modalTitle: "", // modal标题
|
||||||
|
form: {
|
||||||
|
// 表单数据
|
||||||
|
id: "",
|
||||||
|
title: "",
|
||||||
|
name: "",
|
||||||
|
path: "",
|
||||||
|
frontRoute: "",
|
||||||
|
parentId: "",
|
||||||
|
sortOrder: 0,
|
||||||
|
level: 0,
|
||||||
|
permission: "",
|
||||||
|
},
|
||||||
|
formAdd: {
|
||||||
|
// 添加表单
|
||||||
|
},
|
||||||
|
formValidate: {
|
||||||
|
// 验证规则
|
||||||
|
title: [{ required: true, message: "菜单名称名称不能为空", trigger: "blur" }],
|
||||||
|
name: [{ required: true, message: "路由名称不能为空", trigger: "blur" }],
|
||||||
|
path: [{ required: true, message: "路由地址不能为空", trigger: "blur" }],
|
||||||
|
frontRoute: [{ required: true, message: "文件地址不能为空", trigger: "blur" }],
|
||||||
|
sortOrder: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
type: "number",
|
||||||
|
message: "排序值不能为空",
|
||||||
|
trigger: "blur",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
submitLoading: false, // 提交状态
|
||||||
|
data: [], // 数据
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 初始化数据
|
||||||
|
init() {
|
||||||
|
this.getAllList();
|
||||||
|
},
|
||||||
|
|
||||||
|
renderContent(h, { root, node, data }) {
|
||||||
|
// 渲染树形结构前面图标
|
||||||
|
let icon = "";
|
||||||
|
if (data.level == 0) {
|
||||||
|
icon = "ios-navigate";
|
||||||
|
} else if (data.level == 1) {
|
||||||
|
icon = "md-list-box";
|
||||||
|
} else if (data.level == 2) {
|
||||||
|
icon = "md-list";
|
||||||
|
}
|
||||||
|
return h("span", [
|
||||||
|
h("span", [
|
||||||
|
h("Icon", {
|
||||||
|
props: {
|
||||||
|
type: icon,
|
||||||
|
size: "16",
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
"margin-right": "8px",
|
||||||
|
"margin-bottom": "3px",
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
h("span", data.title),
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
// 更多操作
|
||||||
|
handleDropdown(name) {
|
||||||
|
if (name == "expandOne") {
|
||||||
|
this.expandLevel = 1;
|
||||||
|
this.getAllList();
|
||||||
|
} else if (name == "expandTwo") {
|
||||||
|
this.expandLevel = 2;
|
||||||
|
this.getAllList();
|
||||||
|
} else if (name == "expandThree") {
|
||||||
|
this.expandLevel = 3;
|
||||||
|
this.getAllList();
|
||||||
|
}
|
||||||
|
if (name == "expandAll") {
|
||||||
|
this.expandLevel = 4;
|
||||||
|
this.getAllList();
|
||||||
|
} else if (name == "refresh") {
|
||||||
|
this.getAllList();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 获取所有菜单
|
||||||
|
getAllList() {
|
||||||
|
this.loading = true;
|
||||||
|
getStoreAllPermissionList().then((res) => {
|
||||||
|
this.loading = false;
|
||||||
|
if (res.success) {
|
||||||
|
// 仅展开指定级数 默认后台已展开所有
|
||||||
|
let expandLevel = this.expandLevel;
|
||||||
|
res.result.forEach(function (e) {
|
||||||
|
if (expandLevel == 1) {
|
||||||
|
if (e.level == 0) {
|
||||||
|
e.expand = false;
|
||||||
|
}
|
||||||
|
if (e.children && e.children.length > 0) {
|
||||||
|
e.children.forEach(function (c) {
|
||||||
|
if (c.level == 1) {
|
||||||
|
c.expand = false;
|
||||||
|
}
|
||||||
|
if (c.children && c.children.length > 0) {
|
||||||
|
c.children.forEach(function (b) {
|
||||||
|
if (b.level == 2) {
|
||||||
|
b.expand = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (expandLevel == 2) {
|
||||||
|
if (e.level == 0) {
|
||||||
|
e.expand = true;
|
||||||
|
}
|
||||||
|
if (e.children && e.children.length > 0) {
|
||||||
|
e.children.forEach(function (c) {
|
||||||
|
if (c.level == 1) {
|
||||||
|
c.expand = false;
|
||||||
|
}
|
||||||
|
if (c.children && c.children.length > 0) {
|
||||||
|
c.children.forEach(function (b) {
|
||||||
|
if (b.level == 2) {
|
||||||
|
b.expand = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (expandLevel == 3) {
|
||||||
|
if (e.level == 0) {
|
||||||
|
e.expand = true;
|
||||||
|
}
|
||||||
|
if (e.children && e.children.length > 0) {
|
||||||
|
e.children.forEach(function (c) {
|
||||||
|
if (c.level == 1) {
|
||||||
|
c.expand = true;
|
||||||
|
}
|
||||||
|
if (c.children && c.children.length > 0) {
|
||||||
|
c.children.forEach(function (b) {
|
||||||
|
if (b.level == 2) {
|
||||||
|
b.expand = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (expandLevel == 4) {
|
||||||
|
if (e.level == 0) {
|
||||||
|
e.expand = true;
|
||||||
|
}
|
||||||
|
if (e.children && e.children.length > 0) {
|
||||||
|
e.children.forEach(function (c) {
|
||||||
|
if (c.level == 1) {
|
||||||
|
c.expand = true;
|
||||||
|
}
|
||||||
|
if (c.children && c.children.length > 0) {
|
||||||
|
c.children.forEach(function (b) {
|
||||||
|
if (b.level == 2) {
|
||||||
|
b.expand = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.data = res.result;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 选择菜单
|
||||||
|
selectTree(v) {
|
||||||
|
if (v.length > 0) {
|
||||||
|
let str = JSON.stringify(v);
|
||||||
|
let menu = JSON.parse(str);
|
||||||
|
this.form = menu[0];
|
||||||
|
console.log(this.form);
|
||||||
|
this.editTitle = menu[0].title;
|
||||||
|
} else {
|
||||||
|
this.cancelEdit();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 搜索菜单
|
||||||
|
search() {
|
||||||
|
if (this.searchKey) {
|
||||||
|
this.loading = true;
|
||||||
|
searchStorePermission({ title: this.searchKey }).then((res) => {
|
||||||
|
this.loading = false;
|
||||||
|
if (res.success) {
|
||||||
|
this.data = res.result;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.getAllList();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 取消选择
|
||||||
|
cancelEdit() {
|
||||||
|
let data = this.$refs.tree.getSelectedNodes()[0];
|
||||||
|
if (data) {
|
||||||
|
data.selected = false;
|
||||||
|
}
|
||||||
|
this.$refs.form.resetFields();
|
||||||
|
this.form.id = "";
|
||||||
|
this.editTitle = "";
|
||||||
|
},
|
||||||
|
// 重置表单
|
||||||
|
handleReset() {
|
||||||
|
this.$refs.form.resetFields();
|
||||||
|
this.form.frontRoute = "";
|
||||||
|
},
|
||||||
|
// 保存
|
||||||
|
submitEdit() {
|
||||||
|
this.$refs.form.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
if (!this.form.id) {
|
||||||
|
this.$Message.warning("请先点击选择要修改的菜单节点");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.submitLoading = true;
|
||||||
|
if (this.form.sortOrder == null) {
|
||||||
|
this.form.sortOrder = 0;
|
||||||
|
}
|
||||||
|
// 删除一些之前添加的无用字段
|
||||||
|
delete this.form.icon;
|
||||||
|
delete this.form.frontComponent;
|
||||||
|
delete this.form.buttonType;
|
||||||
|
delete this.form.updateTime;
|
||||||
|
delete this.form.selected;
|
||||||
|
delete this.form.description;
|
||||||
|
delete this.form.children;
|
||||||
|
delete this.form.children;
|
||||||
|
|
||||||
|
editStorePermission(this.form).then((res) => {
|
||||||
|
this.submitLoading = false;
|
||||||
|
if (res.success) {
|
||||||
|
this.$Message.success("编辑成功");
|
||||||
|
// 标记重新获取菜单数据
|
||||||
|
this.$store.commit("setAdded", false);
|
||||||
|
util.initRouter(this);
|
||||||
|
this.init();
|
||||||
|
this.menuModalVisible = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 添加
|
||||||
|
submitAdd() {
|
||||||
|
this.$refs.formAdd.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.submitLoading = true;
|
||||||
|
|
||||||
|
addStorePermission(this.formAdd).then((res) => {
|
||||||
|
this.submitLoading = false;
|
||||||
|
if (res.success) {
|
||||||
|
this.$Message.success("添加成功");
|
||||||
|
// 标记重新获取菜单数据
|
||||||
|
this.$store.commit("setAdded", false);
|
||||||
|
util.initRouter(this);
|
||||||
|
this.init();
|
||||||
|
this.menuModalVisible = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 添加子菜单
|
||||||
|
addMenu() {
|
||||||
|
if (!this.form.id) {
|
||||||
|
this.$Message.warning("请先点击选择一个菜单权限节点");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.parentTitle = this.form.title;
|
||||||
|
this.modalTitle = "添加子节点";
|
||||||
|
this.showParent = true;
|
||||||
|
if (this.form.level == 2) {
|
||||||
|
this.$Modal.warning({
|
||||||
|
title: "抱歉,不能添加啦",
|
||||||
|
content: "仅支持2级菜单目录",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.formAdd = {
|
||||||
|
parentId: this.form.id,
|
||||||
|
level: Number(this.form.level) + 1,
|
||||||
|
sortOrder: 0,
|
||||||
|
permission: "", // 权限url
|
||||||
|
};
|
||||||
|
if (this.form.level == 0) {
|
||||||
|
this.formAdd.path = "/";
|
||||||
|
this.formAdd.frontRoute = "Main";
|
||||||
|
}
|
||||||
|
this.menuModalVisible = true;
|
||||||
|
},
|
||||||
|
// 添加顶级菜单
|
||||||
|
addRootMenu() {
|
||||||
|
this.modalTitle = "添加顶级菜单";
|
||||||
|
this.showParent = false;
|
||||||
|
this.formAdd = {
|
||||||
|
level: 0,
|
||||||
|
sortOrder: 0,
|
||||||
|
};
|
||||||
|
this.menuModalVisible = true;
|
||||||
|
},
|
||||||
|
// 选中菜单赋值
|
||||||
|
changeSelect(v) {
|
||||||
|
this.selectCount = v.length;
|
||||||
|
this.selectList = v;
|
||||||
|
},
|
||||||
|
// 批量删除菜单
|
||||||
|
delAll() {
|
||||||
|
if (this.selectCount <= 0) {
|
||||||
|
this.$Message.warning("您还未勾选要删除的数据");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.$Modal.confirm({
|
||||||
|
title: "确认删除",
|
||||||
|
content: "您确认要删除所选的 " + this.selectCount + " 条数据?",
|
||||||
|
loading: true,
|
||||||
|
onOk: () => {
|
||||||
|
let ids = "";
|
||||||
|
this.selectList.forEach(function (e) {
|
||||||
|
ids += e.id + ",";
|
||||||
|
});
|
||||||
|
ids = ids.substring(0, ids.length - 1);
|
||||||
|
deleteStorePermission(ids).then((res) => {
|
||||||
|
this.$Modal.remove();
|
||||||
|
if (res.success) {
|
||||||
|
this.$Message.success("删除成功");
|
||||||
|
// 标记重新获取菜单数据
|
||||||
|
this.$store.commit("setAdded", false);
|
||||||
|
util.initRouter(this);
|
||||||
|
this.selectList = [];
|
||||||
|
this.selectCount = 0;
|
||||||
|
this.cancelEdit();
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
// 计算高度
|
||||||
|
let height = document.documentElement.clientHeight;
|
||||||
|
this.maxHeight = Number(height - 287) + "px";
|
||||||
|
this.init();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import "@/styles/tree-common.scss";
|
||||||
|
.desc {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
.menu-input {
|
||||||
|
width: 362px;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in New Issue