pages_sms.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /** @jsxImportSource react */
  2. import React, { useState } from 'react'
  3. import { useRequest } from './hooks_sys.tsx'
  4. import { Button, Card, Form, Input, Table, message } from 'antd'
  5. import type { ColumnsType } from 'antd/es/table'
  6. import { smsApi } from './api/sms.ts'
  7. // 配置JSX运行时
  8. import * as jsxRuntime from 'react/jsx-runtime'
  9. Object.assign(globalThis, {
  10. React: React,
  11. ...jsxRuntime
  12. })
  13. interface SmsItem {
  14. id: string
  15. phone: string
  16. content: string
  17. status: string
  18. createdAt: string
  19. }
  20. export default function SmsPage() {
  21. const [form] = Form.useForm()
  22. const [activeTab, setActiveTab] = useState('send')
  23. const [password, setPassword] = useState('')
  24. // 登录状态检查
  25. const { data: isLoggedIn } = useRequest(() => smsApi.checkLogin(), {
  26. onError: () => message.error('请先登录短信服务')
  27. })
  28. // 发送短信
  29. const { run: sendSms } = useRequest(
  30. (values: { phone: string; content: string }) => smsApi.send(values),
  31. {
  32. manual: true,
  33. onSuccess: () => message.success('短信发送任务已创建'),
  34. onError: () => message.error('短信发送失败')
  35. }
  36. )
  37. // 获取设备状态
  38. const { data: deviceStatus } = useRequest(() => smsApi.getStatus(), {
  39. ready: isLoggedIn,
  40. pollingInterval: 5000
  41. })
  42. // 短信记录
  43. const { data: smsList } = useRequest(() => smsApi.getList(), {
  44. ready: isLoggedIn,
  45. pollingInterval: 10000
  46. })
  47. // 登录
  48. const handleLogin = async () => {
  49. try {
  50. await smsApi.login({ username: 'vsmsd', password })
  51. message.success('登录成功')
  52. } catch (error) {
  53. message.error('登录失败')
  54. }
  55. }
  56. const columns: ColumnsType<SmsItem> = [
  57. { title: '任务ID', dataIndex: 'id' },
  58. { title: '手机号', dataIndex: 'phone' },
  59. { title: '内容', dataIndex: 'content' },
  60. { title: '状态', dataIndex: 'status' },
  61. { title: '发送时间', dataIndex: 'createdAt' }
  62. ]
  63. if (!isLoggedIn) {
  64. return (
  65. <Card title="短信服务登录">
  66. <Form layout="vertical">
  67. <Form.Item label="密码" required>
  68. <Input.Password
  69. value={password}
  70. onChange={(e) => setPassword(e.target.value)}
  71. placeholder="请输入初始密码 Vsmsd123"
  72. />
  73. </Form.Item>
  74. <Button type="primary" onClick={handleLogin}>
  75. 验证登录
  76. </Button>
  77. </Form>
  78. </Card>
  79. )
  80. }
  81. return (
  82. <Card
  83. tabList={[
  84. { key: 'send', tab: '发送短信' },
  85. { key: 'status', tab: '设备状态' },
  86. { key: 'history', tab: '发送记录' }
  87. ]}
  88. activeTabKey={activeTab}
  89. onTabChange={setActiveTab}
  90. >
  91. {activeTab === 'send' && (
  92. <Form form={form} onFinish={sendSms}>
  93. <Form.Item name="phone" label="手机号" rules={[{ required: true }]}>
  94. <Input placeholder="请输入手机号" />
  95. </Form.Item>
  96. <Form.Item name="content" label="短信内容" rules={[{ required: true }]}>
  97. <Input.TextArea rows={4} placeholder="请输入短信内容" />
  98. </Form.Item>
  99. <Button type="primary" htmlType="submit">
  100. 发送短信
  101. </Button>
  102. </Form>
  103. )}
  104. {activeTab === 'status' && deviceStatus && (
  105. <div>
  106. <p>信号强度: {deviceStatus.signalStrength}%</p>
  107. <p>运营商: {deviceStatus.carrier}</p>
  108. <p>当前模式: {deviceStatus.mode}</p>
  109. </div>
  110. )}
  111. {activeTab === 'history' && (
  112. <Table<SmsItem>
  113. columns={columns}
  114. dataSource={smsList}
  115. rowKey="id"
  116. pagination={false}
  117. />
  118. )}
  119. </Card>
  120. )
  121. }