index.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <template>
  2. <div class="alarm-container">
  3. <div class="alarm-header">
  4. <span class="alarm-title">Manual Alarm Control</span>
  5. </div>
  6. <div class="alarm-buttons">
  7. <el-button
  8. type="primary"
  9. size="large"
  10. @click="handleAlarm"
  11. class="btn-alarm"
  12. :loading="loading"
  13. >
  14. Enable Manual Alarm
  15. </el-button>
  16. <el-button
  17. type="info"
  18. size="large"
  19. @click="handleCloseAlarm"
  20. class="btn-close"
  21. :loading="DisableLoading"
  22. >
  23. Disable Manual Alarm
  24. </el-button>
  25. </div>
  26. <div class="alarm-tip">
  27. <span class="tip-icon">ℹ️</span>
  28. <span>Alarm will remain active for 1 minute after activation.</span>
  29. </div>
  30. </div>
  31. </template>
  32. <script setup lang="ts">
  33. import { ref } from 'vue'
  34. import { ElMessage } from 'element-plus'
  35. import { cameraAlarm } from '@/api/setting'
  36. const loading = ref(false)
  37. const DisableLoading = ref(false)
  38. async function handleCloseAlarm() {
  39. if (loading.value) return
  40. DisableLoading.value = true
  41. try {
  42. const res = await cameraAlarm({
  43. AlarmSettings: 0
  44. })
  45. if (res.data === 'ok\n') {
  46. ElMessage.success('Manual Alarm Deactivated Successfully')
  47. } else {
  48. ElMessage.warning('Manual Alarm Deactivation Error')
  49. }
  50. } catch (error) {
  51. ElMessage.error('Manual Alarm Deactivation Error')
  52. } finally {
  53. DisableLoading.value = false
  54. }
  55. }
  56. async function handleAlarm() {
  57. if (loading.value) return
  58. loading.value = true
  59. try {
  60. const res = await cameraAlarm({
  61. AlarmSettings: 1
  62. })
  63. if (res.data === 'ok\n') {
  64. ElMessage.success('Manual alarm activated successfully. It will remain active for 1 minute.')
  65. } else {
  66. ElMessage.warning('Manual Alarm Activation Error')
  67. }
  68. } catch (error) {
  69. ElMessage.error('Failed to Activate Manual Alarm.')
  70. } finally {
  71. loading.value = false
  72. }
  73. }
  74. </script>
  75. <style scoped lang="scss">
  76. .alarm-container {
  77. background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  78. border-radius: 12px;
  79. padding: 24px;
  80. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
  81. border-left: 4px solid #ff6b6b;
  82. transition: all 0.3s ease;
  83. &:hover {
  84. box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);
  85. transform: translateY(-2px);
  86. }
  87. }
  88. .alarm-header {
  89. margin-bottom: 20px;
  90. padding-bottom: 12px;
  91. border-bottom: 2px solid rgba(255, 107, 107, 0.2);
  92. }
  93. .alarm-title {
  94. font-size: 16px;
  95. font-weight: 600;
  96. color: #333;
  97. display: flex;
  98. align-items: center;
  99. gap: 8px;
  100. &::before {
  101. content: '';
  102. width: 4px;
  103. height: 4px;
  104. background: #ff6b6b;
  105. border-radius: 50%;
  106. animation: pulse 2s ease-in-out infinite;
  107. }
  108. }
  109. .alarm-buttons {
  110. display: flex;
  111. gap: 16px;
  112. margin-bottom: 16px;
  113. flex-wrap: wrap;
  114. @media (max-width: 600px) {
  115. flex-direction: column;
  116. gap: 12px;
  117. }
  118. }
  119. .btn-alarm,
  120. .btn-close {
  121. flex: 1;
  122. min-width: 160px;
  123. height: 44px;
  124. font-weight: 500;
  125. letter-spacing: 0.5px;
  126. border-radius: 8px;
  127. transition: all 0.3s ease;
  128. border: none;
  129. font-size: 14px;
  130. @media (max-width: 600px) {
  131. width: 100%;
  132. }
  133. &:hover:not(:disabled) {
  134. transform: translateY(-2px);
  135. box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
  136. }
  137. &:active:not(:disabled) {
  138. transform: translateY(0);
  139. }
  140. }
  141. .btn-icon {
  142. margin-right: 6px;
  143. font-size: 16px;
  144. }
  145. .alarm-tip {
  146. display: flex;
  147. align-items: center;
  148. gap: 8px;
  149. padding: 12px;
  150. background: rgba(255, 193, 7, 0.1);
  151. border-radius: 6px;
  152. border-left: 3px solid #ffc107;
  153. font-size: 13px;
  154. color: #666;
  155. line-height: 1.5;
  156. }
  157. .tip-icon {
  158. font-size: 16px;
  159. flex-shrink: 0;
  160. }
  161. @keyframes pulse {
  162. 0%, 100% {
  163. opacity: 1;
  164. }
  165. 50% {
  166. opacity: 0.5;
  167. }
  168. }
  169. </style>