310 lines
7.2 KiB
TypeScript
310 lines
7.2 KiB
TypeScript
import services from '@/services/demo';
|
||
import {
|
||
ActionType,
|
||
FooterToolbar,
|
||
PageContainer,
|
||
ProDescriptions,
|
||
ProDescriptionsItemProps,
|
||
ProTable,
|
||
} from '@ant-design/pro-components';
|
||
import { Button, Divider, Drawer, message } from 'antd';
|
||
import React, { useRef, useState } from 'react';
|
||
import CreateForm from './components/CreateForm';
|
||
//import UpdateForm, { FormValueType } from './components/UpdateForm';
|
||
|
||
const { addUser, queryUserList, deleteUser, modifyUser } =
|
||
services.UserController;
|
||
|
||
/**
|
||
* 添加节点
|
||
* @param fields
|
||
*/
|
||
const handleAdd = async (fields: API.UserInfo) => {
|
||
const hide = message.loading('正在添加');
|
||
try {
|
||
await addUser({ ...fields });
|
||
hide();
|
||
message.success('添加成功');
|
||
return true;
|
||
} catch (error) {
|
||
hide();
|
||
message.error('添加失败请重试!');
|
||
return false;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 更新节点
|
||
* @param fields
|
||
*/
|
||
const handleUpdate = async (fields: FormValueType) => {
|
||
const hide = message.loading('正在配置');
|
||
try {
|
||
await modifyUser(
|
||
{
|
||
userId: fields.id || '',
|
||
},
|
||
{
|
||
name: fields.name || '',
|
||
nickName: fields.nickName || '',
|
||
email: fields.email || '',
|
||
},
|
||
);
|
||
hide();
|
||
|
||
message.success('编辑成功');
|
||
return true;
|
||
} catch (error) {
|
||
hide();
|
||
message.error('编辑失败请重试!');
|
||
return false;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 删除节点
|
||
* @param selectedRows
|
||
*/
|
||
const handleRemove = async (selectedRows: API.UserInfo[]) => {
|
||
const hide = message.loading('正在删除');
|
||
if (!selectedRows) return true;
|
||
try {
|
||
await deleteUser({
|
||
userId: selectedRows.find((row) => row.id)?.id || '',
|
||
});
|
||
hide();
|
||
message.success('删除成功,即将刷新');
|
||
return true;
|
||
} catch (error) {
|
||
hide();
|
||
message.error('删除失败,请重试');
|
||
return false;
|
||
}
|
||
};
|
||
|
||
const User: React.FC<unknown> = () => {
|
||
const [createModalVisible, handleModalVisible] = useState<boolean>(false);
|
||
const [updateModalVisible, handleUpdateModalVisible] =
|
||
useState<boolean>(false);
|
||
const [stepFormValues, setStepFormValues] = useState({});
|
||
const actionRef = useRef<ActionType>();
|
||
const [row, setRow] = useState<API.UserInfo>();
|
||
const [selectedRowsState, setSelectedRows] = useState<API.UserInfo[]>([]);
|
||
const columns: ProDescriptionsItemProps<API.UserInfo>[] = [
|
||
{
|
||
title: '用户id',
|
||
dataIndex: 'user_id',
|
||
tip: '用户id是唯一的 key',
|
||
formItemProps: {
|
||
rules: [
|
||
{
|
||
required: true,
|
||
message: '用户id为必填项',
|
||
},
|
||
],
|
||
},
|
||
},
|
||
{
|
||
title: '密码',
|
||
dataIndex: 'password',
|
||
valueType: 'text',
|
||
},
|
||
{
|
||
title: '用户名称',
|
||
dataIndex: 'user',
|
||
valueType: 'text',
|
||
},
|
||
{
|
||
title: '主机',
|
||
dataIndex: 'host',
|
||
valueType: 'text',
|
||
},
|
||
{
|
||
title: '端口',
|
||
dataIndex: 'port',
|
||
valueType: 'text',
|
||
},
|
||
{
|
||
title: '数据存储路径',
|
||
dataIndex: 'basePath',
|
||
valueType: 'text',
|
||
},
|
||
|
||
{
|
||
title: '编码',
|
||
dataIndex: 'charset',
|
||
valueType: 'text',
|
||
},
|
||
{
|
||
title: '连接超时时长,单位毫秒',
|
||
dataIndex: 'connection_timeout',
|
||
valueType: 'text',
|
||
},
|
||
{
|
||
title: 'Socket连接超时时长,单位毫秒',
|
||
dataIndex: 'so_timeout',
|
||
valueType: 'text',
|
||
},
|
||
{
|
||
title: '设置服务器语言',
|
||
dataIndex: 'server_language_code',
|
||
valueType: 'text',
|
||
},
|
||
{
|
||
title: '注册时间',
|
||
dataIndex: 'create_time',
|
||
valueType: 'dateTime',
|
||
},
|
||
{
|
||
title: '操作',
|
||
dataIndex: 'option',
|
||
valueType: 'option',
|
||
render: (_, record) => (
|
||
<>
|
||
<a
|
||
onClick={() => {
|
||
handleUpdateModalVisible(true);
|
||
setStepFormValues(record);
|
||
}}
|
||
>
|
||
编辑
|
||
</a>
|
||
<Divider type="vertical" />
|
||
<a href="">删除</a>
|
||
</>
|
||
),
|
||
},
|
||
];
|
||
|
||
return (
|
||
<PageContainer
|
||
header={{
|
||
title: 'Sftp存储对象配置表',
|
||
}}
|
||
>
|
||
<ProTable<API.UserInfo>
|
||
headerTitle="Sftp配置表格"
|
||
actionRef={actionRef}
|
||
rowKey="id"
|
||
search={{
|
||
labelWidth: 120,
|
||
}}
|
||
toolBarRender={() => [
|
||
<Button
|
||
key="1"
|
||
type="primary"
|
||
onClick={() => handleModalVisible(true)}
|
||
>
|
||
新建
|
||
</Button>,
|
||
]}
|
||
request={async (params, sorter, filter) => {
|
||
const { data, success } = await queryUserList({
|
||
...params,
|
||
// FIXME: remove @ts-ignore
|
||
// @ts-ignore
|
||
sorter,
|
||
filter,
|
||
});
|
||
return {
|
||
data: data?.list || [],
|
||
success,
|
||
};
|
||
}}
|
||
columns={columns}
|
||
rowSelection={{
|
||
onChange: (_, selectedRows) => setSelectedRows(selectedRows),
|
||
}}
|
||
/>
|
||
{selectedRowsState?.length > 0 && (
|
||
<FooterToolbar
|
||
extra={
|
||
<div>
|
||
已选择{' '}
|
||
<a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{' '}
|
||
项
|
||
</div>
|
||
}
|
||
>
|
||
<Button
|
||
type="primary"
|
||
onClick={async () => {
|
||
await handleRemove(selectedRowsState);
|
||
setSelectedRows([]);
|
||
actionRef.current?.reloadAndRest?.();
|
||
}}
|
||
>
|
||
批量删除
|
||
</Button>
|
||
|
||
</FooterToolbar>
|
||
)}
|
||
<CreateForm
|
||
onCancel={() => handleModalVisible(false)}
|
||
modalVisible={createModalVisible}
|
||
>
|
||
<ProTable<API.UserInfo, API.UserInfo>
|
||
onSubmit={async (value) => {
|
||
const success = await handleAdd(value);
|
||
if (success) {
|
||
handleModalVisible(false);
|
||
if (actionRef.current) {
|
||
actionRef.current.reload();
|
||
}
|
||
}
|
||
}}
|
||
rowKey="id"
|
||
type="form"
|
||
columns={columns}
|
||
/>
|
||
</CreateForm>
|
||
{stepFormValues && Object.keys(stepFormValues).length ? (
|
||
<UpdateForm
|
||
onSubmit={async (value) => {
|
||
const success = await handleUpdate(value);
|
||
if (success) {
|
||
handleUpdateModalVisible(false);
|
||
setStepFormValues({});
|
||
if (actionRef.current) {
|
||
actionRef.current.reload();
|
||
}
|
||
}
|
||
}}
|
||
onCancel={() => {
|
||
handleUpdateModalVisible(false);
|
||
setStepFormValues({});
|
||
}}
|
||
updateModalVisible={updateModalVisible}
|
||
values={stepFormValues}
|
||
/>
|
||
|
||
) : null}
|
||
|
||
<Drawer
|
||
width={600}
|
||
open={!!row}
|
||
onClose={() => {
|
||
setRow(undefined);
|
||
}}
|
||
closable={false}
|
||
>
|
||
{row?.name && (
|
||
<ProDescriptions<API.UserInfo>
|
||
column={2}
|
||
title={row?.name}
|
||
request={async () => ({
|
||
data: row || {},
|
||
})}
|
||
params={{
|
||
id: row?.name,
|
||
}}
|
||
columns={columns}
|
||
/>
|
||
)}
|
||
</Drawer>
|
||
</PageContainer>
|
||
);
|
||
};
|
||
|
||
export default User;
|