index.jsx 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import React, { useState, useEffect } from 'react';
  2. import { Checkbox, Input, Card, Form, Button, Row, Col, Spin, message } from 'antd';
  3. import { connect } from 'dva';
  4. import XForm, { FieldTypes } from '@/components/XForm';
  5. import request from '@/utils/request';
  6. import router from 'umi/router';
  7. import apis from '@/services/apis';
  8. const { TextArea } = Input;
  9. /**
  10. *
  11. *
  12. * @param {*} props
  13. * @returns
  14. */
  15. const Poster = props => {
  16. const userMenus = props.user.currentUser.menus;
  17. const userBtns = props.user.currentUser.buttons;
  18. console.log(userMenus)
  19. // 获取当前所有菜单
  20. const [data, setData] = useState({ data: [] })
  21. const [buttonData, setButtonData] = useState([])
  22. // 展示要显示的菜单和按钮----(编辑)
  23. const [dataMenuId, setDataMenuId] = useState([])
  24. const [dataButtonId, setDataButtonId] = useState([])
  25. const [loading, setLoading] = useState(false);
  26. useEffect(() => {
  27. // 新增和编辑用一个页面
  28. if (props.location.query) {
  29. const { id } = props.location.query
  30. if (id) {
  31. buttonAndMenuList('', id)
  32. }
  33. }
  34. // menuList({ pageNum: 1, pageSize: 100 })
  35. buttonList({ pageNum: 1, pageSize: 100 })
  36. }, [])
  37. // 当前所有的菜单
  38. function menuList(params) {
  39. request({ ...apis.role.menuList, params: { ...params } }).then((data) => {
  40. setData(data)
  41. }).catch((err) => {
  42. console.log(err)
  43. message.info(err.msg || err.message)
  44. })
  45. }
  46. // 所有按钮
  47. function buttonList(params) {
  48. request({ ...apis.role.buttonList, params: { ...params } }).then((data) => {
  49. setButtonData(data)
  50. }).catch((err) => {
  51. console.log(err)
  52. })
  53. }
  54. // 根据角色id查询当前的菜单及其按钮
  55. function buttonAndMenuList(params, ids) {
  56. setLoading(true)
  57. request({ ...apis.role.buttonAndMenuList, urlData: { id: ids }, params: { ...params } }).then(data => {
  58. setLoading(false)
  59. props.form.setFieldsValue({ roleName: data.roleName })
  60. console.log(data)
  61. setData(data)
  62. // 获取所有的权限Id
  63. if (data.sysMenuList) {
  64. setDataMenuId(data.sysMenuList.map(item => item && item.menuId))
  65. // setDataButtonId((data.sysMenuList.map(item => item.sysButtonInMenu && item.sysButtonInMenu.map(btn => btn.btnId).join(',')).filter(f => f !== '').join(',').split(',')).map(a => parseInt(a) ) )
  66. setDataButtonId(data.sysButtonInMenu.map(item => item && item.btnId))
  67. }
  68. }).catch((err) => {
  69. console.log(err)
  70. message.info(err.msg || err.message)
  71. })
  72. }
  73. // const [menus, setMenus] = useState([]);
  74. // 判断menus是否有值
  75. const [menus, setMenus] = useState([]);
  76. const [but, setBut] = useState([]);
  77. const addMenus = m => setMenus([...menus, m])
  78. const delMenus = m => setMenus(menus.filter(x => x.menuId !== m.menuId));
  79. const handleMenuChange = m => e => {
  80. // 如果是根菜单, 把子菜单挑出来
  81. const isMenuRoot = m.parentCode === '-1'
  82. const subMenus = isMenuRoot ? userMenus.filter(x => x.parentCode == m.menuId) : []
  83. // 把子菜单与当前对象, 同时作为当前操作对象
  84. const currentMenus = [ m, ...subMenus ]
  85. // 先把选中列表中, 当前操作对象去掉
  86. const leftCheckedMenusIds = dataMenuId.filter(x => !currentMenus.some(it => it.menuId == x))
  87. // 当前选中菜单
  88. const currentCheckedMenus = e.target.checked ? currentMenus : []
  89. // 计算所有选中菜单
  90. let checkedMenus = [
  91. ...currentCheckedMenus,
  92. ...userMenus.filter(x => leftCheckedMenusIds.some(it => it == x.menuId)),
  93. ]
  94. // 如果子菜单全部取消选择, 那么根菜单也取消选择
  95. // 如果子菜单有一个选中, 那么根菜单也选中
  96. if (!isMenuRoot) {
  97. const children = checkedMenus.filter(x => x.menuRoot === m.menuRoot && x.menuId !== m.menuRoot)
  98. if (!children || children.length < 1) {
  99. checkedMenus = checkedMenus.filter(x => x.menuId !== m.menuRoot)
  100. } else {
  101. const hasRootMenu = checkedMenus.some(x => x.menuId === m.menuRoot)
  102. if (!hasRootMenu) {
  103. const rootMenu = userMenus.filter(x => x.menuId === m.menuRoot)[0]
  104. if (rootMenu) {
  105. checkedMenus.push(rootMenu)
  106. }
  107. }
  108. }
  109. }
  110. // 只要菜单选中, 所属按钮全部选中
  111. // 菜单取消选择, 所有按钮全部取消选择
  112. const currentMenuBtns = currentMenus.reduce((acc, it) => [...acc, ...userBtns.filter(x => x.menuId === it.menuId)], [])
  113. const currentCheckedMenuBtns = currentCheckedMenus.reduce((acc, it) => [...acc, ...userBtns.filter(x => x.menuId === it.menuId)], [])
  114. const checkedBtns = dataButtonId.filter(x => !currentMenuBtns.some(it => it.btnId === x)).map(x => userBtns.filter(it => x == it.btnId)[0]).concat(...currentCheckedMenuBtns)
  115. setMenus(checkedMenus)
  116. setDataMenuId(checkedMenus.map(x => x.menuId))
  117. setDataButtonId(checkedBtns.map(x => x.btnId))
  118. setBut(checkedBtns)
  119. }
  120. // 判断menus是否有值
  121. const addBut = m => setBut([...but, m])
  122. const delBut = m => setBut(but.filter(x => x.menuId !== m.menuId));
  123. const handleButChange = m => e => {
  124. // 如果有一个按钮选中, 那么对应的菜单也需要选中
  125. // 如果没有一个兄弟节点选中, 不做任何处理
  126. if (e.target.checked) {
  127. const parentMenuId = dataMenuId.filter(x => x === m.menuId)[0]
  128. if (!parentMenuId) {
  129. const parentMenu = userMenus.filter(x => x.menuId === m.menuId)[0]
  130. const parentMenuRoot = userMenus.filter(x => x.menuId === parentMenu.menuRoot)[0]
  131. const checkedMenus = menus.concat(parentMenu).concat(parentMenuRoot)
  132. setMenus(checkedMenus)
  133. setDataMenuId(checkedMenus.map(x => x.menuId))
  134. }
  135. }
  136. if (e.target.checked) {
  137. setDataButtonId(dataButtonId.concat(m.btnId))
  138. addBut(m)
  139. } else {
  140. setDataButtonId(dataButtonId.filter(item => item !== m.btnId));
  141. delBut(m)
  142. }
  143. }
  144. const gridStyle1 = {
  145. width: '16%',
  146. textAlign: 'left',
  147. height: '72px',
  148. padding:'24px'
  149. };
  150. const gridStyle2 = {
  151. width: '84%',
  152. textAlign: 'left',
  153. height: '72px',
  154. };
  155. function toRoleList() {
  156. router.push({
  157. pathname: '/staff/RoleList',
  158. });
  159. }
  160. function updateAuthMenu(data) {
  161. setLoading(true)
  162. request({ ...apis.role.updateAuthMenu, data: { ...data } }).then((data) => {
  163. setLoading(false)
  164. toRoleList()
  165. }).catch((err) => {
  166. console.log(err)
  167. })
  168. }
  169. function handleSubmit(e) {
  170. e.preventDefault();
  171. props.form.validateFields((err, values) => {
  172. if (values.roleName === undefined || values.roleName === '') {
  173. message.error('请输入角色名称')
  174. return
  175. }
  176. if (props.location.query.id !== undefined) {
  177. console.log('menus', menus)
  178. const sumitMenu = userMenus.filter(item => dataMenuId.includes(item.menuId))
  179. const sumitBtn = buttonData.filter(item => dataButtonId.includes(item.btnId))
  180. updateAuthMenu({ sysMenu: sumitMenu, name: values.roleName, id: props.location.query.id, sysButton: sumitBtn })
  181. } else {
  182. updateAuthMenu({ sysMenu: menus, name: values.roleName, id: props.location.query.id, sysButton: but })
  183. }
  184. });
  185. }
  186. const { getFieldDecorator } = props.form;
  187. return (
  188. <Card>
  189. <div>
  190. <Spin spinning={ loading } size="large">
  191. <Form labelCol={{ span: 6 }} wrapperCol={{ span: 12 }} onSubmit={handleSubmit}>
  192. <Form.Item label="角色名称">
  193. {getFieldDecorator('roleName', {
  194. rules: [{ required: true, message: '请输入角色名称' }],
  195. })(<Input />)}
  196. </Form.Item>
  197. {userMenus.map(item => (
  198. (item.parentCode === '-1') &&
  199. <Row >
  200. <Col span={6}>
  201. </Col>
  202. <Col span={18}>
  203. <Card title={<Checkbox checked={dataMenuId.includes(item.menuId)} onChange={handleMenuChange(item)}>{item.name}</Checkbox>} bordered style={{ width: '100%', alignItems: 'center',margin:'10px 0', boxShadow:'3px 3px 10px rgba(0,0,0,0.15)',borderRadius:'8px'}} >
  204. {
  205. userMenus.map(menu => (
  206. (item.menuId === menu.menuRoot && item.menuId !== menu.menuId) &&
  207. <>
  208. <Card.Grid style={gridStyle1} >
  209. <Checkbox checked={dataMenuId.includes(menu.menuId)} onChange={handleMenuChange(menu)}>{menu.name}</Checkbox>
  210. </Card.Grid>
  211. <Card.Grid style={gridStyle2}>
  212. {buttonData.length > 0 && buttonData.map(btn => (
  213. <>
  214. {
  215. btn.menuId === menu.menuId &&
  216. <Checkbox checked={dataButtonId.includes(btn.btnId)} onChange={handleButChange(btn)}>{btn.name}</Checkbox>
  217. }
  218. </>
  219. ))}
  220. </Card.Grid>
  221. </>
  222. ))
  223. }
  224. </Card>
  225. </Col>
  226. </Row>
  227. ))}
  228. <Form.Item wrapperCol={{ span: 15, offset: 7 }} style={{ marginTop: '10px' }}>
  229. <Button type="primary" htmlType="submit">
  230. 保存
  231. </Button>
  232. <Button onClick = {toRoleList}>
  233. 取消
  234. </Button>
  235. </Form.Item>
  236. </Form>
  237. </Spin>
  238. </div>
  239. </Card>
  240. )
  241. }
  242. const WrappedNormalLoginForm = Form.create({ name: 'Poster' })(Poster);
  243. export default connect(({ user }) => ({ user }))(WrappedNormalLoginForm);