feat(component-env): 支持环境编辑与测试功能

- 添加 record 属性以支持表单数据回显
- 实现环境测试接口及调用逻辑
- 更新环境配置模态框交互流程
- 优化环境删除确认逻辑
- 移除调试用 console 日志输出
master
钟良源 3 months ago
parent 319e917676
commit d4c2c0a63d

@ -21,4 +21,9 @@ export function deleteEnvConfig(id: string) {
// 下载环境配置文件 // 下载环境配置文件
export function downloadEnvConfigFile(id: string) { export function downloadEnvConfigFile(id: string) {
return axios.post(`${urlPrefix}/componentDeployEnv/download`, { id }); return axios.post(`${urlPrefix}/componentDeployEnv/download`, { id });
}
// 环境测试
export function testEnv(id: string) {
return axios.get(`${urlPrefix}/componentDeployEnv/check?id=${id}`);
} }

@ -18,20 +18,28 @@ interface AddModalProps {
visible: boolean; visible: boolean;
envType: EnvTypeOption[]; envType: EnvTypeOption[];
setVisible: (visible: boolean) => void; setVisible: (visible: boolean) => void;
onOk?: () => void; onOk?: (value) => void;
record?: any; // 添加record属性用于接收外部传入的数据
} }
const AddModal = ({ visible, envType, setVisible, onOk }: AddModalProps) => { const AddModal = ({ visible, envType, setVisible, onOk, record }: AddModalProps) => {
const [currentStep, setCurrentStep] = useState(2); const [currentStep, setCurrentStep] = useState(1);
const [envTypeOptions, setEnvTypeOptions] = useState<EnvTypeOption[]>([]); const [envTypeOptions, setEnvTypeOptions] = useState<EnvTypeOption[]>([]);
const [confirmLoading, setConfirmLoading] = useState(false); const [confirmLoading, setConfirmLoading] = useState(false);
const [currentEnvData,setCurrentEnvData] = useState<any>({}); const [currentEnvData, setCurrentEnvData] = useState<any>({});
const formRef = useRef<FormEditorInstance>(null); const formRef = useRef<FormEditorInstance>(null);
useEffect(() => { useEffect(() => {
if (envType.length > 0) setEnvTypeOptions(envType); if (envType.length > 0) setEnvTypeOptions(envType);
}, [envType]); }, [envType]);
// 当组件接收到record参数时初始化数据并跳转到第二步
useEffect(() => {
if (record && Object.keys(record).length > 0) setCurrentStep(2);
else setCurrentStep(1);
setCurrentEnvData(record);
}, [record]);
const handleOk = () => { const handleOk = () => {
// 当前步骤为1时触发表单提交 // 当前步骤为1时触发表单提交
if (currentStep === 1) { if (currentStep === 1) {
@ -39,8 +47,7 @@ const AddModal = ({ visible, envType, setVisible, onOk }: AddModalProps) => {
return; return;
} }
// 其他步骤的确认逻辑可以在这里添加 setVisible(false);
console.log('ok');
}; };
const handleCancel = () => { const handleCancel = () => {
@ -50,8 +57,8 @@ const AddModal = ({ visible, envType, setVisible, onOk }: AddModalProps) => {
const handleStepOneSuccess = (value) => { const handleStepOneSuccess = (value) => {
setCurrentStep(2); setCurrentStep(2);
setCurrentEnvData(value) setCurrentEnvData(value);
onOk && onOk(); onOk && onOk(value);
}; };
// 返回第一步的处理函数 // 返回第一步的处理函数
@ -93,6 +100,7 @@ const AddModal = ({ visible, envType, setVisible, onOk }: AddModalProps) => {
{currentStep === 1 && ( {currentStep === 1 && (
<FormEditor <FormEditor
ref={formRef} ref={formRef}
record={record}
envTypeOptions={envTypeOptions} envTypeOptions={envTypeOptions}
setVisible={setVisible} setVisible={setVisible}
setConfirmLoading={setConfirmLoading} setConfirmLoading={setConfirmLoading}

@ -1,12 +1,13 @@
import React from 'react'; import React, { useState } from 'react';
import { Button, Space } from '@arco-design/web-react'; import { Button, Space } from '@arco-design/web-react';
import { downloadEnvConfigFile } from '@/api/componentDeployEnv'; import { downloadEnvConfigFile, testEnv } from '@/api/componentDeployEnv';
const EnvExtra = ({ currentEnvData }) => { const EnvExtra = ({ currentEnvData }) => {
const [testLoading, setTestLoading] = useState(false);
// 模拟下载配置证书文件 // 模拟下载配置证书文件
const handleDownloadConfig = () => { const handleDownloadConfig = () => {
// 这里可以添加实际的下载逻辑 // 这里可以添加实际的下载逻辑
console.log('下载配置证书文件');
downloadEnvConfigFile(currentEnvData.id); downloadEnvConfigFile(currentEnvData.id);
}; };
@ -17,9 +18,11 @@ const EnvExtra = ({ currentEnvData }) => {
}; };
// 模拟点击测试环境可用性 // 模拟点击测试环境可用性
const handleTestAvailability = () => { const handleTestAvailability = async () => {
console.log('点击测试环境可用性'); setTestLoading(true);
// 这里可以添加实际的环境可用性测试逻辑 const res = await testEnv(currentEnvData.id);
console.log('res:', res);
setTestLoading(false);
}; };
return ( return (
@ -54,6 +57,7 @@ const EnvExtra = ({ currentEnvData }) => {
type="outline" type="outline"
onClick={handleTestAvailability} onClick={handleTestAvailability}
style={{ marginLeft: 16 }} style={{ marginLeft: 16 }}
loading={testLoading}
> >
</Button> </Button>

@ -1,4 +1,4 @@
import React, { useState, forwardRef, useImperativeHandle } from 'react'; import React, { useState, forwardRef, useImperativeHandle, useEffect } from 'react';
import { Form, Grid, Input, Message, Select } from '@arco-design/web-react'; import { Form, Grid, Input, Message, Select } from '@arco-design/web-react';
import { submitEnvConfig } from '@/api/componentDeployEnv'; import { submitEnvConfig } from '@/api/componentDeployEnv';
@ -8,6 +8,7 @@ const TextArea = Input.TextArea;
// 定义组件 Props 类型 // 定义组件 Props 类型
interface FormEditorProps { interface FormEditorProps {
record: any;
envTypeOptions: { id: string | number; classifyType: string; classifyName: string, dictKey: string }[]; envTypeOptions: { id: string | number; classifyType: string; classifyName: string, dictKey: string }[];
setVisible: (visible: boolean) => void; setVisible: (visible: boolean) => void;
onOk?: () => void; onOk?: () => void;
@ -21,6 +22,7 @@ export interface FormEditorInstance {
} }
const FormEditor = forwardRef<FormEditorInstance, FormEditorProps>(({ const FormEditor = forwardRef<FormEditorInstance, FormEditorProps>(({
record,
envTypeOptions, envTypeOptions,
setConfirmLoading, setConfirmLoading,
onSuccess onSuccess
@ -68,6 +70,11 @@ const FormEditor = forwardRef<FormEditorInstance, FormEditorProps>(({
} }
}; };
useEffect(() => {
if (record) form.setFieldsValue(record);
else form.resetFields();
}, [record]);
return ( return (
<Form form={form} layout="vertical"> <Form form={form} layout="vertical">
<Grid.Row gutter={8}> <Grid.Row gutter={8}>

@ -4,7 +4,7 @@ import { Button, Input, Space, Select, Divider, Table, TableColumnProps, Message
import { getComponentClassify } from '@/api/componentClassify'; import { getComponentClassify } from '@/api/componentClassify';
import { IconSearch } from '@arco-design/web-react/icon'; import { IconSearch } from '@arco-design/web-react/icon';
import AddModal from './addModal'; import AddModal from './addModal';
import { getEnvConfigList, deleteEnvConfig } from '@/api/componentDeployEnv'; import { getEnvConfigList, deleteEnvConfig, testEnv } from '@/api/componentDeployEnv';
const Option = Select.Option; const Option = Select.Option;
@ -13,6 +13,7 @@ const ComponentEnv = () => {
const [architectureType, setArchitectureType] = useState(['x86_64', 'aarch64']); // 结构类型 const [architectureType, setArchitectureType] = useState(['x86_64', 'aarch64']); // 结构类型
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [data, setData] = useState([]); const [data, setData] = useState([]);
const [editingRecord, setEditingRecord] = useState(null);
const columns: TableColumnProps[] = [ const columns: TableColumnProps[] = [
{ {
@ -58,17 +59,24 @@ const ComponentEnv = () => {
]; ];
// 环境测试处理函数 // 环境测试处理函数
const handleTestEnv = (record: any) => { const handleTestEnv = async (record: any) => {
Message.info(`正在测试环境 ${record.name}...`); Message.info(`正在测试环境 ${record.name}...`);
// 这里可以添加实际的环境测试逻辑 const res: any = await testEnv(record.id);
console.log('测试环境:', record); if (res.code === 200) {
Message.success(`环境 ${record.name} 测试成功`);
}
else {
Message.error(`环境 ${record.name} 测试失败: ${res.message}`);
}
}; };
// 环境配置处理函数 // 环境配置处理函数
const handleConfigEnv = (record: any) => { const handleConfigEnv = (record: any) => {
Message.info(`配置环境 ${record.name}`); // 设置编辑记录
// 这里可以添加环境配置逻辑,比如打开配置模态框 setEditingRecord(record);
console.log('配置环境:', record);
// 打开模态框
setVisible(true);
}; };
// 删除环境处理函数 // 删除环境处理函数
@ -78,7 +86,7 @@ const ComponentEnv = () => {
content: ( content: (
<div> <div>
<p></p> <p></p>
<p style={{ color: 'red', fontWeight: 'bold' }}> {record.name} IP: {record.ip}</p> <p style={{ color: 'red', fontWeight: 'bold' }}> {record.name}</p>
<p> <strong>{record.name}</strong> :</p> <p> <strong>{record.name}</strong> :</p>
<Input placeholder={`请输入 ${record.name}`} id="confirm-env-name" /> <Input placeholder={`请输入 ${record.name}`} id="confirm-env-name" />
</div> </div>
@ -89,7 +97,6 @@ const ComponentEnv = () => {
const confirmInput = document.getElementById('confirm-env-name') as HTMLInputElement; const confirmInput = document.getElementById('confirm-env-name') as HTMLInputElement;
if (!confirmInput || confirmInput.value !== record.name) { if (!confirmInput || confirmInput.value !== record.name) {
Message.error('环境名称输入不匹配,请重新输入'); Message.error('环境名称输入不匹配,请重新输入');
// 阻止关闭确认框
return Promise.reject(); return Promise.reject();
} }
@ -169,7 +176,10 @@ const ComponentEnv = () => {
<Button <Button
type="primary" type="primary"
style={{ borderRadius: 4 }} style={{ borderRadius: 4 }}
onClick={() => setVisible(true)} onClick={() => {
setEditingRecord(null);
setVisible(true);
}}
> >
+ +
</Button> </Button>
@ -183,14 +193,14 @@ const ComponentEnv = () => {
visible={visible} visible={visible}
envType={envType} envType={envType}
setVisible={setVisible} setVisible={setVisible}
onOk={() => { onOk={(value) => {
console.log('Add component env'); setEditingRecord(value);
getEnvList(); // 新增完成后刷新列表 getEnvList(); // 新增完成后刷新列表
}} }}
record={editingRecord}
/> />
</div> </div>
); );
}; };
export default ComponentEnv; export default ComponentEnv;

Loading…
Cancel
Save