123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- import React, { useEffect, useState, useReducer } from 'react';
- import { getAgent, stopOrOpenAgent } from '@/services/agent';
- import { getRoleList } from '@/services/role';
- import { Button, Card, Col, Input, Row, Select, Space, Table, message, Tag } from 'antd';
- import { PageContainer } from '@ant-design/pro-layout';
- import DetailModal from './detail';
- const { Option } = Select;
- type User = {
- id: string;
- nickName: string;
- phoneNumber: number;
- region: string;
- authRoles: string;
- followBarNum: number;
- postsNum: number;
- state: number;
- caeateTime: string;
- action?: React.ReactNode;
- };
- export type roleListType = {
- id: string;
- label: string;
- [key: string]: any;
- };
- type initStateType = {
- curPage: number;
- roleId: string;
- state: number;
- label: string | number;
- };
- type Action = {
- type: string;
- [key: string]: any;
- };
- const initState: initStateType = {
- curPage: 1,
- roleId: '',
- state: 2,
- label: '',
- };
- const reducer: React.Reducer<initStateType, Action> = (State, action): initStateType => {
- const { type, value } = action;
- switch (type) {
- case 'page':
- return { ...State, curPage: value };
- case 'state':
- return { ...State, state: value };
- case 'label':
- return { ...State, label: value };
- case 'roleId':
- return { ...State, roleId: value };
- case 'reload':
- return { ...State, roleId: '', state: 2, label: '' };
- default:
- throw new Error('没有对应的initStateType类型');
- }
- };
- const Agent: React.FC = () => {
- const [state, dispatch] = useReducer(reducer, initState);
- const [agentList, setAgentList] = useState<User[]>([]);
- const [roleList, setRoleList] = useState<roleListType[]>([]);
- const [total, setTotal] = useState<number>(0);
- const [loading, setLoading] = useState<boolean>(false);
- // 弹窗
- const [visible, setVisible] = useState<boolean>(false);
- // 当前点击的代理商
- const [id, setId] = useState<string>('');
- // 获取代理商列表
- const GetAgent = async () => {
- setLoading(true);
- const { code, data } = await getAgent(state);
- setLoading(false);
- if (code === 0) {
- const { records, total: Total } = data;
- setAgentList(records);
- setTotal(Total);
- }
- };
- // 获取权限列表
- const GetRoleList = async () => {
- const { code, data } = await getRoleList({ curPage: 1 });
- if (code === 0) {
- const { records } = data;
- setRoleList([{ id: '', label: '全部' }, ...records]);
- }
- };
- // 停用或者启用代理商
- const StopOrOpenAgent = async (text: Record<string, any>, index: number): Promise<void> => {
- setLoading(true);
- const { code } = await stopOrOpenAgent(text.id, { state: text.state === 1 ? 0 : 1 });
- setLoading(false);
- if (code === 0) {
- const a = { ...text, state: text.state === 1 ? 0 : 1 };
- const b = JSON.parse(JSON.stringify(agentList));
- b.splice(index, 1, a);
- setAgentList(b);
- message.success('操作成功');
- }
- };
- useEffect(() => {
- GetAgent();
- GetRoleList();
- }, []);
- // 重置搜索条件
- const reloadSate = (): void => dispatch({ type: 'reload', value: '' });
- // 打开弹窗
- const openModal = (value: Record<string, any>): void => {
- setVisible(true);
- setId(value.id);
- };
- // 关闭弹窗
- const closeModal = (): void => setVisible(false);
- // 账户状态
- const changeAccState = (value: number): void => dispatch({ type: 'state', value });
- // 手机号
- const changePhone = (e: React.ChangeEvent<HTMLInputElement>): void =>
- dispatch({ type: 'label', value: e.target.value });
- // 选择角色
- const changeRole = (value: string): void => dispatch({ type: 'roleId', value });
- // 分页
- const pagination = (changePage: number): void => dispatch({ type: 'page', value: changePage });
- return (
- <PageContainer title="代理商列表">
- <Card>
- <Row gutter={[16, 16]} justify="space-between">
- <Col span={10}>
- <Space>
- <Select
- placeholder="请选择认证角色"
- style={{ width: 200 }}
- onChange={changeRole}
- value={state.roleId}
- >
- {roleList.map((item) => (
- <Option key={item.id} value={item.id}>
- {item.label}
- </Option>
- ))}
- </Select>
- <Select
- placeholder="请选择账号状态"
- style={{ width: 200 }}
- onChange={changeAccState}
- value={state.state}
- >
- <Option value={2}>全部</Option>
- <Option value={1}>启用</Option>
- <Option value={0}>禁用</Option>
- </Select>
- <Input
- onChange={changePhone}
- value={state.label}
- style={{ width: 200 }}
- placeholder="输入手机号/姓名"
- ></Input>
- </Space>
- </Col>
- <Col>
- <Space>
- <Button type="primary" onClick={GetAgent}>
- 搜索
- </Button>
- <Button onClick={reloadSate}>重置</Button>
- </Space>
- </Col>
- </Row>
- <Table
- rowKey={(record) => record.id}
- loading={loading}
- pagination={{ total, showSizeChanger: false, onChange: pagination }}
- dataSource={agentList}
- style={{ marginTop: '20px' }}
- >
- <Table.Column<User> title="姓名" dataIndex="nickName" key="nickName" />
- <Table.Column<User> title="手机号" dataIndex="phoneNumber" key="phoneNumber" />
- <Table.Column<User>
- title="地区"
- dataIndex="region"
- key="region"
- render={(region) => <span>{region || '未知地区'}</span>}
- />
- <Table.Column<User>
- title="认证角色"
- dataIndex="authRoles"
- key="authRoles"
- render={(authRoles) => (
- <>
- {authRoles.map((item: Record<string, any>) => {
- return <span key={item.id}>{item.roleLabel}</span>;
- })}
- </>
- )}
- />
- <Table.Column<User> title="关注贴吧板块" dataIndex="followBarNum" key="followBarNum" />
- <Table.Column<User> title="发帖数" dataIndex="postsNum" key="postsNum" />
- <Table.Column<User> title="发帖数" dataIndex="postsNum" key="postsNum" />
- <Table.Column<User>
- title="账号状态"
- dataIndex="state"
- key="state"
- render={(text) => <Tag color="blue"> {text === 1 ? '正常' : '禁用中'} </Tag>}
- />
- <Table.Column<User> title="日期" dataIndex="createTime" key="stcreateTimeate" />
- <Table.Column<User>
- key="action"
- title="操作"
- render={(text, record, index) => (
- <Space>
- <a onClick={() => openModal(text)}>查看</a>
- <a onClick={() => StopOrOpenAgent(text, index)}>
- {text.state === 1 ? '禁用' : '启用'}
- </a>
- {/* <Dropdown overlay={menu}>
- <a className="ant-dropdown-link" onClick={e => e.preventDefault()}>
- 更多 <DownOutlined />
- </a>
- </Dropdown> */}
- </Space>
- )}
- />
- </Table>
- </Card>
- {/* 详情弹窗 */}
- {visible ? <DetailModal visible={visible} closeModal={closeModal} id={id} /> : null}
- </PageContainer>
- );
- };
- export default Agent;
|