From 2eff945fb9fc0d17b2098b26aba74ab192ec3727 Mon Sep 17 00:00:00 2001
From: WXL <1785969728@qq.com>
Date: 星期三, 06 八月 2025 17:48:54 +0800
Subject: [PATCH] 测试完成

---
 src/components/CallButton/index.vue |  230 ++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 168 insertions(+), 62 deletions(-)

diff --git a/src/components/CallButton/index.vue b/src/components/CallButton/index.vue
index 51a4995..84a1519 100644
--- a/src/components/CallButton/index.vue
+++ b/src/components/CallButton/index.vue
@@ -3,29 +3,32 @@
     <div class="sip-status" :class="sipStatusClass">
       SIP鐘舵��: {{ sipStatus }}
     </div>
-    <!-- 鍙风爜杈撳叆 -->
-    <input
-      v-model="phoneNumber"
-      type="text"
-      placeholder="杈撳叆鐢佃瘽鍙风爜"
-      @keyup.enter="startCall"
-    />
+
+    <!-- 鐘舵�佹樉绀� -->
+    <div class="call-status" :class="callStatusClass">
+      {{ callStatusText }}
+    </div>
 
     <!-- 鍛煎彨鎸夐挳 -->
-    <button :class="['call-btn', { calling: isCalling }]" @click="startCall">
-      {{ isCalling ? "閫氳瘽涓�..." : "涓�閿懠鍙�" }}
+    <button
+      :class="['call-btn', { calling: isCalling }]"
+      @click="startCall"
+      :disabled="isCalling || sipStatus !== '宸叉敞鍐�'"
+    >
+      {{ callButtonText }}
     </button>
 
     <!-- 鎸傛柇鎸夐挳 -->
-    <button v-if="isCalling" class="end-call-btn" @click="endCall">鎸傛柇</button>
+    <button
+      v-if="isCalling"
+      class="end-call-btn"
+      @click="endCall"
+    >
+      鎸傛柇
+    </button>
 
     <!-- 闊抽鍏冪礌锛堥殣钘忥級 -->
     <audio id="remoteAudio" autoplay></audio>
-
-    <!-- 鐘舵�佹樉绀� -->
-    <div class="call-status">
-      {{ callStatus }}
-    </div>
   </div>
 </template>
 
@@ -33,82 +36,86 @@
 import sipService from "@/utils/sipService";
 
 export default {
-  data() {
-    return {
-      // phoneNumber: "",
-      isCalling: false,
-      callStatus: "鍑嗗灏辩华",
-      sipStatus: "鏈繛鎺�",
-      sipStatusClass: "status-disconnected",
-      sipConfig: {
-        wsUrl: "wss://9.208.5.18:7443",
-        sipUri: "1000@9.208.5.18",
-        password: "Smartor@2023",
-        displayName: "Web 灏忛緳",
-        // realm: "9.208.5.18:8090",
-      },
-    };
-  },
   props: {
     phoneNumber: {
       type: String,
       default: ''
     }
   },
+  data() {
+    return {
+      isCalling: false,
+      callStatus: 'idle', // idle, calling, connected, ended
+      sipStatus: "鏈繛鎺�",
+      sipStatusClass: "status-disconnected",
+      sipConfig: {
+        wsUrl: "wss://192.168.100.6:7443",
+        sipUri: "1000@192.168.100.6",
+        password: "Smartor@2023",
+        displayName: "Web 灏忛緳",
+      },
+    };
+  },
+  computed: {
+    callStatusText() {
+      const statusMap = {
+        idle: '鍑嗗灏辩华',
+        calling: '鍛煎彨涓�...',
+        connected: '閫氳瘽涓�',
+        ended: '閫氳瘽缁撴潫'
+      };
+      return statusMap[this.callStatus];
+    },
+    callStatusClass() {
+      return `status-${this.callStatus}`;
+    },
+    callButtonText() {
+      return this.isCalling ? "閫氳瘽涓�..." : "涓�閿懠鍙�";
+    }
+  },
   mounted() {
-    // 娴嬭瘯
-    const ws = new WebSocket("wss://9.208.5.18:7443");
-    ws.onopen = () => console.log("WebSocket 杩炴帴鎴愬姛");
-    ws.onerror = (e) => console.error("WebSocket 閿欒:", e);
-
-
-    // 鍒濆鍖朣IP杩炴帴
-
     sipService.init(this.sipConfig);
     sipService.onStatusChange = (status) => {
       this.sipStatus = status.text;
       this.sipStatusClass = `status-${status.type}`;
+    };
 
-      // 鏍规嵁鐘舵�佹洿鏂癠I鎴栨墽琛屽叾浠栨搷浣�
-      if (status.type === "registered") {
-        console.log("SIP娉ㄥ唽鎴愬姛锛屽彲浠ュ紑濮嬪懠鍙�");
-      } else if (status.type === "failed") {
-        console.error("SIP娉ㄥ唽澶辫触");
-      }
+    // 鐩戝惉閫氳瘽鐘舵�佸彉鍖�
+    sipService.onCallStatusChange = (status) => {
+      this.callStatus = status.type;
+      this.isCalling = status.type === 'calling' || status.type === 'connected';
+
+      // 閫氱煡鐖剁粍浠堕�氳瘽鐘舵�佸彉鍖�
+      this.$emit('call-status-change', status);
     };
   },
-  beforeDestroy() {
-    // 缁勪欢閿�姣佹椂缁撴潫閫氳瘽
-    this.endCall();
-  },
   methods: {
-    // 寮�濮嬪懠鍙�
     async startCall() {
       if (!this.phoneNumber) {
-        this.callStatus = "璇疯緭鍏ョ數璇濆彿鐮�";
+        this.$message.error("璇疯緭鍏ョ數璇濆彿鐮�");
         return;
       }
-      try {
-        this.isCalling = true;
-        this.callStatus = "鍛煎彨涓�...";
-        // 璋冪敤SIP鏈嶅姟
-        sipService.makeCall(this.phoneNumber);
 
-        this.callStatus = "閫氳瘽宸插缓绔�";
+      try {
+        this.callStatus = 'calling';
+        this.isCalling = true;
+
+        await sipService.makeCall(this.phoneNumber);
+
       } catch (error) {
         console.error("鍛煎彨澶辫触:", error);
-        this.callStatus = `鍛煎彨澶辫触: ${error.message}`;
+        this.callStatus = 'ended';
         this.isCalling = false;
+        this.$message.error(`鍛煎彨澶辫触: ${error.message}`);
       }
     },
 
-    // 缁撴潫閫氳瘽
     endCall() {
       sipService.endCall();
+      this.callStatus = 'ended';
       this.isCalling = false;
-      this.callStatus = "閫氳瘽宸茬粨鏉�";
-    },
-  },
+    }
+  }
 };
 </script>
 
@@ -138,7 +145,106 @@
   border-radius: 4px;
   cursor: pointer;
 }
+.call-status {
+  padding: 8px;
+  margin: 10px 0;
+  border-radius: 4px;
+  text-align: center;
+}
 
+.status-idle {
+  background-color: #f5f5f5;
+  color: #666;
+}
+
+.status-calling {
+  background-color: #fff8e1;
+  color: #ff8f00;
+}
+
+.status-connected {
+  background-color: #e8f5e9;
+  color: #2e7d32;
+}
+
+.status-ended {
+  background-color: #ffebee;
+  color: #c62828;
+}
+
+/* 鍘熸湁鏍峰紡淇濇寔涓嶅彉 */
+.call-container {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  max-width: 300px;
+  margin: 0 auto;
+  padding: 20px;
+  border: 1px solid #eee;
+  border-radius: 8px;
+}
+
+.call-btn {
+  padding: 10px;
+  background-color: #4caf50;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+}
+
+.call-btn:hover:not(:disabled) {
+  background-color: #45a049;
+}
+
+.call-btn:disabled {
+  background-color: #cccccc;
+  cursor: not-allowed;
+}
+
+.call-btn.calling {
+  background-color: #2196f3;
+}
+
+.end-call-btn {
+  padding: 10px;
+  background-color: #f44336;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+}
+
+.end-call-btn:hover {
+  background-color: #d32f2f;
+}
+
+.sip-status {
+  padding: 8px;
+  margin-bottom: 10px;
+  border-radius: 4px;
+  text-align: center;
+}
+
+.status-disconnected {
+  background-color: #ffebee;
+  color: #c62828;
+}
+
+.status-connecting {
+  background-color: #fff8e1;
+  color: #ff8f00;
+}
+
+.status-registered {
+  background-color: #e8f5e9;
+  color: #2e7d32;
+}
+
+.status-failed {
+  background-color: #ffebee;
+  color: #c62828;
+}
 .call-btn:hover {
   background-color: #45a049;
 }

--
Gitblit v1.9.3