index.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. import { useEffect, useState } from 'react';
  2. import { useSelector } from 'react-redux'
  3. /*import { useDispatch,useSelector } from 'react-redux'*/
  4. import { Table, Modal, message, Space, Form, Input, Button, Row, Col, Select } from 'antd';
  5. import { PlusOutlined } from '@ant-design/icons';
  6. import AddRole from './AddRole';
  7. import './index.less';
  8. import apiObj from '@api/index';
  9. import RoleContext from './role-context';
  10. import { pickCheckedTreeIds, getValueFromEvent } from '@utils/index'
  11. const { post, api, xPost } = apiObj;
  12. const { Option } = Select;
  13. function RoleManager() {
  14. useEffect(() => {
  15. getTableData();
  16. }, []);
  17. const [dataSource, setDataSource] = useState([]); //列表数据
  18. const [roleDetail, setRoleDetail] = useState(null); //角色详情数据
  19. const [visible, setVisible] = useState(false); //删除禁用确认弹窗显示
  20. const [addVisible, setAddVisible] = useState(false); //新增页面显示
  21. const [confirmLoading, setConfirmLoading] = useState(false);
  22. //弹窗类型:1删除 2有用户删除 3禁用 4有用户禁用
  23. const [modalType, setModalType] = useState(1);
  24. const [operId, setOperId] = useState(''); //当前操作的角色id
  25. const [total, setTotal] = useState(0);
  26. const [size, setSize] = useState(15);
  27. const [current, setCurrent] = useState(1);
  28. const [params, setParams] = useState({
  29. pages: 1,
  30. current: 1,
  31. size: 15
  32. });
  33. //从state中取出状态、类型列表
  34. const staticInfo = useSelector(state => {
  35. return state.staticInfo;
  36. });
  37. const { statusList } = staticInfo;
  38. const tipText = {
  39. 1: '确定要删除该角色?',
  40. 2: '当前角色存在用户,删除后用户将一并被删除',
  41. 3: '确定要禁用该角色?',
  42. 4: '当前角色存在用户,禁用后用户将一并被禁用',
  43. };
  44. let data = {
  45. pages: 1,
  46. current: 1,
  47. size: size
  48. }
  49. //获取表格数据
  50. function getTableData(param) {
  51. post(api.getRolePage, param || params).then((res) => {
  52. if (res.data.code === 200) {
  53. const data = res.data.data;
  54. setDataSource(data.records);
  55. setTotal(data.total)
  56. }
  57. })
  58. }
  59. //启用/禁用
  60. function enable(flag, id) {
  61. const param = { roleId: id || operId, status: flag };
  62. xPost(api.disableRole, param).then((res) => {
  63. if (res.data.code === 200) {
  64. getTableData();
  65. setVisible(false);
  66. message.success((flag ? '启用' : '禁用') + "成功");
  67. } else {
  68. message.warning(res.data.message || '操作失败');
  69. }
  70. }).catch(() => {
  71. message.error("接口出错");
  72. });
  73. }
  74. //删除
  75. function onDelete() {
  76. const param = { roleId: operId };
  77. xPost(api.deleteRole, param).then((res) => {
  78. if (res.data.code === 200) {
  79. getTableData();
  80. setVisible(false);
  81. message.success("删除成功");
  82. } else {
  83. message.warning(res.data.message || '操作失败');
  84. }
  85. }).catch(() => {
  86. message.error("接口出错");
  87. });
  88. }
  89. //显示弹窗
  90. function showModal(type, id) {
  91. setModalType(type);
  92. setOperId(id);
  93. setVisible(true);
  94. }
  95. //弹窗确认事件
  96. function handleOk() {
  97. if ("1,2".indexOf(modalType) > -1) {
  98. onDelete();
  99. } else if ("3,4".indexOf(modalType) > -1) {
  100. enable(0);
  101. }
  102. }
  103. //弹窗取消
  104. function handleCancel() {
  105. setVisible(false);
  106. setAddVisible(false);
  107. }
  108. //新增角色弹窗
  109. function showAddRole() {
  110. setAddVisible(true);
  111. }
  112. function getRoleDetail(id) {
  113. return xPost(api.getRoleById, { roleId: id });
  114. }
  115. //修改角色
  116. async function editRole(id) {
  117. const data = await getRoleDetail(id);
  118. const detail = data.data;
  119. if (detail.code === 200) {
  120. const content = detail.data;
  121. const menuData = content.loginUserMenuResourceTree;
  122. const loginSoftwares = content.loginSoftwares;
  123. let softwares = [], sids = [];
  124. for (let i = 0; i < menuData.length; i++) {
  125. const obj = pickCheckedTreeIds(menuData[i]);
  126. softwares.push(obj);
  127. }
  128. for (let j = 0; j < loginSoftwares.length; j++) {
  129. const obj = loginSoftwares[j];
  130. if (obj.relation == '1') {
  131. sids.push(obj.id);
  132. }
  133. }
  134. const fData = Object.assign({}, content, { sids, softwares });
  135. setRoleDetail(fData);
  136. }
  137. setAddVisible(true);
  138. }
  139. //保存
  140. function addRole(formData) {
  141. let url = api.addRole;
  142. const arr = formData.softwares.filter((it) => {
  143. if (Object.keys(it).length && it.softwareMenuIds && it.softwareMenuIds.length) {
  144. return it;
  145. }
  146. });
  147. if (roleDetail) { //修改角色
  148. formData.id = roleDetail.id;
  149. url = api.updateRole;
  150. }
  151. formData.softwares = arr;
  152. post(url, formData).then((res) => {
  153. if (res.data.code === 200) {
  154. getTableData();
  155. setAddVisible(false);
  156. setRoleDetail(null)
  157. message.success("添加成功");
  158. } else {
  159. message.warning(res.data.message || '操作失败');
  160. }
  161. }).catch(() => {
  162. message.error("接口出错");
  163. });
  164. }
  165. function goBack() {
  166. setAddVisible(false);
  167. setRoleDetail(null)
  168. getTableData();
  169. }
  170. function onSizeChange(current, pageSize) {
  171. params.current = current
  172. params.size = pageSize
  173. setSize(pageSize)
  174. setCurrent(current)
  175. setParams(params)
  176. getTableData()
  177. }
  178. function changePage(page, pageSize) {
  179. params.current = page
  180. params.size = pageSize
  181. setCurrent(page)
  182. setParams(params)
  183. getTableData()
  184. }
  185. //表格渲染
  186. function RenderTable() {
  187. const columns = [
  188. { title: '角色名称', dataIndex: 'name', key: 'name' },
  189. { title: '角色描述', dataIndex: 'remark', key: 'remark' },
  190. {
  191. title: '状态', key: 'statusName', render: (row) => {
  192. return (<span className={(row.status === '1') ? 'Enable' : 'Disable'}>{row.statusName}</span>)
  193. }
  194. },
  195. /*{ title: '创建时间', dataIndex: 'gmtCreate', key: 'gmtCreate' },*/
  196. {
  197. title: '操作', key: 'operation', render: (row, i) => {
  198. //console.log(21,row)
  199. if (row.rootFlag) {
  200. return '-'
  201. }
  202. return (<Space size="middle">
  203. <a onClick={() => editRole(row.id)}>修改</a>
  204. {row.status === '1' ? (<a className="disable" onClick={() => showModal(row.hasUserFlag ? 4 : 3, row.id)}>禁用</a>) : (<a onClick={() => enable(1, row.id)}>启用</a>)}
  205. <a className="delete" onClick={() => showModal(row.hasUserFlag ? 2 : 1, row.id)}>删除</a>
  206. </Space>)
  207. }
  208. },
  209. ];
  210. return (
  211. <Table
  212. className="components-table-demo-nested"
  213. rowKey={record => record.id}
  214. scroll={{ y: 'calc(100vh - 360px)' }}
  215. columns={columns}
  216. dataSource={dataSource}
  217. pagination={{
  218. current: current,
  219. pageSize: size,
  220. size: 'small',
  221. showSizeChanger: true,
  222. pageSizeOptions: ['15', '30', '60', '120'],
  223. showTotal: (total, range) => `第${range[0]}-${range[1]} 条/共 ${total} 条数据`,
  224. onShowSizeChange: (current, pageSize) => onSizeChange(current, pageSize), // 改变每页数量时更新显示
  225. onChange: (page, pageSize) => changePage(page, pageSize),//点击页码事件
  226. total: total
  227. }}
  228. />
  229. )
  230. }
  231. //筛选项渲染
  232. const [form] = Form.useForm();
  233. const onFinish = (values) => {
  234. const param = {
  235. ...data,
  236. ...params
  237. }
  238. setCurrent(1)
  239. setParams(param)
  240. getTableData(param);
  241. };
  242. const onReset = () => {
  243. setCurrent(1)
  244. setParams(data)
  245. form.resetFields();
  246. getTableData(data);
  247. };
  248. if (addVisible) {
  249. return (
  250. <RoleContext.Provider value={{ save: addRole, detail: roleDetail }}>
  251. <AddRole back={goBack} />
  252. </RoleContext.Provider>
  253. )
  254. }
  255. return (
  256. <div className='wrapper'>
  257. <div className="filter-box">
  258. <Form form={form} name="control-hooks" onFinish={onFinish} initialValues={{ status: '' }}>
  259. <Row gutter={24}>
  260. <Col span={5} key={0}>
  261. <Form.Item name="name" label="角色名称" getValueFromEvent={getValueFromEvent}>
  262. <Input placeholder='角色名称' autoComplete='off' />
  263. </Form.Item>
  264. </Col>
  265. <Col span={5} key={2}>
  266. <Form.Item name="status" label="当前状态">
  267. <Select
  268. allowClear
  269. >
  270. {statusList.map((item) => {
  271. return (
  272. <Option value={item.name} key={item.name}>{item.val}</Option>
  273. )
  274. })}
  275. </Select>
  276. </Form.Item>
  277. </Col>
  278. <Col span={9} key={3}>
  279. <Form.Item>
  280. <Button type="primary" htmlType="submit">
  281. 查询
  282. </Button>
  283. <Button htmlType="button" onClick={onReset}>
  284. 重置
  285. </Button>
  286. </Form.Item>
  287. </Col>
  288. </Row>
  289. </Form>
  290. </div>
  291. <div className="table">
  292. <div className="table-header">
  293. <h2 className="table-title">组织管理</h2>
  294. <Button type="primary" icon={<PlusOutlined />} onClick={() => showAddRole()}>新增角色</Button>
  295. </div>
  296. <RenderTable />
  297. </div>
  298. <Modal
  299. title="提示"
  300. okText='确定'
  301. cancelText='取消'
  302. width={400}
  303. visible={visible}
  304. onOk={handleOk}
  305. confirmLoading={confirmLoading}
  306. onCancel={handleCancel}
  307. maskClosable={false}
  308. >
  309. <p>{tipText[modalType]}</p>
  310. </Modal>
  311. </div>
  312. )
  313. }
  314. export default RoleManager;