index.tsx 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. import { RootState } from "@/store";
  2. import {
  3. getUserListAPI,
  4. getUserRoleAPI,
  5. userDisplayAPI,
  6. userPassResetAPI,
  7. userRemoveAPI,
  8. } from "@/store/action/user";
  9. import { UserTableAPIType, UserTableListType } from "@/types";
  10. import {
  11. Input,
  12. DatePicker,
  13. Button,
  14. Table,
  15. Switch,
  16. Popconfirm,
  17. message,
  18. } from "antd";
  19. import React, {
  20. useCallback,
  21. useEffect,
  22. useMemo,
  23. useRef,
  24. useState,
  25. } from "react";
  26. import { useDispatch, useSelector } from "react-redux";
  27. import styles from "./index.module.scss";
  28. import UserAdd from "./UserAdd";
  29. const { RangePicker } = DatePicker;
  30. function User() {
  31. const dispatch = useDispatch();
  32. const pageNumRef = useRef(1);
  33. const pagePageRef = useRef(10);
  34. // 顶部筛选
  35. const [tableSelect, setTableSelect] = useState<UserTableAPIType>({
  36. startTime: "",
  37. endTime: "",
  38. nickName: "",
  39. pageNum: 1,
  40. pageSize: 10,
  41. realName: "",
  42. searchKey: "",
  43. });
  44. // 进来用户管理页面获取角色的下拉列表
  45. useEffect(() => {
  46. dispatch(getUserRoleAPI());
  47. }, [dispatch]);
  48. // 封装发送请求的函数
  49. const getList = useCallback(async () => {
  50. const data = {
  51. ...tableSelect,
  52. pageNum: pageNumRef.current,
  53. };
  54. dispatch(getUserListAPI(data));
  55. }, [dispatch, tableSelect]);
  56. // 当前页码统一
  57. useEffect(() => {
  58. pageNumRef.current = tableSelect.pageNum;
  59. pagePageRef.current = tableSelect.pageSize;
  60. }, [tableSelect.pageNum, tableSelect.pageSize]);
  61. // 防止发送了2次请求来对应页码
  62. const getListRef = useRef(-1);
  63. useEffect(() => {
  64. clearTimeout(getListRef.current);
  65. getListRef.current = window.setTimeout(() => {
  66. getList();
  67. }, 100);
  68. }, [getList, tableSelect]);
  69. // 用户昵称的输入
  70. const nameTime = useRef(-1);
  71. const nameChange = useCallback(
  72. (e: React.ChangeEvent<HTMLInputElement>) => {
  73. clearTimeout(nameTime.current);
  74. nameTime.current = window.setTimeout(() => {
  75. setTableSelect({
  76. ...tableSelect,
  77. nickName: e.target.value,
  78. pageNum: 1,
  79. });
  80. }, 500);
  81. },
  82. [tableSelect]
  83. );
  84. // 真实姓名的输入
  85. const realNameTime = useRef(-1);
  86. const realNameChange = useCallback(
  87. (e: React.ChangeEvent<HTMLInputElement>) => {
  88. clearTimeout(realNameTime.current);
  89. realNameTime.current = window.setTimeout(() => {
  90. setTableSelect({
  91. ...tableSelect,
  92. realName: e.target.value,
  93. pageNum: 1,
  94. });
  95. }, 500);
  96. },
  97. [tableSelect]
  98. );
  99. // 时间选择器改变
  100. const timeChange = (date: any, dateString: any) => {
  101. let startTime = "";
  102. let endTime = "";
  103. if (dateString[0] && dateString[1]) {
  104. startTime = dateString[0] + " 00:00:00";
  105. endTime = dateString[1] + " 23:59:59";
  106. }
  107. setTableSelect({ ...tableSelect, startTime, endTime, pageNum: 1 });
  108. };
  109. // 点击重置
  110. const [inputKey, setInputKey] = useState(1);
  111. const resetSelectFu = useCallback(() => {
  112. // 把2个输入框和时间选择器清空
  113. setInputKey(Date.now());
  114. setTableSelect({
  115. startTime: "",
  116. endTime: "",
  117. nickName: "",
  118. pageNum: 1,
  119. pageSize: 10,
  120. realName: "",
  121. searchKey: "",
  122. });
  123. }, []);
  124. // 从仓库中获取表格数据
  125. const tableInfo = useSelector(
  126. (state: RootState) => state.userReducer.tableInfo
  127. );
  128. // 页码变化
  129. const paginationChange = useCallback(
  130. () => (pageNum: number, pageSize: number) => {
  131. pageNumRef.current = pageNum;
  132. pagePageRef.current = pageSize;
  133. setTableSelect({ ...tableSelect, pageNum, pageSize });
  134. },
  135. [tableSelect]
  136. );
  137. // 切换表格中的启用停用状态
  138. const isEnabledClickFu = useCallback(
  139. async (val: boolean, id: number) => {
  140. const isDisable = val ? 1 : 0;
  141. const res: any = await userDisplayAPI(id, isDisable);
  142. if (res.code === 0) getList();
  143. },
  144. [getList]
  145. );
  146. // 点击删除
  147. const delTableFu = useCallback(
  148. async (id: number) => {
  149. const res: any = await userRemoveAPI(id);
  150. if (res.code === 0) {
  151. message.success("删除成功!");
  152. getList();
  153. }
  154. },
  155. [getList]
  156. );
  157. // 点击重置密码
  158. const resetPassFu = useCallback(async (id: number) => {
  159. const res: any = await userPassResetAPI(id);
  160. if (res.code === 0) message.success("重置成功!");
  161. }, []);
  162. // 0------------点击新增或者编辑出来的页面
  163. const [editPageShow, setEditPageShow] = useState(false);
  164. const editId = useRef(0);
  165. const openEditPageFu = useCallback(
  166. (id: number) => {
  167. if (id === 0 && tableInfo.list.length >= 30)
  168. return message.warning("最多支持30个用户!");
  169. editId.current = id;
  170. setEditPageShow(true);
  171. },
  172. [tableInfo.list.length]
  173. );
  174. const columns = useMemo(() => {
  175. return [
  176. // {
  177. // width: 80,
  178. // title: "序号",
  179. // render: (text: any, record: any, index: any) =>
  180. // index + 1 + (pageNumRef.current - 1) * pagePageRef.current,
  181. // },
  182. {
  183. title: "账号名",
  184. dataIndex: "userName",
  185. },
  186. {
  187. title: "用户昵称",
  188. dataIndex: "nickName",
  189. },
  190. {
  191. title: "用户角色",
  192. dataIndex: "roleName",
  193. },
  194. {
  195. title: "真实姓名",
  196. dataIndex: "realName",
  197. },
  198. {
  199. title: "注册时间",
  200. dataIndex: "createTime",
  201. },
  202. {
  203. title: "启用状态",
  204. render: (item: UserTableListType) => (
  205. <Switch
  206. disabled={item.isAdmin === 1}
  207. checkedChildren="启用"
  208. unCheckedChildren="停用"
  209. checked={item.isEnabled === 1}
  210. onChange={(val) => isEnabledClickFu(val, item.id!)}
  211. />
  212. ),
  213. },
  214. {
  215. title: "操作",
  216. render: (item: UserTableListType) => {
  217. return item.isAdmin === 1 ? (
  218. "-"
  219. ) : (
  220. <>
  221. <Popconfirm
  222. title="密码重制后为123456,是否重置?"
  223. okText="重置"
  224. cancelText="取消"
  225. onConfirm={() => resetPassFu(item.id!)}
  226. >
  227. <Button size="small" type="text">
  228. 重置密码
  229. </Button>
  230. </Popconfirm>
  231. <Button
  232. size="small"
  233. type="text"
  234. onClick={() => openEditPageFu(item.id!)}
  235. >
  236. 编辑
  237. </Button>
  238. <Popconfirm
  239. title="删除后无法恢复,是否删除?"
  240. okText="删除"
  241. cancelText="取消"
  242. onConfirm={() => delTableFu(item.id!)}
  243. >
  244. <Button size="small" type="text" danger>
  245. 删除
  246. </Button>
  247. </Popconfirm>
  248. </>
  249. );
  250. },
  251. },
  252. ];
  253. }, [delTableFu, isEnabledClickFu, openEditPageFu, resetPassFu]);
  254. return (
  255. <div className={styles.User}>
  256. <div className="userTop">
  257. <div className="pageTitlt">用户管理</div>
  258. <div className="selectBox">
  259. <div className="selectBoxL">
  260. <div className="row">
  261. <span>用户昵称:</span>
  262. <Input
  263. key={inputKey}
  264. maxLength={8}
  265. style={{ width: 150 }}
  266. placeholder="请输入"
  267. allowClear
  268. onChange={(e) => nameChange(e)}
  269. />
  270. </div>
  271. <div className="row">
  272. <span>真实姓名:</span>
  273. <Input
  274. key={inputKey}
  275. maxLength={8}
  276. style={{ width: 150 }}
  277. placeholder="请输入"
  278. allowClear
  279. onChange={(e) => realNameChange(e)}
  280. />
  281. </div>
  282. <div className="row">
  283. <span>注册日期:</span>
  284. <RangePicker key={inputKey} onChange={timeChange} />
  285. </div>
  286. </div>
  287. <div className="selectBoxR">
  288. <Button onClick={resetSelectFu}>重置</Button>&emsp;&emsp;
  289. <Button type="primary" onClick={() => openEditPageFu(0)}>
  290. 新增
  291. </Button>
  292. </div>
  293. </div>
  294. </div>
  295. {/* 表格主体 */}
  296. <div className="tableBox">
  297. <Table
  298. scroll={{ y: 575 }}
  299. dataSource={tableInfo.list}
  300. columns={columns}
  301. rowKey="id"
  302. pagination={{
  303. showQuickJumper: true,
  304. position: ["bottomCenter"],
  305. // showSizeChanger: true,
  306. current: tableSelect.pageNum,
  307. pageSize: tableSelect.pageSize,
  308. total: tableInfo.total,
  309. onChange: paginationChange(),
  310. }}
  311. />
  312. </div>
  313. {/* 点击新增或者编辑 */}
  314. {editPageShow ? (
  315. <UserAdd
  316. id={editId.current}
  317. closePage={() => setEditPageShow(false)}
  318. upTableList={getList}
  319. addTableList={resetSelectFu}
  320. />
  321. ) : null}
  322. </div>
  323. );
  324. }
  325. const MemoUser = React.memo(User);
  326. export default MemoUser;