diff --git a/ant-react/src/locales/bn-BD/pages.ts b/ant-react/src/locales/bn-BD/pages.ts index 13b6868ac7251cbef0d1cc88e828a31237969e42..4223df30eebdbeac5fe3b9740c996d1e3b09af6d 100644 --- a/ant-react/src/locales/bn-BD/pages.ts +++ b/ant-react/src/locales/bn-BD/pages.ts @@ -65,6 +65,13 @@ export default { 'pages.searchTable.batchDeletion': 'একসাথে মুছুন', 'pages.searchTable.batchApproval': 'একসাথে অনুমোদন', + 'pages.rules.select': 'অনুগ্রহ করে নির্বাচন করুন', + 'pages.rules.input': 'প্রবেশ করুন', + + 'pages.deleteConfirm': 'এই রেকর্ডটি মুছে ফেলার নিশ্চিত আছেন?', + 'pages.yes': 'হ্যাঁ', + 'pages.no': 'না', + 'pages.new': 'নতুন', 'pages.deleted': 'মুছে ফেলা', 'pages.set-param': 'প্যারামিটার নির্ধারণ', @@ -249,4 +256,6 @@ export default { "pages.welcome.a6": "Go IoT ডেভেলপমেন্ট প্ল্যাটফর্মটি একটি ওপেন সোর্স ইওটি ডেভেলপমেন্ট প্ল্যাটফর্ম যা আপনাকে আমরা এই প্রকল্পটি সম্পূর্ণ করার জন্য আমন্ত্রণ জানাই।", "pages.welcome.a2": "Go IoT ডেভেলপমেন্ট প্ল্যাটফর্মটি একটি বিনামূল্যে, দক্ষতা ও স্থানান্তরযোগ্য ইওটি সমাধান যা গো প্রোগ্রামিং ভাষা ব্যবহার করে তৈরি করা হয়েছে।\n" + " এই প্ল্যাটফর্ম MQTT, HTTP, WebSocket, COAP, TCP প্রোটোকল ট্রান্সমিশন সমর্থন করে, ল্যাইটওয়েট কনফিগারেশন টুল ব্যবহার করে ডাটার অ্যালার্ম ফিচার সম্পূর্ণ করে, জাভাস্ক্রিপ্ট ভিত্তিক ডাটা পরিসংখ্যান সেবা প্রদান করে।", + + "pages.more": 'আরও', }; diff --git a/ant-react/src/locales/en-US/pages.ts b/ant-react/src/locales/en-US/pages.ts index 5a5c17dc58e67bcc41d9f3af78f7515c3c8b9d8a..99ff23b1ff5b6882a29fa8dc6798567ce8367ab4 100644 --- a/ant-react/src/locales/en-US/pages.ts +++ b/ant-react/src/locales/en-US/pages.ts @@ -65,6 +65,13 @@ export default { 'pages.searchTable.batchDeletion': 'Batch Deletion', 'pages.searchTable.batchApproval': 'Batch Approval', + 'pages.rules.select': 'Please Select', + 'pages.rules.input': 'Please Input', + + 'pages.deleteConfirm': 'Are you sure you want to delete this record?', + 'pages.yes': 'Yes', + 'pages.no': 'No', + 'pages.new': 'New', 'pages.deleted': 'Deleted', 'pages.set-param': 'Set Params', @@ -247,5 +254,7 @@ export default { "pages.welcome.a8": "We have made all design documentation publicly available for users to consult at any time.", "pages.welcome.a6": "Go IoT Development Platform is an open-source IoT development platform, and we hope you can join us to improve this project together.", "pages.welcome.a2": "Go IoT Development Platform is a free, efficient, and scalable IoT solution developed using the Go language.\n" + - " The platform supports MQTT, HTTP, WebSocket, COAP, TCP protocol transmissions, provides lightweight configuration tools for data alarm functions, and offers data statistical services based on JavaScript." + " The platform supports MQTT, HTTP, WebSocket, COAP, TCP protocol transmissions, provides lightweight configuration tools for data alarm functions, and offers data statistical services based on JavaScript.", + + "pages.more": 'More' }; diff --git a/ant-react/src/locales/fa-IR/pages.ts b/ant-react/src/locales/fa-IR/pages.ts index 5cc14d3cbdd413d4da8c5dd365dbd0be58b20b70..837a992dbaebb5d731ee5bbac49f53571d661c5f 100644 --- a/ant-react/src/locales/fa-IR/pages.ts +++ b/ant-react/src/locales/fa-IR/pages.ts @@ -65,6 +65,13 @@ export default { 'pages.searchTable.batchDeletion': 'ลบเป็นกลุ่ม', 'pages.searchTable.batchApproval': 'อนุมัติเป็นกลุ่ม', + 'pages.rules.select': 'لطفا انتخاب کنید', + 'pages.rules.input': 'لطفا وارد شوید', + + 'pages.deleteConfirm': 'آیا مطمئن هستید که می‌خواهید این رکورد را حذف کنید؟', + 'pages.yes': 'بله', + 'pages.no': 'خیر', + 'pages.new': 'สร้างใหม่', 'pages.deleted': 'ลบ', 'pages.set-param': 'ตั้งค่าพารามิเตอร์', @@ -248,4 +255,5 @@ export default { "pages.welcome.a6": "پلتفررم توسعه Go IoT یک پلتفررم توسعه باز源 برای اینترنت چیزها است و ما امیدواریم که شما نیز به ما بپیوندید تا این پروژه را به اتمام برسانیم.", "pages.welcome.a2": "پلتفررم توسعه Go IoT یک راه حل رایگان، کارآمد و قابل توسعه برای اینترنت چیزها است که با استفاده از زبان برنامه نویسی Go توسعه یافته است.\n" + " این پلتفرم از انتقال پروتکل‌های MQTT, HTTP, WebSocket, COAP, TCP پشتیبانی می‌کند و ابزارهای پیکربندی سبک را برای انجام عملکردهای هشدار داده فراهم می‌کند و خدمات آماری بر اساس جاوا اسکریپت ارائه می‌دهد.", + "pages.more": "بیشتر" }; diff --git a/ant-react/src/locales/id-ID/pages.ts b/ant-react/src/locales/id-ID/pages.ts index 86f5711188a52ebf8c1fbbc48978fb77f2f22bed..f746e4451385128c1ced585c134211991564a636 100644 --- a/ant-react/src/locales/id-ID/pages.ts +++ b/ant-react/src/locales/id-ID/pages.ts @@ -65,6 +65,13 @@ export default { 'pages.searchTable.batchDeletion': 'Penghapusan Massal', 'pages.searchTable.batchApproval': 'Persetujuan Massal', + 'pages.rules.select': 'Silakan pilih', + 'pages.rules.input': 'Silakan masuk', + + 'pages.deleteConfirm': 'Apakah Anda yakin ingin menghapus catatan ini?', + 'pages.yes': 'Ya', + 'pages.no': 'Tidak', + 'pages.new': 'Baru', 'pages.deleted': 'Dihapus', 'pages.set-param': 'Setel Parameter', @@ -248,4 +255,5 @@ export default { "pages.welcome.a6": "Platform Pengembangan Go IoT adalah platform pengembangan IoT terbuka sumber, kami harap Anda bisa bergabung dan memperkaya proyek ini bersama kami.", "pages.welcome.a2": "Platform Pengembangan Go IoT adalah solusi IoT gratis, efisien, dan dapat diperluas yang dikembangkan dengan menggunakan bahasa Go.\n" + " Platform ini mendukung transmisi protokol MQTT, HTTP, WebSocket, COAP, TCP, menyediakan alat konfigurasi ringan untuk menyelesaikan fungsi peringatan data, dan menyediakan layanan statistik data berbasis JavaScript.", + "pages.more": "Lainnya" }; diff --git a/ant-react/src/locales/ja-JP/pages.ts b/ant-react/src/locales/ja-JP/pages.ts index 77fb21749fbaf544a297ce71e7a2dc2ce6eddd93..c0157bfd3ee5a4893df9159d213e4edaa7e0ee5f 100644 --- a/ant-react/src/locales/ja-JP/pages.ts +++ b/ant-react/src/locales/ja-JP/pages.ts @@ -65,6 +65,13 @@ export default { 'pages.searchTable.batchDeletion': '一括削除', 'pages.searchTable.batchApproval': '一括承認', + 'pages.rules.select': '選択してください', + 'pages.rules.input': '入力してください', + + 'pages.deleteConfirm': 'このレコードを削除してもよろしいですか?', + 'pages.yes': 'はい', + 'pages.no': 'いいえ', + 'pages.new': '新規', 'pages.deleted': '削除', 'pages.set-param': 'パラメーター設定', @@ -248,6 +255,6 @@ export default { "pages.welcome.a6": "Go IoT開発プラットフォームは、オープンソースの物联网開発プラットフォームであり、このプロジェクトを一緒に充実させるためにあなたの参加を望んでいます。", "pages.welcome.a2": "Go IoT開発プラットフォームは、Go言語で開発された無料、効率的、スケーラブルな物联网ソリューションです。\n" + " このプラットフォームはMQTT、HTTP、WebSocket、COAP、TCPプロトコルの伝送をサポートし、軽量の設定ツールを提供してデータのアラーム機能を完了させ、JavaScriptに基づくデータ統計サービスを提供します。", - + "pages.more": "もっと" }; diff --git a/ant-react/src/locales/pt-BR/pages.ts b/ant-react/src/locales/pt-BR/pages.ts index 9bc5136bef28056fc8de7028119ac49888f4db9c..642180e606f9f3aba3fa7201d2561be5ba434054 100644 --- a/ant-react/src/locales/pt-BR/pages.ts +++ b/ant-react/src/locales/pt-BR/pages.ts @@ -66,6 +66,13 @@ export default { 'pages.searchTable.batchDeletion': 'Exclusão em lote', 'pages.searchTable.batchApproval': 'Aprovação em lote', + 'pages.rules.select': 'Selecione', + 'pages.rules.input': 'Por favor insira', + + 'pages.deleteConfirm': 'Tem certeza de que deseja excluir este registro?', + 'pages.yes': 'Sim', + 'pages.no': 'Não', + 'pages.new': 'Novo', 'pages.deleted': 'Excluído', 'pages.set-param': 'Configurar parâmetros', @@ -250,4 +257,5 @@ export default { "pages.welcome.a6": "A plataforma de desenvolvimento Go IoT é uma plataforma de desenvolvimento de IoT de código aberto, esperamos que você possa se juntar a nós para perfeccionar este projeto.", "pages.welcome.a2": "A plataforma de desenvolvimento Go IoT é uma solução de IoT gratuita, eficiente e escalável desenvolvida usando a linguagem Go.\n" + " Esta plataforma suporta a transmissão de protocolos MQTT, HTTP, WebSocket, COAP, TCP, fornecendo ferramentas de configuração leve para concluir a função de alarme de dados, fornecendo serviços de estatísticas de dados baseados em JavaScript.", + "pages.more": "Mais" }; diff --git a/ant-react/src/locales/zh-CN/pages.ts b/ant-react/src/locales/zh-CN/pages.ts index fdd5b84d08b18b62ec25caefb62760a9b5cd0f7f..caa85150fdbe7cebbc5f419bd1fca8007b176c44 100644 --- a/ant-react/src/locales/zh-CN/pages.ts +++ b/ant-react/src/locales/zh-CN/pages.ts @@ -66,6 +66,13 @@ export default { 'pages.searchTable.batchDeletion': '批量删除', 'pages.searchTable.batchApproval': '批量审批', + 'pages.rules.select': '请选择', + 'pages.rules.input': '请输入', + + 'pages.deleteConfirm': '确定要删除这条记录吗?', + 'pages.yes': '是', + 'pages.no': '否', + 'pages.new': '新增', 'pages.deleted': '删除', 'pages.set-param': '参数设置', @@ -250,8 +257,10 @@ export default { "pages.welcome.a2":"Go IoT 开发平台 是一个使用Go语言开发的免费、高效、可扩展的物联网解决方案。\n" + " 该平台支持MQTT、HTTP、WebSocket、COAP、TCP协议传输,提供轻量化的配置工具完成数据的报警功能,提供基于JavaScript的数据统计服务。", - + "pages.more": '更多', "pages.device":"物理设备" + + }; diff --git a/ant-react/src/locales/zh-TW/pages.ts b/ant-react/src/locales/zh-TW/pages.ts index 6ec732f362bb5a83a1fc8d0f8ec9e2762884a613..450d08cd8f625f8cf3e610d931574dae08a1eab3 100644 --- a/ant-react/src/locales/zh-TW/pages.ts +++ b/ant-react/src/locales/zh-TW/pages.ts @@ -65,6 +65,13 @@ export default { 'pages.searchTable.batchDeletion': '批量刪除', 'pages.searchTable.batchApproval': '批量審批', + 'pages.rules.select': '請選擇', + 'pages.rules.input': '請輸入', + + 'pages.deleteConfirm': '您確定要刪除這筆記錄嗎?', + 'pages.yes': '是', + 'pages.no': '否', + 'pages.new': '新增', 'pages.deleted': '刪除', 'pages.set-param': '參數設定', @@ -248,5 +255,7 @@ export default { "pages.welcome.a6":"Go IoT开发平台是一个开源的物联网开发平台,希望你可以加入我们一起完善这个项目。", "pages.welcome.a2":"Go IoT 开发平台 是一个使用Go语言开发的免费、高效、可扩展的物联网解决方案。\n" + " 该平台支持MQTT、HTTP、WebSocket、COAP、TCP协议传输,提供轻量化的配置工具完成数据的报警功能,提供基于JavaScript的数据统计服务。", + "pages.more": "更多" + }; diff --git a/ant-react/src/pages/Data/Calc/CalcRuleUpdateForm.tsx b/ant-react/src/pages/Data/Calc/CalcRuleUpdateForm.tsx index a89b185a669ef79bdaed4c283dbcf4a86b38ac93..7fc43342c3ac83fa63c124ca1873abf530b72d5e 100644 --- a/ant-react/src/pages/Data/Calc/CalcRuleUpdateForm.tsx +++ b/ant-react/src/pages/Data/Calc/CalcRuleUpdateForm.tsx @@ -26,8 +26,11 @@ const CalcRuleUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,26 +42,56 @@ const CalcRuleUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="cron" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="offset" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Data/Calc/index.tsx b/ant-react/src/pages/Data/Calc/index.tsx index 55c6f561d57e6ef8ff9230886c96a0563c44a1b7..8d97ffc55b57ceaf47565c8b65ccddea9e601e6e 100644 --- a/ant-react/src/pages/Data/Calc/index.tsx +++ b/ant-react/src/pages/Data/Calc/index.tsx @@ -23,7 +23,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message, Tag } from 'antd'; +import { Button, Drawer, message, Popconfirm, Tag } from 'antd'; import React, { useRef, useState } from 'react'; import { history } from 'umi'; @@ -240,21 +240,25 @@ const Admin: React.FC = () => { > , - , + + , ], }, ]; @@ -294,6 +298,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.CalcRuleListItem); if (success) { @@ -308,21 +315,45 @@ const Admin: React.FC = () => { key={'name'} label={} name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="cron" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="offset" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -43,6 +46,12 @@ const CalcParamUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { value: 'ID', }, }} + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { value: createProp, onClick: (v) => { setCreateDeviceUid(''); - - }, }} + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'signal_id'} label={} name="signal_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'reduce'} label={} name="reduce" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Data/CalcParam/index.tsx b/ant-react/src/pages/Data/CalcParam/index.tsx index 7c7d5469b466aac464b3c73a52af3da41205100e..b8207e0822d56467369075a59134ec7999603a8a 100644 --- a/ant-react/src/pages/Data/CalcParam/index.tsx +++ b/ant-react/src/pages/Data/CalcParam/index.tsx @@ -26,7 +26,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.CalcParamListItem) => { @@ -116,7 +116,7 @@ const Admin: React.FC = () => { { key: 'protocol', title: , - order:99, + order: 99, hideInSearch: false, dataIndex: 'protocol', initialValue: 'MQTT', @@ -157,9 +157,9 @@ const Admin: React.FC = () => { { key: 'device_uid', - dependencies:["protocol"], + dependencies: ['protocol'], title: , - order:98, + order: 98, hideInSearch: false, dataIndex: 'device_uid', valueType: 'select', @@ -231,7 +231,7 @@ const Admin: React.FC = () => { { key: 'calc_rule_id', title: , - order:100, + order: 100, hideInSearch: false, dataIndex: 'calc_rule_id', request: async () => { @@ -264,21 +264,25 @@ const Admin: React.FC = () => { , - , + + , ], }, ]; @@ -320,6 +324,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.CalcParamListItem); if (success) { @@ -346,6 +353,12 @@ const Admin: React.FC = () => { value: 'ID', }, }} + rules={[ + { + required: true, + message: , + }, + ]} /> { setCreateDeviceUid(''); }, }} + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'signal_id'} label={} name="signal_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'reduce'} label={} name="reduce" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Data/ScriptParam/ScriptParamUpdateForm.tsx b/ant-react/src/pages/Data/ScriptParam/ScriptParamUpdateForm.tsx index a795e2c33a44471c6bddf0d71f024d5e61a6c9b6..c6cd9da2c51fef5fcea3fab2433ed2e445be2496 100644 --- a/ant-react/src/pages/Data/ScriptParam/ScriptParamUpdateForm.tsx +++ b/ant-react/src/pages/Data/ScriptParam/ScriptParamUpdateForm.tsx @@ -26,8 +26,11 @@ const ScriptParamUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,26 +42,56 @@ const ScriptParamUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="cron" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="offset" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Data/ScriptParam/index.tsx b/ant-react/src/pages/Data/ScriptParam/index.tsx index e5dc0d21f410a0d59193d9e7669d086db11875b4..1f0ca80f3335692d892730b524bf59ec566c15fb 100644 --- a/ant-react/src/pages/Data/ScriptParam/index.tsx +++ b/ant-react/src/pages/Data/ScriptParam/index.tsx @@ -1,11 +1,11 @@ -import ScriptNameShow from '@/pages/Data/ScriptParam/ScriptNameShow'; import ScriptParamUpdateForm from '@/pages/Data/ScriptParam/ScriptParamUpdateForm'; -import { initSearchDeviceUidForMqtt } from '@/pages/Data/Signal'; import DeviceUidShow from '@/pages/Data/Signal/DeviceUidShow'; import SignalNameShow from '@/pages/Data/Signal/SignalNameShow'; +import { initSearchSignalId } from '@/pages/Data/SignalWaring'; import { addScriptWaringParam, - deleteScriptWaringParam, deviceList, + deleteScriptWaringParam, + deviceList, mqttList, scriptWaringList, scritpParamPage, @@ -26,9 +26,10 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; -import React, { useRef, useState } from 'react'; -import {initSearchSignalId} from "@/pages/Data/SignalWaring"; +import { Button, Drawer, message, Popconfirm } from 'antd'; +import React, { useEffect, useRef, useState } from 'react'; +import { initSearchDeviceUidForMqtt } from '../Signal'; +import ScriptNameShow from './ScriptNameShow'; const handleAdd = async (fields: API.ScriptWaringParamListItem) => { const hide = message.loading('正在添加'); @@ -105,6 +106,15 @@ const Admin: React.FC = () => { const [opDeviceUid, setOpDeviceUid] = useState(); const [opSignal, setOpSignal] = useState(); + useEffect(() => { + async function extracted() { + let v = await initSearchDeviceUidForMqtt(setSearchDeviceUid, setOpDeviceUid); + + initSearchSignalId('MQTT', v, setOpSignal, setSearchSignalId); + } + extracted(); + }, []); + const columns: ProColumns[] = [ { key: 'ID', @@ -125,6 +135,27 @@ const Admin: React.FC = () => { ); }, }, + { + key: 'signal_delay_waring_id', + title: , + hideInSearch: true, + dataIndex: 'signal_delay_waring_id', + fieldProps: { + showSearch: true, + allowClear: false, + fieldNames: { + label: 'name', + value: 'ID', + }, + }, + render: (dom, entity) => { + return ( + <> + + + ); + }, + }, { key: 'protocol', title: , @@ -133,21 +164,38 @@ const Admin: React.FC = () => { initialValue: 'MQTT', fieldProps: { onChange: async (value) => { - setSearchDeviceUid(Number(value)); - await initSearchSignalId(searchProtocol, value, setOpSignal, setSearchSignalId); - }, - value: searchDeviceUid, + console.log(value, 'value'); - showSearch: true, - allowClear: false, - fieldNames: { - label: 'client_id', - value: 'ID', + setSearchProtocol(value); + if (value === 'MQTT') { + await initSearchDeviceUidForMqtt(setSearchDeviceUid, setOpDeviceUid); + } else { + setSearchDeviceUid(''); + setSearchSignalId(''); + // setOpDeviceUid([ + // { + // client_id: 'ccc', + // ID: '1', + // }, + // ]); + let c = await deviceList(); + console.log(c, 'c'); + + let r = []; + c.data.forEach((e) => { + if (e.protocol === value) { + r.push({ + client_id: e.sn, + ID: e.ID, + }); + } + }); + setOpDeviceUid(r); + } }, - options: opDeviceUid, - placeholder: '请选择', + value: searchProtocol, }, - order:99, + order: 99, valueEnum: { MQTT: { text: 'MQTT', status: 'success' }, HTTP: { text: 'HTTP', status: 'success' }, @@ -165,7 +213,7 @@ const Admin: React.FC = () => { { key: 'device_uid', - order:98, + order: 98, title: , hideInSearch: false, dataIndex: 'device_uid', @@ -174,7 +222,6 @@ const Admin: React.FC = () => { onChange: async (value) => { setSearchDeviceUid(Number(value)); await initSearchSignalId(searchProtocol, value, setOpSignal, setSearchSignalId); - }, value: searchDeviceUid, @@ -202,14 +249,14 @@ const Admin: React.FC = () => { { key: 'name', title: , - hideInSearch: true, + hideInSearch: false, dataIndex: 'name', }, { key: 'signal_id', title: , - order:97, + order: 97, hideInSearch: false, dataIndex: 'signal_id', valueType: 'select', @@ -243,27 +290,6 @@ const Admin: React.FC = () => { options: opSignal, }, }, - { - key: 'signal_delay_waring_id', - title: , - hideInSearch: true, - dataIndex: 'signal_delay_waring_id', - fieldProps: { - showSearch: true, - allowClear: false, - fieldNames: { - label: 'name', - value: 'ID', - }, - }, - render: (dom, entity) => { - return ( - <> - - - ); - }, - }, { title: , @@ -280,21 +306,25 @@ const Admin: React.FC = () => { > , - , + + , ], }, ]; @@ -322,7 +352,18 @@ const Admin: React.FC = () => { , ]} - request={scritpParamPage} + request={async (params, sorter, filter) => { + if (searchProtocol) { + params.protocol = searchProtocol; + } + if (searchDeviceUid) { + params.device_uid = Number(searchDeviceUid); + } + if (searchSignalId) { + params.signal_id = Number(searchSignalId); + } + return scritpParamPage(params); + }} columns={columns} /> { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.ScriptWaringParamListItem); if (success) { @@ -360,6 +404,12 @@ const Admin: React.FC = () => { setCreateDeviceUid(''); }, }} + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'signal_id'} label={} name="signal_id" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'signal_delay_waring_id'} label={} name="signal_delay_waring_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,9 +42,35 @@ const ScriptWaringUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="name" /> - } name="script" /> ); diff --git a/ant-react/src/pages/Data/ScriptWaring/index.tsx b/ant-react/src/pages/Data/ScriptWaring/index.tsx index 5a1a351a3926ed2ca792ac12d5a9b19a870ba669..dfe4ad2f2466df8b0de011c56ad8d3c3a86eaf53 100644 --- a/ant-react/src/pages/Data/ScriptWaring/index.tsx +++ b/ant-react/src/pages/Data/ScriptWaring/index.tsx @@ -20,7 +20,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; import { history } from 'umi'; @@ -162,21 +162,25 @@ const Admin: React.FC = () => { > , - , + + , ], }, ]; @@ -216,6 +220,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.ScriptWaringListItem); if (success) { @@ -226,8 +233,28 @@ const Admin: React.FC = () => { } }} > - } name="name" /> - } name="script" /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="script" + rules={[ + { + required: true, + message: , + }, + ]} + /> = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -40,6 +43,12 @@ const SignalUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="name" /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} + /> } name="alias" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { }} label={} name="type" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="unit" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="unit" /> } name="cache_size" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Data/Signal/index.tsx b/ant-react/src/pages/Data/Signal/index.tsx index c7279d2d55b999a136f10e6fc64a9ae2e2c76469..6f1ccf5b0dece0c504478a231685fea91887001a 100644 --- a/ant-react/src/pages/Data/Signal/index.tsx +++ b/ant-react/src/pages/Data/Signal/index.tsx @@ -26,7 +26,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, Form, message } from 'antd'; +import { Button, Drawer, Form, message, Popconfirm } from 'antd'; import React, { useEffect, useRef, useState } from 'react'; const handleAdd = async (fields: API.SignalListItem) => { @@ -102,14 +102,40 @@ const Admin: React.FC = () => { const [showDetail, setShowDetail] = useState(false); const [searchProtocol, setSearchProtocol] = useState('MQTT'); - const [searchDeviceUid, setSearchDeviceUid] = useState(''); + const [searchDeviceUid, setSearchDeviceUid] = useState(''); const [opDeviceUid, setOpDeviceUid] = useState(); useEffect(() => { const queryParams = new URLSearchParams(location.search); + async function getMqttList() { + let res = await mqttList(); + let data = res.data; + setOpDeviceUid(data); + } + + async function getOtherList(value) { + let c = await deviceList(); + + let r = []; + c.data.forEach((e) => { + if (e.protocol === value) { + r.push({ + client_id: e.sn, + ID: e.ID, + }); + } + }); + setOpDeviceUid(r); + } + if (queryParams.get('protocol')) { setSearchProtocol(queryParams.get('protocol')); + if (queryParams.get('protocol') === 'MQTT') { + getMqttList(); + } else { + getOtherList(queryParams.get('protocol')); + } } if (queryParams.get('id')) { setSearchDeviceUid(Number(queryParams.get('id'))); @@ -155,9 +181,10 @@ const Admin: React.FC = () => { if (value === 'MQTT') { await initSearchDeviceUidForMqtt(setSearchDeviceUid, setOpDeviceUid); } else { - setSearchDeviceUid(''); + setSearchDeviceUid(undefined); let c = await deviceList(); + let r = []; c.data.forEach((e) => { if (e.protocol === value) { @@ -296,21 +323,25 @@ const Admin: React.FC = () => { , - , + + , ], }, ]; @@ -328,7 +359,7 @@ const Admin: React.FC = () => { rowKey="key" onReset={() => { setSearchProtocol('MQTT'); - setSearchDeviceUid(''); + setSearchDeviceUid(undefined); }} search={{ labelWidth: 120, @@ -365,6 +396,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.SignalListItem); if (success) { @@ -386,6 +420,12 @@ const Admin: React.FC = () => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="name" /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} + /> } name="alias" + rules={[ + { + required: true, + message: , + }, + ]} /> { }} label={} name="type" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="unit" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="unit" /> } name="cache_size" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Data/SignalWaring/SignalWaringUpdateForm.tsx b/ant-react/src/pages/Data/SignalWaring/SignalWaringUpdateForm.tsx index da2330a0de6c63022909385a9afefbb4ab3ea887..8dad6eea76552597df07ac1c9b6a1a631aa5b0af 100644 --- a/ant-react/src/pages/Data/SignalWaring/SignalWaringUpdateForm.tsx +++ b/ant-react/src/pages/Data/SignalWaring/SignalWaringUpdateForm.tsx @@ -28,8 +28,11 @@ const SignalWaringUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -41,6 +44,12 @@ const SignalWaringUpdateForm: React.FC = (props) => { key={'id'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'signal_id'} label={} name="signal_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="min" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="max" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { 1: { text: '范围内报警', status: 'success' }, 0: { text: '范围外报警', status: 'success' }, }} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Data/SignalWaring/index.tsx b/ant-react/src/pages/Data/SignalWaring/index.tsx index 582f47d8e75349e631cfa7d8dcc3a9bcf9f22c7d..59a0f8139853edea959604c2ea658612e88c7663 100644 --- a/ant-react/src/pages/Data/SignalWaring/index.tsx +++ b/ant-react/src/pages/Data/SignalWaring/index.tsx @@ -4,6 +4,7 @@ import SignalWaringUpdateForm from '@/pages/Data/SignalWaring/SignalWaringUpdate import { addSignalWaring, deleteSignalWaring, + deviceList, mqttList, signalList, signalWaringPage, @@ -25,7 +26,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useEffect, useRef, useState } from 'react'; import { initSearchDeviceUidForMqtt } from '../Signal'; @@ -122,6 +123,8 @@ const Admin: React.FC = () => { const [opSignal, setOpSignal] = useState(); + const form = ProForm.useFormInstance(); + useEffect(() => { const queryParams = new URLSearchParams(location.search); if (queryParams.get('protocol')) { @@ -130,9 +133,31 @@ const Admin: React.FC = () => { async function extracted() { let v = await initSearchDeviceUidForMqtt(setSearchDeviceUid, setOpDeviceUid); + initSearchSignalId('MQTT', v, setOpSignal, setSearchSignalId); } + async function getMqttList() { + let res = await mqttList(); + let data = res.data; + setOpDeviceUid(data); + } + + async function getOtherList(value) { + let c = await deviceList(); + + let r = []; + c.data.forEach((e) => { + if (e.protocol === value) { + r.push({ + client_id: e.sn, + ID: e.ID, + }); + } + }); + setOpDeviceUid(r); + } + if (queryParams.get('client_id')) { setSearchDeviceUid(Number(queryParams.get('client_id'))); } else { @@ -141,6 +166,14 @@ const Admin: React.FC = () => { if (queryParams.get('id')) { setSearchSignalId(Number(queryParams.get('id'))); } + if (queryParams.get('protocol')) { + setSearchProtocol(queryParams.get('protocol')); + if (queryParams.get('protocol') === 'MQTT') { + getMqttList(); + } else { + getOtherList(queryParams.get('protocol')); + } + } }, []); const columns: ProColumns[] = [ @@ -177,14 +210,28 @@ const Admin: React.FC = () => { } else { setSearchDeviceUid(''); setSearchSignalId(''); - setOpDeviceUid([ - { - client_id: 'ccc', - ID: '1', - }, - ]); + // setOpDeviceUid([ + // { + // client_id: 'ccc', + // ID: '1', + // }, + // ]); + let c = await deviceList(); + console.log(c, 'c'); + + let r = []; + c.data.forEach((e) => { + if (e.protocol === value) { + r.push({ + client_id: e.sn, + ID: e.ID, + }); + } + }); + setOpDeviceUid(r); } }, + value: searchProtocol, }, formItemProps: { rules: [ @@ -329,25 +376,28 @@ const Admin: React.FC = () => { , - , + + , ], }, ]; - const form = ProForm.useFormInstance(); return ( @@ -398,6 +448,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.SignalWaringItem); if (success) { @@ -419,6 +472,12 @@ const Admin: React.FC = () => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'signal_id'} label={} name="signal_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="min" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="max" + rules={[ + { + required: true, + message: , + }, + ]} /> { 1: { text: '范围内报警', status: 'success' }, 0: { text: '范围外报警', status: 'success' }, }} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Device/DeviceGroup/DeviceGroup.tsx b/ant-react/src/pages/Device/DeviceGroup/DeviceGroup.tsx index 6eab3976eb67f912c4c71b5a9e3ce75ad5535569..70425c41d3f116922965d21d08a92794f37f6258 100644 --- a/ant-react/src/pages/Device/DeviceGroup/DeviceGroup.tsx +++ b/ant-react/src/pages/Device/DeviceGroup/DeviceGroup.tsx @@ -1,9 +1,11 @@ +import DeviceGroupBindForm from '@/pages/Device/DeviceGroup/DeviceGroupBindForm'; import DeviceGroupUpdateForm from '@/pages/Device/DeviceGroup/DeviceGroupUpdateForm'; import { addDeviceGroup, deleteDeviceGroup, deviceGroupPage, - updateDeviceGroup, updateDeviceGroupBind, + updateDeviceGroup, + updateDeviceGroupBind, } from '@/services/ant-design-pro/api'; import { FormattedMessage } from '@@/exports'; import { PlusOutlined } from '@ant-design/icons'; @@ -18,9 +20,8 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; -import DeviceGroupBindForm from "@/pages/Device/DeviceGroup/DeviceGroupBindForm"; const handleAdd = async (fields: API.DeviceGroupItem) => { const hide = message.loading('正在添加'); @@ -147,21 +148,22 @@ const Admin: React.FC = () => { > , - , + + , ], }, ]; @@ -201,6 +203,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.DeviceGroupItem); if (success) { @@ -211,7 +216,17 @@ const Admin: React.FC = () => { } }} > - } name="name" /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} + /> { await handlerBind({ group_id: value.ID, - device_id:value.device_id - } ); + device_id: value.device_id, + }); handleBindModalOpen(false); if (actionRef.current) { await actionRef.current.reload(); diff --git a/ant-react/src/pages/Device/DeviceGroup/DeviceGroupBindForm.tsx b/ant-react/src/pages/Device/DeviceGroup/DeviceGroupBindForm.tsx index cc87680ffb6ec25f73ce538e314b08093af216bf..5ecaf1d688c0687634b68379c68f2588a8e6653c 100644 --- a/ant-react/src/pages/Device/DeviceGroup/DeviceGroupBindForm.tsx +++ b/ant-react/src/pages/Device/DeviceGroup/DeviceGroupBindForm.tsx @@ -1,8 +1,8 @@ +import { deviceList, queryDeviceGroupBind } from '@/services/ant-design-pro/api'; import { FormattedMessage } from '@@/exports'; import { ProFormSelect, ProFormText } from '@ant-design/pro-components'; import { Form, Modal } from 'antd'; import React, { useEffect } from 'react'; -import { deviceList, queryDeviceGroupBind } from "@/services/ant-design-pro/api"; export type UpdateFormProps = { onCancel: (flag?: boolean, formVals?: API.DeviceGroupItem) => void; @@ -22,11 +22,12 @@ const DeviceGroupBindForm: React.FC = (props) => { useEffect(() => { const fetchData = async () => { const response = await queryDeviceGroupBind(props.values.ID); - const deviceIds = response.data.map(item => item.device_info_id); // 提取 device_info_id + const deviceIds = response.data.map((item) => item.device_info_id); // 提取 device_info_id form.setFieldsValue({ device_id: deviceIds }); // 设置提取的值 }; - if (props.updateModalOpen) { // 只有在模态框打开时才调用 + if (props.updateModalOpen) { + // 只有在模态框打开时才调用 fetchData(); } }, [props.updateModalOpen, props.values.ID]); // 添加依赖数组 @@ -38,8 +39,11 @@ const DeviceGroupBindForm: React.FC = (props) => { forceRender={true} open={props.updateModalOpen} onCancel={() => props.onCancel()} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} >
@@ -48,6 +52,12 @@ const DeviceGroupBindForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -55,8 +65,7 @@ const DeviceGroupBindForm: React.FC = (props) => { return a.data; }} fieldProps={{ - - mode: "multiple", + mode: 'multiple', showSearch: true, allowClear: true, // 允许清空选择 fieldNames: { @@ -67,6 +76,12 @@ const DeviceGroupBindForm: React.FC = (props) => { key={'device_id'} label={} name="device_id" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Device/DeviceGroup/DeviceGroupUpdateForm.tsx b/ant-react/src/pages/Device/DeviceGroup/DeviceGroupUpdateForm.tsx index 08a8888a3cd684184aa340a3d7f4e97095152cbb..f0a5c9cdefa6f4a615812faa90446e29211750cf 100644 --- a/ant-react/src/pages/Device/DeviceGroup/DeviceGroupUpdateForm.tsx +++ b/ant-react/src/pages/Device/DeviceGroup/DeviceGroupUpdateForm.tsx @@ -26,8 +26,11 @@ const DeviceGroupUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,8 +42,24 @@ const DeviceGroupUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="name" /> ); diff --git a/ant-react/src/pages/Device/DeviceInfo/DeviceInfo.tsx b/ant-react/src/pages/Device/DeviceInfo/DeviceInfo.tsx index 46d0fafccc8a11a9442f785bae5d042d202638b6..9ecf3c7ef1454f46377fe322f8dbe97149b4aacb 100644 --- a/ant-react/src/pages/Device/DeviceInfo/DeviceInfo.tsx +++ b/ant-react/src/pages/Device/DeviceInfo/DeviceInfo.tsx @@ -22,7 +22,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, Form, message } from 'antd'; +import { Button, Drawer, Form, message, Popconfirm } from 'antd'; import dayjs from 'dayjs'; import React, { useRef, useState } from 'react'; @@ -221,21 +221,27 @@ const Admin: React.FC = () => { , - , + + , ], }, ]; @@ -281,6 +287,12 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + onCancel: () => { + setSourceValue(0); + }, + }} onFinish={async (value) => { const success = await handleAdd(value as API.DeviceInfoItem); if (success) { @@ -306,8 +318,23 @@ const Admin: React.FC = () => { }} label={} name="product_id" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="sn" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="sn" /> { }} label={} name="source" + rules={[ + { + required: true, + message: , + }, + ]} /> {sourceValue === '1' && ( @@ -330,6 +363,12 @@ const Admin: React.FC = () => { }} label={} name="manufacturing_date" + rules={[ + { + required: true, + message: , + }, + ]} /> )} {sourceValue === '2' && ( @@ -340,6 +379,12 @@ const Admin: React.FC = () => { }} label={} name="procurement_date" + rules={[ + { + required: true, + message: , + }, + ]} /> )} {sourceValue === '1' && ( @@ -350,15 +395,33 @@ const Admin: React.FC = () => { }} label={} name="warranty_expiry" + rules={[ + { + required: true, + message: , + }, + ]} /> )} } name="push_interval" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="error_rate" + rules={[ + { + required: true, + message: , + }, + ]} /> { }} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); }} >
- } name="ID" /> + } + name="ID" + rules={[ + { + required: true, + message: , + }, + ]} + /> { let resp = await productList(); @@ -60,11 +73,23 @@ const DeviceInfoUpdateForm: React.FC = (props) => { }} label={} name="product_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="sn" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { }} label={} name="source" + rules={[ + { + required: true, + message: , + }, + ]} /> {sourceValue === '1' && ( @@ -88,6 +119,12 @@ const DeviceInfoUpdateForm: React.FC = (props) => { }} label={} name="manufacturing_date" + rules={[ + { + required: true, + message: , + }, + ]} /> )} {sourceValue === '2' && ( @@ -98,6 +135,12 @@ const DeviceInfoUpdateForm: React.FC = (props) => { }} label={} name="procurement_date" + rules={[ + { + required: true, + message: , + }, + ]} /> )} {sourceValue === '1' && ( @@ -108,11 +151,23 @@ const DeviceInfoUpdateForm: React.FC = (props) => { }} label={} name="warranty_expiry" + rules={[ + { + required: true, + message: , + }, + ]} /> )} } name="error_rate" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { }} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Lifecycle/ProductList/ProductList.tsx b/ant-react/src/pages/Lifecycle/ProductList/ProductList.tsx index d5b9dae21c7f73fdcbbce193e00d198f36933f05..4470318180aa6e8696a7afbe9b8d86c3dd4b121e 100644 --- a/ant-react/src/pages/Lifecycle/ProductList/ProductList.tsx +++ b/ant-react/src/pages/Lifecycle/ProductList/ProductList.tsx @@ -22,7 +22,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, Form, Image, message } from 'antd'; +import { Button, Drawer, Form, Image, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.ProductItem) => { @@ -209,9 +209,10 @@ const Admin: React.FC = () => { , - , + + , ], }, ]; @@ -266,6 +270,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.ProductItem); if (success) { @@ -281,51 +288,115 @@ const Admin: React.FC = () => { key={'name'} label={} name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="description" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="sku" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="sku" /> } name="price" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="cost" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="quantity" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="minimum_stock" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="warranty_period" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="status" + rules={[ + { + required: true, + message: , + }, + ]} /> } placeholder={'请输入,如果存在多个请用逗号分割'} name="tags" + rules={[ + { + required: true, + message: , + }, + ]} /> { action: '/api/file/update', multiple: false, }} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Lifecycle/ProductList/ProductUpdateForm.tsx b/ant-react/src/pages/Lifecycle/ProductList/ProductUpdateForm.tsx index 2ecb43727cf74f537579ab7061152a5bf99c6d11..3a7a51e0cd450ba2ada49b265fbd9037fa2eeef2 100644 --- a/ant-react/src/pages/Lifecycle/ProductList/ProductUpdateForm.tsx +++ b/ant-react/src/pages/Lifecycle/ProductList/ProductUpdateForm.tsx @@ -70,8 +70,11 @@ const ProductUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -84,56 +87,126 @@ const ProductUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="description" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="sku" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="sku" /> } name="price" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="cost" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="quantity" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="minimum_stock" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="warranty_period" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="status" + rules={[ + { + required: true, + message: , + }, + ]} /> } placeholder={'请输入,如果存在多个请用逗号分割'} name="tags" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { beforeUpload: (file, fileList) => beforeUpload(form, file, fileList), fileList: fileList, }} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Lifecycle/SimList/SimList.tsx b/ant-react/src/pages/Lifecycle/SimList/SimList.tsx index 1dcc643d0c66816eac56638859fd127d813aa7d4..f30e9142fd7ea699d63493de4f40c2398bfea98f 100644 --- a/ant-react/src/pages/Lifecycle/SimList/SimList.tsx +++ b/ant-react/src/pages/Lifecycle/SimList/SimList.tsx @@ -14,7 +14,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import dayjs from 'dayjs'; import React, { useRef, useState } from 'react'; @@ -146,22 +146,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -201,6 +204,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.SimListItem); if (success) { @@ -215,13 +221,45 @@ const Admin: React.FC = () => { key={'access_number'} label={} name="access_number" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="iccid" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="imsi" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="iccid" /> - } name="imsi" /> } name="operator" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -230,6 +268,12 @@ const Admin: React.FC = () => { key={'expiration'} label={} name="expiration" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Lifecycle/SimList/SimUpdateForm.tsx b/ant-react/src/pages/Lifecycle/SimList/SimUpdateForm.tsx index efb84465df2a3e8502002d62ec517f0928cc6cf0..d1cec10a73453824796245bd0f7ffda93aa74012 100644 --- a/ant-react/src/pages/Lifecycle/SimList/SimUpdateForm.tsx +++ b/ant-react/src/pages/Lifecycle/SimList/SimUpdateForm.tsx @@ -27,8 +27,11 @@ const SimUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -40,18 +43,56 @@ const SimUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="access_number" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="iccid" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="imsi" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="iccid" /> - } name="imsi" /> } name="operator" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -60,6 +101,12 @@ const SimUpdateForm: React.FC = (props) => { key={'expiration'} label={} name="expiration" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Protocol/coap/clients/CoapHandlerUpdateForm.tsx b/ant-react/src/pages/Protocol/coap/clients/CoapHandlerUpdateForm.tsx index 734a398c7eae86a9a57afbb9ab0541da01f0b1e2..4a25cacb6fc45fbcd60be125a78f50532074c7f9 100644 --- a/ant-react/src/pages/Protocol/coap/clients/CoapHandlerUpdateForm.tsx +++ b/ant-react/src/pages/Protocol/coap/clients/CoapHandlerUpdateForm.tsx @@ -27,8 +27,11 @@ const CoapHandlerUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -40,6 +43,12 @@ const CoapHandlerUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { value: 'ID', }, }} + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="name" /> } name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/Protocol/coap/clients/index.tsx b/ant-react/src/pages/Protocol/coap/clients/index.tsx index d6ae29e0d82b947f345de65fbb711def05a8a198..550244aa27a58d994531419048355e693018e032 100644 --- a/ant-react/src/pages/Protocol/coap/clients/index.tsx +++ b/ant-react/src/pages/Protocol/coap/clients/index.tsx @@ -22,7 +22,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, Form, message } from 'antd'; +import { Button, Drawer, Form, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.CoapHandlerListItem) => { @@ -170,21 +170,25 @@ const Admin: React.FC = () => { , - , + + , , , - , + + , , , - , - , - record.start === false && ( - - ), - record.start === false && ( - - ), - - record.start === false && ( - - ), - record.start === true && ( - + + ), + { + if (e === 'signal-config') { + handleSignalConfig(record); + } + if (e === 'mock-send') { + handleMockSend(record); + } + if (e === 'set-script') { + handleSetScript(record); + } + if (e === 'start') { + handleStart(record); + } + if (e === 'end') { + handleStop(record); + } + }} + menus={[ + { + key: 'signal-config', + name: , + }, + { + key: 'mock-send', + name: , + }, + { + key: 'set-script', + name: record.start === false && ( + + ), + }, + { + key: 'start', + name: record.start === false && ( + + ), + }, + { + key: 'stop', + name: record.start === true && ( + + ), + }, + ].filter(({ name }) => !!name)} + > + + + + , ], }, ]; @@ -304,9 +334,11 @@ const Admin: React.FC = () => { })} actionRef={actionRef} rowKey="key" - search={{ - labelWidth: 120, - }} + search={ + { + // labelWidth: 120, + } + } toolBarRender={() => [ , - , + + , , , - , + + , , , + } + onConfirm={async () => { + const success = await handleRemove(record.ID); + if (success) { + actionRef.current?.reload(); + } + }} + okText={} + cancelText={} + > + + , ], }, ]; @@ -168,6 +198,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.DeptListItem); if (success) { @@ -179,13 +212,29 @@ const Admin: React.FC = () => { } }} > - } name="name" /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} + /> } name="parent_id" options={options} + rules={[ + { + required: false, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/User/DeptList/DeptUpdateForm.tsx b/ant-react/src/pages/User/DeptList/DeptUpdateForm.tsx index 6d710706a42c88b79c46dd839ab7d2ec412e07db..b8427970ffc983f7dc556f513e2b6934f792f93a 100644 --- a/ant-react/src/pages/User/DeptList/DeptUpdateForm.tsx +++ b/ant-react/src/pages/User/DeptList/DeptUpdateForm.tsx @@ -51,8 +51,11 @@ const DeptUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -64,13 +67,35 @@ const DeptUpdateForm: React.FC = (props) => { key={'id'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="name" /> } name="parent_id" options={options} + rules={[ + { + required: false, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/User/RoleList/RoleList.tsx b/ant-react/src/pages/User/RoleList/RoleList.tsx index 7a8f58856c23774221eeff57f9a3092384ae6dfe..80accc41cc106e7538aa47a783695462a3226929 100644 --- a/ant-react/src/pages/User/RoleList/RoleList.tsx +++ b/ant-react/src/pages/User/RoleList/RoleList.tsx @@ -1,5 +1,5 @@ import RoleUpdateForm from '@/pages/User/RoleList/RoleUpdateForm'; -import { addRole, rolePage, updateRole } from '@/services/ant-design-pro/api'; +import { addRole, deleteRole, rolePage, updateRole } from '@/services/ant-design-pro/api'; import { FormattedMessage } from '@@/exports'; import { PlusOutlined } from '@ant-design/icons'; import { @@ -13,7 +13,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const Admin: React.FC = () => { @@ -48,6 +48,20 @@ const Admin: React.FC = () => { } } + const handleRemove = async (id: any) => { + const hide = message.loading('正在删除'); + try { + await deleteRole(id); + hide(); + message.success('删除 successfully'); + return true; + } catch (error) { + hide(); + message.error('Delete failed, please try again!'); + return false; + } + }; + const columns: ProColumns[] = [ { title: , @@ -91,6 +105,22 @@ const Admin: React.FC = () => { > , + } + onConfirm={async () => { + const success = await handleRemove(record.ID); + if (success) { + actionRef.current?.reload(); + } + }} + okText={} + cancelText={} + > + + , ], }, ]; @@ -143,6 +173,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.RoleListItem); if (success) { @@ -153,8 +186,26 @@ const Admin: React.FC = () => { } }} > - } name="name" />{' '} - } name="description" /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} + />{' '} + } + name="description" + rules={[ + { + required: true, + message: , + }, + ]} + /> void; @@ -12,20 +11,14 @@ export type UpdateFormProps = { values: API.RoleListItem; }; const RoleUpdateForm: React.FC = (props) => { - const [form] = Form.useForm(); useEffect(() => { form.resetFields(); form.setFieldsValue(props.values); }); - - - - return ( = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -46,10 +42,34 @@ const RoleUpdateForm: React.FC = (props) => { key={'id'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="description" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="name" /> - } name="description" /> - ); diff --git a/ant-react/src/pages/User/UserList/UserList.tsx b/ant-react/src/pages/User/UserList/UserList.tsx index 9764b55acfed228a489e66b90090894405c36f40..7e77573b561306fd95ff8d2fa88a8f485e8d3ed8 100644 --- a/ant-react/src/pages/User/UserList/UserList.tsx +++ b/ant-react/src/pages/User/UserList/UserList.tsx @@ -13,7 +13,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.UserListItem) => { @@ -134,21 +134,22 @@ const Admin: React.FC = () => { , - , + + , ], }, ]; @@ -188,6 +189,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.UserListItem); if (success) { @@ -202,16 +206,34 @@ const Admin: React.FC = () => { key={'username'} label={} name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="email" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/User/UserList/UserUpdateForm.tsx b/ant-react/src/pages/User/UserList/UserUpdateForm.tsx index 4f41c371816059b24585f62d7c172afa939377d5..72fdee58bf442c5b069df91f919474a7a75d2d3d 100644 --- a/ant-react/src/pages/User/UserList/UserUpdateForm.tsx +++ b/ant-react/src/pages/User/UserList/UserUpdateForm.tsx @@ -26,8 +26,11 @@ const UserUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,21 +42,45 @@ const UserUpdateForm: React.FC = (props) => { key={'id'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="email" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/dashboard/AlarmStatistics.tsx b/ant-react/src/pages/dashboard/AlarmStatistics.tsx index ef6ca77eaeca6dd9f170ed1b785cbb06ef1bde5d..7750d445da05a1350b869d3fed3e5205c857fb01 100644 --- a/ant-react/src/pages/dashboard/AlarmStatistics.tsx +++ b/ant-react/src/pages/dashboard/AlarmStatistics.tsx @@ -1,19 +1,41 @@ -import React from 'react'; -import { Card, Row, Col, Statistic } from 'antd'; import { ExclamationCircleOutlined } from '@ant-design/icons'; +import { Card, Col, Row, Statistic } from 'antd'; +import React from 'react'; const AlarmStatistics: React.FC = () => { const alarmData = [ - { title: '高危报警', value: 32, icon: }, - { title: '中危报警', value: 15, icon: }, - { title: '低危报警', value: 5, icon: }, - { title: '已处理报警', value: 50, icon: }, + { + title: '高危报警', + value: 32, + icon: , + }, + { + title: '中危报警', + value: 15, + icon: , + }, + { + title: '低危报警', + value: 5, + icon: , + }, + { + title: '已处理报警', + value: 50, + icon: , + }, ]; return ( - + {alarmData.map((data) => ( diff --git a/ant-react/src/pages/dashboard/DeviceMap.tsx b/ant-react/src/pages/dashboard/DeviceMap.tsx index 591501b9808923b504798fac7e8911703178439c..1799c33d6691a88d9e4470b6fa73be4890592d8d 100644 --- a/ant-react/src/pages/dashboard/DeviceMap.tsx +++ b/ant-react/src/pages/dashboard/DeviceMap.tsx @@ -1,47 +1,55 @@ -import 'ol/ol.css'; +import { Card } from 'antd'; +import { Feature } from 'ol'; import Map from 'ol/Map'; import View from 'ol/View'; +import { Point } from 'ol/geom'; import TileLayer from 'ol/layer/Tile'; +import VectorLayer from 'ol/layer/Vector'; +import 'ol/ol.css'; +import { fromLonLat } from 'ol/proj'; import OSM from 'ol/source/OSM'; -import {fromLonLat} from 'ol/proj'; -import {Card} from 'antd'; -import React, {useEffect} from "react"; -import {Feature} from "ol"; -import VectorSource from "ol/source/Vector"; -import VectorLayer from "ol/layer/Vector"; -import {Point} from "ol/geom"; -import {Circle, Fill, Stroke, Style} from "ol/style"; - +import VectorSource from 'ol/source/Vector'; +import { Circle, Fill, Stroke, Style } from 'ol/style'; +import React, { useEffect } from 'react'; const DeviceMap: React.FC = () => { useEffect(() => { const map = new Map({ target: 'map', // 地图容器ID - layers: [new TileLayer({ - source: new OSM(), - }),], view: new View({ + layers: [ + new TileLayer({ + source: new OSM(), + }), + ], + view: new View({ center: fromLonLat([116.4074, 39.9042]), // 北京的经纬度 zoom: 10, - }), controls: [], // 移除所有控制 + }), + controls: [], // 移除所有控制 }); -// 添加设备标记示例 - const deviceCoordinates = [{lon: 116.4074, lat: 39.9042}, // 示例设备坐标 - {lon: 116.5, lat: 39.9}, {lon: 116.4, lat: 39.92},]; + // 添加设备标记示例 + const deviceCoordinates = [ + { lon: 116.4074, lat: 39.9042 }, // 示例设备坐标 + { lon: 116.5, lat: 39.9 }, + { lon: 116.4, lat: 39.92 }, + ]; - const features = deviceCoordinates.map(device => { + const features = deviceCoordinates.map((device) => { var feature = new Feature({ geometry: new Point(fromLonLat([device.lon, device.lat])), }); // 设置样式 - feature.setStyle(new Style({ - image: new Circle({ - radius: 5, // 半径 - fill: new Fill({color: 'red'}), // 填充颜色 - stroke: new Stroke({color: 'white', width: 2}), // 边框颜色和宽度 + feature.setStyle( + new Style({ + image: new Circle({ + radius: 5, // 半径 + fill: new Fill({ color: 'red' }), // 填充颜色 + stroke: new Stroke({ color: 'white', width: 2 }), // 边框颜色和宽度 + }), }), - })); + ); return feature; }); @@ -59,8 +67,10 @@ const DeviceMap: React.FC = () => { return () => map.setTarget(undefined); // 清理 }, []); - return ( -
- ); + return ( + +
+ + ); }; export default DeviceMap; diff --git a/ant-react/src/pages/dashboard/MessageList.tsx b/ant-react/src/pages/dashboard/MessageList.tsx index 7624932aabe21bfaeb83de4a75ea4ea742d18397..a9be5d96fd13ac2249d8e8f5142153f92005be61 100644 --- a/ant-react/src/pages/dashboard/MessageList.tsx +++ b/ant-react/src/pages/dashboard/MessageList.tsx @@ -1,60 +1,58 @@ +import { Card, List, Tabs, Typography } from 'antd'; import React, { useState } from 'react'; -import { Card, Tabs, List, Typography } from 'antd'; const { Title } = Typography; const { TabPane } = Tabs; const messages = { - "分类1": [ - "消息内容 1-1: 这是第一类的第一条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", - "消息内容 1-2: 这是第一类的第二条消息。", + 分类1: [ + '消息内容 1-1: 这是第一类的第一条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', + '消息内容 1-2: 这是第一类的第二条消息。', // ...其他消息 - "消息内容 1-3: 这是第一类的第三条消息。", + '消息内容 1-3: 这是第一类的第三条消息。', ], - "分类2": [ - "消息内容 2-1: 这是第二类的第一条消息。", - "消息内容 2-2: 这是第二类的第二条消息。", - "消息内容 2-3: 这是第二类的第三条消息。", + 分类2: [ + '消息内容 2-1: 这是第二类的第一条消息。', + '消息内容 2-2: 这是第二类的第二条消息。', + '消息内容 2-3: 这是第二类的第三条消息。', ], - "分类3": [ - "消息内容 3-1: 这是第三类的第一条消息。", - "消息内容 3-2: 这是第三类的第二条消息。", + 分类3: [ + '消息内容 3-1: 这是第三类的第一条消息。', + '消息内容 3-2: 这是第三类的第二条消息。', // ...其他消息 ], }; const MessageCard: React.FC = () => { - const [activeKey, setActiveKey] = useState("分类1"); + const [activeKey, setActiveKey] = useState('分类1'); return ( - + 消息列表 - {Object.keys(messages).map(category => ( + {Object.keys(messages).map((category) => ( ( - - {item} - - )} - style={{ maxHeight: 200, overflowY: 'auto' }} // 设置最大高度和滚动条 + renderItem={(item) => {item}} + style={{ height: 140, overflowY: 'auto' }} // 设置最大高度和滚动条 /> ))} diff --git a/ant-react/src/pages/dashboard/ProtocolStatsTable.tsx b/ant-react/src/pages/dashboard/ProtocolStatsTable.tsx index dbd294523d29dd4357f4ac759d64d71d1cb432db..e886d5d998b3eb564a4f319e2f1addc5ea898c13 100644 --- a/ant-react/src/pages/dashboard/ProtocolStatsTable.tsx +++ b/ant-react/src/pages/dashboard/ProtocolStatsTable.tsx @@ -1,6 +1,6 @@ -import React from 'react'; +import { DownOutlined, UpOutlined } from '@ant-design/icons'; import { Card, Col, Row } from 'antd'; -import { UpOutlined, DownOutlined } from '@ant-design/icons'; +import React from 'react'; interface ProtocolStats { protocol: string; @@ -20,25 +20,33 @@ const ProtocolStatsCards: React.FC = () => { return ( {mockData.map((protocol) => ( - +
-

{protocol.protocol}

-

Today: {protocol.today_processed}

-

Yesterday: {protocol.yesterday_processed}

-

Total: {protocol.total_processed}

+

+ {protocol.protocol} +

+

+ Today: {protocol.today_processed} +

+

+ Yesterday: {protocol.yesterday_processed} +

+

+ Total: {protocol.total_processed} +

{protocol.today_processed > protocol.yesterday_processed ? ( diff --git a/ant-react/src/pages/dashboard/index.tsx b/ant-react/src/pages/dashboard/index.tsx index 6eba098e0ae9726beff1c1ca12c5aaf39b0cef59..74bb9de8100f3e1308fbcc5714c88d1e3c039cbc 100644 --- a/ant-react/src/pages/dashboard/index.tsx +++ b/ant-react/src/pages/dashboard/index.tsx @@ -1,24 +1,22 @@ -import DeviceMap from "@/pages/dashboard/DeviceMap"; -import ProtocolStatsCards from "@/pages/dashboard/ProtocolStatsTable"; -import MessageList from "@/pages/dashboard/MessageList"; -import { Col, Row } from "antd"; -import AlarmStatistics from "@/pages/dashboard/AlarmStatistics"; -import ProductDeviceChart from "@/pages/dashboard/ProductDeviceCards"; +import AlarmStatistics from '@/pages/dashboard/AlarmStatistics'; +import DeviceMap from '@/pages/dashboard/DeviceMap'; +import MessageList from '@/pages/dashboard/MessageList'; +import ProtocolStatsCards from '@/pages/dashboard/ProtocolStatsTable'; +import { Col, Row } from 'antd'; const Dashboard = () => { return ( <> - - + + - + - + - ); }; diff --git a/ant-react/src/pages/forward/cassandra/CassandraTransmitUpdateForm.tsx b/ant-react/src/pages/forward/cassandra/CassandraTransmitUpdateForm.tsx index 237bb4b76c85d60dde2841c2148aa769f34fbc06..2201469efbe1d20c1e8c747a34d4bb6c908734b0 100644 --- a/ant-react/src/pages/forward/cassandra/CassandraTransmitUpdateForm.tsx +++ b/ant-react/src/pages/forward/cassandra/CassandraTransmitUpdateForm.tsx @@ -26,8 +26,11 @@ const CassandraTransmitUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,31 +42,67 @@ const CassandraTransmitUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="host" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="port" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/cassandra/index.tsx b/ant-react/src/pages/forward/cassandra/index.tsx index b1edac24def2ce8903284277aefb267273454c2b..721840d9879e549e2683c7561a36f1057dacaa28 100644 --- a/ant-react/src/pages/forward/cassandra/index.tsx +++ b/ant-react/src/pages/forward/cassandra/index.tsx @@ -19,7 +19,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.CassandraTransmitListItem) => { @@ -152,22 +152,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -207,6 +210,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.CassandraTransmitListItem); if (success) { @@ -221,26 +227,56 @@ const Admin: React.FC = () => { key={'name'} label={} name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="host" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="port" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/cassandra_bind/CassandraTransmitBindUpdateForm.tsx b/ant-react/src/pages/forward/cassandra_bind/CassandraTransmitBindUpdateForm.tsx index 8d474ca247e4d8cf9b8eab244a62c0a3296d8e4a..44407aacc816f42e3d0a0be4d45591f392cbd2d9 100644 --- a/ant-react/src/pages/forward/cassandra_bind/CassandraTransmitBindUpdateForm.tsx +++ b/ant-react/src/pages/forward/cassandra_bind/CassandraTransmitBindUpdateForm.tsx @@ -32,8 +32,11 @@ const CassandraTransmitBindUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -45,6 +48,12 @@ const CassandraTransmitBindUpdateForm: React.FC = (props) => { disabled={true} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -122,16 +149,34 @@ const CassandraTransmitBindUpdateForm: React.FC = (props) => { key={'cassandra_transmit_id'} label={} name="cassandra_transmit_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="database" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="table" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'script'} label={} name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { value: false, }, ]} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/cassandra_bind/index.tsx b/ant-react/src/pages/forward/cassandra_bind/index.tsx index 44d58329455af23ac0472bb4bba2c64541f29f5d..0744d962cf99f9aec17edf52208132c268b68d24 100644 --- a/ant-react/src/pages/forward/cassandra_bind/index.tsx +++ b/ant-react/src/pages/forward/cassandra_bind/index.tsx @@ -25,7 +25,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, Form, message } from 'antd'; +import { Button, Drawer, Form, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.CassandraTransmitBindListItem) => { @@ -194,22 +194,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -251,6 +254,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.CassandraTransmitBindListItem); if (success) { @@ -272,6 +278,12 @@ const Admin: React.FC = () => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -336,16 +360,34 @@ const Admin: React.FC = () => { key={'cassandra_transmit_id'} label={} name="cassandra_transmit_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="database" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="table" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'script'} label={} name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> { value: false, }, ]} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/clickhouse/ClickhouseTransmitUpdateForm.tsx b/ant-react/src/pages/forward/clickhouse/ClickhouseTransmitUpdateForm.tsx index 10b324f2ae86e60d71845d9a1c219057ec95cd3a..a8936485e54979f38dad7f95a3a516b5c8e78dee 100644 --- a/ant-react/src/pages/forward/clickhouse/ClickhouseTransmitUpdateForm.tsx +++ b/ant-react/src/pages/forward/clickhouse/ClickhouseTransmitUpdateForm.tsx @@ -26,8 +26,11 @@ const ClickhouseTransmitUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,31 +42,67 @@ const ClickhouseTransmitUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="host" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="port" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/clickhouse/index.tsx b/ant-react/src/pages/forward/clickhouse/index.tsx index 3ea341c0df9389f07ed2a7bcb60d8d5e0b1863a7..e4474d15a59a273298e7c7ec26e1deb638b30576 100644 --- a/ant-react/src/pages/forward/clickhouse/index.tsx +++ b/ant-react/src/pages/forward/clickhouse/index.tsx @@ -19,7 +19,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.ClickhouseTransmitListItem) => { @@ -152,22 +152,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -207,6 +210,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.ClickhouseTransmitListItem); if (success) { @@ -221,26 +227,56 @@ const Admin: React.FC = () => { key={'name'} label={} name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="host" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="port" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/clickhouse_bind/ClickhouseTransmitBindUpdateForm.tsx b/ant-react/src/pages/forward/clickhouse_bind/ClickhouseTransmitBindUpdateForm.tsx index 636f48e3831c1e9c3b1f5b876de163c4d2e088aa..8e0ff1268270eea1de8620bb8d19034a9ad583d6 100644 --- a/ant-react/src/pages/forward/clickhouse_bind/ClickhouseTransmitBindUpdateForm.tsx +++ b/ant-react/src/pages/forward/clickhouse_bind/ClickhouseTransmitBindUpdateForm.tsx @@ -32,8 +32,11 @@ const ClickhouseTransmitBindUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -45,6 +48,12 @@ const ClickhouseTransmitBindUpdateForm: React.FC = (props) => { disabled={true} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -122,16 +149,34 @@ const ClickhouseTransmitBindUpdateForm: React.FC = (props) => { key={'clickhouse_transmit_id'} label={} name="clickhouse_transmit_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="database" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="table" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'script'} label={} name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { value: false, }, ]} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/clickhouse_bind/index.tsx b/ant-react/src/pages/forward/clickhouse_bind/index.tsx index 6076b20f93ce4cc5f80ceee5fbd8ecdca406afe5..650ec73204974926d2a751f21f828f6fd03342c4 100644 --- a/ant-react/src/pages/forward/clickhouse_bind/index.tsx +++ b/ant-react/src/pages/forward/clickhouse_bind/index.tsx @@ -24,7 +24,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, Form, message } from 'antd'; +import { Button, Drawer, Form, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; import ClickhouseTransmitBindUpdateForm from './ClickhouseTransmitBindUpdateForm'; @@ -194,22 +194,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -251,6 +254,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.ClickhouseTransmitBindListItem); if (success) { @@ -272,6 +278,12 @@ const Admin: React.FC = () => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -336,16 +360,34 @@ const Admin: React.FC = () => { key={'clickhouse_transmit_id'} label={} name="clickhouse_transmit_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="database" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="table" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'script'} label={} name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> { value: false, }, ]} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/influxdb2/InfluxdbTransmitUpdateForm.tsx b/ant-react/src/pages/forward/influxdb2/InfluxdbTransmitUpdateForm.tsx index e0d6e4790fc2e8df087ef091bae8b73347757d94..8ca3fdb383d9e5f29e1563781be33744b738544e 100644 --- a/ant-react/src/pages/forward/influxdb2/InfluxdbTransmitUpdateForm.tsx +++ b/ant-react/src/pages/forward/influxdb2/InfluxdbTransmitUpdateForm.tsx @@ -26,8 +26,11 @@ const InfluxdbTransmitUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,26 +42,56 @@ const InfluxdbTransmitUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="host" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="port" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="token" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/influxdb2/index.tsx b/ant-react/src/pages/forward/influxdb2/index.tsx index 8e5eb87cf32e7b42dd9b622e72437cd70c172774..779a895a15ebf88c6424620f32469f8f7ba31581 100644 --- a/ant-react/src/pages/forward/influxdb2/index.tsx +++ b/ant-react/src/pages/forward/influxdb2/index.tsx @@ -19,7 +19,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.InfluxdbTransmitListItem) => { @@ -145,22 +145,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -200,6 +203,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.InfluxdbTransmitListItem); if (success) { @@ -214,21 +220,45 @@ const Admin: React.FC = () => { key={'name'} label={} name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="host" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="port" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="token" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/influxdb2_bind/InfluxdbTransmitBindUpdateForm.tsx b/ant-react/src/pages/forward/influxdb2_bind/InfluxdbTransmitBindUpdateForm.tsx index 183fe47104e706c16329f639708e30aa3c4158ed..4bbffcefa36a41367b8ee4f8b91948b3e3d04727 100644 --- a/ant-react/src/pages/forward/influxdb2_bind/InfluxdbTransmitBindUpdateForm.tsx +++ b/ant-react/src/pages/forward/influxdb2_bind/InfluxdbTransmitBindUpdateForm.tsx @@ -1,4 +1,4 @@ -import { CassandraTransmitList, ClickhouseTransmitList, deviceList, InfluxdbTransmitList, mqttList } from '@/services/ant-design-pro/api'; +import { deviceList, InfluxdbTransmitList, mqttList } from '@/services/ant-design-pro/api'; import { FormattedMessage } from '@@/exports'; import { ProFormRadio, ProFormSelect, ProFormText } from '@ant-design/pro-components'; import { Form, Modal } from 'antd'; @@ -27,8 +27,11 @@ const InfluxdbTransmitBindUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -40,6 +43,12 @@ const InfluxdbTransmitBindUpdateForm: React.FC = (props) => { disabled={true} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -117,26 +144,56 @@ const InfluxdbTransmitBindUpdateForm: React.FC = (props) => { key={'influxdb_transmit_id'} label={} name="influxdb_transmit_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="org" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="bucket" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="measurement" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { value: false, }, ]} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/influxdb2_bind/index.tsx b/ant-react/src/pages/forward/influxdb2_bind/index.tsx index ccdf7c97cac3587be2c723ef94cca6fff5f43054..2df5a46e80455bc15d6251dbdda9b73ca6943239 100644 --- a/ant-react/src/pages/forward/influxdb2_bind/index.tsx +++ b/ant-react/src/pages/forward/influxdb2_bind/index.tsx @@ -23,7 +23,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, Form, message } from 'antd'; +import { Button, Drawer, Form, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; import InfluxdbTransmitBindUpdateForm from './InfluxdbTransmitBindUpdateForm'; @@ -201,22 +201,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -258,6 +261,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.InfluxdbTransmitBindListItem); if (success) { @@ -279,6 +285,12 @@ const Admin: React.FC = () => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -343,26 +367,56 @@ const Admin: React.FC = () => { key={'influxdb_transmit_id'} label={} name="influxdb_transmit_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="org" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="bucket" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="measurement" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> { value: false, }, ]} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/mongo/MongoTransmitUpdateForm.tsx b/ant-react/src/pages/forward/mongo/MongoTransmitUpdateForm.tsx index 069d748fbe4c56c421c1c33e70b6c88b442b897c..6266517624676ce3ae976737faf43faa35dbc268 100644 --- a/ant-react/src/pages/forward/mongo/MongoTransmitUpdateForm.tsx +++ b/ant-react/src/pages/forward/mongo/MongoTransmitUpdateForm.tsx @@ -26,8 +26,11 @@ const MongoTransmitUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,31 +42,67 @@ const MongoTransmitUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="host" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="port" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/mongo/index.tsx b/ant-react/src/pages/forward/mongo/index.tsx index b7083f236155dd8a95ac37832b034b7ddebe9961..6b841469425bfd096916bd63d17dcefea9e38c02 100644 --- a/ant-react/src/pages/forward/mongo/index.tsx +++ b/ant-react/src/pages/forward/mongo/index.tsx @@ -19,7 +19,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.MongoTransmitListItem) => { @@ -152,22 +152,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -207,6 +210,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.MongoTransmitListItem); if (success) { @@ -221,26 +227,56 @@ const Admin: React.FC = () => { key={'name'} label={} name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="host" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="port" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/mongo_bind/MongoTransmitBindUpdateForm.tsx b/ant-react/src/pages/forward/mongo_bind/MongoTransmitBindUpdateForm.tsx index da1e6b7537c22f7b10c1fce4dab194f861755717..1361f0087d4e1a00403ed621fe196e00ea2b4f94 100644 --- a/ant-react/src/pages/forward/mongo_bind/MongoTransmitBindUpdateForm.tsx +++ b/ant-react/src/pages/forward/mongo_bind/MongoTransmitBindUpdateForm.tsx @@ -32,8 +32,11 @@ const MongoTransmitBindUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -45,6 +48,12 @@ const MongoTransmitBindUpdateForm: React.FC = (props) => { disabled={true} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -121,22 +148,46 @@ const MongoTransmitBindUpdateForm: React.FC = (props) => { key={'mongo_transmit_id_transmit_id'} label={} name="mongo_transmit_id_transmit_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="collection" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="database" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { value: false, }, ]} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/mongo_bind/index.tsx b/ant-react/src/pages/forward/mongo_bind/index.tsx index 313887ac2ec1987c41c32393e5ad603262704b0d..e762c8e33996c54000e584c61fcca03883db455a 100644 --- a/ant-react/src/pages/forward/mongo_bind/index.tsx +++ b/ant-react/src/pages/forward/mongo_bind/index.tsx @@ -24,7 +24,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, Form, message } from 'antd'; +import { Button, Drawer, Form, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; import MongoTransmitBindUpdateForm from './MongoTransmitBindUpdateForm'; @@ -195,22 +195,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -252,6 +255,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.MongoTransmitBindListItem); if (success) { @@ -273,6 +279,12 @@ const Admin: React.FC = () => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -337,16 +361,34 @@ const Admin: React.FC = () => { key={'mongo_transmit_id_transmit_id'} label={} name="mongo_transmit_id_transmit_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="collection" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="database" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'script'} label={} name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> { value: false, }, ]} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/mysql/MySQLTransmitUpdateForm.tsx b/ant-react/src/pages/forward/mysql/MySQLTransmitUpdateForm.tsx index 7c001e06747a8e3a0239089a2bb31de5d5401f7e..671cc8dbbe4feb1301cc40910cc0cd91ce8ce179 100644 --- a/ant-react/src/pages/forward/mysql/MySQLTransmitUpdateForm.tsx +++ b/ant-react/src/pages/forward/mysql/MySQLTransmitUpdateForm.tsx @@ -26,8 +26,11 @@ const MySQLTransmitUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,36 +42,78 @@ const MySQLTransmitUpdateForm: React.FC = (props) => { key={'ID'} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="host" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="port" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="database" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/mysql/index.tsx b/ant-react/src/pages/forward/mysql/index.tsx index 40b0bd1ee1da6a97a13e113826449d1b47fb6038..3af0e13eb2661c34403e24f41ae980f758b545b0 100644 --- a/ant-react/src/pages/forward/mysql/index.tsx +++ b/ant-react/src/pages/forward/mysql/index.tsx @@ -19,7 +19,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.MySQLTransmitListItem) => { @@ -158,22 +158,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -213,6 +216,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.MySQLTransmitListItem); if (success) { @@ -227,31 +233,67 @@ const Admin: React.FC = () => { key={'name'} label={} name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="host" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="port" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="username" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="password" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="database" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/mysql_bind/MysqlTransmitBindUpdateForm.tsx b/ant-react/src/pages/forward/mysql_bind/MysqlTransmitBindUpdateForm.tsx index d295293539de827348077e1a4684e98ea71520f0..0bf57837ec27903ef19248d60e8cfde716f2eeb9 100644 --- a/ant-react/src/pages/forward/mysql_bind/MysqlTransmitBindUpdateForm.tsx +++ b/ant-react/src/pages/forward/mysql_bind/MysqlTransmitBindUpdateForm.tsx @@ -32,8 +32,11 @@ const MysqlTransmitBindUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -45,6 +48,12 @@ const MysqlTransmitBindUpdateForm: React.FC = (props) => { disabled={true} label={} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -121,11 +148,23 @@ const MysqlTransmitBindUpdateForm: React.FC = (props) => { key={'mysql_transmit_id'} label={} name="mysql_transmit_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="table" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { key={'script'} label={} name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> = (props) => { value: false, }, ]} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/forward/mysql_bind/index.tsx b/ant-react/src/pages/forward/mysql_bind/index.tsx index 05782ef1888e955da7fbd6f5f766e99302441cf5..e05310d949fa7d954d034a5c6c27e7df3838f4f1 100644 --- a/ant-react/src/pages/forward/mysql_bind/index.tsx +++ b/ant-react/src/pages/forward/mysql_bind/index.tsx @@ -24,7 +24,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, Form, message } from 'antd'; +import { Button, Drawer, Form, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; import MysqlTransmitBindUpdateForm from './MysqlTransmitBindUpdateForm'; @@ -189,22 +189,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -246,6 +249,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.MySQLTransmitBindListItem); if (success) { @@ -267,6 +273,12 @@ const Admin: React.FC = () => { key={'protocol'} label={} name="protocol" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'device_uid'} label={} name="device_uid" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="identification_code" + rules={[ + { + required: true, + message: , + }, + ]} /> { @@ -331,11 +355,23 @@ const Admin: React.FC = () => { key={'mysql_transmit_id'} label={} name="mysql_transmit_id" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="table" + rules={[ + { + required: true, + message: , + }, + ]} /> { key={'script'} label={} name="script" + rules={[ + { + required: true, + message: , + }, + ]} /> { value: false, }, ]} + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/notice/dingding/DingDingUpdateForm.tsx b/ant-react/src/pages/notice/dingding/DingDingUpdateForm.tsx index 8b81096655c298a34bf6f21c1ef620900d61e0b9..0245c90ba338648a76685b80bb0af8d44baa247d 100644 --- a/ant-react/src/pages/notice/dingding/DingDingUpdateForm.tsx +++ b/ant-react/src/pages/notice/dingding/DingDingUpdateForm.tsx @@ -26,8 +26,11 @@ const DingDingUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,26 +42,56 @@ const DingDingUpdateForm: React.FC = (props) => { label={} disabled={true} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="access_token" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="secret" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="content" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/notice/dingding/index.tsx b/ant-react/src/pages/notice/dingding/index.tsx index edffc46125157ac6ccc4eb68fe028d09fb5e2b4b..aa8458d34a92d8b0bba8ea055e34c8237f2a0aa7 100644 --- a/ant-react/src/pages/notice/dingding/index.tsx +++ b/ant-react/src/pages/notice/dingding/index.tsx @@ -18,7 +18,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.DingDingListItem) => { @@ -150,22 +150,25 @@ const Admin: React.FC = () => { > , - - , + + , ], }, ]; @@ -205,6 +208,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.DingDingListItem); if (success) { @@ -219,16 +225,34 @@ const Admin: React.FC = () => { key={'name'} label={} name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="access_token" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="secret" + rules={[ + { + required: true, + message: , + }, + ]} /> { ' 单位: {{unit}}
\n' + ' 范围内,范围外: {{in_or_out}}' } + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/notice/feishu/FeishuUpdateForm.tsx b/ant-react/src/pages/notice/feishu/FeishuUpdateForm.tsx index 81531f1d75d46d16ecdd2061d8b7fea5a2b3bfd8..d8e34bbbe4649776e6b6a61b46599348a744d39d 100644 --- a/ant-react/src/pages/notice/feishu/FeishuUpdateForm.tsx +++ b/ant-react/src/pages/notice/feishu/FeishuUpdateForm.tsx @@ -26,8 +26,11 @@ const FeishuUpdateForm: React.FC = (props) => { onCancel={(vvv) => { props.onCancel(); }} - onOk={() => { - props.onSubmit(form.getFieldsValue()); + onOk={async () => { + let success = await form.validateFields(); + if (success) { + props.onSubmit(form.getFieldsValue()); + } }} onClose={() => { props.onCancel(); @@ -39,22 +42,56 @@ const FeishuUpdateForm: React.FC = (props) => { label={} disabled={true} name="ID" + rules={[ + { + required: true, + message: , + }, + ]} + /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} /> - } name="name" /> } name="access_token" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="secret" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="content" + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/pages/notice/feishu/index.tsx b/ant-react/src/pages/notice/feishu/index.tsx index 19ea3e144468e9ae79879522f78094255bb33fbe..8aa604e00d6978d04b315f5bbc7f4cc0112be23b 100644 --- a/ant-react/src/pages/notice/feishu/index.tsx +++ b/ant-react/src/pages/notice/feishu/index.tsx @@ -13,7 +13,7 @@ import { ProTable, } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; -import { Button, Drawer, message } from 'antd'; +import { Button, Drawer, message, Popconfirm } from 'antd'; import React, { useRef, useState } from 'react'; const handleAdd = async (fields: API.FeiShuListItem) => { @@ -146,21 +146,25 @@ const Admin: React.FC = () => { , - , + + , ], }, ]; @@ -200,6 +204,9 @@ const Admin: React.FC = () => { width="75%" open={createModalOpen} onOpenChange={handleModalOpen} + modalProps={{ + destroyOnClose: true, + }} onFinish={async (value) => { const success = await handleAdd(value as API.FeiShuListItem); if (success) { @@ -210,16 +217,38 @@ const Admin: React.FC = () => { } }} > - } name="name" /> + } + name="name" + rules={[ + { + required: true, + message: , + }, + ]} + /> } name="access_token" + rules={[ + { + required: true, + message: , + }, + ]} /> } name="secret" + rules={[ + { + required: true, + message: , + }, + ]} /> { ' 单位: {{unit}}
\n' + ' 范围内,范围外: {{in_or_out}}' } + rules={[ + { + required: true, + message: , + }, + ]} /> diff --git a/ant-react/src/services/ant-design-pro/api.ts b/ant-react/src/services/ant-design-pro/api.ts index a6ca10fe95debe44538cd578b79f1a8c4e88a0e5..9202bd96127a4f97185fe01ce2e72a734d721ffb 100644 --- a/ant-react/src/services/ant-design-pro/api.ts +++ b/ant-react/src/services/ant-design-pro/api.ts @@ -1444,6 +1444,20 @@ export async function deleteUser(id: any) { }); } +export async function deleteDept(id: any) { + return request>('/api/Dept/delete/' + id, { + method: 'POST', + }); +} + +export async function deleteRole(id: any) { + return request>('/api/Role/delete/' + id, { + method: 'POST', + }); +} + + + export async function deleteSimCard(id: any) { return request>('/api/SimCard/delete/' + id, { method: 'POST',