index.tsx 5.1 KB

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