<!doctype html>
|
<html>
|
<head>
|
<meta charset="utf-8"><meta http-equiv="Expires" content="0"><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Cache-control" content="no-cache"><meta http-equiv="Cache" content="no-cache">
|
<title>菜单</title>
|
|
<script type="text/javascript">
|
var pageVue = null;
|
function loadJsCss(callback) {
|
var jscss_urls = [
|
{id: "css_m1", type: "css", url: "root/css/tree.css"},
|
];
|
window.top.initJsCss(document, jscss_urls, callback);
|
};
|
|
function initVue() {
|
new TreeVue({
|
el: "#vbody",
|
data: {
|
dataname: "sys_menu",
|
title: "菜单管理",
|
tree_title: "菜单管理",
|
treeTxtFormatter: "{title}",
|
isTreeReadonly: false,
|
|
form_dataname: "sys_menu",
|
// formAttr: {},
|
formFields: [],
|
formData: {
|
parent_id: []
|
},
|
formfieldClick: {},
|
defaultexpandedkeys: [],
|
currentnodekey: "",
|
|
options_menutree: [],
|
options_menumap: {},
|
dataRequest: [
|
{
|
name: "sys_menunotpage",
|
dataname: "sys_menu",
|
filter: " page_id is null",
|
isnotoption: false, //true:不是选项
|
code:"id",//是下拉选项时设置
|
label:"name",//是下拉选项时设置
|
},
|
|
],
|
dataRequestObj: {},
|
|
pagesize_p: 10,
|
pagenum_p: 1,
|
total_p: 0,
|
tableData_p: [],
|
isRefresh_p: true,
|
tableHeight_p: 100,
|
|
// filterfieldClick: {},
|
// tablefieldClick: {},
|
},
|
created() {
|
},
|
|
mounted() {
|
var me = this;
|
//预加载数据
|
if (this.dataRequest.length) {
|
var result = {};
|
this.loadRequestData(this.dataRequest, result, function(data) {
|
me.dataRequestObj = data;
|
//预加载数据后给哪些字段设置options或formatterjson
|
var sys_menunotpage_ = clone(data.sys_menunotpage);
|
sys_menunotpage_.map(m=>{
|
me.options_menumap[m.id] = m;
|
})
|
var sys_menunotpagetree = ArrayToTree(clone(sys_menunotpage_), "title", "parent_id");
|
me.options_menutree = clone(sys_menunotpagetree);
|
|
me.initData();
|
});
|
}
|
else {
|
this.initData();
|
}
|
this.$nextTick(() => { // 以服务的方式调用的 Loading 需要异步关闭
|
hideLoading();
|
this.treeHeight = document.documentElement.clientHeight - 20;
|
});
|
},
|
|
methods:{
|
initData() {
|
var me = this;
|
this.getMenuAll();
|
this.getTableMeta();
|
},
|
|
//拿到左边树
|
getMenuAll() {
|
var me = this;
|
var param_ = {}
|
me.treeData = [];
|
Server.call("root/client/getMenuTreeAll", param_, function(result) {
|
//遍历树数据,将根节点的page_id设置为id
|
var menus_tree = clone(result.data.menus);
|
// var menus_tree2 = clone(result.data.menus);
|
//me.menuToPageTree(menus_tree);
|
me.treeData = clone(menus_tree);
|
var row = me.treeData[0];
|
// me.$refs.table1.setCurrentRow(row)
|
me.formData = row;
|
me.isRefresh = false;
|
me.$nextTick(() => { // 以服务的方式调用的 Loading 需要异步关闭
|
me.defaultexpandedkeys = [me.formData.id];
|
me.currentnodekey = me.formData.id;
|
me.isRefresh = true
|
});
|
})
|
},
|
|
//拿到右边的字段
|
getTableMeta() {
|
var me = this;
|
var param_ = {
|
dataname: this.form_dataname,
|
attachMeta: true,
|
}
|
|
Server.call("root/data/getEntity", param_, function(result) {
|
if (result.meta && result.meta[me.form_dataname] && result.meta[me.form_dataname].fields) {
|
var metas = clone(result.meta[me.form_dataname].fields);
|
var filterFields_ = [];
|
var formFields_ = [];
|
|
metas.map(f=>{
|
f.isshow = "T";
|
if (f.field == "parent_id") {
|
// f.notshowalllevels = true;
|
f.props = {value: "id", label: "title", checkStrictly: true};
|
f.options = me.options_menutree;
|
}
|
formFields_.push(clone(f));
|
})
|
if (!me.formFields || (me.formFields && me.formFields.length == 0)) {
|
me.formFields = clone(formFields_);
|
}
|
me.tableFieldClick();
|
}
|
})
|
},
|
|
//节点点击,给右边赋值
|
onNodeClick(obj) {
|
var data = obj.data, node = obj.node, el = obj.el;
|
var data_ = clone(data);
|
|
if (data_.parent_id) {
|
var parent_ids_ = [];
|
var parent_ids = this.getParents(data_.parent_id, this.options_menumap, parent_ids_);
|
|
data_.parent_id = parent_ids
|
}
|
this.formData = data_;
|
},
|
|
//拿到所有的父节点id
|
getParents(id, treemap, list) {
|
list.unshift(id);
|
if (treemap[id].parent_id) {
|
this.getParents(treemap[id].parent_id, treemap, list)
|
}
|
else {
|
return list;
|
}
|
},
|
|
//新增节点
|
onAddNode(obj) {
|
var data = obj.data, node = obj.node;
|
let me = this;
|
var config = {
|
totab: false, //true: 以Tab导航的方式打开
|
width: "900px",
|
height: "340px",
|
icon: "icon-product",
|
text: "菜单新增",
|
id: "sys_menu_add",//totab: true时需设置,用于判断是否已打开此页面
|
url: "module/config/page/sys_menu_add.html",
|
data: data,
|
delta: {},
|
sceneCode: "add",//"refuseedit",//"approval", //"add"//"browse",
|
callback: function(obj, callback) {
|
me.treeData = obj.options;
|
me.getMenuAll();
|
if (callback) {
|
callback();
|
}
|
}
|
};
|
me.doPopupByPublic(config);
|
},
|
|
//编辑节点
|
onEditNode(obj) {
|
var data = obj.data, node = obj.node;
|
var me = this;
|
Root.showPopup({
|
url: "module/config/page/sys_menu_add.html",
|
width: "900px",
|
height: "340px",
|
text: "菜单编辑",
|
data: data,
|
sceneCode: "edit",
|
callback: function(options_obj, callback) {
|
me.treeData = options_obj.options;
|
if (callback) {
|
callback();
|
}
|
}
|
});
|
},
|
|
//删除节点
|
onDelNode(obj) {
|
var data = obj.data, node = obj.node;
|
let me = this;
|
Root.confirm('确定删除-' + data.title + '-吗?', '删除提示', {
|
confirmButtonText: '删除',
|
cancelButtonText: '取消',
|
type: 'warning'
|
}).then(() => {
|
me.dodeldata(data, node, "sys_menu");
|
}).catch(() => {
|
Root.message({
|
type: 'info',
|
message: '已取消删除'
|
});
|
});
|
},
|
dodeldata(row, node, tablename) {
|
var me = this;
|
if (row.id) {
|
let param = {
|
dataname: tablename,
|
id: row.id
|
}
|
|
Server.call("root/data/deleteEntity", param, function(result) {
|
console.log(result);
|
if (result && result.data) {
|
const parent = node.parent;
|
const children = parent.data.children || parent.data;
|
const index = children.findIndex(d => d.id === row.id);
|
children.splice(index, 1);
|
|
let param_ = {
|
dataname: "sys_menu",
|
filter: "page_id is null",
|
}
|
Server.call("root/data/getEntitySet", param_, function(result2){
|
let agm_category_ = ArrayToTree(clone(result2.data.entityset), "title", "parent_id");
|
me.treeData = agm_category_;
|
me.getMenuAll();
|
Root.message({
|
type: 'success',
|
message: '删除成功!'
|
});
|
});
|
}
|
});
|
}
|
},
|
|
tableFieldClick() {
|
var me = this;
|
//表单字段事件设置
|
this.formfieldClick = {
|
icon: {
|
popup: {
|
onclick: function(obj) {//弹窗点击事件
|
//打开
|
me.open_iconlist()
|
}
|
},
|
},
|
page_id: {
|
popup: {
|
onclick: function(obj) {//弹窗点击事件
|
//打开
|
me.open_pagelist()
|
}
|
},
|
},
|
};
|
},
|
|
open_iconlist() {
|
var me = this;
|
var config = {
|
totab: false, //true: 以Tab导航的方式打开
|
width: "900px",
|
height: "900px",
|
icon: "icon-product",
|
text: "图标",
|
id: "popup_iconfont",//totab: true时需设置,用于判断是否已打开此页面
|
url: "module/tool/page/popup_iconfont.html",
|
data: {},
|
delta: {pageobj: me.selectTabObj},
|
sceneCode: "add",//"refuseedit",//"approval", //"add"//"browse",
|
callback: function(obj, callback) {
|
let formData_ = clone(me.formData);
|
formData_.icon = obj.icon;
|
me.formData = formData_;
|
|
if (callback) {
|
callback();
|
}
|
}
|
};
|
me.doPopupByPublic(config);
|
},
|
|
open_pagelist() {
|
var me = this;
|
var config = {
|
totab: false, //true: 以Tab导航的方式打开
|
width: "900px",
|
height: "900px",
|
icon: "icon-product",
|
text: "页面详情",
|
id: "popup_page",//totab: true时需设置,用于判断是否已打开此页面
|
url: "module/config/page/popup_page.html",
|
data: {},
|
delta: {},
|
sceneCode: "add",//"refuseedit",//"approval", //"add"//"browse",
|
callback: function(obj, callback) {
|
let formData_ = clone(me.formData);
|
formData_.page_id = obj.row.id;
|
me.formData = formData_;
|
|
if (callback) {
|
callback();
|
}
|
}
|
};
|
me.doPopupByPublic(config);
|
},
|
|
//新增菜单,没懂和新增节点有什么区别
|
onAddData() {
|
var data = obj.data, node = obj.node;
|
var me = this;
|
var config = {
|
totab: false, //true: 以Tab导航的方式打开
|
width: "900px",
|
height: "340px",
|
icon: "icon-product",
|
text: "菜单新增",
|
id: "sys_menu_add",//totab: true时需设置,用于判断是否已打开此页面
|
url: "module/config/page/sys_menu_add.html",
|
data: data,
|
delta: {},
|
sceneCode: "add",//"refuseedit",//"approval", //"add"//"browse",
|
callback: function(obj, callback) {
|
me.treeData = obj.options;
|
if (callback) {
|
callback();
|
}
|
}
|
};
|
me.doPopupByPublic(config);
|
},
|
|
saveRowTable() {
|
var me = this;
|
var operator_ = "save";//保存
|
|
var entity_ = clone(this.formData);
|
var entity = {};
|
for (var r in entity_) {
|
if (r == "parent_id") {
|
if (entity_[r] && entity_[r].length) {
|
entity[r] = entity_[r][entity_[r].length - 1];
|
}
|
else {
|
entity[r] = null;
|
}
|
}
|
else if (entity_[r] || entity_[r] == "" || entity_[r] == false || entity_[r] == 0) {
|
entity[r] = entity_[r];
|
}
|
}
|
|
let param = {
|
dataname: this.dataname,
|
// operator: operator_,
|
data: {},
|
}
|
param.data[this.dataname] = entity;
|
|
Server.call("root/data/saveEntity", param, function(result) {
|
console.log(result);
|
if (result.success) {
|
if (me.iscommit) {
|
me.iscommit = false;
|
Root.message({
|
type: 'success',
|
message: '提交成功'
|
});
|
}
|
else {
|
Root.message({
|
type: 'success',
|
message: '保存成功'
|
});
|
}
|
}
|
|
me.getMenuAll();
|
});
|
},
|
|
node_isShow(data, isShow) {
|
if (this.$refs[data.id]) {
|
this.$refs[data.id].style.display = isShow ? '' : 'none';
|
}
|
},
|
}
|
});
|
};
|
|
loadJsCss(function () {
|
initVue();
|
});
|
</script>
|
<style>
|
/* 在vue.js中 v-cloak 这个指令是防止页面加载时出现 vuejs 的变量名而设计的 */
|
[v-cloak] {
|
display: none !important;
|
}
|
.el-tabs__nav-scroll {
|
overflow: hidden;
|
position: relative;
|
padding-left: 20px;
|
}
|
</style>
|
|
</head>
|
|
<body style="margin: 0px; position: absolute; top: 0px; bottom: 0px; width: 100%;">
|
<div v-cloak id="vbody" style="height: 100%; width: 100%;">
|
<div id="page_root" style="height: 100%; width: 100%;">
|
<!-- <div class="topbar">
|
<span>{{title}}</span>
|
|
|
</div> -->
|
|
<div class="h_dialog__body" style="height: 100%; width: 100%;">
|
<div :style="{position: 'absolute', top: '10px', left: '10px', width: '320px', height: treeHeight + 'px', border: '1px solid #ccc'}">
|
<div style="height: 32px;line-height: 32px;border-bottom: 1px solid #ccc ;">
|
<span style="font-size: 14px;margin-left: 20px;">{{tree_title}}</span>
|
|
<!-- 工具栏 -->
|
<div style="float: right; margin-right: 18px">
|
<el-button-group style="margin-left: 3px">
|
<el-button @click="addData">添加菜单</el-button>
|
</el-button-group>
|
</div>
|
|
</div>
|
<div :style="{padding: '10px 0', height: treeHeight - 60 + 'px', overflow: 'auto'}">
|
<h-tree
|
v-if="isRefresh"
|
:tree-data="treeData"
|
:tree-txt-formatter="treeTxtFormatter"
|
:is-readonly="isTreeReadonly"
|
:default-expanded-keys="defaultexpandedkeys"
|
:currentnodekey="currentnodekey"
|
:default-expand-all="false"
|
|
@node-click="onNodeClick"
|
@add-node="onAddNode"
|
@edit-node="onEditNode"
|
@del-node="onDelNode"
|
>
|
</h-tree>
|
</div>
|
</div>
|
<div :style="{position: 'absolute', top: '10px', left: '340px', right: '10px', height: treeHeight + 'px', border: '1px solid #ccc'}">
|
<div>
|
<div style="height: 32px;line-height: 32px;border-bottom: 1px solid #ccc ;">
|
<span style="font-size: 14px;margin-left: 20px;">菜单详情</span>
|
|
<!-- 工具栏 -->
|
<div style="float: right; margin-right: 18px">
|
<el-button-group style="margin-left: 3px">
|
<el-button @click="saveRowTable":icon="buttonsconfig.save.icon">{{buttonsconfig.save.name}}</el-button>
|
</el-button-group>
|
</div>
|
</div>
|
|
<div style="margin: 16px;">
|
<h-form
|
ref="form1"
|
:form-attr="formAttr"
|
:table-fields="formFields"
|
:form-data="formData"
|
:table-field-click="formfieldClick"
|
>
|
</h-form>
|
</div>
|
|
</div>
|
</div>
|
|
</div>
|
</div>
|
</div>
|
|
<div id="page_loading" style="position: absolute; top:0px; width: 100vw; height: 50vh;">
|
<div class="spinner">
|
<div class="cube1"></div>
|
<div class="cube2"></div>
|
</div>
|
</div>
|
|
</body>
|
</html>
|