知与行后台管理端

addRole.jsx 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. import React, { useState, useEffect } from 'react';
  2. import { Checkbox, Input, Card, Form, Button, Row, Col, Spin } from 'antd';
  3. import { connect } from 'dva';
  4. import XForm, { FieldTypes } from '../../../components/XForm';
  5. import request from '../../../utils/request';
  6. import channels from './channelList.less';
  7. import { resolve, join } from 'path';
  8. import router from 'umi/router';
  9. import apis from '../../../services/apis';
  10. const { TextArea } = Input;
  11. /**
  12. *
  13. *
  14. * @param {*} props
  15. * @returns
  16. */
  17. const Poster = props => {
  18. const userMenus = props.user.currentUser.menus;
  19. const userBtns = props.user.currentUser.buttons;
  20. // 获取当前所有菜单
  21. const [data, setData] = useState({ data: [] })
  22. const [buutonDate, setBuutonDate] = useState({})
  23. // 展示要显示的菜单和按钮----(编辑)
  24. const [dataMenuId, setDataMenuId] = useState([])
  25. const [dataButtonId, setDataButtonId] = useState([])
  26. const [loading, setLoading] = useState(true);
  27. useEffect(() => {
  28. // 新增和编辑用一个页面
  29. if (props.location.query) {
  30. const { id } = props.location.query
  31. if (id) {
  32. buttonAndMenuList('', id)
  33. }
  34. }
  35. // menuList({ pageNum: 1, pageSize: 100 })
  36. buttonList({ pageNum: 1, pageSize: 100 })
  37. }, [])
  38. // 当前所有的菜单
  39. function menuList(params) {
  40. request({ ...apis.role.menuList, params: { ...params } }).then((data) => {
  41. setData(data)
  42. }).catch((err) => {
  43. console.log(err)
  44. message.info(err.msg || err.message)
  45. })
  46. }
  47. // 所有按钮
  48. function buttonList(params) {
  49. request({ ...apis.role.buttonList, params: { ...params } }).then((data) => {
  50. setBuutonDate(data)
  51. }).catch((err) => {
  52. console.log(err)
  53. })
  54. }
  55. // 根据角色id查询当前的菜单及其按钮
  56. function buttonAndMenuList(params, ids) {
  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 addMenus = m => setMenus([...menus, m])
  77. const delMenus = m => setMenus(menus.filter(x => x.menuId !== m.menuId));
  78. const handleMenuChange = m => e => {
  79. if (e.target.checked) {
  80. setDataMenuId(dataMenuId.concat(m.menuId))
  81. addMenus(m)
  82. } else {
  83. setDataMenuId(dataMenuId.filter(item => item !== m.menuId));
  84. delMenus(m)
  85. }
  86. }
  87. const [but, setBut] = useState([]);
  88. // 判断menus是否有值
  89. const addBut = m => setBut([...but, m])
  90. const delBut = m => setBut(but.filter(x => x.menuId !== m.menuId));
  91. const handleButChange = m => e => {
  92. if (e.target.checked) {
  93. setDataButtonId(dataButtonId.concat(m.btnId))
  94. addBut(m)
  95. } else {
  96. setDataButtonId(dataButtonId.filter(item => item !== m.btnId));
  97. delBut(m)
  98. }
  99. }
  100. const gridStyle1 = {
  101. width: '16%',
  102. textAlign: 'left',
  103. height: '72px',
  104. padding:'24px 10px'
  105. };
  106. const gridStyle2 = {
  107. width: '84%',
  108. textAlign: 'left',
  109. height: '72px',
  110. };
  111. function toRoleList() {
  112. router.push({
  113. pathname: '/staff/RoleList',
  114. });
  115. }
  116. function updateAuthMenu(data) {
  117. request({ ...apis.role.updateAuthMenu, data: { ...data } }).then((data) => {
  118. toRoleList()
  119. }).catch((err) => {
  120. console.log(err)
  121. })
  122. }
  123. function handleSubmit(e) {
  124. e.preventDefault();
  125. props.form.validateFields((err, values) => {
  126. if (props.location.query.id !== undefined) {
  127. console.log('menus', menus)
  128. const sumitMenu = userMenus.filter(item => dataMenuId.includes(item.menuId))
  129. const sumitBtn = buutonDate.filter(item => dataButtonId.includes(item.btnId))
  130. updateAuthMenu({ sysMenu: sumitMenu, name: values.roleName, id: props.location.query.id, sysButton: sumitBtn })
  131. } else {
  132. updateAuthMenu({ sysMenu: menus, name: values.roleName, id: props.location.query.id, sysButton: but })
  133. }
  134. });
  135. }
  136. const { getFieldDecorator } = props.form;
  137. return (
  138. <>
  139. <div>
  140. <Spin spinning={ loading } size="large">
  141. <Form labelCol={{ span: 6 }} wrapperCol={{ span: 12 }} onSubmit={handleSubmit}>
  142. <Form.Item label="角色名称">
  143. {getFieldDecorator('roleName', {
  144. rules: [{ required: true, message: '请输入角色名称' }],
  145. })(<Input className={channels.inpuit} />)}
  146. </Form.Item>
  147. {userMenus.map(item => (
  148. (item.parentCode === '-1') &&
  149. <Row >
  150. <Col span={6}>
  151. </Col>
  152. <Col span={18}>
  153. <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'}} >
  154. {
  155. userMenus.map(menu => (
  156. (item.menuId === menu.menuRoot && item.menuId !== menu.menuId) &&
  157. <>
  158. <Card.Grid style={gridStyle1} >
  159. <Checkbox checked={dataMenuId.includes(menu.menuId)} onChange={handleMenuChange(menu)}>{menu.name}</Checkbox>
  160. </Card.Grid>
  161. <Card.Grid style={gridStyle2}>
  162. {buutonDate.length > 0 && buutonDate.map(btn => (
  163. <>
  164. {
  165. btn.menuId === menu.menuId &&
  166. <Checkbox checked={dataButtonId.includes(btn.btnId)} onChange={handleButChange(btn)}>{btn.name}</Checkbox>
  167. }
  168. </>
  169. ))}
  170. </Card.Grid>
  171. </>
  172. ))
  173. }
  174. </Card>
  175. </Col>
  176. </Row>
  177. ))}
  178. <Form.Item wrapperCol={{ span: 15, offset: 7 }} style={{ marginTop: '10px' }}>
  179. <Button type="primary" htmlType="submit">
  180. 保存
  181. </Button>
  182. <Button className={channels.formButton} htmlType="submit" onChange = {toRoleList}>
  183. 取消
  184. </Button>
  185. </Form.Item>
  186. </Form>
  187. </Spin>
  188. </div>
  189. </>
  190. )
  191. }
  192. const WrappedNormalLoginForm = Form.create({ name: 'Poster' })(Poster);
  193. export default connect(({ user }) => ({ user }))(WrappedNormalLoginForm);