From f8c3c53f9e29541f8c0e3fcbf682c301fd17e06a Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期一, 23 十一月 2020 17:49:23 +0800 Subject: [PATCH] 2020-11-23 --- src/components/header/index.jsx | 515 ++++++++++++++++++++++++++++++--------------------------- 1 files changed, 272 insertions(+), 243 deletions(-) diff --git a/src/components/header/index.jsx b/src/components/header/index.jsx index 61d8f47..7d2eb82 100644 --- a/src/components/header/index.jsx +++ b/src/components/header/index.jsx @@ -9,6 +9,7 @@ import asyncComponent from '@/utils/asyncComponent' import { toggleCollapse, + modifyMenuTree, modifyMainMenu, modifyTabview, resetState, @@ -30,17 +31,13 @@ import LoginForm from './loginform' import './index.scss' -const EditMenu = asyncComponent(() => import('@/templates/headerconfig')) +const EditMenu = asyncComponent(() => import('@/templates/menuconfig/editfirstmenu')) const { confirm } = Modal const { Search } = Input class Header extends Component { static propTpyes = { - collapse: PropTypes.bool, - mainMenu: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.object - ]) + collapse: PropTypes.bool } state = { menulist: null, // 涓�绾ц彍鍗� @@ -51,7 +48,7 @@ logourl: window.GLOB.mainlogo, loginVisible: false, loginLoading: false, - avatar: avatar, + avatar: Utils.getrealurl(sessionStorage.getItem('avatar')), systems: [], searchkey: '', thdMenuList: [], @@ -79,42 +76,37 @@ this.setState({ confirmLoading: true }) - this.resetPwdSubmitexec(res) + + let _param = { + func: 's_PwdUpt', + LText: `select '${res.originpwd}','${res.password}'` + } + + _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') // 鏃堕棿鎴� + _param.LText = Utils.formatOptions(_param.LText) // 鍏抽敭瀛楃鏇挎崲锛宐ase64鍔犲瘑 + _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp) // md5瀵嗛挜 + + Api.getSystemConfig(_param).then(result => { + this.setState({ + visible: !result.status, + confirmLoading: false + }) + + if (result.status) { + notification.success({ + top: 92, + message: this.state.dict['main.password.resetsuccess'], + duration: 2 + }) + } else { + notification.warning({ + top: 92, + message: result.message, + duration: 5 + }) + } + }) }, () => {}) - } - - async resetPwdSubmitexec (param) { - let _param = { - func: 's_PwdUpt', - LText: `select '${param.originpwd}','${param.password}'` - } - - _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') // 鏃堕棿鎴� - _param.LText = Utils.formatOptions(_param.LText) // 鍏抽敭瀛楃鏇挎崲锛宐ase64鍔犲瘑 - _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp) // md5瀵嗛挜 - - let result = await Api.getSystemConfig(_param) // 鍙栨秷淇敼鏈湴瀵嗙爜锛屽彧淇敼鍗曠偣鏈嶅姟鍣� - - if (result.status) { - this.setState({ - visible: false, - confirmLoading: false - }) - notification.success({ - top: 92, - message: this.state.dict['main.password.resetsuccess'], - duration: 2 - }) - } else { - notification.warning({ - top: 92, - message: result.message, - duration: 5 - }) - this.setState({ - confirmLoading: false - }) - } } handleCancel = () => { @@ -154,13 +146,14 @@ async loadmenu () { // 鑾峰彇涓昏彍鍗� - let _param = {func: 'sPC_Get_MainMenu', systemType: options.sysType} - if (sessionStorage.getItem('isEditState') === 'true') { // 缂栬緫鐘舵�佹椂锛岃幏鍙栦竴绾ц彍鍗曪紝澧炲姞鍙傛暟debug + let _param = {func: 's_get_pc_menus', systemType: options.sysType} + if (sessionStorage.getItem('isEditState') === 'true') { // 缂栬緫鐘舵�佹椂锛屽鍔犲弬鏁癲ebug _param.debug = 'Y' } if (options.sysType !== 'cloud' && window.GLOB.systemType !== 'production') { _param.linkurl = window.GLOB.linkurl } + _param.pro_sys = window.GLOB.systemType === 'production' ? 'Y' : '' let result = await Api.getSystemConfig(_param) @@ -168,33 +161,15 @@ if (!result) return if (result.status) { - let MainMenuId = sessionStorage.getItem('MainMenu') // 鏄惁涓烘墦寮�鏂伴〉闈� - if (MainMenuId) { - // 閫氳繃url涓璵enuid绛涢�夊嚭閫変腑鐨勪富鑿滃崟 - let _menu = result.data.filter(item => item.MenuID === MainMenuId)[0] - sessionStorage.removeItem('MainMenu') - this.props.modifyMainMenu(_menu || result.data[0]) - } else { - this.props.modifyMainMenu(result.data[0]) - } + let res = this.getMenulist(result) this.setState({ - menulist: result.data.map((item, index) => { - item.id = index - item.text = item.MenuName - if (item.PageParam) { - try { - item.PageParam = JSON.parse(item.PageParam) - } catch (e) { - item.PageParam = {OpenType: 'menu', linkUrl: ''} - } - } else { - item.PageParam = {OpenType: 'menu', linkUrl: ''} - } - return item - }), - systems: sessionStorage.getItem('isEditState') === 'true' ? [] : result.Systems.filter(sys => sys.LinkUrl1 && sys.AppName && sys.AppKey !== window.GLOB.appkey) + menulist: res.menulist, + systems: [] }) + + this.props.modifyMenuTree(res.menulist) + this.props.modifyMainMenu(res.menulist[0] || null) } else { notification.error({ top: 92, @@ -204,13 +179,16 @@ } } - async getRolesMenu () { + getRolesMenu () { // 鑾峰彇瑙掕壊鏉冮檺 - let promiseRole = new Promise(resolve => { - Api.getSystemConfig({func: 's_Get_TrdMenu_Role', edition_type: 'Y'}).then(result => { + let roledefer = new Promise(resolve => { + // edition_type 鎺ュ彛鐗堟湰鎺у埗 ''銆�'Y'銆�'A' + Api.getSystemConfig({ + func: 's_Get_TrdMenu_Role', + edition_type: 'A', + pro_sys: window.GLOB.systemType === 'production' ? 'Y' : '' + }).then(result => { let _permAction = {} // 鎸夐挳鏉冮檺 - let _permMenus = {} // 鑿滃崟鏉冮檺锛屽瓧娈甸�忚绛� - let menulist = [] // 涓夌骇鑿滃崟鍒楄〃 if (result && result.status) { if (result.UserRoles_Menu) { @@ -219,54 +197,6 @@ _permAction[menu.MenuID] = true }) } - - if (result.UserRoles) { - let iframes = ['Main/Index', 'bda/rdt', 'Home/rdt'] - let menukeys = [] - - result.UserRoles.forEach(menu => { - if (!menu.MenuID) return - if (menukeys.includes(menu.MenuID)) { - console.warn('s_Get_TrdMenu_Role閲嶅鐨勮彍鍗旾D锛�' + menu.MenuID) - return - } - _permMenus[menu.MenuID] = true - - let _type = '' - if (menu.LinkUrl === 'CommonTable') { - _type = 'CommonTable' - } else if (menu.LinkUrl && iframes.includes(menu.LinkUrl.split('?')[0])) { - _type = 'iframe' - } - - if (_type !== 'iframe') { - let pageParam = {} - try { - pageParam = JSON.parse(menu.PageParam) - } catch (e) { - pageParam = {} - } - _type = pageParam.Template || _type - } - - menukeys.push(menu.MenuID) - - menulist.push({ - MenuID: menu.MenuID, - MenuName: menu.MenuName, - MenuNo: menu.MenuNo || '', - EasyCode: menu.EasyCode || '', - LinkUrl: menu.LinkUrl, - type: _type - }) - }) - } - - this.setState({ - thdMenuList: menulist - }) - - this.props.initMenuPermission(_permMenus) } else if (result) { notification.error({ top: 92, @@ -275,79 +205,207 @@ }) } - resolve(_permAction) + this.props.initActionPermission(_permAction) + resolve() }) }) // 鑾峰彇涓昏彍鍗曞弬鏁� - let promiseMenu = new Promise(resolve => { - let _param = {func: 'sPC_Get_MainMenu', systemType: options.sysType} + let menudefer = new Promise(resolve => { + let _param = {func: 's_get_pc_menus', systemType: options.sysType} if (options.sysType !== 'cloud' && window.GLOB.systemType !== 'production') { _param.linkurl = window.GLOB.linkurl } - + _param.pro_sys = window.GLOB.systemType === 'production' ? 'Y' : '' + Api.getSystemConfig(_param).then(result => { - let mainMenu = null - if (result && result.status) { - let MainMenuId = sessionStorage.getItem('MainMenu') // 鏄惁涓烘墦寮�鏂伴〉闈� - if (MainMenuId) { - // 閫氳繃url涓璵enuid绛涢�夊嚭閫変腑鐨勪富鑿滃崟 - let _menu = result.data.filter(item => item.MenuID === MainMenuId)[0] - sessionStorage.removeItem('MainMenu') - mainMenu = _menu || result.data[0] - } else { - mainMenu = result.data[0] - } - - this.setState({ - menulist: result.data.map((item, index) => { - item.id = index - item.text = item.MenuName - if (item.PageParam) { - try { - item.PageParam = JSON.parse(item.PageParam) - } catch (e) { - item.PageParam = {OpenType: 'menu', linkUrl: ''} - } - } else { - item.PageParam = {OpenType: 'menu', linkUrl: ''} - } - return item - }), - systems: result.Systems.filter(sys => sys.LinkUrl1 && sys.AppName && sys.AppKey !== window.GLOB.appkey) - }) - } else if (result) { + if (!result.status || !result.fst_menu) { notification.error({ top: 92, - message: result.message, + message: result.message || '鏈煡璇㈠埌鑿滃崟淇℃伅锛�', duration: 10 }) + return } - resolve(mainMenu) + let res = this.getMenulist(result) + + this.setState({ + menulist: res.menulist, + thdMenuList: res.thdMenuList, + systems: window.GLOB.systemType === 'production' || options.sysType === 'SSO' ? (result.sys_list || []) : [] + }) + + let mainMenu = res.menulist[0] || null + let _menu = null + + if (sessionStorage.getItem('ThirdMenu')) { // 鏄惁涓烘墦寮�鏂伴〉闈� + let ThirdMenuId = sessionStorage.getItem('ThirdMenu') + _menu = res.thdMenuList.filter(item => item.MenuID === ThirdMenuId)[0] // 閫氳繃url涓璵enuid绛涢�夊嚭閫変腑鐨勪富鑿滃崟 + + if (_menu) { + mainMenu = res.menulist.filter(item => item.MenuID === _menu.FstId)[0] + mainMenu = fromJS(mainMenu).toJS() + mainMenu.openId = _menu.ParentId + } + + sessionStorage.removeItem('ThirdMenu') + } + + this.props.modifyMenuTree(res.menulist) + this.props.modifyMainMenu(mainMenu) + this.props.initMenuPermission(res.permMenus) + + resolve(_menu) }) }) - let _mainMenu = await promiseMenu - if (_mainMenu) { - this.props.modifyMainMenu(_mainMenu) - } + Promise.all([roledefer, menudefer]).then(response => { + if (response[1]) { + let tabs = fromJS(this.props.tabviews).toJS() + let menu = fromJS(response[1]).toJS() - let permAction = await promiseRole + tabs = tabs.map(tab => { + tab.selected = false + return tab + }) - this.props.initActionPermission(permAction) + menu.selected = true + tabs.push(menu) + this.props.modifyTabview(tabs) + } + }) + } + + getMenulist = (result) => { + let thdMenuList = [] + let permMenus = {} + let iframes = ['Main/Index', 'bda/rdt', 'Home/rdt'] + let menulist = result.fst_menu.map(fst => { + let fstItem = { + MenuID: fst.MenuID, + MenuName: fst.MenuName, + PageParam: {OpenType: 'menu', linkUrl: ''}, + children: [] + } + if (fst.PageParam) { + try { + fstItem.PageParam = JSON.parse(fst.PageParam) + } catch (e) { + fstItem.PageParam = {OpenType: 'menu', linkUrl: ''} + } + } + + if (fst.snd_menu) { + fstItem.children = fst.snd_menu.map(snd => { + let sndItem = { + ParentId: fst.MenuID, + MenuID: snd.MenuID, + MenuName: snd.MenuName, + PageParam: {Icon: 'folder'}, + children: [] + } + + if (snd.PageParam) { + try { + sndItem.PageParam = JSON.parse(snd.PageParam) + } catch (e) { + sndItem.PageParam = {Icon: 'folder'} + } + } + + let msg = { + UserID: sessionStorage.getItem('UserID'), + LoginUID: sessionStorage.getItem('LoginUID'), + User_Name: sessionStorage.getItem('User_Name'), + Full_Name: sessionStorage.getItem('Full_Name'), + Member_Level: sessionStorage.getItem('Member_Level'), + dataM: sessionStorage.getItem('dataM'), + avatar: sessionStorage.getItem('avatar'), + debug: sessionStorage.getItem('debug'), + role_id: sessionStorage.getItem('role_id'), + mainlogo: window.GLOB.mainlogo, + mstyle: window.GLOB.style + } + + if (snd.trd_menu) { + sndItem.children = snd.trd_menu.map(trd => { + let trdItem = { + FstId: fst.MenuID, + ParentId: snd.MenuID, + MenuID: trd.MenuID, + MenuName: trd.MenuName, + MenuNo: trd.MenuNo, + EasyCode: trd.EasyCode, + type: 'CommonTable', // 榛樿鍊间负甯哥敤琛� + OpenType: 'newtab' // 鎵撳紑鏂瑰紡 + } + + if (trd.LinkUrl && iframes.includes(trd.LinkUrl.split('?')[0])) { + trdItem.type = 'iframe' + trdItem.LinkUrl = trd.LinkUrl + trdItem.forbidden = true + } else { + try { + trdItem.PageParam = trd.PageParam ? JSON.parse(trd.PageParam) : {OpenType: 'newtab'} + } catch (e) { + trdItem.PageParam = {OpenType: 'newtab'} + } + + trdItem.type = trdItem.PageParam.Template || trdItem.type + trdItem.OpenType = trdItem.PageParam.OpenType || trdItem.OpenType + + if (trdItem.type === 'CustomPage' && this.props.memberLevel < 20) { // 浼氬憳绛夌骇澶т簬绛変簬20鏃讹紝鏈夌紪杈戞潈闄� + trdItem.forbidden = true + } + if (trdItem.type === 'NewPage') { + trdItem.src = trdItem.PageParam.url || '' + + if (trdItem.src.indexOf('paramsmain/') > -1) { + try { + let _url = trdItem.src.split('paramsmain/')[0] + 'paramsmain/' + let _param = JSON.parse(window.decodeURIComponent(window.atob(trdItem.src.split('paramsmain/')[1]))) + _param.UserID = sessionStorage.getItem('UserID') + _param.LoginUID = sessionStorage.getItem('LoginUID') + _param.User_Name = sessionStorage.getItem('User_Name') + _param.Full_Name = sessionStorage.getItem('Full_Name') + + trdItem.src = _url + window.btoa(window.encodeURIComponent(JSON.stringify(_param))) + } catch { + console.warn('鑿滃崟鍙傛暟瑙f瀽閿欒锛�') + } + } + } else { + // 鎵撳紑鏂伴〉闈㈤摼鎺� + trdItem.src = '#/paramsmain/' + window.btoa(window.encodeURIComponent(JSON.stringify({ + ...msg, + ThirdMenu: trd.MenuID + }))) + } + } + + permMenus[trd.MenuID] = true + thdMenuList.push(trdItem) + + return trdItem + }) + } + + return sndItem + }) + } + + return fstItem + }) + + return { menulist, thdMenuList, permMenus} } reload = () => { - this.setState({ - menulist: null - }) this.loadmenu() } changeEditState = (state) => { - const { menulist } = this.state - if (!state) { // 閫�鍑虹紪杈戯紝椤甸潰鍒锋柊 window.location.reload() return @@ -357,48 +415,23 @@ let UserID = sessionStorage.getItem('CloudUserID') let LoginUID = sessionStorage.getItem('CloudLoginUID') - if (state && (!UserID || !LoginUID)) { + if (!UserID || !LoginUID) { this.setState({ loginVisible: true }) } else { - sessionStorage.setItem('isEditState', state) - let _userName = sessionStorage.getItem('User_Name') - let _avatar = avatar + sessionStorage.setItem('isEditState', 'true') + this.props.modifyDataManager(sessionStorage.getItem('cloudDataM') === 'true') - if (sessionStorage.getItem('cloudDataM') === 'true') { - this.props.modifyDataManager(true) - } - if (!state && sessionStorage.getItem('avatar')) { - _avatar = Utils.getrealurl(sessionStorage.getItem('avatar')) // 澶村儚 - } else if (state && sessionStorage.getItem('CloudAvatar')) { - _avatar = Utils.getrealurl(sessionStorage.getItem('CloudAvatar')) // 澶村儚 - } - - if (state) { - _userName = sessionStorage.getItem('CloudUserName') - } - - if (window.GLOB.systemType === 'production' && state) { + if (window.GLOB.systemType === 'production') { this.props.resetEditLevel('HS') this.props.modifyMainMenu({ MenuID: 'systemManageView' }) this.setState({ - userName: _userName, - avatar: _avatar - }) - this.props.resetEditState(state) - - return - } else if (window.GLOB.systemType === 'production' && !state) { - this.props.resetEditLevel(false) - this.props.modifyMainMenu(menulist[0] || '') - - this.setState({ - userName: _userName, - avatar: _avatar + userName: sessionStorage.getItem('CloudUserName'), + avatar: Utils.getrealurl(sessionStorage.getItem('CloudAvatar')) }) this.props.resetEditState(state) @@ -407,15 +440,15 @@ this.setState({ menulist: null, - userName: _userName, - avatar: _avatar + userName: sessionStorage.getItem('CloudUserName'), + avatar: Utils.getrealurl(sessionStorage.getItem('CloudAvatar')) }) this.loadmenu() - this.props.modifyMainMenu('') + this.props.modifyMainMenu(null) this.props.resetEditState(state) } - if (state && this.props.sysRoles.length === 0 && this.props.permFuncField.length === 0 && window.GLOB.systemType !== 'production') { + if (window.GLOB.systemType !== 'production') { Api.getSystemConfig({func: 'sPC_Get_Roles_sModular'}).then(res => { if (res.status) { let _permFuncField = [] @@ -458,13 +491,9 @@ sessionStorage.setItem('CloudUserName', res.UserName) sessionStorage.setItem('CloudFullName', res.FullName) sessionStorage.setItem('CloudAvatar', res.icon) - sessionStorage.setItem('isEditState', 'true') sessionStorage.setItem('cloudDataM', res.dataM ? 'true' : '') - - let _avatar = avatar - if (res.icon) { - _avatar = Utils.getrealurl(res.icon) // 澶村儚 - } + + sessionStorage.setItem('isEditState', 'true') if (res.dataM) { this.props.modifyDataManager(true) @@ -480,7 +509,7 @@ loginVisible: false, loginLoading: false, userName: res.UserName, - avatar: _avatar + avatar: res.icon }) this.props.resetEditState(true) @@ -492,10 +521,10 @@ loginVisible: false, loginLoading: false, userName: res.UserName, - avatar: _avatar + avatar: res.icon }) this.loadmenu() - this.props.modifyMainMenu('') + this.props.modifyMainMenu(null) this.props.resetEditState(true) } else { this.setState({ @@ -531,14 +560,15 @@ * @description 閫�鍑虹鐞嗙晫闈㈣彍鍗� */ exitManage = () => { + const { menulist } = this.state + if (window.GLOB.systemType === 'production') { // 姝e紡绯荤粺鐗堟湰鍗囩骇鍚庯紝椤甸潰鍒锋柊 window.location.reload() return } - this.props.resetEditState(true) + this.props.modifyMainMenu(menulist[0] || null) this.props.resetEditLevel(false) - this.reload() } exitEdit = () => { @@ -576,40 +606,36 @@ } selectMenu = (item) => { - const { tabviews } = this.props - - let menu = JSON.parse(JSON.stringify(item)) + let tabs = fromJS(this.props.tabviews).toJS() + let menu = fromJS(item).toJS() menu.selected = true - let index = 0 - let isexit = false - let tabs = tabviews.map((tab, i) => { + tabs = tabs.filter(tab => { tab.selected = false - - if (tab.MenuID === menu.MenuID) { - tab.selected = true - isexit = true - } - - return tab + return tab.MenuID !== menu.MenuID }) - if (!isexit) { - tabs.splice(index + 1, 0, menu) + if (this.props.tabviews.length !== tabs.length) { + this.props.modifyTabview(fromJS(tabs).toJS()) } - this.props.modifyTabview(tabs) + this.setState({}, () => { + tabs.push(menu) + this.props.modifyTabview(tabs) + }) } UNSAFE_componentWillMount () { // 缁勪欢鍔犺浇鏃讹紝鑾峰彇鑿滃崟鏁版嵁 - let _avatar = sessionStorage.getItem('avatar') - if (_avatar) { - _avatar = Utils.getrealurl(_avatar) // 澶村儚 - this.setState({avatar: _avatar}) - } - this.getRolesMenu() + } + + UNSAFE_componentWillReceiveProps (nextProps) { + if (!is(fromJS(this.props.menuTree), fromJS(nextProps.menuTree)) && !is(fromJS(this.state.menulist), fromJS(nextProps.menuTree))) { + this.setState({ + menulist: nextProps.menuTree + }) + } } componentDidMount () { @@ -675,6 +701,7 @@ } render () { + const { mainMenu, collapse } = this.props const { thdMenuList, searchkey, oriVersion, newVersion } = this.state const menu = ( @@ -699,16 +726,16 @@ return ( <header className="header-container ant-menu-dark" id="main-header-container"> - <div className={this.props.collapse ? "collapse header-logo" : "header-logo"}><img src={this.state.logourl} alt=""/></div> - <div className={this.props.collapse ? "collapse header-collapse" : "header-collapse"} onClick={this.handleCollapse}> - <Icon type={this.props.collapse ? 'menu-unfold' : 'menu-fold'} /> + <div className={collapse ? "collapse header-logo" : "header-logo"}><img src={this.state.logourl} alt=""/></div> + <div className={collapse ? "collapse header-collapse" : "header-collapse"} onClick={this.handleCollapse}> + <Icon type={collapse ? 'menu-unfold' : 'menu-fold'} /> </div> {/* 姝e父鑿滃崟 */} {this.props.editLevel !== 'level1' && this.state.menulist ? <ul className={'header-menu ' + this.props.editLevel}>{ this.state.menulist.map(item => { return ( - <li key={item.MenuID} onClick={() => {this.changeMenu(item)}} className={this.props.selectmenu.MenuID === item.MenuID ? 'active' : ''}> + <li key={item.MenuID} onClick={() => {this.changeMenu(item)}} className={mainMenu && mainMenu.MenuID === item.MenuID ? 'active' : ''}> <span>{item.MenuName}</span> </li> ) @@ -737,7 +764,7 @@ {/* 澶村儚銆佺敤鎴峰悕 */} <Dropdown className="header-setting" overlay={menu}> <div> - <img src={this.state.avatar} alt=""/> + <img src={this.state.avatar || avatar} alt=""/> <span> <span className="username">{this.state.userName}</span> <Icon type="down" /> </span> @@ -811,7 +838,8 @@ return { tabviews: state.tabviews, collapse: state.collapse, - selectmenu: state.selectedMainMenu, + menuTree: state.menuTree, + mainMenu: state.mainMenu, debug: state.debug, editState: state.editState, editLevel: state.editLevel, @@ -826,7 +854,8 @@ return { toggleCollapse: (collapse) => dispatch(toggleCollapse(collapse)), modifyTabview: (tabviews) => dispatch(modifyTabview(tabviews)), - modifyMainMenu: (selectmenu) => dispatch(modifyMainMenu(selectmenu)), + modifyMenuTree: (menuTree) => dispatch(modifyMenuTree(menuTree)), + modifyMainMenu: (mainMenu) => dispatch(modifyMainMenu(mainMenu)), resetEditState: (state) => dispatch(resetEditState(state)), resetEditLevel: (level) => dispatch(resetEditLevel(level)), initActionPermission: (permAction) => dispatch(initActionPermission(permAction)), -- Gitblit v1.8.0