feat(event): 实现事件管理功能
- 新增事件列表展示页面 - 实现事件的增删查功能- 添加事件名称、标识、描述字段校验 - 集成事件相关的API接口调用 - 使用场景ID查询事件列表 - 实现事件删除确认弹窗提示master
parent
4a310d573f
commit
e9fee3c0ab
@ -0,0 +1,41 @@
|
||||
import axios from 'axios';
|
||||
import { AddEventParams, DeleteEventParams, DeleteEventForAppParams } from '@/api/interface';
|
||||
|
||||
// 公共路径
|
||||
const urlPrefix = '/api/v1/bpms-workbench';
|
||||
|
||||
// 事件管理-获取事件列表
|
||||
export function getEventList() {
|
||||
return axios.get(`${urlPrefix}/event/list`);
|
||||
}
|
||||
|
||||
// 事件管理-添加事件
|
||||
export function addEventItem(params: AddEventParams) {
|
||||
return axios.post(`${urlPrefix}/event/addSub`, params);
|
||||
}
|
||||
|
||||
// 事件管理-删除事件
|
||||
export function deleteEventItem(id: DeleteEventParams) {
|
||||
return axios.delete(`${urlPrefix}/event/${id}/del`);
|
||||
}
|
||||
|
||||
// 事件管理-删除应用发布(事件发送)
|
||||
export function deleteEventPub(params: DeleteEventForAppParams) {
|
||||
return axios.delete(`${urlPrefix}/event/pub`, { data: params });
|
||||
}
|
||||
|
||||
// 事件管理-删除应用定远(事件接收)
|
||||
export function deleteEventSub(params: DeleteEventForAppParams) {
|
||||
return axios.delete(`${urlPrefix}/event/sub`, { data: params });
|
||||
}
|
||||
|
||||
// 事件管理-查询事件
|
||||
export function queryEventItem(name: string) {
|
||||
return axios.post(`${urlPrefix}/event/get`, { name });
|
||||
}
|
||||
|
||||
// 事件管理-使用场景ID查询事件
|
||||
export function queryEventItemBySceneId(sceneId: string) {
|
||||
return axios.get(`${urlPrefix}/event/${sceneId}/get`);
|
||||
}
|
||||
|
||||
@ -0,0 +1,233 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import styles from './style/index.module.less';
|
||||
import {
|
||||
Button,
|
||||
Input,
|
||||
Space,
|
||||
Divider,
|
||||
Table,
|
||||
TableColumnProps,
|
||||
Modal,
|
||||
Form,
|
||||
Message,
|
||||
Popconfirm
|
||||
} from '@arco-design/web-react';
|
||||
import { IconSearch } from '@arco-design/web-react/icon';
|
||||
import { useSelector } from 'react-redux';
|
||||
import { addEventItem, deleteEventItem, queryEventItemBySceneId } from '@/api/event';
|
||||
|
||||
const FormItem = Form.Item;
|
||||
const TextArea = Input.TextArea;
|
||||
|
||||
const HandleModal = ({ visible, onChangeVisible, onRefresh }) => {
|
||||
const [form] = Form.useForm();
|
||||
const { info } = useSelector((state: any) => state.ideContainer);
|
||||
|
||||
const onOk = async () => {
|
||||
await form.validate();
|
||||
const formData = form.getFields();
|
||||
|
||||
const params = {
|
||||
name: formData.name,
|
||||
topic: `${formData.topic}/${info.identity}`,
|
||||
description: formData.description,
|
||||
sceneId: info.id
|
||||
};
|
||||
|
||||
const res: any = await addEventItem(params);
|
||||
|
||||
if (res && res.code === 200) {
|
||||
Message.success('添加成功');
|
||||
onChangeVisible(false);
|
||||
onRefresh();
|
||||
}
|
||||
else {
|
||||
Message.error(res.message);
|
||||
}
|
||||
|
||||
// 清空表单数据和其他变量数据
|
||||
form.resetFields();
|
||||
|
||||
};
|
||||
|
||||
return (
|
||||
<Modal
|
||||
title="新增事件"
|
||||
visible={visible}
|
||||
onOk={() => onOk()}
|
||||
onCancel={() => onChangeVisible(false)}
|
||||
autoFocus={false}
|
||||
focusLock={true}
|
||||
maskClosable={false}
|
||||
>
|
||||
<Form form={form} autoComplete="off">
|
||||
<FormItem
|
||||
field="name"
|
||||
label="事件名称"
|
||||
required
|
||||
rules={[
|
||||
{
|
||||
validator(value, cb) {
|
||||
if (!value) {
|
||||
return cb('请填写事件名称');
|
||||
}
|
||||
// 检查是否只包含汉字
|
||||
const chineseOnlyRegex = /^[\u4e00-\u9fa5]+$/;
|
||||
if (!chineseOnlyRegex.test(value)) {
|
||||
return cb('事件名称只能输入汉字');
|
||||
}
|
||||
|
||||
return cb();
|
||||
}
|
||||
}
|
||||
]}
|
||||
>
|
||||
<Input placeholder="请输入事件名称" />
|
||||
</FormItem>
|
||||
<FormItem
|
||||
field="topic"
|
||||
label="事件标识"
|
||||
required
|
||||
rules={[
|
||||
{
|
||||
validator(value, cb) {
|
||||
if (!value) {
|
||||
return cb('请填写事件标识');
|
||||
}
|
||||
|
||||
return cb();
|
||||
}
|
||||
}
|
||||
]}
|
||||
>
|
||||
<Input placeholder="请输入事件标识" />
|
||||
</FormItem>
|
||||
<FormItem
|
||||
field="description"
|
||||
label="事件描述"
|
||||
required
|
||||
rules={[
|
||||
{
|
||||
validator(value, cb) {
|
||||
if (!value) {
|
||||
return cb('请填写事件描述');
|
||||
}
|
||||
|
||||
return cb();
|
||||
}
|
||||
}
|
||||
]}
|
||||
>
|
||||
<TextArea placeholder="请输入事件描述" />
|
||||
</FormItem>
|
||||
</Form>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
const EventContainer = () => {
|
||||
const [eventData, setEventData] = useState<any[]>([]);
|
||||
const [visible, setVisible] = useState(false);
|
||||
const { info } = useSelector((state: any) => state.ideContainer);
|
||||
|
||||
const columns: TableColumnProps[] = [
|
||||
{
|
||||
title: '序号',
|
||||
dataIndex: 'index',
|
||||
render: (_, record, index) => (
|
||||
<div>{index + 1}</div>
|
||||
)
|
||||
},
|
||||
{
|
||||
title: '事件名称',
|
||||
dataIndex: 'name'
|
||||
},
|
||||
{
|
||||
title: '事件标识',
|
||||
dataIndex: 'topic',
|
||||
render: (_, record) => (
|
||||
<div>{record.topic.includes('/') ? record.topic.split('/')[0] : record.topic}</div>
|
||||
)
|
||||
},
|
||||
{
|
||||
title: '事件描述',
|
||||
dataIndex: 'description',
|
||||
width: '80%'
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
dataIndex: 'actions',
|
||||
render: (_, record) => (
|
||||
<Popconfirm
|
||||
focusLock
|
||||
title="删除事件"
|
||||
content="事件删除后无法恢复,请谨慎删除!"
|
||||
onOk={async () => {
|
||||
const res: any = await deleteEventItem(record.id);
|
||||
if (res && res.code === 200) {
|
||||
Message.success('删除成功');
|
||||
fetchEventData();
|
||||
}
|
||||
else {
|
||||
Message.error(res.message);
|
||||
}
|
||||
}}
|
||||
|
||||
>
|
||||
<Button style={{ padding: 0 }} type="text" status="danger" size="small">删除</Button>
|
||||
</Popconfirm>
|
||||
)
|
||||
}
|
||||
];
|
||||
|
||||
const fetchEventData = async () => {
|
||||
const res: any = await queryEventItemBySceneId(info.id);
|
||||
if (res && res.code === 200) setEventData(res.data);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (info.id) {
|
||||
fetchEventData();
|
||||
}
|
||||
}, [info.id]);
|
||||
|
||||
return (
|
||||
<div className={styles['event-container']}>
|
||||
{/*头部*/}
|
||||
<div className={styles['event-header']}>
|
||||
<div className={styles['event-title']}>事件列表</div>
|
||||
<div className={styles['event-handle']}>
|
||||
<Space split={<Divider type="vertical" />}>
|
||||
<Input
|
||||
prefix={<IconSearch />}
|
||||
placeholder={'搜索'}
|
||||
style={{ width: 236 }}
|
||||
/>
|
||||
<Button
|
||||
type="primary"
|
||||
style={{ marginLeft: 5, borderRadius: 4 }}
|
||||
onClick={() => setVisible(true)}
|
||||
>
|
||||
+ 添加事件
|
||||
</Button>
|
||||
</Space>
|
||||
</div>
|
||||
</div>
|
||||
{/*数据列表*/}
|
||||
<div className={styles['event-list']}>
|
||||
<Table columns={columns} data={eventData} pagination={false} />
|
||||
</div>
|
||||
|
||||
{visible &&
|
||||
<HandleModal
|
||||
visible={visible}
|
||||
onChangeVisible={(value => setVisible(value))}
|
||||
onRefresh={() => fetchEventData()}
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default EventContainer;
|
||||
@ -0,0 +1,22 @@
|
||||
.event-container {
|
||||
background-color: #ffffff;
|
||||
padding: 17px 19px 0 24px;
|
||||
height: 98%;
|
||||
|
||||
.event-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 15px;
|
||||
|
||||
.event-title {
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.event-handle{}
|
||||
}
|
||||
|
||||
.event-list {
|
||||
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue