From 4d6b9f8a2d7b316633e43b489eae9ada949c07b5 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期二, 10 九月 2024 10:18:08 +0800 Subject: [PATCH] Merge branch 'master' into positec --- src/views/rolemanage/index.jsx | 381 ++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 270 insertions(+), 111 deletions(-) diff --git a/src/views/rolemanage/index.jsx b/src/views/rolemanage/index.jsx index 26dd053..2fdc6e4 100644 --- a/src/views/rolemanage/index.jsx +++ b/src/views/rolemanage/index.jsx @@ -1,10 +1,9 @@ import React, {Component} from 'react' import { fromJS } from 'immutable' -import { Spin, notification, Button, Table, Modal, ConfigProvider, Tree, Input, Empty } from 'antd' +import { Spin, notification, Button, Table, Modal, Tree, Input, Empty } from 'antd' import moment from 'moment' import md5 from 'md5' -import enUS from 'antd/es/locale/en_US' -import zhCN from 'antd/es/locale/zh_CN' +import { ApiOutlined, SoundOutlined } from '@ant-design/icons' import Api from '@/api' import Utils from '@/utils/utils.js' @@ -15,26 +14,52 @@ const { TreeNode } = Tree const { Search } = Input -const _locale = sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS const Header = asyncComponent(() => import('./header')) const TransferForm = asyncComponent(() => import('@/templates/zshare/basetransferform')) - -sessionStorage.setItem('isEditState', 'true') class RoleManage extends Component { state = { app: null, loading: false, menulist: [], + sortType: '', columns: [ - { title: '鑿滃崟鍚嶇О', dataIndex: 'MenuName', key: 'MenuName', align: 'center' }, + { + title: '鑿滃崟鍚嶇О', dataIndex: 'MenuName', key: 'MenuName', align: 'center', render: (text, record) => { + if (record.extra || this.state.appKeys.includes(record.MenuID)) { + return <span style={{color: '#1890ff'}}>{text}</span> + } else if (record.interfaces === 'true' || record.msg === 'true') { + return <span>{record.interfaces === 'true' ? <ApiOutlined style={{color: 'orange', marginRight: '5px'}} title="鑿滃崟涓娇鐢ㄤ簡澶栭儴鎺ュ彛" /> : null}{record.msg === 'true' ? <SoundOutlined style={{color: 'orange', marginRight: '5px'}} title="鑿滃崟涓彂閫佷簡娑堟伅" /> : null}{text}</span> + } + return text + } + }, + { + title: '鑿滃崟鍙傛暟', dataIndex: 'MenuNo', key: 'MenuNo', align: 'center' + }, + { + title: '淇敼鏃堕棿', dataIndex: 'modifydate', key: 'modifydate', align: 'center', sorter: true, render: (text, record) => { + if (window.GLOB.upStatus && record.up_action === 'Y') { + return <span style={{color: 'orange'}}>{text}</span> + } + return text + } + }, { title: '鎿嶄綔', key: 'action', align: 'center', render: (text, record) => ( - <div> - <Button type="link" onClick={() => this.deleteMenu(record)} style={{color: '#ff4d4f'}}>鍒犻櫎</Button> + <div style={{minWidth: '125px'}}> + {record.type !== 'none' ? + <Button type="link" onClick={() => this.deleteMenu(record)} style={{color: '#ff4d4f'}}>鍒犻櫎</Button> : + <Button type="link" onClick={() => { + notification.warning({ + top: 92, + message: '褰撳墠绯荤粺鑿滃崟灏氭湭鍒涘缓銆�', + duration: 5 + }) + }} style={{color: '#ff4d4f', opacity: '0.5'}}>鍒犻櫎</Button>} <Button type="link" onClick={() => this.jumpApp(record)} style={{color: '#1890ff', marginLeft: '5px'}}>缂栬緫</Button> </div> ), @@ -48,17 +73,25 @@ targetKeys: [], trees: null, expandedKeys: [], - searchkey: '' + searchkey: '', + appViewList: [], + appKeys: [] } oriTrees = null UNSAFE_componentWillMount() { + document.body.className = '' let param = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param))) + + if (param.lang) { + sessionStorage.setItem('lang', param.lang) + } this.setState({app: param}, () => { this.getTreeList() this.getMenuList() + this.getAppViewList() }) } @@ -71,7 +104,28 @@ } } - getMenuList = (reset) => { + getAppViewList = () => { + const { app } = this.state + + Api.getCloudConfig({ + func: 's_get_keyids', + bid: app.ID + }).then(result => { + if (!result.status) { + notification.warning({ + top: 92, + message: result.message, + duration: 5 + }) + return + } + + let data = result.data || [] + this.setState({appViewList: data, appKeys: data.map(item => item.keys_id)}) + }) + } + + getMenuList = (reset, resolve) => { const { app } = this.state let param = { func: 's_get_app_menus', @@ -84,32 +138,70 @@ param.secretkey = Utils.encrypt(param.LText, param.timestamp) - this.setState({ - loading: true - }) + if (!resolve) { + this.setState({ + loading: true + }) + } Api.getCloudConfig(param).then(result => { if (result.status) { - this.setState({ - menulist: result.menus.map(item => { - item.nodes = '' - item.type = 'view' - if (item.menus_rolelist) { - try { - let pageParam = JSON.parse(window.decodeURIComponent(window.atob(item.menus_rolelist))) - item.nodes = pageParam - if (pageParam.type === 'navbar') { - item.type = 'navbar' - } - } catch (e) { + let ub = app.user_binding === 'true' && app.userbind ? false : true + let im = app.instantMessage ? false : true + + let menus = result.menus.map(item => { + item.nodes = '' + item.type = 'view' + if (item.menus_rolelist) { + try { + let pageParam = JSON.parse(window.decodeURIComponent(window.atob(item.menus_rolelist))) + item.nodes = pageParam + item.interfaces = pageParam.interfaces || 'false' + item.msg = pageParam.msg || 'false' + + if (pageParam.type) { + item.type = pageParam.type + } + + if (pageParam.version !== '1.0') { + item.nodes = '' + } else if (pageParam.login || pageParam.pass) { + item.nodes = '' + } else if (pageParam.type === 'im') { item.nodes = '' } + } catch (e) { + item.nodes = '' } - - return item - }) + + delete item.menus_rolelist + } + + if (app.userbind === item.MenuID) { + item.extra = true + ub = true + } + if (app.instantMessage === item.MenuID) { + item.extra = true + im = true + } + + return item + }) + + if (!im) { + menus.push({nodes: '', type: 'none', extra: true, MenuID: app.instantMessage, MenuName: '鍗虫椂閫氫俊'}) + } + if (!ub) { + menus.push({nodes: '', type: 'none', extra: true, MenuID: app.userbind, MenuName: '鐢ㄦ埛缁戝畾'}) + } + + this.setState({ + menulist: menus }, () => { - if (reset && (!this.oriTrees || this.oriTrees.length === 0)) { + if (resolve) { + this.initMenutree(resolve) + } else if (reset && (!this.oriTrees || this.oriTrees.length === 0)) { this.initMenutree() } else if (!reset && this.oriTrees && this.oriTrees.length === 0) { this.initMenutree() @@ -294,7 +386,8 @@ ParentID: 'mk_app', TypeCharOne: app.kei_no, typename: app.typename, - lang: app.lang + lang: app.lang, + TYPE: 30 }).then(res => { if (res.status) { this.setState({ @@ -316,8 +409,8 @@ } deleteMenu = (record) => { - const { app } = this.state - const _this = this + const { app, appViewList } = this.state + const that = this let param = { func: 'sPC_MainMenu_Del', @@ -327,8 +420,24 @@ lang: app.lang } - if (app.typename === 'pc' && record.nodes && record.nodes.popviews && record.nodes.popviews.length > 0) { - param.MenuID = param.MenuID + ',' + record.nodes.popviews.join(',') + let _param = { + func: 's_kei_link_keyids_addupt', + BID: app.ID, + exec_type: 'x', + LText: '' + } + + let _appViewList = appViewList.filter(item => item.keys_id !== record.MenuID) + + if (appViewList.length !== _appViewList.length) { + _param.LText = _appViewList.map(item => `select '${item.keys_id}','${item.keys_type}','${item.kei_no}','${item.appkey}','${item.bid}','${sessionStorage.getItem('CloudUserID')}','${item.remark}'`) + _param.LText = _param.LText.join(' union all ') + _param.LText = Utils.formatOptions(_param.LText, 'x') + + _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + _param.secretkey = Utils.encrypt('', _param.timestamp) + } else { + _param = null } confirm({ @@ -342,7 +451,21 @@ message: '鎿嶄綔鎴愬姛锛�', duration: 3 }) - _this.getMenuList(true) + that.getMenuList(true) + + if (_param) { + Api.getCloudConfig(_param).then(res => { + if (!res.status) { + notification.warning({ + top: 92, + message: res.message, + duration: 5 + }) + } else { + that.setState({appViewList: _appViewList}) + } + }) + } } else { notification.warning({ top: 92, @@ -376,7 +499,7 @@ confirmLoading: true }) - Api.getSystemConfig({ + Api.getCloudConfig({ func: 'sPC_MainMenu_ReDel', MenuID: targetKeys.join(','), TypeCharOne: app.kei_no, @@ -415,16 +538,23 @@ try { let pageParam = JSON.parse(window.decodeURIComponent(window.atob(item.menus_rolelist))) item.nodes = pageParam - if (pageParam.type === 'navbar') { - item.type = 'navbar' + + if (pageParam.type) { + item.type = pageParam.type + } + + if (pageParam.version !== '1.0') { + item.nodes = '' + } else if (pageParam.login || pageParam.pass) { + item.nodes = '' + } else if (pageParam.type === 'im') { + item.nodes = '' } } catch (e) { item.nodes = '' } - } - if (targetKeys.includes(item.MenuID) && item.nodes && item.nodes.popviews && item.nodes.popviews.length > 0) { - list = [...list, ...item.nodes.popviews] + delete item.menus_rolelist } return item @@ -436,7 +566,7 @@ }) if (app.typename === 'pc' && list.length > 0) { - Api.getSystemConfig({ + Api.getCloudConfig({ func: 'sPC_MainMenu_ReDel', MenuID: list.join(','), TypeCharOne: app.kei_no, @@ -553,12 +683,12 @@ } initTree = () => { - const _this = this + const that = this confirm({ - content: '鍒濆鍖栦細鏍规嵁鑿滃崟閲嶇疆鏉冮檺鏍戯紝纭畾鎵ц鍚楋紵', + content: '鏉冮檺鏍戜細閲嶆柊鐢熸垚锛岀‘瀹氭墽琛屽悧锛�', onOk() { return new Promise(resolve => { - _this.initMenutree(resolve) + that.getMenuList(true, resolve) }) }, onCancel() {} @@ -566,13 +696,13 @@ } syncTree = () => { - const _this = this + const that = this confirm({ content: '鍚屾浼氭牴鎹彍鍗曞垹闄ゆ垨鏂板鑺傜偣锛岀‘瀹氭墽琛屽悧锛�', onOk() { return new Promise(resolve => { - _this.syncMenutree(resolve) + that.syncMenutree(resolve) }) }, onCancel() {} @@ -580,23 +710,23 @@ } saveTree = () => { - const { trees } = this.state - const _this = this + // const { trees } = this.state + const that = this - if (!trees || trees.length === 0) { - notification.warning({ - top: 92, - message: '鏈幏鍙栧埌鏉冮檺淇℃伅锛�', - duration: 5 - }) - return - } + // if (!trees || trees.length === 0) { + // notification.warning({ + // top: 92, + // message: '鏈幏鍙栧埌鏉冮檺淇℃伅锛�', + // duration: 5 + // }) + // return + // } confirm({ content: '纭畾鎵ц鍚楋紵', onOk() { return new Promise(resolve => { - _this.execSave(resolve) + that.execSave(resolve) }) }, onCancel() {} @@ -749,74 +879,103 @@ if (app.typename === 'pc') { route = 'pcdesign' } + if (item.type === 'navbar') { + notification.warning({ + top: 92, + message: '瀵艰埅鏍忎笉鍙崟鐙紪杈戯紝璇峰湪鍚湁瀵艰埅鏍忕殑椤甸潰涓慨鏀广��', + duration: 5 + }) + return + } + + if (app.instantMessage && item.MenuID === app.instantMessage) { + route = 'imdesign' + } window.open(window.location.href.replace(/#.+/ig, `#/${route}/${window.btoa(window.encodeURIComponent(JSON.stringify({...app, MenuID: item.MenuID, type: 'app'})))}`)) } + changeTable = (pagination, filters, sorter) => { + this.setState({sortType: sorter.order || ''}) + } + render () { - const { app, loading, columns, menulist, trees, searchkey } = this.state - let _menulist = menulist + const { app, loading, columns, menulist, trees, searchkey, sortType } = this.state + let _menulist = fromJS(menulist).toJS() if (searchkey) { _menulist = _menulist.filter(item => item.MenuName.toLowerCase().indexOf(searchkey.toLowerCase()) > -1) } + if (sortType === 'ascend') { + _menulist.sort((a, b) => { + if (a.modifydate > b.modifydate) return 1 + if (a.modifydate < b.modifydate) return -1 + return 0 + }) + } else if (sortType === 'descend') { + _menulist.sort((a, b) => { + if (a.modifydate < b.modifydate) return 1 + if (a.modifydate > b.modifydate) return -1 + return 0 + }) + } + return ( <div className="mk-role-manage"> - <ConfigProvider locale={_locale}> - <Header app={app} /> - {loading ? - <div className="loading-mask"> - <Spin size="large" /> - </div> : null - } - <div className="view-wrap"> - <div className="left-view"> - <div className="app-table"> - <div className="app-action"> - <Button className="mk-green" onClick={this.triggerThaw}>瑙e喕鑿滃崟</Button> - <Search placeholder="缁煎悎鎼滅储" onSearch={value => this.setState({ searchkey: value })} enterButton /> - </div> - <Table - rowKey="MenuID" - columns={columns} - dataSource={_menulist} - pagination={false} - /> - </div> - </div> - <div className="right-view"> + <Header app={app} /> + {loading ? + <div className="loading-mask"> + <Spin size="large" /> + </div> : null + } + <div className="view-wrap"> + <div className="left-view"> + <div className="app-table"> <div className="app-action"> - <Button className="mk-primary" onClick={this.initTree}>鍒濆鍖�</Button> - <Button className="mk-purple" onClick={this.syncTree}>鍚屾</Button> - <Button className="mk-green save" onClick={this.saveTree}>淇濆瓨</Button> + <Button className="mk-green" onClick={this.triggerThaw}>瑙e喕鑿滃崟</Button> + <Search placeholder="缁煎悎鎼滅储" onSearch={value => this.setState({ searchkey: value })} enterButton /> </div> - {trees && trees.length ? <Tree - className="draggable-tree" - defaultExpandedKeys={this.state.expandedKeys} - // showLine - draggable - blockNode - onDrop={this.onDrop} - > - {this.renderNode(trees)} - </Tree> : <div className="empty"> - <Empty /> - </div>} + <Table + rowKey="MenuID" + columns={columns} + dataSource={_menulist} + pagination={false} + onChange={this.changeTable} + /> </div> </div> - <Modal - title="瑙i櫎鍐荤粨" - visible={this.state.visible} - width={600} - onOk={this.thawSubmit} - confirmLoading={this.state.confirmLoading} - onCancel={() => this.setState({visible: false, targetKeys: []})} - destroyOnClose - > - <TransferForm onChange={(vals) => this.setState({targetKeys: vals})} menulist={this.state.thawmenulist}/> - </Modal> - </ConfigProvider> + <div className="right-view"> + <div className="app-action"> + <Button className="mk-primary" onClick={this.initTree}>閲嶇疆</Button> + {/* <Button className="mk-purple" onClick={this.syncTree}>鍚屾</Button> */} + <Button className="mk-green save" onClick={this.saveTree}>淇濆瓨</Button> + </div> + {trees && trees.length ? <Tree + className="draggable-tree" + defaultExpandedKeys={this.state.expandedKeys} + // showLine + draggable + blockNode + onDrop={this.onDrop} + > + {this.renderNode(trees)} + </Tree> : <div className="empty"> + <Empty /> + </div>} + </div> + </div> + <Modal + title="瑙i櫎鍐荤粨" + visible={this.state.visible} + width={600} + onOk={this.thawSubmit} + confirmLoading={this.state.confirmLoading} + onCancel={() => this.setState({visible: false, targetKeys: []})} + destroyOnClose + > + <TransferForm onChange={(vals) => this.setState({targetKeys: vals})} menulist={this.state.thawmenulist}/> + </Modal> </div> ) } -- Gitblit v1.8.0