import { templatecontrollerCreatetemplate, templatecontrollerDeletetemplate, templatecontrollerGettemplatelist, templatecontrollerRendertemplate, templatecontrollerRendertemplatedirect, templatecontrollerUpdatetemplate, } from '@/servers/api/template'; import { EditOutlined, PlusOutlined, ReloadOutlined } from '@ant-design/icons'; import { ActionType, DrawerForm, PageContainer, ProColumns, ProForm, ProFormText, ProTable, } from '@ant-design/pro-components'; import Editor from '@monaco-editor/react'; import { App, Button, Card, Popconfirm, Space, Typography } from 'antd'; import { useEffect, useRef, useState } from 'react'; // 自定义hook,用于处理模板预览逻辑 const useTemplatePreview = () => { const [renderedResult, setRenderedResult] = useState(''); const [previewData, setPreviewData] = useState(null); // 防抖的预览效果 useEffect(() => { if (!previewData || !previewData.value) { setRenderedResult('请输入模板内容'); return; } const timer = setTimeout(async () => { let testData = {}; try { if (previewData.testData) { testData = JSON.parse(previewData.testData); } } catch (e) { testData = {}; } try { // 使用新的直接渲染API,传入模板内容和测试数据 const res = await templatecontrollerRendertemplatedirect({ template: previewData.value, data: testData, }); if (res.success) { setRenderedResult(res.data as unknown as string); } else { setRenderedResult(`错误: ${res.message}`); } } catch (error: any) { setRenderedResult(`错误: ${error.message}`); } }, 500); // 防抖 500ms return () => clearTimeout(timer); }, [previewData]); // 处理实时预览逻辑 const handlePreview = (_changedValues: any, allValues: any) => { setPreviewData(allValues); }; // 手动刷新预览 const refreshPreview = (formValues: any) => { setPreviewData(formValues); }; return { renderedResult, handlePreview, refreshPreview, setPreviewData }; }; const List: React.FC = () => { const actionRef = useRef(); const { message } = App.useApp(); const columns: ProColumns[] = [ { title: '名称', dataIndex: 'name', tip: '名称是唯一的 key', formItemProps: { rules: [ { required: true, message: '名称为必填项', }, ], }, }, { title: '标题', dataIndex: 'title', }, { title: '值', dataIndex: 'value', }, { title: '更新时间', dataIndex: 'updatedAt', valueType: 'dateTime', hideInSearch: true, }, { title: '创建时间', dataIndex: 'createdAt', valueType: 'dateTime', hideInSearch: true, }, { title: '操作', dataIndex: 'option', valueType: 'option', render: (_, record) => ( { if (!record.id) return; try { await templatecontrollerDeletetemplate({ id: record.id }); actionRef.current?.reload(); } catch (error: any) { message.error(error.message); } }} > ), }, ]; return ( headerTitle="查询表格" actionRef={actionRef} rowKey="id" toolBarRender={() => []} request={async (params) => { const response = (await templatecontrollerGettemplatelist( params as any, )) as any; return { data: response.items || [], total: response.total || 0, success: true, }; }} columns={columns} /> ); }; const CreateForm: React.FC<{ tableRef: React.MutableRefObject; }> = ({ tableRef }) => { const { message } = App.useApp(); const [form] = ProForm.useForm(); const { renderedResult, handlePreview, refreshPreview } = useTemplatePreview(); return ( title="新建" form={form} trigger={ } autoFocusFirstInput drawerProps={{ destroyOnHidden: true, width: 1200, // 增加抽屉宽度以容纳调试面板 }} onValuesChange={handlePreview} onFinish={async (values) => { try { await templatecontrollerCreatetemplate(values); tableRef.current?.reload(); message.success('提交成功'); return true; } catch (error: any) { message.error(error.message); return false; } }} >
{ if (!value) return Promise.resolve(); try { JSON.parse(value); return Promise.resolve(); } catch (e) { return Promise.reject(new Error('请输入有效的JSON格式')); } }, }, ]} >
实时预览
              {renderedResult || '修改模板或测试数据后将自动预览结果...'}
            
); }; const UpdateForm: React.FC<{ tableRef: React.MutableRefObject; values: API.Template; }> = ({ tableRef, values: initialValues }) => { const { message } = App.useApp(); const [form] = ProForm.useForm(); const { renderedResult, handlePreview, refreshPreview, setPreviewData } = useTemplatePreview(); // 组件挂载时初始化预览数据 useEffect(() => { if (initialValues) { setPreviewData({ name: initialValues.name, value: initialValues.value, testData: initialValues.testData }); } }, [initialValues, setPreviewData]); return ( title="编辑" form={form} initialValues={initialValues} trigger={ } autoFocusFirstInput drawerProps={{ destroyOnHidden: true, width: 1200, // 增加抽屉宽度以容纳调试面板 }} onValuesChange={handlePreview} onFinish={async (values) => { if (!initialValues.id) return false; try { await templatecontrollerUpdatetemplate( { id: initialValues.id }, values, ); message.success('提交成功'); tableRef.current?.reload(); return true; } catch (error: any) { message.error(error.message); return false; } }} >
{ if (!value) return Promise.resolve(); try { JSON.parse(value); return Promise.resolve(); } catch (e) { return Promise.reject(new Error('请输入有效的JSON格式')); } }, }, ]} >
实时预览
              {renderedResult || '修改模板或测试数据后将自动预览结果...'}
            
); }; export default List;