pages_sms_module.tsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import React, { useState } from 'react';
  2. import { Button, Card, Space, Row, Col, Table, Form, Input, message } from 'antd';
  3. import { useNavigate } from 'react-router';
  4. export const SmsModulePage = () => {
  5. const navigate = useNavigate();
  6. const [deviceStatus, setDeviceStatus] = useState({
  7. io_alive: false,
  8. md_alive: false,
  9. signal_rate: 0,
  10. mno: '未知'
  11. });
  12. interface TaskStatus {
  13. id: string;
  14. status: string;
  15. result?: string;
  16. timestamp?: string;
  17. }
  18. const [taskStatus, setTaskStatus] = useState<TaskStatus | null>(null);
  19. const [taskId, setTaskId] = useState<string>('');
  20. const [phoneNumber, setPhoneNumber] = useState<string>('');
  21. const [smsContent, setSmsContent] = useState<string>('');
  22. const fetchDeviceStatus = async () => {
  23. try {
  24. const response = await fetch('http://vsmsd:Vsmsd123@52.55.129.63:12080/api/v1/info');
  25. const data = await response.json();
  26. setDeviceStatus({
  27. io_alive: data.io_alive,
  28. md_alive: data.md_alive,
  29. signal_rate: data.signal_rate,
  30. mno: data.mno
  31. });
  32. message.success('状态获取成功');
  33. } catch (error) {
  34. message.error('状态获取失败');
  35. console.error('Error fetching device status:', error);
  36. }
  37. };
  38. const sendSms = async () => {
  39. // 验证手机号码
  40. if (!/^1[3-9]\d{9}$/.test(phoneNumber)) {
  41. message.error('请输入正确的11位手机号码');
  42. return;
  43. }
  44. // 验证短信内容
  45. if (!smsContent.trim()) {
  46. message.error('请输入短信内容');
  47. return;
  48. }
  49. try {
  50. const response = await fetch('http://vsmsd:Vsmsd123@52.55.129.63:12080/api/v1/sms', {
  51. method: 'POST',
  52. headers: {
  53. 'Content-Type': 'application/json',
  54. },
  55. body: JSON.stringify({
  56. method: 'send_sms',
  57. number: phoneNumber,
  58. content: smsContent
  59. })
  60. });
  61. const data = await response.json();
  62. setTaskId(data.task_id);
  63. message.success('短信发送成功');
  64. } catch (error) {
  65. message.error('短信发送失败');
  66. console.error('Error sending SMS:', error);
  67. }
  68. };
  69. const fetchTaskStatus = async (taskId: string) => {
  70. try {
  71. const response = await fetch(`http://vsmsd:Vsmsd123@52.55.129.63:12080/api/v1/task/${taskId}`);
  72. const data = await response.json();
  73. setTaskStatus(data);
  74. message.success('任务状态获取成功');
  75. } catch (error) {
  76. message.error('任务状态获取失败');
  77. console.error('Error fetching task status:', error);
  78. }
  79. };
  80. return (
  81. <div className="p-4">
  82. <div className="flex justify-between items-center mb-4">
  83. <h1 className="text-2xl font-bold">短信模块管理</h1>
  84. </div>
  85. <Row gutter={16}>
  86. <Col span={24}>
  87. <Card title="功能测试面板" className="mb-4">
  88. <Space direction="vertical" size="middle" style={{ width: '100%' }}>
  89. <Row gutter={16}>
  90. <Col span={12}>
  91. <Card title="设备状态">
  92. <p>信号强度: {deviceStatus.signal_rate}%</p>
  93. <p>运营商: {deviceStatus.mno}</p>
  94. <p>4G模块: {deviceStatus.md_alive ? '在线' : '离线'}</p>
  95. <Button
  96. type="primary"
  97. onClick={fetchDeviceStatus}
  98. style={{ marginTop: 16 }}
  99. >
  100. 获取状态
  101. </Button>
  102. </Card>
  103. </Col>
  104. <Col span={12}>
  105. <Card title="模式选择">
  106. <Space>
  107. <Button type="primary">短信</Button>
  108. <Button>电话</Button>
  109. <Button>语音</Button>
  110. <Button>余额查询</Button>
  111. <Button>测试</Button>
  112. </Space>
  113. </Card>
  114. </Col>
  115. </Row>
  116. <Card title="短信测试">
  117. <Form layout="vertical">
  118. <Form.Item label="号码" required>
  119. <Input
  120. placeholder="请输入11位手机号码"
  121. value={phoneNumber}
  122. onChange={(e) => setPhoneNumber(e.target.value)}
  123. />
  124. </Form.Item>
  125. <Form.Item label="内容" required>
  126. <Input.TextArea
  127. rows={4}
  128. placeholder="请输入短信内容"
  129. value={smsContent}
  130. onChange={(e) => setSmsContent(e.target.value)}
  131. />
  132. </Form.Item>
  133. <Form.Item label="任务ID">
  134. <Space.Compact style={{ width: '100%' }}>
  135. <Input
  136. placeholder="可手动输入或自动生成"
  137. value={taskId}
  138. onChange={(e) => setTaskId(e.target.value)}
  139. />
  140. <Button
  141. onClick={() => setTaskId(`TASK_${Date.now()}`)}
  142. >
  143. 自动生成
  144. </Button>
  145. <Button
  146. onClick={() => setTaskId('')}
  147. >
  148. 重置
  149. </Button>
  150. </Space.Compact>
  151. </Form.Item>
  152. <Space>
  153. <Button
  154. type="primary"
  155. onClick={sendSms}
  156. >
  157. 发送短信
  158. </Button>
  159. <Button
  160. type="default"
  161. onClick={() => fetchTaskStatus(taskId)}
  162. disabled={!taskId}
  163. >
  164. 获取任务状态
  165. </Button>
  166. </Space>
  167. </Form>
  168. </Card>
  169. <Card title="执行信息">
  170. <Table
  171. columns={[
  172. { title: '序列号', dataIndex: 'id', key: 'id' },
  173. { title: '运营商', dataIndex: 'carrier', key: 'carrier' },
  174. { title: '时间', dataIndex: 'time', key: 'time' },
  175. { title: '结果', dataIndex: 'result', key: 'result' }
  176. ]}
  177. dataSource={[]}
  178. size="small"
  179. />
  180. </Card>
  181. </Space>
  182. </Card>
  183. </Col>
  184. </Row>
  185. </div>
  186. );
  187. };