index.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import Header from '@/components/Header'
  2. import Slot from '@/components/Header/slot'
  3. import SvgIcon from '@/components/SvgIcon'
  4. import { iUserInfo } from '@/types/setting'
  5. import consts from '@/utils/consts'
  6. import { Button, Input, Table, Tooltip } from 'antd'
  7. import { ColumnsType } from 'antd/lib/table'
  8. import React, { useEffect, useState } from 'react'
  9. import { apiAccountEdit, apiAccountEnable, apiAccountList } from './api'
  10. import UserModal from './components/Modal'
  11. import styles from './index.module.scss'
  12. interface iModalStatus {
  13. visible: boolean
  14. loading: boolean
  15. type: string
  16. }
  17. export default function Info() {
  18. const initUserState = {
  19. account: '',
  20. accountGroup: undefined,
  21. company: '',
  22. csrf: '',
  23. enable: 0,
  24. id: '',
  25. isAdmin: 0,
  26. mobile: '',
  27. name: '',
  28. password: '',
  29. position: '',
  30. projectId: '',
  31. role: '',
  32. telephone: ''
  33. }
  34. const { Search } = Input
  35. const [ userList, setUserList ] = useState<iUserInfo[]>([ {
  36. "account": "",
  37. "accountGroup": 0,
  38. "company": "",
  39. "csrf": "",
  40. "enable": 0,
  41. "id": "",
  42. "isAdmin": 0,
  43. "mobile": "",
  44. "name": "",
  45. "password": "",
  46. "position": "",
  47. "projectId": "",
  48. "role": "",
  49. "telephone": ""
  50. } ])
  51. const initData = async () => {
  52. const { code = -1, data } = await apiAccountList()
  53. if (code === consts.RET_CODE.SUCCESS) {
  54. setUserList(data.sort((a: iUserInfo, b: iUserInfo) => b.isAdmin - a.isAdmin))
  55. }
  56. }
  57. const [ row, setRow ] = useState<iUserInfo>(initUserState)
  58. useEffect(() => {
  59. initData()
  60. }, [])
  61. const [ modalStatus, setModalStatus ] = useState<iModalStatus>({
  62. visible: false,
  63. loading: false,
  64. type: ''
  65. })
  66. const onCreate = async (values: iUserInfo) => {
  67. setModalStatus({ ...modalStatus, loading: true })
  68. const { code = -1 } = await apiAccountEdit(modalStatus.type, values)
  69. if (code === consts.RET_CODE.SUCCESS) {
  70. initData()
  71. }
  72. setModalStatus({
  73. ...modalStatus,
  74. visible: false,
  75. loading: false,
  76. type: ''
  77. })
  78. }
  79. const onCancel = () => {
  80. setModalStatus({ ...modalStatus, visible: false })
  81. }
  82. const editHandler = (user: iUserInfo) => {
  83. setRow(user)
  84. setModalStatus({ ...modalStatus, visible: true, type: 'edit' })
  85. }
  86. const enableHandler = async (record: iUserInfo, enable: 0 | 1) => {
  87. const { code = -1 } = await apiAccountEnable({ id: record.id, enable })
  88. if ( code === consts.RET_CODE.SUCCESS) {
  89. // setUserList([ ...userList, { ...record, enable } ])
  90. initData()
  91. }
  92. }
  93. const columns: ColumnsType<iUserInfo> = [
  94. {
  95. title: '账号',
  96. dataIndex: 'account',
  97. // eslint-disable-next-line react/display-name
  98. render: (text:any, record: iUserInfo) => {
  99. return (
  100. <div>
  101. <span>{text}</span>
  102. {
  103. record.isAdmin ?
  104. <Tooltip title="管理员"><span className="pi-mg-left-5"><SvgIcon iconClass="user-circle" fontSize="13"></SvgIcon></span></Tooltip>
  105. : ''
  106. }
  107. </div>
  108. )
  109. }
  110. },
  111. {
  112. title: '姓名',
  113. dataIndex: 'name'
  114. },
  115. {
  116. title: '单位',
  117. dataIndex: 'company'
  118. },
  119. {
  120. title: '职位',
  121. dataIndex: 'postition'
  122. },
  123. {
  124. title: '手机',
  125. dataIndex: 'mobile'
  126. },
  127. {
  128. title: '电话',
  129. dataIndex: 'telephone'
  130. },
  131. {
  132. title: '操作',
  133. align: 'center',
  134. // eslint-disable-next-line react/display-name
  135. render: (_: any, record: iUserInfo) => {
  136. return (
  137. <div>
  138. <Button size="small" className="pi-mg-right-5" onClick={() => editHandler(record)}>编辑</Button>
  139. {
  140. !record.isAdmin ?
  141. record.enable ?
  142. <Button danger size="small" onClick={() => enableHandler(record, 0)}>停用</Button>
  143. : <Button size="small" className={styles.greenBtn} onClick={() => enableHandler(record, 1)}>启用</Button>
  144. : ''
  145. }
  146. </div>
  147. )
  148. }
  149. }
  150. ]
  151. return (
  152. <div className="content-wrap">
  153. <Header>
  154. <Slot position="right">
  155. <Button type="primary" size="small" onClick={() => {
  156. setRow({ ...row, ...initUserState })
  157. setModalStatus({ ...modalStatus, visible: true, type: 'add' })
  158. }}>添加账号</Button>
  159. </Slot>
  160. <Slot position="left">
  161. <Search placeholder="账号/姓名/单位/手机 搜索" loading={false} size="small"></Search>
  162. </Slot>
  163. </Header>
  164. <div className={styles.SettingContent}>
  165. <Table<iUserInfo>
  166. dataSource={userList}
  167. columns={columns}
  168. bordered
  169. rowClassName={(record: iUserInfo) => !record.enable ? 'pi-red' : ''}
  170. rowKey={record => record.id}
  171. ></Table>
  172. </div>
  173. <UserModal {...modalStatus} userInfo={row} onCreate={onCreate} onCancel={onCancel} initData={initData}></UserModal>
  174. </div>
  175. )
  176. }