index.tsx 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import React, { useEffect, useState, useReducer } from 'react';
  2. import { getAgent, stopOrOpenAgent } from '@/services/agent';
  3. import { getRoleList } from '@/services/role';
  4. import { Button, Card, Col, Input, Row, Select, Space, Table, message, Tag } from 'antd';
  5. import { PageContainer } from '@ant-design/pro-layout';
  6. import DetailModal from './detail';
  7. const { Option } = Select;
  8. type User = {
  9. id: string;
  10. nickName: string;
  11. phoneNumber: number;
  12. region: string;
  13. authRoles: string;
  14. followBarNum: number;
  15. postsNum: number;
  16. state: number;
  17. caeateTime: string;
  18. action?: React.ReactNode;
  19. };
  20. export type roleListType = {
  21. id: string;
  22. label: string;
  23. [key: string]: any;
  24. };
  25. type initStateType = {
  26. curPage: number;
  27. roleId: string;
  28. state: number;
  29. label: string | number;
  30. };
  31. type Action = {
  32. type: string;
  33. [key: string]: any;
  34. };
  35. const initState: initStateType = {
  36. curPage: 1,
  37. roleId: '',
  38. state: 2,
  39. label: '',
  40. };
  41. const reducer: React.Reducer<initStateType, Action> = (State, action): initStateType => {
  42. const { type, value } = action;
  43. switch (type) {
  44. case 'page':
  45. return { ...State, curPage: value };
  46. case 'state':
  47. return { ...State, state: value };
  48. case 'label':
  49. return { ...State, label: value };
  50. case 'roleId':
  51. return { ...State, roleId: value };
  52. case 'reload':
  53. return { ...State, roleId: '', state: 2, label: '' };
  54. default:
  55. throw new Error('没有对应的initStateType类型');
  56. }
  57. };
  58. const Agent: React.FC = () => {
  59. const [state, dispatch] = useReducer(reducer, initState);
  60. const [agentList, setAgentList] = useState<User[]>([]);
  61. const [roleList, setRoleList] = useState<roleListType[]>([]);
  62. const [total, setTotal] = useState<number>(0);
  63. const [loading, setLoading] = useState<boolean>(false);
  64. // 弹窗
  65. const [visible, setVisible] = useState<boolean>(false);
  66. // 当前点击的代理商
  67. const [id, setId] = useState<string>('');
  68. // 获取代理商列表
  69. const GetAgent = async () => {
  70. setLoading(true);
  71. const { code, data } = await getAgent(state);
  72. setLoading(false);
  73. if (code === 0) {
  74. const { records, total: Total } = data;
  75. setAgentList(records);
  76. setTotal(Total);
  77. }
  78. };
  79. // 获取权限列表
  80. const GetRoleList = async () => {
  81. const { code, data } = await getRoleList({ curPage: 1 });
  82. if (code === 0) {
  83. const { records } = data;
  84. setRoleList([{ id: '', label: '全部' }, ...records]);
  85. }
  86. };
  87. // 停用或者启用代理商
  88. const StopOrOpenAgent = async (text: Record<string, any>, index: number): Promise<void> => {
  89. setLoading(true);
  90. const { code } = await stopOrOpenAgent(text.id, { state: text.state === 1 ? 0 : 1 });
  91. setLoading(false);
  92. if (code === 0) {
  93. const a = { ...text, state: text.state === 1 ? 0 : 1 };
  94. const b = JSON.parse(JSON.stringify(agentList));
  95. b.splice(index, 1, a);
  96. setAgentList(b);
  97. message.success('操作成功');
  98. }
  99. };
  100. useEffect(() => {
  101. GetAgent();
  102. GetRoleList();
  103. }, []);
  104. // 重置搜索条件
  105. const reloadSate = (): void => dispatch({ type: 'reload', value: '' });
  106. // 打开弹窗
  107. const openModal = (value: Record<string, any>): void => {
  108. setVisible(true);
  109. setId(value.id);
  110. };
  111. // 关闭弹窗
  112. const closeModal = (): void => setVisible(false);
  113. // 账户状态
  114. const changeAccState = (value: number): void => dispatch({ type: 'state', value });
  115. // 手机号
  116. const changePhone = (e: React.ChangeEvent<HTMLInputElement>): void =>
  117. dispatch({ type: 'label', value: e.target.value });
  118. // 选择角色
  119. const changeRole = (value: string): void => dispatch({ type: 'roleId', value });
  120. // 分页
  121. const pagination = (changePage: number): void => dispatch({ type: 'page', value: changePage });
  122. return (
  123. <PageContainer title="代理商列表">
  124. <Card>
  125. <Row gutter={[16, 16]} justify="space-between">
  126. <Col span={10}>
  127. <Space>
  128. <Select
  129. placeholder="请选择认证角色"
  130. style={{ width: 200 }}
  131. onChange={changeRole}
  132. value={state.roleId}
  133. >
  134. {roleList.map((item) => (
  135. <Option key={item.id} value={item.id}>
  136. {item.label}
  137. </Option>
  138. ))}
  139. </Select>
  140. <Select
  141. placeholder="请选择账号状态"
  142. style={{ width: 200 }}
  143. onChange={changeAccState}
  144. value={state.state}
  145. >
  146. <Option value={2}>全部</Option>
  147. <Option value={1}>启用</Option>
  148. <Option value={0}>禁用</Option>
  149. </Select>
  150. <Input
  151. onChange={changePhone}
  152. value={state.label}
  153. style={{ width: 200 }}
  154. placeholder="输入手机号/姓名"
  155. ></Input>
  156. </Space>
  157. </Col>
  158. <Col>
  159. <Space>
  160. <Button type="primary" onClick={GetAgent}>
  161. 搜索
  162. </Button>
  163. <Button onClick={reloadSate}>重置</Button>
  164. </Space>
  165. </Col>
  166. </Row>
  167. <Table
  168. rowKey={(record) => record.id}
  169. loading={loading}
  170. pagination={{ total, showSizeChanger: false, onChange: pagination }}
  171. dataSource={agentList}
  172. style={{ marginTop: '20px' }}
  173. >
  174. <Table.Column<User> title="姓名" dataIndex="nickName" key="nickName" />
  175. <Table.Column<User> title="手机号" dataIndex="phoneNumber" key="phoneNumber" />
  176. <Table.Column<User>
  177. title="地区"
  178. dataIndex="region"
  179. key="region"
  180. render={(region) => <span>{region || '未知地区'}</span>}
  181. />
  182. <Table.Column<User>
  183. title="认证角色"
  184. dataIndex="authRoles"
  185. key="authRoles"
  186. render={(authRoles) => (
  187. <>
  188. {authRoles.map((item: Record<string, any>) => {
  189. return <span key={item.id}>{item.roleLabel}</span>;
  190. })}
  191. </>
  192. )}
  193. />
  194. <Table.Column<User> title="关注贴吧板块" dataIndex="followBarNum" key="followBarNum" />
  195. <Table.Column<User> title="发帖数" dataIndex="postsNum" key="postsNum" />
  196. <Table.Column<User> title="发帖数" dataIndex="postsNum" key="postsNum" />
  197. <Table.Column<User>
  198. title="账号状态"
  199. dataIndex="state"
  200. key="state"
  201. render={(text) => <Tag color="blue"> {text === 1 ? '正常' : '禁用中'} </Tag>}
  202. />
  203. <Table.Column<User> title="日期" dataIndex="createTime" key="stcreateTimeate" />
  204. <Table.Column<User>
  205. key="action"
  206. title="操作"
  207. render={(text, record, index) => (
  208. <Space>
  209. <a onClick={() => openModal(text)}>查看</a>
  210. <a onClick={() => StopOrOpenAgent(text, index)}>
  211. {text.state === 1 ? '禁用' : '启用'}
  212. </a>
  213. {/* <Dropdown overlay={menu}>
  214. <a className="ant-dropdown-link" onClick={e => e.preventDefault()}>
  215. 更多 <DownOutlined />
  216. </a>
  217. </Dropdown> */}
  218. </Space>
  219. )}
  220. />
  221. </Table>
  222. </Card>
  223. {/* 详情弹窗 */}
  224. {visible ? <DetailModal visible={visible} closeModal={closeModal} id={id} /> : null}
  225. </PageContainer>
  226. );
  227. };
  228. export default Agent;