1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import React, { useState, useEffect } from 'react';
  2. import { history } from 'umi';
  3. import { PageContainer } from '@ant-design/pro-layout';
  4. import { Button, Card, notification } from 'antd';
  5. import request from '@/utils/request';
  6. import RoleForm from './components/Form';
  7. import RoleMenu from './components/Menu';
  8. export default (props) => {
  9. const { id } = props.location.query;
  10. const [loading, setLoading] = useState(false);
  11. const [saveLoading, setSaveLoading] = useState(false);
  12. const [role, setRole] = useState({});
  13. // 数据库授权菜单
  14. const [roleMenu, setRoleMenu] = useState([]);
  15. // 待保存菜单
  16. const [menuData, setMenuData] = useState([]);
  17. const handleFormChange = (newRole) => {
  18. setRole(newRole);
  19. };
  20. const handleMenuChange = (menuList) => {
  21. setMenuData(menuList);
  22. };
  23. const handleMenuSave = () => {
  24. const data = menuData.map((m) => ({ roleId: id, menuId: m.menuId }));
  25. setSaveLoading(true);
  26. request(`/role-menu/${id}`, { method: 'post', data })
  27. .then(() => {
  28. setRoleMenu(data);
  29. setMenuData([]);
  30. setSaveLoading(false);
  31. notification.success({ message: '操作成功' });
  32. })
  33. .catch((e) => {
  34. setSaveLoading(false);
  35. notification.error({ message: e.message });
  36. });
  37. };
  38. useEffect(() => {
  39. if (id) {
  40. setLoading(true);
  41. request(`/role/${id}`)
  42. .then((res) => {
  43. setRole(res);
  44. setRoleMenu(res.menuList || []);
  45. setMenuData([]);
  46. setLoading(false);
  47. })
  48. .catch((e) => {
  49. setLoading(false);
  50. notification.error({ message: e.message });
  51. });
  52. }
  53. }, [id]);
  54. return (
  55. <PageContainer
  56. header={{
  57. extra: [
  58. <Button key="1" onClick={() => history.go('-1')}>
  59. 返回
  60. </Button>,
  61. ],
  62. }}
  63. >
  64. <Card style={{ width: '100%' }} loading={loading}>
  65. <RoleForm role={role} onChange={handleFormChange} />
  66. </Card>
  67. <Card
  68. title="授权菜单"
  69. style={{ width: '100%', marginTop: '2em' }}
  70. extra={
  71. <Button
  72. type="primary"
  73. disabled={!menuData.length}
  74. loading={saveLoading}
  75. onClick={handleMenuSave}
  76. >
  77. 保存
  78. </Button>
  79. }
  80. >
  81. <RoleMenu roleMenu={roleMenu} onChange={handleMenuChange} />
  82. </Card>
  83. </PageContainer>
  84. );
  85. };