index.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import { RootState } from '@/store'
  2. import { getUserListAPI, userPassResetAPI, userRemoveAPI } from '@/store/action/Z1user'
  3. import { UserTableAPIType, UserTableListType } from '@/types'
  4. import { MessageFu } from '@/utils/message'
  5. import { Input, Button } from 'antd'
  6. import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
  7. import { useDispatch, useSelector } from 'react-redux'
  8. import styles from './index.module.scss'
  9. import UserAdd from './UserAdd'
  10. import MyTable from '@/components/MyTable'
  11. import { Z1tableC } from '@/utils/tableData'
  12. import MyPopconfirm from '@/components/MyPopconfirm'
  13. function Z1user() {
  14. const dispatch = useDispatch()
  15. // 顶部筛选
  16. const [fromData, setFromData] = useState<UserTableAPIType>({
  17. pageNum: 1,
  18. pageSize: 10,
  19. searchKey: ''
  20. })
  21. // 封装发送请求的函数
  22. const getList = useCallback(async () => {
  23. dispatch(getUserListAPI(fromData))
  24. }, [dispatch, fromData])
  25. useEffect(() => {
  26. getList()
  27. }, [getList])
  28. const timeRef = useRef(-1)
  29. // 用户名
  30. const txtChangeFu = useCallback(
  31. (e: React.ChangeEvent<HTMLInputElement>, key: 'searchKey') => {
  32. clearTimeout(timeRef.current)
  33. timeRef.current = window.setTimeout(() => {
  34. setFromData({
  35. ...fromData,
  36. [key]: e.target.value,
  37. pageNum: 1
  38. })
  39. }, 500)
  40. },
  41. [fromData]
  42. )
  43. // 点击重置
  44. const [inputKey, setInputKey] = useState(1)
  45. const resetSelectFu = useCallback(() => {
  46. // 把2个输入框和时间选择器清空
  47. setInputKey(Date.now())
  48. setFromData({
  49. pageNum: 1,
  50. pageSize: 10,
  51. searchKey: ''
  52. })
  53. }, [])
  54. // 从仓库中获取表格数据
  55. const tableInfo = useSelector((state: RootState) => state.Z1user.tableInfo)
  56. // 点击删除
  57. const delTableFu = useCallback(
  58. async (id: number) => {
  59. const res: any = await userRemoveAPI(id)
  60. if (res.code === 0) {
  61. MessageFu.success('删除成功!')
  62. getList()
  63. }
  64. },
  65. [getList]
  66. )
  67. // 点击重置密码
  68. const resetPassFu = useCallback(async (id: number) => {
  69. const res: any = await userPassResetAPI(id)
  70. if (res.code === 0) MessageFu.success('重置成功!')
  71. }, [])
  72. // 0------------点击新增或者编辑出来的页面
  73. const [editPageShow, setEditPageShow] = useState(false)
  74. const editId = useRef(0)
  75. const openEditPageFu = useCallback(
  76. (id: number) => {
  77. if (id === 0 && tableInfo.list.length >= 20) return MessageFu.warning('最多支持20个用户!')
  78. editId.current = id
  79. setEditPageShow(true)
  80. },
  81. [tableInfo.list.length]
  82. )
  83. const tableLastBtn = useMemo(() => {
  84. return [
  85. {
  86. title: '操作',
  87. render: (item: UserTableListType) => {
  88. return item.isAdmin === 1 ? (
  89. '-'
  90. ) : (
  91. <>
  92. <MyPopconfirm
  93. txtK='重置密码'
  94. onConfirm={() => resetPassFu(item.id)}
  95. Dom={
  96. <Button size='small' type='text'>
  97. 重置密码
  98. </Button>
  99. }
  100. />
  101. <Button size='small' type='text' onClick={() => openEditPageFu(item.id)}>
  102. 编辑
  103. </Button>
  104. <MyPopconfirm txtK='删除' onConfirm={() => delTableFu(item.id)} />
  105. </>
  106. )
  107. }
  108. }
  109. ]
  110. }, [delTableFu, openEditPageFu, resetPassFu])
  111. return (
  112. <div className={styles.Z1user}>
  113. <div className='pageTitle'>用户管理</div>
  114. <div className='userTop'>
  115. <div className='selectBox'>
  116. <div className='selectBoxRow'>
  117. <span>搜索项:</span>
  118. <Input
  119. key={inputKey}
  120. maxLength={10}
  121. showCount
  122. style={{ width: 300 }}
  123. placeholder='请输入用户名'
  124. allowClear
  125. onChange={e => txtChangeFu(e, 'searchKey')}
  126. />
  127. </div>
  128. <div className='selectBoxRow'>
  129. &emsp;&emsp;<Button onClick={resetSelectFu}>重置</Button>
  130. &emsp;&emsp;
  131. <Button
  132. type='primary'
  133. onClick={() => {
  134. if (tableInfo.total >= 30) return MessageFu.warning('最多30个账号!')
  135. openEditPageFu(0)
  136. }}
  137. >
  138. 新增
  139. </Button>
  140. </div>
  141. </div>
  142. </div>
  143. {/* 表格主体 */}
  144. <div className='tableBox'>
  145. <MyTable
  146. yHeight={585}
  147. list={tableInfo.list}
  148. columnsTemp={Z1tableC}
  149. lastBtn={tableLastBtn}
  150. pageNum={fromData.pageNum}
  151. pageSize={fromData.pageSize}
  152. total={tableInfo.total}
  153. onChange={(pageNum, pageSize) => setFromData({ ...fromData, pageNum, pageSize })}
  154. />
  155. </div>
  156. {/* 点击新增或者编辑 */}
  157. {editPageShow ? (
  158. <UserAdd
  159. id={editId.current}
  160. closePage={() => setEditPageShow(false)}
  161. upTableList={getList}
  162. addTableList={resetSelectFu}
  163. />
  164. ) : null}
  165. </div>
  166. )
  167. }
  168. const MemoZ1user = React.memo(Z1user)
  169. export default MemoZ1user