import "./index.scss"; import { Input, Tree, Select, DatePicker, Button, Table, Space, Tag, message, Modal, Form, Row, Col, TreeSelect, Radio, } from "antd"; import { EditOutlined, DeleteOutlined, ExclamationCircleFilled, } from "@ant-design/icons"; import { getUserListApi, deleteUserApi, getDeptTreeApi, addUserApi, getRoleListApi, getUserInfoApi, editUserApi, } from "../../../api/system/users"; import dataLocale from "antd/es/date-picker/locale/zh_CN"; import React, { useEffect, useState, useMemo } from "react"; import { SearchOutlined, PlusOutlined } from "@ant-design/icons"; export default function User() { const postIdList: number[] = []; const [form] = Form.useForm(); const [searchForm] = Form.useForm(); const [echoId, setEchoId] = useState(); const [myTreeData, setMyTreeData] = useState<[]>([]); const [listData, setListData] = useState([]); const [radioValue, setRadioValue] = useState(1); const [searchTreeValue, setSearchTreeValue] = useState(""); const [roleList, setRoleList] = useState([]); const [messageApi, contextHolder] = message.useMessage(); const [modalTitle, setModalTitle] = useState(""); const [buttonType, setButtonType] = useState(""); const [isShowModal, setIsShowModal] = useState(false); const [autoExpandParent, setAutoExpandParent] = useState(true); const [expandedKeys, setExpandedKeys] = useState([ 100, 102, 101, 104, ]); const [treeValue, setTreeValue] = useState(); const fieldNames = { label: "deptName", title: "deptName", value: "deptId", key: "deptName", }; const [queryParams, setQueryParams] = useState({ deptId: undefined, userName: undefined, phoneNumber: undefined, state: undefined, startTime: undefined, endTime: undefined, pageNum: undefined, pageSize: undefined, }); const columns = [ { title: "序号", dataIndex: "userId", key: "Id", render: (text: string) => <>{text ? text : "null"}, }, { title: "用户名称", dataIndex: "userName", key: "userName", render: (text: string) => <>{text ? text : "null"}, }, { title: "用户昵称", dataIndex: "nickName", key: "nikeName", render: (text: string) => <>{text ? text : "null"}, }, { title: "部门", key: "deptId", dataIndex: "deptName", render: (text: string) => <>{text ? text : "--"}, }, { title: "手机号码", key: "phoneNumber", dataIndex: "phoneNumber", render: (text: string) => <>{text ? text : "--"}, }, { title: "状态", key: "state", dataIndex: "state", render: (text: string) => ( <> {text === "0" ? ( 停用 ) : ( 正常 )} ), }, { title: "创建时间", key: "createTime", dataIndex: "createTime", render: (text: string) => <>{text ? text : "null"}, }, { title: "操作", key: "operate", dataIndex: "operate", render: (_: string, record: object) => ( ), }, ]; interface AddUserType { email: string; nickName: string; password: string; phoneNumber: string; postIds: number[]; roleIds: number[]; sex: string; state: string; userName: string; } interface QueryParamsType { deptId?: number; userName?: string; phoneNumber?: string; state?: string; startTime?: string | any; endTime?: string | any; pageNum?: number; pageSize?: number; } let addUserParams: AddUserType = { email: "", nickName: "", password: "", phoneNumber: "", postIds: [], roleIds: [], sex: "", state: "", userName: "", }; const getDeptTreeData = async () => { try { const { code, data } = await getDeptTreeApi(); if (code === 1000) { setMyTreeData(data); handleLoopPostList(data); setExpandedKeys(postIdList); } } catch (error) { console.error(error); } }; const getUserList = async (newQueryParams: object) => { try { const { code, data } = await getUserListApi(newQueryParams); if (code === 1000) { setListData(data.rows); } } catch (err) { console.error(err); } }; const getUserInfo = async () => { try { const { code, data } = await getUserInfoApi(echoId); if (code === 1000) { handleEcho(data); } } catch (error) { console.error(error); } }; const getRoleList = async () => { try { const { code, data } = await getRoleListApi(); if (code === 1000) { setRoleList(data.rows); } } catch (err) { console.log(err); } }; const handleAdd = () => { setModalTitle("新增用户"); setButtonType("ADD"); setIsShowModal(true); }; const handleEdit = (echoData: any) => { setModalTitle("修改用户"); setButtonType("EDIT"); setIsShowModal(true); setEchoId(echoData.userId); }; const handleConfirm = () => { form.validateFields().then((values) => { Object.keys(values).forEach( (key) => values[key] === undefined && delete values[key] ); addUserParams = { ...addUserParams, ...values, userId: echoId, }; if (buttonType === "ADD") { handleAddUser(); } else if (buttonType === "EDIT") { handleEditUser(); } else { messageApi.open({ type: "error", content: "系统异常,请刷新后重试", }); } }); }; const handleAddUser = async () => { const { code } = await addUserApi(addUserParams); try { if (code === 1000) { messageApi.open({ type: "success", content: "创建成功", }); setQueryParams({}); handleClear(); } else { messageApi.open({ type: "error", content: "用户名已经存在", }); } } catch (err) { console.log(err); } }; const handleEditUser = async () => { const { code } = await editUserApi(addUserParams); try { if (code === 1000) { messageApi.open({ type: "success", content: "修改成功", }); setQueryParams({}); handleClear(); } else { messageApi.open({ type: "error", content: "修改失败", }); } } catch (err) { console.log(err); } }; const handleReset = async () => { searchForm.resetFields(); setQueryParams({}); getUserList({}); }; const handleSearch = () => { getUserList(queryParams); }; const handleDel = async (record: any) => { Modal.confirm({ title: `确定删除Id为-${record.userId}-, 用户名为-${record.userName}-的用户吗?`, icon: , async onOk() { const { code } = await deleteUserApi(record.userId); try { if (code === 1000) { messageApi.open({ type: "success", content: "删除成功", }); setQueryParams({}); } else { messageApi.open({ type: "error", content: "删除失败", }); } } catch (err) { console.log(err); } }, onCancel() { messageApi.open({ type: "warning", content: "取消成功", }); }, }); }; const handleTimePikerValue = (_: any, dates: string[]) => { setQueryParams({ ...queryParams, startTime: dates[0], endTime: dates[1], }); searchForm.setFieldsValue({ dataTime: [dates[0], dates[1]] }); }; const handleSearchValues = (e: any) => { const { name, value } = e.target; setQueryParams({ ...queryParams, [name]: value }); }; const handlePageChange = (page: number) => { setQueryParams({ ...queryParams, pageNum: page, }); }; const handleTreeSelect = (deptId: any) => { console.log(queryParams); getUserList({ ...queryParams, deptId: deptId[0], }); }; const handleEcho = (data: any) => { const { userName, nickName, sex, state, phoneNumber, deptId, email } = data.user; const { postIds, roleIds } = data; form.setFieldsValue({ userName, nickName, state, phoneNumber, sex, deptId, email, postIds, roleIds, }); }; const handleCancel = () => { handleClear(); }; const handleClear = () => { form.resetFields(); setIsShowModal(false); }; const handleExpandKeys = (key: string, data: object[]) => { const filterRes = new RegExp(key, "i"); data.forEach((item: any) => { if (filterRes.test(item?.title?.props?.children)) { postIdList.push(item.key); } item.children ? handleExpandKeys(key, item.children) : ""; }); }; const handleLoopPostList = (loopData: object[]) => { loopData.forEach((item: any) => { if (item?.deptId) { const flag = postIdList.some((someItem) => { someItem === item.deptId; }); if (!flag) { postIdList.push(item.deptId); } } item.children ? handleLoopPostList(item.children) : ""; }); }; const onRadio = (e: any) => { setRadioValue(e.target.value); }; const onTreeSelect = (newValue: string) => { setTreeValue(newValue); }; const onTreeSearch = (e?: any) => { const { value } = e.target ? e.target : null; setSearchTreeValue(value); handleExpandKeys(value, treeData); setExpandedKeys(postIdList); setAutoExpandParent(true); }; const onExpand = (newExpandedKeys: React.Key[]) => { console.log(newExpandedKeys); setExpandedKeys(newExpandedKeys); setAutoExpandParent(false); }; const treeData = useMemo(() => { const loop = (data: any[]): any[] => data.map((item) => { const strTitle = item.deptName as string; const index = strTitle.indexOf(searchTreeValue); const beforeStr = strTitle.substring(0, index); const afterStr = strTitle.slice(index + searchTreeValue.length); const title = index > -1 ? ( {beforeStr} {searchTreeValue} {afterStr} ) : ( {strTitle} ); if (item.children) { return { title, key: item.deptId, children: loop(item.children) }; } return { title, key: item.deptId, }; }); return loop(myTreeData); }, [myTreeData]); useEffect(() => { getDeptTreeData(); getRoleList(); getUserInfo(); }, [echoId]); useEffect(() => { getUserList({}); }, []); return (
} placeholder="请输入部门名称" onChange={onTreeSearch} />
<>
正常 停用 {roleList.map((item) => ( {item.roleName} ))}
); }