| | |
| | | const { Search } = Input |
| | | const { TabPane } = Tabs |
| | | const { TreeNode, DirectoryTree } = Tree |
| | | let checkedKeysMap = null |
| | | let linkMap = null |
| | | |
| | | let linkMap = new Map() |
| | | let selectMap = null |
| | | |
| | | export default class RoleManage extends Component { |
| | |
| | | state = { |
| | | dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, |
| | | loading: true, |
| | | loadingTree: false, |
| | | roleList: null, |
| | | selectRoleId: '', |
| | | mainMenus: null, |
| | |
| | | initCheckKeys: null |
| | | } |
| | | |
| | | /** |
| | | * @description 获取角色列表 |
| | | */ |
| | | getRoleList = async () => { |
| | | let param = { |
| | | func: 's_rolemenu_get_list' |
| | |
| | | |
| | | if (result.status) { |
| | | this.setState({ |
| | | roleList: result.data, |
| | | loading: false |
| | | roleList: result.data |
| | | }) |
| | | } else { |
| | | this.setState({ |
| | | loading: false |
| | | }) |
| | | notification.warning({ |
| | | top: 92, |
| | | message: result.message, |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description 获取一级菜单,用于构建结构树 |
| | | */ |
| | | getMainMenuList = async () => { |
| | | let param = { |
| | | func: 's_rolemenu_get_FstMenu' |
| | |
| | | |
| | | if (result.status) { |
| | | this.setState({ |
| | | loadingTree: true, |
| | | loading: false, |
| | | mainMenus: result.data.map(item => { |
| | | return { |
| | | title: item.MenuName, |
| | |
| | | this.getAllMenuList() |
| | | }) |
| | | } else { |
| | | this.setState({ |
| | | loading: false |
| | | }) |
| | | notification.warning({ |
| | | top: 92, |
| | | message: result.message, |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description 获取所有菜单节点,形成权限树 |
| | | */ |
| | | getAllMenuList = async () => { |
| | | const { selectRoleId, mainMenus, tabKey } = this.state |
| | | |
| | |
| | | let result = await Api.getSystemConfig(param) |
| | | |
| | | if (result.status) { |
| | | let _tree = null |
| | | let _openKeys = [] |
| | | |
| | | let _state = { |
| | | loading: false |
| | | // MenuID(菜单Id)、MenuName(菜单名称)、OnlySelf(值为true,表示三级菜单,增加-仅页面)、Type(菜单级别) |
| | | // ParentID(父级Id)、Selected(是否选中-已失效)、Tabs( 标签类型)、TypeCharOne 菜单类型PC或其他 |
| | | let _tree = this.getTree(fromJS(mainMenus).toJS(), result.data) |
| | | if (_tree[0]) { |
| | | this.getOpenNode(_tree[0], _openKeys) |
| | | } |
| | | |
| | | if (tabKey === '') { |
| | | let _initCheckKeys = [] // 初始选中的菜单id |
| | | checkedKeysMap = new Map() |
| | | linkMap = new Map() |
| | | selectMap = new Map() |
| | | |
| | | result.data.forEach(item => { |
| | | if (item.Selected !== 'true') return |
| | | |
| | | checkedKeysMap.set(item.MenuID, true) |
| | | _initCheckKeys.push(item.MenuID) |
| | | this.setState({ |
| | | loadingTree: false, |
| | | menuTrees: _tree, |
| | | menuOpenKeys: _openKeys |
| | | }) |
| | | |
| | | _initCheckKeys = Array.from(new Set(_initCheckKeys)) |
| | | |
| | | _tree = this.getTree(JSON.parse(JSON.stringify(mainMenus)), result.data) |
| | | |
| | | if (_tree[0]) { |
| | | this.getOpenNode(_tree[0], _openKeys) |
| | | } |
| | | |
| | | _state.menuTrees = _tree |
| | | _state.initCheckKeys = _initCheckKeys |
| | | _state.checkedKeys = Array.from(checkedKeysMap.keys()) |
| | | _state.menuOpenKeys = _openKeys |
| | | } else { |
| | | _tree = this.getSelectTree(JSON.parse(JSON.stringify(mainMenus)), result.data) |
| | | _tree = _tree.filter(node => node.children) |
| | | |
| | | if (_tree[0]) { |
| | | this.getOpenNode(_tree[0], _openKeys) |
| | | } |
| | | |
| | | _state.selectMenuTrees = _tree |
| | | _state.selectMenuOpenKeys = _openKeys |
| | | } |
| | | |
| | | this.setState(_state) |
| | | } else { |
| | | this.setState({ |
| | | loading: false |
| | | loadingTree: false |
| | | }) |
| | | notification.warning({ |
| | | top: 92, |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description 选择角色且存在权限树时,获取已分配结构 |
| | | */ |
| | | getSelectMenuList = async () => { |
| | | const { selectRoleId, menuTrees, tabKey } = this.state |
| | | if (!menuTrees) return |
| | | |
| | | let param = { |
| | | func: 's_rolemenu_get_Menulist', |
| | | RoleID: selectRoleId |
| | | } |
| | | |
| | | let result = await Api.getSystemConfig(param) |
| | | |
| | | if (result.status) { |
| | | let _openKeys = [] |
| | | |
| | | if (tabKey === '') { |
| | | let _initKeys = result.data.map(item => item.MenuID) |
| | | _initKeys = Array.from(new Set(_initKeys)) |
| | | |
| | | selectMap = new Map() |
| | | this.getCheckedKeys(fromJS(menuTrees).toJS(), _initKeys) |
| | | |
| | | if (menuTrees[0]) { |
| | | this.getOpenNode(menuTrees[0], _openKeys) |
| | | } |
| | | |
| | | this.setState({ |
| | | loadingTree: false, |
| | | initCheckKeys: _initKeys, |
| | | checkedKeys: Array.from(selectMap.keys()), |
| | | menuOpenKeys: _openKeys |
| | | }) |
| | | } else { |
| | | let Keys = result.data.map(item => item.MenuID) |
| | | let _tree = this.getSelectTree(fromJS(menuTrees).toJS(), Keys) |
| | | |
| | | if (_tree[0]) { |
| | | this.getOpenNode(_tree[0], _openKeys) |
| | | } |
| | | |
| | | this.setState({ |
| | | loadingTree: false, |
| | | selectMenuTrees: _tree, |
| | | selectMenuOpenKeys: _openKeys |
| | | }) |
| | | } |
| | | } else { |
| | | this.setState({ |
| | | loadingTree: false |
| | | }) |
| | | notification.warning({ |
| | | top: 92, |
| | | message: result.message, |
| | | duration: 5 |
| | | }) |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description 获取展开节点 |
| | | */ |
| | | getOpenNode = (parentNode, keys) => { |
| | | if (parentNode.children) { |
| | | keys.push(parentNode.key) |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description 获取权限分配树 |
| | | */ |
| | | getTree = (parents, options) => { |
| | | parents.forEach(parent => { |
| | | parent.children = [] |
| | | |
| | | // 添加菜单的子元素 |
| | | options.forEach(option => { |
| | | if (option.ParentID === parent.key) { |
| | | parent.children.push({ |
| | | title: option.MenuName, |
| | | key: option.MenuID, |
| | | selected: parent.selected && option.Selected === 'true', |
| | | addSelf: option.OnlySelf === 'true', |
| | | tabs: option.Tabs |
| | | }) |
| | | } |
| | | }) |
| | | |
| | | |
| | | if (parent.children.length === 0) { |
| | | parent.children = null |
| | | // 针对标签,生成新的id,并保存关联关系(标签不唯一) |
| | | if (parent.tabs) { |
| | | let _uuid = Utils.getuuid() |
| | | linkMap.set(_uuid, parent.key) |
| | | |
| | | if (parent.selected) { |
| | | checkedKeysMap.set(_uuid, true) |
| | | checkedKeysMap.delete(parent.key) |
| | | |
| | | selectMap.set(_uuid, parent.key) |
| | | } |
| | | |
| | | parent.originKey = parent.key |
| | | parent.key = _uuid |
| | | } |
| | | } else { |
| | | if (parent.selected) { |
| | | checkedKeysMap.delete(parent.key) |
| | | } |
| | | // 三级菜单创建子项 |
| | | if (parent.addSelf) { |
| | | let _uuid = Utils.getuuid() |
| | | linkMap.set(_uuid, parent.key) |
| | | |
| | | if (parent.selected) { |
| | | checkedKeysMap.set(_uuid, true) |
| | | } |
| | | parent.subKey = _uuid |
| | | |
| | | parent.children.unshift({ |
| | | title: parent.title + '(仅页面)', |
| | | key: _uuid, |
| | | isSubView: true |
| | | }) |
| | | } |
| | | |
| | | // 针对标签,生成新的id,并保存关联关系(标签不唯一) |
| | | if (parent.tabs) { |
| | | let _uuid = Utils.getuuid() |
| | | linkMap.set(_uuid, parent.key) |
| | | |
| | | if (parent.selected) { |
| | | selectMap.set(_uuid, parent.key) |
| | | } |
| | | |
| | | parent.originKey = parent.key |
| | | parent.key = _uuid |
| | | } |
| | | |
| | | parent.children = this.getTree(parent.children, options) |
| | | } |
| | | }) |
| | | |
| | | return parents |
| | | } |
| | | |
| | | getSelectTree = (parents, options) => { |
| | | /** |
| | | * @description 获取已选择的节点 |
| | | */ |
| | | getCheckedKeys = (parents, initKeys) => { |
| | | parents.forEach(parent => { |
| | | parent.children = [] |
| | | |
| | | options.forEach(option => { |
| | | if (option.ParentID === parent.key) { |
| | | parent.children.push({ |
| | | title: option.MenuName, |
| | | key: option.MenuID, |
| | | tabs: option.Tabs |
| | | }) |
| | | if ((parent.originKey && initKeys.indexOf(parent.originKey) > -1) || initKeys.indexOf(parent.key) > -1) { |
| | | if (parent.children) { |
| | | if (parent.subKey) { |
| | | selectMap.set(parent.subKey, true) |
| | | } |
| | | this.getCheckedKeys(parent.children, initKeys) |
| | | } else { |
| | | selectMap.set(parent.key, true) |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | |
| | | parent.key = Utils.getuuid() |
| | | /** |
| | | * @description 生成已分配权限的结构树 |
| | | */ |
| | | getSelectTree = (parents, options) => { |
| | | return parents.filter(parent => { |
| | | if ((parent.originKey && options.indexOf(parent.originKey) > -1) || options.indexOf(parent.key) > -1) { |
| | | if (parent.children) { |
| | | parent.children = this.getSelectTree(parent.children, options) |
| | | if (parent.children.length === 0) { |
| | | parent.children = null |
| | | } else { |
| | | parent.children = this.getSelectTree(parent.children, options) |
| | | } |
| | | } |
| | | return true |
| | | } else if (parent.isSubView) { |
| | | return true |
| | | } |
| | | return false |
| | | }) |
| | | |
| | | return parents |
| | | } |
| | | |
| | | /** |
| | | * @description 角色切换 |
| | | */ |
| | | changeRole = (role) => { |
| | | const { selectRoleId } = this.state |
| | | |
| | |
| | | |
| | | this.setState({ |
| | | selectRoleId: role.RoleID, |
| | | menuTrees: null, |
| | | checkedKeys: [], |
| | | menuOpenKeys: [], |
| | | selectMenuTrees: null, |
| | | selectMenuOpenKeys: [] |
| | | loadingTree: true |
| | | }, () => { |
| | | this.getAllMenuList() |
| | | this.getSelectMenuList() |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * @description 获取树节点 |
| | | */ |
| | | renderTreeNodes = (data) => { |
| | | return data.map(item => { |
| | | if (item.children) { |
| | |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * @description 节点选择事件 |
| | | */ |
| | | onCheck = (checkedKeys, info) => { |
| | | this.setState({ |
| | | checkedKeys: checkedKeys, |
| | |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * @description 已分配与未分配切换 |
| | | */ |
| | | changeTab = (key) => { |
| | | const { menuTrees, selectMenuTrees } = this.state |
| | | const { selectRoleId } = this.state |
| | | |
| | | this.setState({ |
| | | tabKey: key === 'selected' ? key : '' |
| | | tabKey: key === 'selected' ? key : '', |
| | | loadingTree: true |
| | | }, () => { |
| | | if ((key === 'selected' && !selectMenuTrees) || (key === 'all' && !menuTrees)) { |
| | | this.getAllMenuList() |
| | | if (selectRoleId) { |
| | | this.getSelectMenuList() |
| | | } else { |
| | | this.setState({ |
| | | selectMenuTrees: [], |
| | | loadingTree: false |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * @description 提交已选的权限 |
| | | */ |
| | | roleSubmit = async () => { |
| | | const { checkedKeys, halfCheckedKeys, selectRoleId, initCheckKeys } = this.state |
| | | |
| | |
| | | _keys.push(key) |
| | | } |
| | | }) |
| | | _cKeys = new Map(_cKeys.map(key => [key, true])) |
| | | _keys = new Map(_keys.map(key => [key, true])) |
| | | |
| | | Array.from(selectMap.keys()).forEach(key => { |
| | | if (!_cKeys.has(key)) { |
| | | _keys.delete(selectMap.get(key)) |
| | | _keys = Array.from(new Set(_keys)) |
| | | } |
| | | }) |
| | | |
| | | _keys = Array.from(_keys.keys()) |
| | | } |
| | | |
| | | // let _LText = _keys.map(key => `select '${key}' as MenuID`) |
| | | // _LText = _LText.join(' union all ') |
| | | |
| | | let param = { |
| | | func: 's_rolemenu_sub', |
| | | RoleID: selectRoleId, |
| | | // LText: Utils.formatOptions(_LText) |
| | | RoleMenu: _keys.map(key => { |
| | | return {MenuID: key} |
| | | }) |
| | |
| | | }) |
| | | this.setState({ |
| | | submitloading: false, |
| | | menuTrees: null, |
| | | checkedKeys: [], |
| | | menuOpenKeys: [], |
| | | selectMenuTrees: null, |
| | | selectMenuOpenKeys: [] |
| | | loadingTree: true |
| | | }, () => { |
| | | this.getAllMenuList() |
| | | this.getSelectMenuList() |
| | | }) |
| | | } else { |
| | | this.setState({ |
| | | submitloading: false |
| | | }) |
| | | notification.warning({ |
| | | top: 92, |
| | | message: result.message, |
| | | duration: 5 |
| | | }) |
| | | this.setState({ |
| | | submitloading: false |
| | | }) |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | render() { |
| | | const { roleList, loading, primarykey, menuTrees, checkedKeys, menuOpenKeys, selectMenuTrees, tabKey, selectRoleId, selectMenuOpenKeys, submitloading } = this.state |
| | | const { roleList, loading, loadingTree, primarykey, menuTrees, checkedKeys, menuOpenKeys, selectMenuTrees, tabKey, selectRoleId, selectMenuOpenKeys, submitloading } = this.state |
| | | |
| | | let _roleList = [] |
| | | |
| | |
| | | <Col span={19}> |
| | | <Tabs defaultActiveKey="all" tabBarExtraContent={!tabKey && selectRoleId ? <Button type="primary" loading={submitloading} onClick={this.roleSubmit}>提交</Button> : null} onChange={this.changeTab}> |
| | | <TabPane tab="菜单列表" key="all"> |
| | | {menuTrees && menuTrees.length > 0 ? <Tree |
| | | {!loadingTree && menuTrees && menuTrees.length > 0 ? <Tree |
| | | checkable |
| | | selectable={false} |
| | | defaultExpandedKeys={menuOpenKeys} |
| | |
| | | > |
| | | {this.renderTreeNodes(menuTrees)} |
| | | </Tree> : null} |
| | | {menuTrees && menuTrees.length === 0 ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} |
| | | {!loading && !menuTrees ? <Spin className="load-tree" /> : null} |
| | | {!loadingTree && (!menuTrees || menuTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} |
| | | {loadingTree ? <Spin className="load-tree" /> : null} |
| | | </TabPane> |
| | | <TabPane tab="已授权菜单" key="selected"> |
| | | {selectMenuTrees && selectMenuTrees.length > 0 ? <DirectoryTree multiple defaultExpandedKeys={selectMenuOpenKeys}> |
| | | {!loadingTree && selectMenuTrees && selectMenuTrees.length > 0 ? <DirectoryTree multiple defaultExpandedKeys={selectMenuOpenKeys}> |
| | | {this.renderTreeNodes(selectMenuTrees)} |
| | | </DirectoryTree> : null} |
| | | {selectMenuTrees && selectMenuTrees.length === 0 ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} |
| | | {!loading && !selectMenuTrees ? <Spin className="load-tree" /> : null} |
| | | {!loadingTree && (!selectMenuTrees || selectMenuTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} |
| | | {loadingTree ? <Spin className="load-tree" /> : null} |
| | | </TabPane> |
| | | </Tabs> |
| | | </Col> |