feat(globalVar): 实现全局变量管理功能
- 新增全局变量接口定义- 实现全局变量页面UI及交互逻辑 - 添加全局变量新增弹窗组件 - 实现全局变量的增删查功能 - 添加数据类型映射和校验逻辑 - 支持全局变量按类型分类展示 - 实现全局变量搜索过滤功能master
parent
7047ef0ba5
commit
e1b9d084c2
@ -0,0 +1,20 @@
|
||||
import axios from 'axios';
|
||||
import { GlobalParams } from '@/api/interface';
|
||||
|
||||
// 公共路径
|
||||
const urlPrefix = '/api/v1/bpms-workbench';
|
||||
|
||||
// 新增全局变量
|
||||
export function addGlobal(data: GlobalParams) {
|
||||
return axios.post(`${urlPrefix}/global/add`, data);
|
||||
}
|
||||
|
||||
// 获取全局变量列表
|
||||
export function getGlobalList(sceneId: string) {
|
||||
return axios.get(`${urlPrefix}/global/${sceneId}/map`);
|
||||
}
|
||||
|
||||
// 删除全局变量
|
||||
export function deleteGlobal(id: string) {
|
||||
return axios.delete(`${urlPrefix}/global/${id}`);
|
||||
}
|
||||
@ -0,0 +1,261 @@
|
||||
import React from 'react';
|
||||
import { Form, Input, Modal, Select } from '@arco-design/web-react';
|
||||
import { useSelector } from 'react-redux';
|
||||
|
||||
const FormItem = Form.Item;
|
||||
|
||||
// 定义数据类型枚举
|
||||
const dataTypeEnum = [
|
||||
'OBJECT',
|
||||
'JSON',
|
||||
'ARRAY',
|
||||
'BOOLEAN',
|
||||
'INTEGER',
|
||||
'DOUBLE',
|
||||
'STRING',
|
||||
'DATE',
|
||||
'DATETIME',
|
||||
'TIMESTAMP',
|
||||
'DATABASE'
|
||||
];
|
||||
|
||||
// 定义数组元素类型枚举
|
||||
const arrayElementTypeEnum = [
|
||||
'STRING',
|
||||
'INTEGER',
|
||||
'DOUBLE',
|
||||
'BOOLEAN',
|
||||
'DATE',
|
||||
'DATETIME',
|
||||
'TIMESTAMP'
|
||||
];
|
||||
|
||||
// 默认值类型校验方法
|
||||
const validateDefaultValue = (value, dataType, arrayType) => {
|
||||
// 如果没有值,则不进行校验
|
||||
if (value === undefined || value === null || value === '') {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (dataType) {
|
||||
case 'STRING':
|
||||
case 'DATE':
|
||||
case 'DATETIME':
|
||||
case 'TIMESTAMP':
|
||||
case 'DATABASE':
|
||||
// 字符串类型 - 任何值都是有效的
|
||||
return true;
|
||||
|
||||
case 'INTEGER':
|
||||
// 整数类型 - 必须是整数
|
||||
const intRegex = /^-?\d+$/;
|
||||
return intRegex.test(value);
|
||||
|
||||
case 'DOUBLE':
|
||||
// 双精度浮点类型 - 必须是数字
|
||||
const doubleRegex = /^-?\d+(\.\d+)?$/;
|
||||
return doubleRegex.test(value);
|
||||
|
||||
case 'BOOLEAN':
|
||||
// 布尔类型 - 必须是 true 或 false
|
||||
return value === 'true' || value === 'false' || value === true || value === false;
|
||||
|
||||
case 'ARRAY':
|
||||
// 数组类型 - 尝试解析为JSON数组
|
||||
try {
|
||||
const parsed = JSON.parse(value);
|
||||
if (!Array.isArray(parsed)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 根据数组元素类型进行校验
|
||||
if (arrayType) {
|
||||
for (const item of parsed) {
|
||||
switch (arrayType) {
|
||||
case 'STRING':
|
||||
case 'DATE':
|
||||
case 'DATETIME':
|
||||
case 'TIMESTAMP':
|
||||
if (typeof item !== 'string') {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 'INTEGER':
|
||||
if (!Number.isInteger(item)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 'DOUBLE':
|
||||
if (typeof item !== 'number') {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 'BOOLEAN':
|
||||
if (typeof item !== 'boolean') {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
case 'JSON':
|
||||
// JSON类型 - 必须是有效的JSON
|
||||
try {
|
||||
JSON.parse(value);
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
case 'OBJECT':
|
||||
// 对象类型 - 必须是有效的JSON对象
|
||||
try {
|
||||
const parsed = JSON.parse(value);
|
||||
return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
default:
|
||||
// 其他类型暂时不做特殊校验
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
const AddGlobalVarModal = ({ visible, onOk, onChangeVisible, form }) => {
|
||||
const { info } = useSelector((state: any) => state.ideContainer);
|
||||
|
||||
// 获取表单字段值
|
||||
const formData = Form.useWatch('dataType', form);
|
||||
const arrayTypeData = Form.useWatch('arrayType', form);
|
||||
|
||||
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('请填写变量名');
|
||||
}
|
||||
|
||||
return cb();
|
||||
}
|
||||
}
|
||||
]}
|
||||
>
|
||||
<Input placeholder="请输入变量名" />
|
||||
</FormItem>
|
||||
<FormItem
|
||||
field="dataType"
|
||||
label="数据类型"
|
||||
required
|
||||
rules={[
|
||||
{
|
||||
validator(value, cb) {
|
||||
if (!value) {
|
||||
return cb('请选择数据类型');
|
||||
}
|
||||
|
||||
return cb();
|
||||
}
|
||||
}
|
||||
]}
|
||||
>
|
||||
<Select placeholder="请选择数据类型">
|
||||
{dataTypeEnum.map(key => (
|
||||
<Select.Option key={key} value={key}>
|
||||
{key}
|
||||
</Select.Option>
|
||||
))}
|
||||
</Select>
|
||||
</FormItem>
|
||||
{/* 只有在数据类型选择为ARRAY时才展示数组类型选项 */}
|
||||
{formData === 'ARRAY' && (
|
||||
<FormItem
|
||||
field="arrayType"
|
||||
label="数组类型"
|
||||
required
|
||||
rules={[
|
||||
{
|
||||
validator(value, cb) {
|
||||
if (!value) {
|
||||
return cb('请选择数组类型');
|
||||
}
|
||||
|
||||
return cb();
|
||||
}
|
||||
}
|
||||
]}
|
||||
>
|
||||
<Select placeholder="请选择数组类型">
|
||||
{arrayElementTypeEnum.map(key => (
|
||||
<Select.Option key={key} value={key}>
|
||||
{key}
|
||||
</Select.Option>
|
||||
))}
|
||||
</Select>
|
||||
</FormItem>
|
||||
)}
|
||||
<FormItem
|
||||
field="defaultValue"
|
||||
label="默认值"
|
||||
required
|
||||
rules={[
|
||||
{
|
||||
validator(value, cb) {
|
||||
if (!value) {
|
||||
return cb('请填写默认值');
|
||||
}
|
||||
|
||||
// 校验默认值类型
|
||||
if (!validateDefaultValue(value, formData, arrayTypeData)) {
|
||||
// 根据数据类型返回不同的错误消息
|
||||
switch (formData) {
|
||||
case 'INTEGER':
|
||||
return cb('默认值必须是整数');
|
||||
case 'DOUBLE':
|
||||
return cb('默认值必须是数字');
|
||||
case 'BOOLEAN':
|
||||
return cb('默认值必须是 true 或 false');
|
||||
case 'ARRAY':
|
||||
return cb('默认值必须是有效的JSON数组格式');
|
||||
case 'JSON':
|
||||
return cb('默认值必须是有效的JSON格式');
|
||||
case 'OBJECT':
|
||||
return cb('默认值必须是有效的格式');
|
||||
default:
|
||||
return cb('默认值格式不正确');
|
||||
}
|
||||
}
|
||||
|
||||
return cb();
|
||||
}
|
||||
}
|
||||
]}
|
||||
>
|
||||
<Input placeholder="请输入默认值" />
|
||||
</FormItem>
|
||||
</Form>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
|
||||
export default AddGlobalVarModal;
|
||||
Loading…
Reference in New Issue