feact: 任务列表、服务器状态

develop
JINGYJ 1 year ago
parent e3307046be
commit b7bae347c6

@ -93,6 +93,12 @@ export default [
component: 'System/OperationRecordList',
access: 'canReadMenu',
},
{
name: 'parameter-setting',
path: '/system/parameter-setting',
component: 'System/ParameterSetting',
access: 'canReadMenu',
},
],
},
{
@ -205,6 +211,12 @@ export default [
component: 'Resource/ResourceDeviceStatus',
access: 'canReadMenu',
},
{
name: 'server-status',
path: '/resource/server-status',
component: 'Resource/ServerStatus',
access: 'canReadMenu',
},
],
},
{

@ -128,7 +128,7 @@ const Notice: React.FC = () => {
<div>
<div style={{ display: "flex", justifyContent: "space-between", marginBottom: 8, fontWeight: 600 }}>
<span style={{ fontSize: "14px", color: "#333" }}></span>
<Tag bordered={false} color="error" style={{ marginInlineEnd: 0 }}>
<Tag bordered={false} color="error" style={{ marginInlineEnd: 0, fontWeight: 400 }}>
</Tag>
</div>

@ -0,0 +1,54 @@
/**
*
*
*/
import { DeleteOutlined } from '@ant-design/icons';
import { useIntl } from '@umijs/max';
import { Button, Popconfirm } from 'antd';
import { proIconForTableActionStyle } from '../../../config/defaultIcon';
import { FormattedMessage } from 'react-intl';
type StopBtnProps = {
// eslint-disable-next-line @typescript-eslint/ban-types
buttonType?: 'defalut' | 'deleteIcon';
deleteApi: () => void;
};
const StopBtn: React.FC<StopBtnProps> = (props) => {
const intl = useIntl();
return (
<Popconfirm
key="destroy"
placement="topLeft"
title={intl.formatMessage({ id: 'common.tip.title', defaultMessage: '$$$' })}
description={intl.formatMessage({
id: 'common.modal.table.stop.content',
defaultMessage: '$$$',
})}
okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })}
cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })}
onConfirm={() => {
props.deleteApi();
}}
>
{/* {props.buttonType === 'deleteIcon' ? (
<>
<DeleteOutlined style={{
color: "rgba(232, 13, 13, 1)",
...proIconForTableActionStyle
}} />
</>
) : (
<Button type="link" size="small" danger>
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" />
</Button>
)} */}
<Button type="link" size="small" danger>
<FormattedMessage id="pages.searchTable.stop" defaultMessage="Destroy" />
</Button>
</Popconfirm>
);
};
export default StopBtn;

@ -26,6 +26,7 @@ import {
post,
role,
user,
parameter_setting,
} from '@/locales/zh-CN/system';
import app from './zh-CN/app';
import common from './zh-CN/common';
@ -63,6 +64,7 @@ export default {
...department,
...operation_record,
...app,
...parameter_setting,
...Object.assign({}, ...Object.values(analysisZh)),
...Object.assign({}, ...Object.values(errorTypesZh)),

@ -11,6 +11,7 @@ export default {
'common.modal.table.create.title': '新增表单',
'common.modal.table.delete.title': '确定要删除吗?',
'common.modal.table.delete.content': '确定删除吗,删除后将无法找回,请谨慎操作',
'common.modal.table.stop.content': '确定要停止此任务吗? 停止后模型将停止运行',
'common.enable': '开启',
'common.disable': '禁用',
'common.yes': '是',

@ -70,4 +70,6 @@ export default {
'pages.searchTable.tenThousand': '万',
'pages.searchTable.batchDeletion': '批量删除',
'pages.searchTable.batchApproval': '批量审批',
'pages.searchTable.stop': '停止',
'pages.searchTable.edit': '编辑',
};

@ -79,3 +79,21 @@ export const model_version: { [key: string]: string } = {
'resource.model_version.table.list.add': '新建模型版本',
'resource.model_version.table.list.update': '更新模型版本',
};
export const server_status: { [key: string]: string } = {
'resource.server_status.table.list.name': '服务器名称',
'resource.server_status.table.list.userName': '用户名',
'resource.server_status.table.list.ip': 'IP',
'resource.server_status.table.list.password': '密码',
'resource.server_status.table.list.defaultPort': '默认端口',
'resource.server_status.table.list.parameter': '服务器参数',
'resource.server_status.table.list.publicKeyString': '公钥字符串',
'resource.server_status.table.list.connectivityTesting': '连通性测试',
'resource.server_status.table.list.isEnable': '是否启用',
'resource.server_status.table.list.remark': '备注',
'resource.server_status.table.list.createTime': '创建时间',
'resource.server_status.table.list.updateTime': '更新时间',
'resource.server_status.table.rule.required.modelFkId': '模型为必填项',
'resource.server_status.table.rule.required.path': '模型地址为必填项',
'resource.server_status.table.list.add': '新建服务器',
'resource.server_status.table.list.update': '更新模型版本',
};

@ -152,3 +152,9 @@ export const operation_record: { [key: string]: string } = {
'system.operation.table.rule.list.ip': '请填写IP',
'system.operation.table.rule.list.path': '请填写接口路径',
}
export const parameter_setting: { [key: string]: string } = {
'system.parameter.table.list.label': '标签',
'system.parameter.table.list.editor': '编辑参数',
'system.parameter.table.rule.required.label': '参数为必填',
}

@ -135,7 +135,7 @@ const AccountCenter: React.FC = () => {
</Button>
</div>
<div>
<span className={styles.spanStyle}>:</span>wangliqun
<span className={styles.spanStyle}>:</span>***********
<Button
type="link"
color="#154DDD"

@ -0,0 +1,185 @@
/**
*
*
*/
import { postBusinessImageCreateBusinessImage } from '@/services/resource/BusinessImage';
import { ModalForm, ProForm, ProFormText, ProFormTextArea } from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Button, Form, message } from 'antd';
import { proFormItemStyleProps, proFormModelWidth } from '../../../../../config/defaultForm';
import React from 'react';
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.BusinessImage>;
export type CreateFormProps = {
createModalOpen: boolean;
handleModal: () => void;
values: Partial<API.BusinessImage>;
reload: any;
};
const CreateForm: React.FC<CreateFormProps> = (props) => {
const intl = useIntl();
const [form] = Form.useForm<API.BusinessImage>();
return (
<ModalForm<API.BusinessImage>
width={proFormModelWidth}
title={intl.formatMessage({
id: 'resource.server_status.table.list.add',
defaultMessage: '$$$',
})}
open={props.createModalOpen}
form={form}
autoFocusFirstInput
modalProps={{
destroyOnClose: true,
onCancel: () => props.handleModal(),
}}
submitTimeout={2000}
onFinish={async (values) => {
postBusinessImageCreateBusinessImage(values)
.then(() => {
message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
props.reload();
})
.catch(() => {
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
});
props.handleModal();
return true;
}}
>
<FormattedMessage id="resource.server_status.table.list.parameter" defaultMessage="$$$" />
<ProForm.Group>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="name"
label={
<FormattedMessage id="resource.server_status.table.list.name" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.name',
defaultMessage: '$$$',
})}`}
required={false}
rules={[
{
required: true,
message: (
<FormattedMessage
id="resource.server_status.table.list.name"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="userName"
label={
<FormattedMessage
id="resource.server_status.table.list.userName"
defaultMessage="$$$"
/>
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.userName',
defaultMessage: '$$$',
})}`}
required={false}
rules={[
{
required: true,
message: (
<FormattedMessage
id="resource.server_status.table.list.userName"
defaultMessage="version is required"
/>
),
},
]}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="ip"
label={
<FormattedMessage id="resource.server_status.table.list.ip" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.ip',
defaultMessage: '$$$',
})}`}
required={false}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="password"
label={
<FormattedMessage
id="resource.server_status.table.list.password"
defaultMessage="$$$"
/>
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.password',
defaultMessage: '$$$',
})}`}
required={false}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="defaultPort"
label={
<FormattedMessage
id="resource.server_status.table.list.defaultPort"
defaultMessage="$$$"
/>
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.defaultPort',
defaultMessage: '$$$',
})}`}
required={false}
/>
<ProFormTextArea
width={proFormItemStyleProps.width}
name="publicKeyString"
label={
<FormattedMessage id="resource.server_status.table.list.publicKeyString" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.publicKeyString',
defaultMessage: '$$$',
})}`}
required={false}
/>
<Button type="primary" ghost><FormattedMessage id="resource.server_status.table.list.connectivityTesting" defaultMessage="$$$" /></Button>
</ProForm.Group>
</ModalForm>
);
};
export default CreateForm;

@ -0,0 +1,115 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-06 16:12:17
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-12-11 16:12:17
* @FilePath: \general-ai-platform-web\src\pages\Setting\components\ProjectCardList.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import React from 'react';
import { Progress } from 'antd';
// import { postModelVersionGetModelVersionListByIds } from '@/services/resource/ModelVersion';
// const [tabs, setTabs] = useState([]);
// const [projectData, setProjectData] = useState<any>({});
// const [tab, setTab] = useState('');
// const [modelVersionData, setModelVersionData] = useState<any[]>([]);
/**styles */
const listItemStyle = {
display: 'flex',
fontSize: 14,
color: '#333333',
width: '100%',
alignItems: 'center',
padding: '8px 0 0',
};
const listItemLabelStyle = {
fontSize: 14,
color: '#666666',
minWidth: 40,
};
const listItemTextStyle = {
fontSize: 14,
margin: 0,
};
// 卡片
export type UpdateProjectProps = {
info: Record<string, any>;
// reload: any;
};
type DeviceItemProgress = {
label: string;
percent: number;
};
// 进度条
// TODO 进度条的边框圆角调整为矩形
const DeviceItemProgress: React.FC<DeviceItemProgress> = (props) => {
let strokeColor = 'rgb(243,48,5)';
switch (props.label) {
case 'CPU':
strokeColor = 'rgb(243,48,5)';
break;
case '内存':
strokeColor = 'rgb(33,169,122)';
break;
case '存储':
strokeColor = 'rgb(33,169,122)';
break;
case 'GPU':
strokeColor = 'rgb(250,173,20)';
break;
}
return (
<div style={{ width: '100%', display: 'flex' }} className='rectProgress_box'>
<span style={listItemLabelStyle}>{props.label}</span>
<Progress style={{padding:0, margin: 0, borderRadius: 0}} size={['100%', 10]} height={46} percent={props.percent * 100} strokeColor={strokeColor} showInfo={false} />
</div>
);
};
const DeviceStatusCard: React.FC<UpdateProjectProps> = ({
info,
}: {
info: Record<string, any>;
}) => {
return (
<div
style={{
width: '100%',
display: 'flex',
flexDirection: 'column',
alignItems: 'left',
paddingLeft: 15,
paddingRight: 15,
}}
>
{/* <div style={{ display: 'flex', alignItems: 'center', paddingBottom: 10 }}>
<span style={{ fontWeight: 700, fontSize: 14, paddingRight: 10 }}></span>
<Tag color="#44AEF5"></Tag>
</div> */}
<ul style={{width: '100%'}}>
<li style={listItemStyle}>
<DeviceItemProgress label="CPU" percent={0.79}></DeviceItemProgress>
</li>
<li style={listItemStyle}>
<DeviceItemProgress label="内存" percent={0.18}></DeviceItemProgress>
</li>
<li style={listItemStyle}>
<DeviceItemProgress label="存储" percent={0.16}></DeviceItemProgress>
</li>
<li style={listItemStyle}>
<DeviceItemProgress label="GPU" percent={0.58}></DeviceItemProgress>
</li>
</ul>
</div>
);
};
export default DeviceStatusCard;

@ -0,0 +1,191 @@
/**
*
*
*/
import { putBusinessImageUpdateBusinessImage } from '@/services/resource/BusinessImage';
import {
ModalForm,
ProForm,
ProFormText,
ProFormTextArea,
} from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Button, Form, message } from 'antd';
import React from 'react';
import { proFormItemStyleProps, proFormModelWidth } from '../../../../../config/defaultForm';
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.BusinessImage>;
export type UpdateFormProps = {
updateModalOpen: boolean;
handleModal: () => void;
values: Partial<API.BusinessImage>;
reload: any;
};
const UpdateForm: React.FC<UpdateFormProps> = (props) => {
const intl = useIntl();
const [form] = Form.useForm<API.BusinessImage>();
return (
<ModalForm<API.BusinessImage>
width={proFormModelWidth}
title={intl.formatMessage({
id: 'resource.business_image.table.list.update',
defaultMessage: '$$$',
})}
open={props.updateModalOpen}
form={form}
autoFocusFirstInput
modalProps={{
destroyOnClose: true,
onCancel: () => props.handleModal(),
}}
submitTimeout={2000}
onFinish={async (values) => {
putBusinessImageUpdateBusinessImage(values)
.then(() => {
message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
props.reload();
})
.catch(() => {
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
});
props.handleModal();
return true;
}}
>
<FormattedMessage id="resource.server_status.table.list.parameter" defaultMessage="$$$" />
<ProForm.Group>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="name"
label={
<FormattedMessage id="resource.server_status.table.list.name" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.name',
defaultMessage: '$$$',
})}`}
required={false}
rules={[
{
required: true,
message: (
<FormattedMessage
id="resource.server_status.table.list.name"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="userName"
label={
<FormattedMessage
id="resource.server_status.table.list.userName"
defaultMessage="$$$"
/>
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.userName',
defaultMessage: '$$$',
})}`}
required={false}
rules={[
{
required: true,
message: (
<FormattedMessage
id="resource.server_status.table.list.userName"
defaultMessage="version is required"
/>
),
},
]}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="ip"
label={
<FormattedMessage id="resource.server_status.table.list.ip" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.ip',
defaultMessage: '$$$',
})}`}
required={false}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="password"
label={
<FormattedMessage
id="resource.server_status.table.list.password"
defaultMessage="$$$"
/>
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.password',
defaultMessage: '$$$',
})}`}
required={false}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="defaultPort"
label={
<FormattedMessage
id="resource.server_status.table.list.defaultPort"
defaultMessage="$$$"
/>
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.defaultPort',
defaultMessage: '$$$',
})}`}
required={false}
/>
<ProFormTextArea
width={proFormItemStyleProps.width}
name="publicKeyString"
label={
<FormattedMessage id="resource.server_status.table.list.publicKeyString" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'resource.server_status.table.list.publicKeyString',
defaultMessage: '$$$',
})}`}
required={false}
/>
<Button type="primary" ghost><FormattedMessage id="resource.server_status.table.list.connectivityTesting" defaultMessage="$$$" /></Button>
</ProForm.Group>
</ModalForm>
);
};
export default UpdateForm;

@ -0,0 +1,394 @@
import TableActionCard from '@/components/TableActionCard';
import { deviceStatusEnums } from '@/enums/status';
import { ActionType, PageContainer, ProCard, ProList } from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Button, Modal, Tag } from 'antd';
import React, { useRef, useState } from 'react';
import { proTableCommonOptions, proTablePaginationOptions } from '../../../../config/defaultTable';
import DeviceStatusCard from './components/DeviceStatusCard';
import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm';
import { QuestionCircleFilled } from '@ant-design/icons';
/**
* @
* 1
*/
const tabOptions: Record<string, any> = {
allStatus: 90,
onlineStatus: 20,
outlineStatus: 20,
// processingStatus: 10,
// errorStatus: 20,
};
export type DeleteBoxProps = {
modalOpen: boolean;
handleModal: () => void;
values: any
reload: any;
};
const ServerStatus: React.FC = () => {
const [cardActionProps, setCardActionProps] = useState<'actions' | 'extra'>('extra');
/**
* @en-US Pop-up window of new window
* @zh-CN
* */
const [createModalOpen, setCreateModalOpen] = useState<boolean>(false);
/**
* @en-US The pop-up window of the distribution update window
* @zh-CN
* */
const [updateModalOpen, setUpdateModalOpen] = useState<boolean>(false);
/**
* @en-US The pop-up window of the distribution update window
* @zh-CN
* */
const [modalOpen, setModalOpen] = useState(false);
const [currentRow, setCurrentRow] = useState<Record<string, any>>({});
/**
* @en-US International configuration
* @zh-CN
* */
// const access = useAccess();
// const intl = useIntl();
const actionRef = useRef<ActionType>();
// 动态设置每页数量
const [currentPageSize, setCurrentPageSize] = useState<number>(8);
const [activeTabIndex, setActiveTabIndex] = useState<number>(0);
const handleCreateModal = () => {
if (createModalOpen) {
setCreateModalOpen(false);
setCurrentRow(undefined);
} else {
setCreateModalOpen(true);
}
};
const handleUpdateModal = () => {
if (updateModalOpen) {
setUpdateModalOpen(false);
setCurrentRow(undefined);
} else {
setUpdateModalOpen(true);
}
};
const handleDestroy = async () => {
if (modalOpen) {
setModalOpen(false);
setCurrentRow(undefined);
} else {
setModalOpen(true);
}
// deleteBusinessImageDeleteBusinessImage({ id: selectedRow.id })
// .then(() => {
// message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
// actionRef.current?.reload();
// })
// .catch(() => {
// message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
// });
};
const { confirm } = Modal;
const showConfirm = (record: any) => {
confirm({
title: record.status,
icon: <QuestionCircleFilled />,
content: '确定删除服务器1吗删除后将找不到此服务器请谨慎操作.',
okText: '确认',
cancelText: '取消',
width: 560,
onOk() {
console.log('OK');
},
onCancel() {
console.log('Cancel');
},
});
};
const dataTestList = [
{ status: '在线' },
{ status: '在线' },
{ status: '离线' },
{ status: '离线' },
{ status: '离线' },
{ status: '在线' },
{ status: '在线' },
{ status: '离线' },
].map((record, index) => {
let currColor = 'default';
switch (record.status) {
case '在线':
currColor = 'success';
break;
case '故障':
currColor = 'error';
break;
case '运行中':
currColor = 'warning';
break;
default:
currColor = 'default';
break;
}
return {
content: (
<ProCard
className="gn"
style={{ backgroundColor: '#FAFAFA', margin: 0, padding: 0 }}
bodyStyle={{ margin: 0, padding: 0 }}
>
<div
style={{
display: 'flex',
alignItems: 'center',
padding: 12,
justifyContent: 'space-between',
borderBottom: '1px solid rgba(224, 224, 224, 1)',
}}
>
<div
style={{
display: 'flex',
alignItems: 'center',
maxWidth: '60%',
}}
>
<Tag color={currColor}>{record.status}</Tag>
<p
className="gn single_line text_1 fw7"
style={{ maxWidth: '80%', padding: 0, margin: 0 }}
>
{index + 1}
</p>
</div>
<TableActionCard
key="TableActionCardRef"
listType="proList"
renderActions={[
{
key: 'update',
renderDom: (
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="pages.searchTable.edit" defaultMessage="Update" />
</Button>
),
},
{
key: 'destroy',
renderDom: (
// <IsDelete
// deleteApi={() => {
// handleDestroy(record).then(() => {});
// }}
// ></IsDelete>
<Button
key="destroy"
type="link"
size="small"
danger
onClick={() => {
setCurrentRow(record);
showConfirm(record);
}}
>
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="destroy" />
</Button>
),
},
]}
></TableActionCard>
</div>
<DeviceStatusCard info={record}></DeviceStatusCard>{' '}
</ProCard>
),
};
});
return (
<PageContainer
title={false}
content={
<div style={{
display: 'flex',
justifyContent: 'space-between'
}}>
<div style={{
fontWeight: 600,
fontSize: 20,
color: '#333'
}}></div>
<Button type="primary"
onClick={() => {
setCreateModalOpen(true);
}}
>
<FormattedMessage id="resource.server_status.table.list.add" defaultMessage="add" />
</Button>
</div>
}
>
<ProList<any>
className="gn"
ghost={true}
itemCardProps={{
ghost: true,
bodyStyle: { padding: 0, margin: 0 },
}}
// search={{
// labelWidth: proTableCommonOptions.searchLabelWidth,
// }}
headerTitle={
<>
<div>
{Object.keys(tabOptions).map((item, index) => {
// eslint-disable-next-line react/jsx-key
return (
<Button
style={{ marginRight: 12 }}
type={activeTabIndex === index ? 'primary' : 'default'}
key={index}
onClick={() => {
setActiveTabIndex(index);
}}
>
{Object.keys(deviceStatusEnums).includes(item)
? deviceStatusEnums[item].miniName
: ''}
{"("+tabOptions[item]+ ')'}
</Button>
);
})}
</div>
</>
}
cardProps={{
bodyStyle: {
background: 'white',
padding: '8px 16px 16px',
borderRadius: 8,
},
}}
pagination={{
...proTablePaginationOptions,
pageSize: currentPageSize,
onChange: (page, pageSize) => setCurrentPageSize(pageSize),
}}
showActions="hover"
rowSelection={false}
grid={{ gutter: 16, xs: 1, md: 2, lg: 2, xl: 4, xxl: 4 }}
metas={{
type: {
// 不展示在筛选项
hideInSearch: true,
},
content: {
hideInSearch: true,
},
actions: {
cardActionProps,
},
// status1: {
// // 自己扩展的字段,主要用于筛选,不在列表中显示
// title: '设备组',
// valueType: 'select',
// valueEnum: {
// '0': { text: '全部设备分组', status: '0' },
// '1': {
// text: '设备分组1',
// status: '1',
// },
// '2': {
// text: '设备分组2',
// status: '2',
// },
// '3': {
// text: '设备分组3',
// status: '3',
// },
// },
// },
// status2: {
// // 自己扩展的字段,主要用于筛选,不在列表中显示
// title: '分类',
// valueType: 'select',
// valueEnum: {
// '0': { text: '全部分类', status: '0' },
// '1': {
// text: '外围监控',
// status: '1',
// },
// '2': {
// text: '室内监控',
// status: '2',
// },
// '3': {
// text: '违规监控',
// status: '3',
// },
// },
// },
}}
request={async (params = {}, sort) => {
const { current, ...rest } = params;
const reqParams = {
page: current,
desc: false,
orderKey: '',
...rest,
};
if (sort && Object.keys(sort).length) {
reqParams.orderKey = Object.keys(sort)[0];
let sort_select = sort[reqParams.orderKey];
reqParams.desc = sort_select === 'descend';
}
// TODO 联调查询设备状态接口
// let resps = await postDeviceGroupGetDeviceGroupList({ ...reqParams });
let resp = {
success: true,
data: {
list: dataTestList,
total: 8,
page: 1,
pageSize: 8,
},
};
return {
data: resp.data.list,
success: resp.success,
total: resp.data.total,
current: resp.data.page,
pageSize: resp.data.pageSize,
};
}}
/>
<CreateForm
createModalOpen={createModalOpen}
values={currentRow || {}}
handleModal={handleCreateModal}
reload={actionRef.current?.reload}
/>
<UpdateForm
updateModalOpen={updateModalOpen}
values={currentRow || {}}
handleModal={handleUpdateModal}
reload={actionRef.current?.reload}
/>
</PageContainer>
);
};
export default ServerStatus;

@ -0,0 +1,92 @@
import { putProjectUpdateProject } from '@/services/project/Project';
import {
ModalForm,
ProForm,
ProFormText,
} from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Form, message } from 'antd';
import { proFormSmallItemStyleProps, proFormSmallModelWidth } from '../../../../../config/defaultForm';
import React from 'react';
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.Project>;
export type UpdateFormProps = {
updateModalOpen: boolean;
handleModal: () => void;
values: Partial<API.Project>;
reload: any;
};
const UpdateParameterForm: React.FC<UpdateFormProps> = (props) => {
const intl = useIntl();
const [form] = Form.useForm<API.Project>();
return (
<ModalForm<API.Project>
width={proFormSmallModelWidth}
title={intl.formatMessage({
id: 'system.parameter.table.list.editor',
defaultMessage: '$$$',
})}
open={props.updateModalOpen}
form={form}
autoFocusFirstInput
modalProps={{
destroyOnClose: true,
onCancel: () => props.handleModal(),
}}
submitTimeout={2000}
onFinish={async (values) => {
putProjectUpdateProject(values)
.then(() => {
message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
props.reload();
})
.catch(() => {
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
});
props.handleModal();
return true;
}}
>
<ProForm.Group>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="name"
label={<FormattedMessage id="system.parameter.table.list.label" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.parameter.table.list.label',
defaultMessage: '$$$',
})}`}
required={false}
initialValue={props.values.name}
disabled={false}
rules={[
{
required: true,
message: (
<FormattedMessage
id="system.parameter.table.rule.required.label"
defaultMessage="account is required"
/>
),
},
]}
/>
</ProForm.Group>
</ModalForm>
);
};
export default UpdateParameterForm;

@ -0,0 +1,244 @@
import { PageContainer, ProCard, ProForm } from '@ant-design/pro-components';
import React, { useEffect, useRef, useState } from 'react';
import { EditOutlined } from '@ant-design/icons';
import { Button, Input, message, } from 'antd';
import type { ActionType } from '@ant-design/pro-components';
import styles from "./parameterSetting.less";
import UpdateParameterForm from './components/UpdateParameterForm';
import { FormattedMessage, useIntl } from '@umijs/max';
/**
* @
* @returns
*/
const ParameterSetting: React.FC = () => {
const intl = useIntl();
const actionRef = useRef<ActionType>();
const [updateParameterModalOpen, setUpdateParameterModalOpen] = useState<boolean>(false);
const [currentRow, setCurrentRow] = useState<API.Project>();
const handleUpdateParameterModal = () => {
if (updateParameterModalOpen) {
setUpdateParameterModalOpen(false);
setCurrentRow(undefined);
} else {
setUpdateParameterModalOpen(true);
}
};
const [stateValue, setStateValue] = useState({});
return (
<PageContainer>
<ProCard
style={{ background: 'white' }}
bodyStyle={{
padding: 40,
margin: 0,
}}
gutter={24}
wrap
ghost
>
<ProForm
layout='vertical'
grid={true}
rowProps={{
gutter: 24
}}
submitter={false}
>
<ProForm.Item
label={<FormattedMessage id="system.parameter.table.list.label" defaultMessage="$$$" />}
style={{
width: '50%'
}}>
<Input placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.parameter.table.list.label',
defaultMessage: '$$$',
})}`} disabled style={{
width: '92%'
}} />
<Button
type="link"
icon={<EditOutlined />}
onClick={() => {
setUpdateParameterModalOpen(true);
}}
/>
</ProForm.Item>
<ProForm.Item
label={<FormattedMessage id="system.parameter.table.list.label" defaultMessage="$$$" />}
style={{
width: '50%'
}}>
<Input placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.parameter.table.list.label',
defaultMessage: '$$$',
})}`} disabled style={{
width: '92%'
}} />
<Button
type="link"
icon={<EditOutlined />}
onClick={() => {
setUpdateParameterModalOpen(true);
}}
/>
</ProForm.Item>
<ProForm.Item
label={<FormattedMessage id="system.parameter.table.list.label" defaultMessage="$$$" />}
style={{
width: '50%'
}}>
<Input placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.parameter.table.list.label',
defaultMessage: '$$$',
})}`} disabled style={{
width: '92%'
}} />
<Button
type="link"
icon={<EditOutlined />}
onClick={() => {
setUpdateParameterModalOpen(true);
}}
/>
</ProForm.Item>
<ProForm.Item
label={<FormattedMessage id="system.parameter.table.list.label" defaultMessage="$$$" />}
style={{
width: '50%'
}}>
<Input placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.parameter.table.list.label',
defaultMessage: '$$$',
})}`} disabled style={{
width: '92%'
}} />
<Button
type="link"
icon={<EditOutlined />}
onClick={() => {
setUpdateParameterModalOpen(true);
}}
/>
</ProForm.Item>
<ProForm.Item
label={<FormattedMessage id="system.parameter.table.list.label" defaultMessage="$$$" />}
style={{
width: '50%'
}}>
<Input placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.parameter.table.list.label',
defaultMessage: '$$$',
})}`} disabled style={{
width: '92%'
}} />
<Button
type="link"
icon={<EditOutlined />}
onClick={() => {
setUpdateParameterModalOpen(true);
}}
/>
</ProForm.Item>
<ProForm.Item
label={<FormattedMessage id="system.parameter.table.list.label" defaultMessage="$$$" />}
style={{
width: '50%'
}}>
<Input placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.parameter.table.list.label',
defaultMessage: '$$$',
})}`} disabled style={{
width: '92%'
}} />
<Button
type="link"
icon={<EditOutlined />}
onClick={() => {
setUpdateParameterModalOpen(true);
}}
/>
</ProForm.Item>
<ProForm.Item
label={<FormattedMessage id="system.parameter.table.list.label" defaultMessage="$$$" />}
style={{
width: '50%'
}}>
<Input placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.parameter.table.list.label',
defaultMessage: '$$$',
})}`} disabled style={{
width: '92%'
}} />
<Button
type="link"
icon={<EditOutlined />}
onClick={() => {
setUpdateParameterModalOpen(true);
}}
/>
</ProForm.Item>
<ProForm.Item
label={<FormattedMessage id="system.parameter.table.list.label" defaultMessage="$$$" />}
style={{
width: '50%'
}}>
<Input placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.parameter.table.list.label',
defaultMessage: '$$$',
})}`} disabled style={{
width: '92%'
}} />
<Button
type="link"
icon={<EditOutlined />}
onClick={() => {
setUpdateParameterModalOpen(true);
}}
/>
</ProForm.Item>
</ProForm>
</ProCard>
<UpdateParameterForm
updateModalOpen={updateParameterModalOpen}
values={currentRow || {}}
handleModal={handleUpdateParameterModal}
reload={actionRef.current?.reload}
/>
</PageContainer>
);
};
export default ParameterSetting;

@ -0,0 +1,29 @@
.infoBox {
margin-left: 78px;
padding-top: 5px;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: flex-start;
height: 90px;
color: #333;
}
.infoBoxRight {
margin-left: 65px;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
height: 90px;
color: #333;
}
.spanStyle {
display: inline-block;
width: 68px;
color: #666;
}
.inputWidth {
.ant-form-item-control-input {
width: 90%;
}
}

@ -1,6 +1,6 @@
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete';
import StopBtn from '@/components/TableActionCard/stopBtn';
import {
deleteProjectDeleteProject,
deleteProjectDeleteProjectByIds,
@ -130,11 +130,11 @@ const TaskList: React.FC = () => {
{
key: 'destroy',
renderDom: (
<IsDelete
<StopBtn
deleteApi={() => {
handleDestroy(record).then(() => {});
}}
></IsDelete>
></StopBtn>
),
},
]}

Loading…
Cancel
Save