parent
1cb5668994
commit
60fd93e12c
@ -1,188 +0,0 @@
|
||||
class AuthorityControl {
|
||||
constructor() {
|
||||
this.authorities = new DatasetControl({
|
||||
prefix:"authority",
|
||||
prefixName:"권한",
|
||||
keymapper:info => info.AUTH_ID,
|
||||
dataGetter:obj => obj.authorityList,
|
||||
formats: {
|
||||
REG_DT:datetimeFormat
|
||||
}
|
||||
});
|
||||
|
||||
this.authorities.isBuiltIn = (info) => {
|
||||
let current = info || this.authorities.getCurrent();
|
||||
return current && current.AUTH_TYPE < 2;
|
||||
};
|
||||
|
||||
this.authorities.isImplicit = (info) => {
|
||||
let current = info || this.authorities.getCurrent();
|
||||
return current && current.AUTH_TYPE === 1;
|
||||
};
|
||||
|
||||
this.authorities.isAdmin = (info) => {
|
||||
let current = info || this.authorities.getCurrent();
|
||||
return current && current.AUTH_TYPE === 0;
|
||||
};
|
||||
|
||||
this.users = new DatasetControl({
|
||||
prefix:"user",
|
||||
prefixName:"사용자",
|
||||
keymapper:info => info.AUTH_ID + "-" + info.USER_ID,
|
||||
dataGetter:obj => obj.userList,
|
||||
formats: {
|
||||
REG_DT:datetimeFormat
|
||||
},
|
||||
urls:{
|
||||
load:wctx.url("/authority/user/list.do")
|
||||
}
|
||||
});
|
||||
|
||||
this.actions = new DatasetControl({
|
||||
prefix:"action",
|
||||
prefixName:"기능 그룹",
|
||||
keymapper:info => info.AUTH_ID + "-" + info.GRP_ID,
|
||||
dataGetter:obj => obj.actionList,
|
||||
formats: {
|
||||
REG_DT:datetimeFormat
|
||||
},
|
||||
urls:{
|
||||
load:wctx.url("/authority/action/list.do")
|
||||
}
|
||||
});
|
||||
|
||||
this.linkedList = "users";
|
||||
|
||||
this.authorities.onDatasetChange = obj => this.onAuthorityListChange(obj);
|
||||
this.authorities.onCurrentChange = item => {
|
||||
this.onCurrentAuthorityChange(item);
|
||||
let info = item ? item.data : null;
|
||||
this.getLinkedList(this.linkedList, info);
|
||||
};
|
||||
this.authorities.onSelectionChange = selected => this.onAuthoritySelect(selected);
|
||||
|
||||
this.users.onDatasetChange = obj => this.onUserListChange(obj);
|
||||
this.users.onCurrentChange = item => this.onCurrentUserChange(item);
|
||||
this.users.onSelectionChange = selected => this.onUserSelect(selected);
|
||||
|
||||
this.actions.onDatasetChange = obj => this.onActionListChange(obj);
|
||||
this.actions.onCurrentChange = item => this.onCurrentActionChange(item);
|
||||
this.actions.onSelectionChange = selected => this.onActionSelect(selected);
|
||||
}
|
||||
|
||||
getLinkedList(linked, info) {
|
||||
if (!info)
|
||||
info = this.authorities.getCurrent();
|
||||
switch (this.linkedList = linked) {
|
||||
case "users":
|
||||
if (info && !this.authorities.isImplicit(info)) {
|
||||
if (this.users.query.authIDs == info.AUTH_ID) return;
|
||||
this.users.query.authIDs = info.AUTH_ID;
|
||||
this.users.load();
|
||||
} else {
|
||||
this.users.query.authIDs = info.AUTH_ID;
|
||||
this.users.dataset.clear();
|
||||
}
|
||||
break;
|
||||
case "actions":
|
||||
if (info && !this.authorities.isAdmin(info)) {
|
||||
if (this.actions.query.authIDs == info.AUTH_ID) return;
|
||||
this.actions.query.authIDs = info.AUTH_ID;
|
||||
this.actions.load();
|
||||
} else {
|
||||
this.actions.query.authIDs = info.AUTH_ID;
|
||||
this.actions.dataset.clear();
|
||||
}
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
onAuthorityListChange(obj) {}
|
||||
|
||||
onCurrentAuthorityChange(item) {}
|
||||
|
||||
onAuthoritySelect(selected) {}
|
||||
|
||||
removeAuthorities() {
|
||||
let authIDs = this.authorities.dataset.getKeys("selected");
|
||||
this.authorities.remove({authIDs:authIDs.join(",")});
|
||||
}
|
||||
|
||||
onUserListChange(obj) {}
|
||||
|
||||
onCurrentUserChange(item) {}
|
||||
|
||||
onUserSelect(selected) {}
|
||||
|
||||
onActionListChange(obj) {}
|
||||
|
||||
onCurrentActionChange(item) {}
|
||||
|
||||
onActionSelect(selected) {}
|
||||
|
||||
async addUsers() {
|
||||
let userIDs = await new UserControl().selectUser(true);
|
||||
let authID = this.authorities.dataset.getCurrent().AUTH_ID;
|
||||
json.post({
|
||||
url:wctx.url("/authority/user/add.do"),
|
||||
data:{
|
||||
authID:authID,
|
||||
userIDs:userIDs.join(",")
|
||||
},
|
||||
success:resp => {
|
||||
if (resp.saved)
|
||||
this.users._load();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
removeUsers() {
|
||||
let selected = this.users.dataset.getDataset("selected").map(info => info.USER_ID);
|
||||
let authID = this.authorities.dataset.getCurrent().AUTH_ID;
|
||||
json.post({
|
||||
url:wctx.url("/authority/user/remove.do"),
|
||||
data:{
|
||||
authID:authID,
|
||||
userIDs:selected.join(",")
|
||||
},
|
||||
success:resp => {
|
||||
if (resp.saved)
|
||||
this.users._load();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async addActions() {
|
||||
let actions = await new ActionGroupControl(false).selectActionGroup(true);
|
||||
let authID = this.authorities.dataset.getCurrent().AUTH_ID;
|
||||
|
||||
json.post({
|
||||
url:wctx.url("/authority/action/add.do"),
|
||||
data:{
|
||||
authID:authID,
|
||||
groupIDs:actions.join(",")
|
||||
},
|
||||
success:resp => {
|
||||
if (resp.saved)
|
||||
this.actions._load();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
removeActions() {
|
||||
let selected = this.actions.dataset.getDataset("selected").map(info => info.GRP_ID);
|
||||
let authID = this.authorities.dataset.getCurrent().AUTH_ID;
|
||||
json.post({
|
||||
url:wctx.url("/authority/action/remove.do"),
|
||||
data:{
|
||||
authID:authID,
|
||||
groupIDs:selected.join(",")
|
||||
},
|
||||
success:resp => {
|
||||
if (resp.saved)
|
||||
this.actions._load();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -1,79 +0,0 @@
|
||||
class CodeControl {
|
||||
constructor() {
|
||||
this.groups = new DatasetControl({
|
||||
prefix:"group",
|
||||
prefixName:"코드그룹",
|
||||
keymapper:info => info.GRP_ID,
|
||||
dataGetter:obj => obj.groupList,
|
||||
formats: {
|
||||
REG_DT:datetimeFormat
|
||||
},
|
||||
urls:{
|
||||
load:wctx.url("/code/group/list.do"),
|
||||
getInfo:wctx.url("/code/group/info.do"),
|
||||
create:wctx.url("/code/group/create.do"),
|
||||
update:wctx.url("/code/group/update.do"),
|
||||
remove:wctx.url("/code/group/remove.do")
|
||||
}
|
||||
});
|
||||
|
||||
this.codes = new DatasetControl({
|
||||
prefix:"code",
|
||||
prefixName:"코드",
|
||||
keymapper:info => info.CODE,
|
||||
dataGetter:obj => obj.codeList,
|
||||
formats: {
|
||||
REG_DT:datetimeFormat
|
||||
}
|
||||
});
|
||||
this.codes.remove = (params) => {
|
||||
let selected = this.codes.dataset.getKeys("selected");
|
||||
if (selected.length < 1) return;
|
||||
|
||||
if (!params) {
|
||||
params = {};
|
||||
}
|
||||
params.groupID = this.groups.dataset.getCurrent()["GRP_ID"];
|
||||
params.codes = selected.join(",");
|
||||
|
||||
ajax.post({
|
||||
url:this.codes.urls.remove,
|
||||
data:params,
|
||||
success:resp => this.codes.onRemove(selected, resp)
|
||||
});
|
||||
};
|
||||
|
||||
this.groups.onDatasetChange = obj => this.onGroupListChange(obj);
|
||||
this.groups.onCurrentChange = item => {
|
||||
this.onCurrentGroupChange(item);
|
||||
|
||||
let info = item ? item.data : null;
|
||||
if (info) {
|
||||
this.codes.query.groupIDs = info.GRP_ID;
|
||||
this.codes.load();
|
||||
} else
|
||||
this.codes.dataset.clear();
|
||||
};
|
||||
this.groups.onSelectionChange = selected => this.onGroupSelect(selected);
|
||||
|
||||
this.codes.onDatasetChange = obj => this.onCodeListChange(obj);
|
||||
this.codes.onCurrentChange = item => this.onCurrentCodeChange(item);
|
||||
this.codes.onSelectionChange = selected => this.onCodeSelect(selected);
|
||||
}
|
||||
|
||||
onGroupListChange(obj) {}
|
||||
|
||||
onCurrentGroupChange(item) {}
|
||||
|
||||
onGroupSelect(selected) {}
|
||||
|
||||
newCode() {
|
||||
this.codes.newInfo({GRP_ID:this.groups.getCurrent().GRP_ID})
|
||||
}
|
||||
|
||||
onCodeListChange(obj) {}
|
||||
|
||||
onCurrentCodeChange(item) {}
|
||||
|
||||
onCodeSelect(selected) {}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,292 +0,0 @@
|
||||
/**메뉴의 생성과 선택 시 동작을 지원한다.
|
||||
*/
|
||||
class MenuSupport {
|
||||
/**새 MenuSupport를 생성한다.
|
||||
* @param selector {string} 메뉴를 담을 컨테이너에 대한 css selector
|
||||
*/
|
||||
constructor(conf) {
|
||||
conf = conf || {};
|
||||
this._selector = ifEmpty(conf.selector, "#menus");
|
||||
this._containerSelector = ifEmpty(conf.containerSelector, "#layout-menu");
|
||||
this._container = document.querySelector(this._containerSelector);
|
||||
let onclick = conf.onclick || (menu => 'onclick="openMenu(\'{url}\')" '.replace(/{url}/gi, wctx.url(menu.url)));
|
||||
this._onclick = (menu => menu && menu.url ? onclick(menu) : "");
|
||||
|
||||
this._horizontal = this._container && this._container.classList.contains('menu-horizontal');
|
||||
this._orientation = this._horizontal ? "horizontal" : "vertical";
|
||||
this._template = this._orientation + "-menu-template";
|
||||
this._menuItem = '<li data-key="{menuID}" class="menu-item" title="{title}"><a {onclick}class="menu-link{toggle}"><i class="menu-icon tf-icons {imageConf}"></i><div data-i18n="{menuName}">{menuName}</div></a>{menuSub}</li>';
|
||||
this._menuSub = '<ul class="menu-sub">{children}</ul>';
|
||||
this._menus = [];
|
||||
this._init();
|
||||
}
|
||||
|
||||
/**메뉴를 생성할 정보를 설정한다.
|
||||
* @param menus {array} 메뉴 정보 배열<br />
|
||||
* 각 메뉴 정보의 레이아웃은 다음과 같다.<br />
|
||||
* {"id":메뉴 아이디, "name":"메뉴 이름", "url":"실행 url", "parentID":"상위 메뉴 아이디", "description":"메뉴 설명", "imageConf":"이미지 설정", "displayWindow":"표시 창", "children":[하위 메뉴 배열]}
|
||||
* @returns MenuSupport
|
||||
*/
|
||||
setMenuInfo(menus) {
|
||||
let setParent = menu => {
|
||||
let children = menu.children || [];
|
||||
if (children.length < 1) return;
|
||||
|
||||
children.forEach(child => {
|
||||
child.parent = menu;
|
||||
setParent(child);
|
||||
});
|
||||
};
|
||||
menus.forEach(menu => setParent(menu));
|
||||
this._menus = menus;
|
||||
|
||||
let menuItemTag = menu => {
|
||||
let tag = this._menuItem
|
||||
.replace(/{menuID}/gi, menu.id)
|
||||
.replace(/{menuName}/gi, menu.name)
|
||||
.replace(/{onclick}/gi, this._onclick(menu))
|
||||
.replace(/{title}/gi, (menu.description || ""))
|
||||
.replace(/{imageConf}/gi, (menu.imageConf || "bx bx-layout"));
|
||||
let parent = menu.children && menu.children.length > 0;
|
||||
tag = tag.replace(/{toggle}/gi, !parent ? "" : " menu-toggle");
|
||||
if (!parent)
|
||||
return tag.replace(/{menuSub}/gi, "");
|
||||
|
||||
let children = menu.children.map(child => menuItemTag(child)).join("\n\t")
|
||||
return tag.replace(/{menuSub}/gi, this._menuSub.replace(/{children}/gi, children));
|
||||
}
|
||||
let tags = (menus || []).map(menu => menuItemTag(menu));
|
||||
document.querySelector(this._selector).innerHTML = tags.join("");
|
||||
|
||||
return this._init();
|
||||
}
|
||||
|
||||
_toggleMenuAwares(collapse) {
|
||||
document.querySelectorAll(".menu-aware").forEach(menuAware => menuAware.style.width = collapse ? "calc(100% - 5.25rem)" : "");
|
||||
}
|
||||
|
||||
_init() {
|
||||
let menu = new Menu(this._container, {
|
||||
orientation: this._orientation,
|
||||
closeChildren: this._horizontal,
|
||||
showDropdownOnHover: localStorage.getItem('templateCustomizer-' + this._template + '--ShowDropdownOnHover')
|
||||
? localStorage.getItem('templateCustomizer-' + this._template + '--ShowDropdownOnHover') === 'true'
|
||||
: window.templateCustomizer !== undefined
|
||||
? window.templateCustomizer.settings.defaultShowDropdownOnHover
|
||||
: true
|
||||
});
|
||||
window.Helpers.scrollToActive(false); //animate = false
|
||||
window.Helpers.mainMenu = menu;
|
||||
|
||||
//Sets toggler
|
||||
document.querySelectorAll('.layout-menu-toggle').forEach(item => {
|
||||
item.addEventListener('click', event => {
|
||||
if (event.fired) {
|
||||
return delete event.fired;
|
||||
}
|
||||
event.fired = true;
|
||||
event.preventDefault();
|
||||
window.Helpers.toggleCollapsed();
|
||||
if (config.enableMenuLocalStorage && !window.Helpers.isSmallScreen()) {
|
||||
try {
|
||||
localStorage.setItem(
|
||||
'templateCustomizer-' + this._template + '--LayoutCollapsed',
|
||||
String(window.Helpers.isCollapsed())
|
||||
);
|
||||
} catch (e) {}
|
||||
}
|
||||
this._toggleMenuAwares(Helpers.isCollapsed());
|
||||
});
|
||||
});
|
||||
// Display menu toggle (layout-menu-toggle) on hover with delay
|
||||
let delay = (elem, callback) => {
|
||||
let timeout = null;
|
||||
elem.onmouseenter = () => {
|
||||
// Set timeout to be a timer which will invoke callback after 300ms (not for small screen)
|
||||
timeout = !Helpers.isSmallScreen() ? setTimeout(callback, 300) : setTimeout(callback, 0);
|
||||
};
|
||||
|
||||
elem.onmouseleave = () => {
|
||||
// Clear any timers set to timeout
|
||||
document.querySelector('.layout-menu-toggle').classList.remove('d-block');
|
||||
clearTimeout(timeout);
|
||||
};
|
||||
};
|
||||
if (this._container) {
|
||||
delay(this._container, () => {
|
||||
// not for small screen
|
||||
if (!Helpers.isSmallScreen()) {
|
||||
document.querySelector('.layout-menu-toggle').classList.add('d-block');
|
||||
}
|
||||
});
|
||||
}
|
||||
// Detect swipe gesture on the target element and call swipe In
|
||||
window.Helpers.swipeIn('.drag-target', function (e) {
|
||||
window.Helpers.setCollapsed(false);
|
||||
});
|
||||
// Detect swipe gesture on the target element and call swipe Out
|
||||
window.Helpers.swipeOut(this._containerSelector, function (e) {
|
||||
if (window.Helpers.isSmallScreen()) window.Helpers.setCollapsed(true);
|
||||
});
|
||||
// Display in main menu when menu scrolls
|
||||
let menuInnerContainer = document.getElementsByClassName('menu-inner'),
|
||||
menuInnerShadow = document.getElementsByClassName('menu-inner-shadow')[0];
|
||||
if (menuInnerContainer.length > 0 && menuInnerShadow) {
|
||||
menuInnerContainer[0].addEventListener('ps-scroll-y', function () {
|
||||
if (this.querySelector('.ps__thumb-y').offsetTop) {
|
||||
menuInnerShadow.style.display = 'block';
|
||||
} else {
|
||||
menuInnerShadow.style.display = 'none';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
open(url) {
|
||||
top.document.location.href = url;
|
||||
}
|
||||
|
||||
/**지정한 url의 메뉴를 활성화 한다.
|
||||
* @param url {string} 메뉴 url
|
||||
* @returns MenuSupport
|
||||
*/
|
||||
setActive(url) {
|
||||
let menu = this.getMenu(url);
|
||||
if (!menu) return this;
|
||||
|
||||
document
|
||||
.querySelectorAll(this._selector + " li")
|
||||
.forEach(li => li.classList.remove("active", "open"));
|
||||
|
||||
let a = document.querySelector(this._selector + " li[data-key=\"" + menu.id + "\"]");
|
||||
if (!a) return this;
|
||||
|
||||
let activate = (e, open) => {
|
||||
e.classList.add("active");
|
||||
|
||||
let p = e.parentNode;
|
||||
let tag = (p != this._container ? p : null) ? p.tagName : "";
|
||||
if (!tag) return;
|
||||
|
||||
if ("li" == tag.toLowerCase()) {
|
||||
p.classList.add("active");
|
||||
if (open)
|
||||
p.classList.add("open");
|
||||
}
|
||||
activate(p, true);
|
||||
};
|
||||
|
||||
activate(a);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
/**지정하는 url의 메뉴 정보를 반환한다.
|
||||
* @param url {string} 메뉴 url
|
||||
* @returns 지정하는 url의 메뉴 정보
|
||||
*/
|
||||
getMenu(url) {
|
||||
let find = menus => {
|
||||
for (let i = 0; i < menus.length; ++i) {
|
||||
let menu = menus[i];
|
||||
if (url == menu.url)
|
||||
return menu;
|
||||
let found = find(menu.children || []);
|
||||
if (found)
|
||||
return found;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
return find(this._menus);
|
||||
}
|
||||
|
||||
breadcrumb(url, separator = " / ") {
|
||||
let menu = this.getMenu(url);
|
||||
if (!menu)
|
||||
return "";
|
||||
|
||||
let getName = menu => {
|
||||
let name = menu.name;
|
||||
let parent = !menu.parent ? "" : getName(menu.parent);
|
||||
return parent ? parent + separator + name : name;
|
||||
}
|
||||
|
||||
return getName(menu);
|
||||
}
|
||||
}
|
||||
|
||||
class TabControl extends Dataset {
|
||||
constructor(conf) {
|
||||
if (!conf)
|
||||
conf = {};
|
||||
conf.keymapper = info => {
|
||||
if (!info.index) {
|
||||
info.index = "ndx-" + new Date().getTime();
|
||||
}
|
||||
return info.index;
|
||||
};
|
||||
conf.dataGetter = obj => null;
|
||||
super(conf);
|
||||
this.sticky = conf.sticky || {};
|
||||
this.maxCount = conf.maxCount || 8;
|
||||
this.getMenu = conf.getMenu || ((url) => {throw "getMenu(url) missing"});
|
||||
|
||||
}
|
||||
|
||||
getTab(by) {
|
||||
if (by.startsWith("ndx-"))
|
||||
return this.getData(by, "item");
|
||||
|
||||
if (by != this.sticky.url) {
|
||||
let found = this._items.filter(item => item.data.url == by),
|
||||
empty = !found || found.length < 1;
|
||||
if (empty)
|
||||
return null;
|
||||
|
||||
found = found[0];
|
||||
return !found.unreachable ? found : null;
|
||||
} else {
|
||||
let found = this._items.filter(item => item.data.url == this.sticky.url);
|
||||
if (!found || found.length < 1) {
|
||||
this.addData([this.sticky]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
open(url) {
|
||||
if (!url
|
||||
|| url.startsWith("javascript:void")
|
||||
|| url == this.sticky.url)
|
||||
return;
|
||||
|
||||
let tab = this.getTab(url);
|
||||
if (tab)
|
||||
return this.setCurrent(tab.data.index);
|
||||
|
||||
ajax.get({
|
||||
url: wctx.url(url),
|
||||
success: resp => {
|
||||
let menu = this.getMenu(url);
|
||||
if (!menu)
|
||||
throw "Menu not found for " + url;
|
||||
|
||||
if (this.length == this.maxCount) {
|
||||
let index = isEmpty(this.sticky) ? 0 : 1,
|
||||
first = this._items[index];
|
||||
this.close(first.data.url)
|
||||
}
|
||||
|
||||
menu.content = resp;
|
||||
this.addData([menu]);
|
||||
this.open(url);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
close(url) {
|
||||
let tab = this.getTab(url);
|
||||
this.erase(tab.data.index);
|
||||
}
|
||||
}
|
@ -1,77 +0,0 @@
|
||||
class MenuControl extends DatasetControl {
|
||||
constructor() {
|
||||
super({
|
||||
keymapper: info => info ? info.id : "",
|
||||
prefix:"menu",
|
||||
prefixName:"메뉴"
|
||||
});
|
||||
|
||||
this.urls.load = this.url("/tree.do");
|
||||
delete this.urls.getInfo;
|
||||
this.menus = [];
|
||||
}
|
||||
|
||||
setData(obj) {
|
||||
let list = [];
|
||||
let asList = array => {
|
||||
if (!array || array.length < 1) return;
|
||||
|
||||
for (var i = 0; i < array.length; ++i) {
|
||||
let menu = array[i];
|
||||
list.push(menu);
|
||||
asList(menu.children);
|
||||
}
|
||||
};
|
||||
asList(this.menus = Array.isArray(obj) ? obj : obj.menus);
|
||||
super.setData(list);
|
||||
}
|
||||
|
||||
move(parentID, menuID) {
|
||||
json.post({
|
||||
url:wctx.url("/menu/move.do"),
|
||||
data:{
|
||||
parentID:parentID,
|
||||
menuIDs:menuID
|
||||
},
|
||||
success:resp => {
|
||||
this._load();
|
||||
this.onMenusChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
reorder(menuIDs) {
|
||||
json.post({
|
||||
url:wctx.url("/menu/reorder.do"),
|
||||
data:{
|
||||
menuIDs:Array.isArray(menuIDs) ? menuIDs.join(",") : menuIDs
|
||||
},
|
||||
success:resp => {
|
||||
this._load();
|
||||
this.onMenusChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
onSave(resp) {
|
||||
super.onSave(resp);
|
||||
this.onMenusChanged();
|
||||
}
|
||||
|
||||
onRemove(selected, resp) {
|
||||
super.onRemove(selected, resp);
|
||||
this.onMenusChanged();
|
||||
}
|
||||
|
||||
onMenusChanged() {}
|
||||
|
||||
async getUserMenus() {
|
||||
return new Promise((resolve, reject) => {
|
||||
json.get({
|
||||
url:this.url("/userMenus.do"),
|
||||
data:{},
|
||||
success:resp => resolve(resp.userMenus)
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue