jerrynnms commited on
Commit
63da521
·
verified ·
1 Parent(s): dd18a2b

Update script.js

Browse files
Files changed (1) hide show
  1. script.js +22 -19
script.js CHANGED
@@ -1,6 +1,6 @@
1
  document.addEventListener('DOMContentLoaded', () => {
2
  // ─────────────────────────────────────────────────────────────────────────
3
- // 文字分析相关
4
  const inputTextArea = document.getElementById('predict_info');
5
  const inputButton = document.getElementById('detect_button');
6
  const clearButton = document.getElementById('clear_button');
@@ -16,15 +16,15 @@ document.addEventListener('DOMContentLoaded', () => {
16
  const TEXT_API = '/predict';
17
  const FEEDBACK_API = '/feedback';
18
 
 
19
  inputButton.addEventListener('click', async () => {
20
  const message = inputTextArea.value.trim();
21
  if (!message) {
22
  alert('請輸入您想檢測的訊息內容。');
23
  return;
24
  }
25
-
26
- // 顯示 Loading
27
- normalOrScam.textContent = '檢測中...';
28
  normalOrScam.style.color = 'gray';
29
  confidenceScoreSpan.textContent = '計算中...';
30
  suspiciousPhrasesDiv.innerHTML = '<p>正在分析訊息,請稍候...</p>';
@@ -41,10 +41,10 @@ document.addEventListener('DOMContentLoaded', () => {
41
  });
42
  if (!res.ok) throw new Error(`伺服器錯誤: ${res.status}`);
43
  const data = await res.json();
44
-
45
- // 更新纯文字分析结果
46
  normalOrScam.textContent = data.status;
47
  confidenceScoreSpan.textContent = data.confidence + '%';
 
48
  suspiciousPhrasesDiv.innerHTML = '';
49
  if (Array.isArray(data.suspicious_keywords) && data.suspicious_keywords.length) {
50
  const ul = document.createElement('ul');
@@ -57,13 +57,13 @@ document.addEventListener('DOMContentLoaded', () => {
57
  } else {
58
  suspiciousPhrasesDiv.innerHTML = '<p>沒有偵測到可疑詞句。</p>';
59
  }
60
-
61
  feedbackArea.style.display = 'block';
62
  lastPrediction = { text: message, model_status: data.status };
63
  } catch (err) {
64
  console.error('文字檢測失敗:', err);
65
  alert(`文字檢測失敗,請檢查後端。\n錯誤:${err.message}`);
66
- // 回復預設
67
  normalOrScam.textContent = '待檢測';
68
  normalOrScam.style.color = 'inherit';
69
  confidenceScoreSpan.textContent = '待檢測';
@@ -71,16 +71,18 @@ document.addEventListener('DOMContentLoaded', () => {
71
  }
72
  });
73
 
 
74
  clearButton.addEventListener('click', () => {
75
  inputTextArea.value = '';
76
- // 清空文字结果
77
  normalOrScam.textContent = '待檢測';
78
  normalOrScam.style.color = 'inherit';
79
  confidenceScoreSpan.textContent = '待檢測';
80
  suspiciousPhrasesDiv.innerHTML = '<p>請輸入訊息並點擊「檢測!」按鈕。</p>';
81
  feedbackArea.style.display = 'none';
82
  feedbackStatus.textContent = '';
83
- // 清空图片结果
 
84
  extractedTextSpan.textContent = '尚未上傳圖片';
85
  imgIsScamSpan.textContent = '尚未上傳圖片';
86
  imgConfidenceSpan.textContent = '尚未上傳圖片';
@@ -88,6 +90,7 @@ document.addEventListener('DOMContentLoaded', () => {
88
  imageUpload.value = '';
89
  });
90
 
 
91
  feedbackCorrectBtn.addEventListener('click', () => submitFeedback('正確'));
92
  feedbackWrongBtn.addEventListener('click', () => submitFeedback('錯誤'));
93
 
@@ -101,7 +104,7 @@ document.addEventListener('DOMContentLoaded', () => {
101
  body: JSON.stringify(payload)
102
  });
103
  await r.json();
104
- feedbackStatus.textContent = '✅ 感謝你的回饋!';
105
  feedbackCorrectBtn.style.display = 'none';
106
  feedbackWrongBtn.style.display = 'none';
107
  } catch (e) {
@@ -112,7 +115,7 @@ document.addEventListener('DOMContentLoaded', () => {
112
 
113
 
114
  // ─────────────────────────────────────────────────────────────────────────
115
- // 圖片OCR相關元素
116
  const imageUpload = document.getElementById('image_upload');
117
  const imageButton = document.getElementById('image_button');
118
  const extractedTextSpan = document.getElementById('extracted_text');
@@ -123,23 +126,22 @@ document.addEventListener('DOMContentLoaded', () => {
123
  const IMAGE_API = '/analyze-image';
124
 
125
  imageButton.addEventListener('click', async () => {
126
- // 确保用户选了文件
127
  if (!imageUpload.files.length) {
128
  alert('請先選擇一個圖片檔案。');
129
  return;
130
  }
131
 
132
- // 显示 Loading 文案
133
  extractedTextSpan.textContent = '辨識中...';
134
  imgIsScamSpan.textContent = '辨識中...';
135
  imgConfidenceSpan.textContent = '辨識中...';
136
  imgSuspiciousDiv.innerHTML = '<p>正在分析圖片,請稍候...</p>';
137
 
138
- // 构造 FormData
139
  const formData = new FormData();
140
  formData.append('file', imageUpload.files[0]);
141
 
142
- // 调用后端
143
  try {
144
  const resp = await fetch(IMAGE_API, {
145
  method: 'POST',
@@ -148,13 +150,14 @@ document.addEventListener('DOMContentLoaded', () => {
148
  if (!resp.ok) throw new Error(`伺服器錯誤: ${resp.status}`);
149
  const data = await resp.json();
150
 
 
151
  const extracted = data.extracted_text || '';
152
  const result = data.analysis_result || {};
153
 
154
- // 更新 OCR + BERT 结果
155
  extractedTextSpan.textContent = extracted || '(無文字)';
156
  imgIsScamSpan.textContent = result.status || '(無法辨識)';
157
- imgConfidenceSpan.textContent = result.confidence !== undefined
158
  ? result.confidence + '%'
159
  : '(無法辨識)';
160
  imgSuspiciousDiv.innerHTML = '';
@@ -177,5 +180,5 @@ document.addEventListener('DOMContentLoaded', () => {
177
  imgSuspiciousDiv.innerHTML = `<p style="color:red;">❌ ${err.message}</p>`;
178
  }
179
  });
180
-
181
  });
 
1
  document.addEventListener('DOMContentLoaded', () => {
2
  // ─────────────────────────────────────────────────────────────────────────
3
+ // 1. 文字分析相關元素
4
  const inputTextArea = document.getElementById('predict_info');
5
  const inputButton = document.getElementById('detect_button');
6
  const clearButton = document.getElementById('clear_button');
 
16
  const TEXT_API = '/predict';
17
  const FEEDBACK_API = '/feedback';
18
 
19
+ // 文字檢測:當按「檢測!」時觸發
20
  inputButton.addEventListener('click', async () => {
21
  const message = inputTextArea.value.trim();
22
  if (!message) {
23
  alert('請輸入您想檢測的訊息內容。');
24
  return;
25
  }
26
+ // 顯示 loading
27
+ normalOrScam.textContent = '檢測中...';
 
28
  normalOrScam.style.color = 'gray';
29
  confidenceScoreSpan.textContent = '計算中...';
30
  suspiciousPhrasesDiv.innerHTML = '<p>正在分析訊息,請稍候...</p>';
 
41
  });
42
  if (!res.ok) throw new Error(`伺服器錯誤: ${res.status}`);
43
  const data = await res.json();
44
+ // 更新文字分析結果
 
45
  normalOrScam.textContent = data.status;
46
  confidenceScoreSpan.textContent = data.confidence + '%';
47
+ // 可疑詞句
48
  suspiciousPhrasesDiv.innerHTML = '';
49
  if (Array.isArray(data.suspicious_keywords) && data.suspicious_keywords.length) {
50
  const ul = document.createElement('ul');
 
57
  } else {
58
  suspiciousPhrasesDiv.innerHTML = '<p>沒有偵測到可疑詞句。</p>';
59
  }
60
+ // 顯示回饋區
61
  feedbackArea.style.display = 'block';
62
  lastPrediction = { text: message, model_status: data.status };
63
  } catch (err) {
64
  console.error('文字檢測失敗:', err);
65
  alert(`文字檢測失敗,請檢查後端。\n錯誤:${err.message}`);
66
+ // 還原預設文字區
67
  normalOrScam.textContent = '待檢測';
68
  normalOrScam.style.color = 'inherit';
69
  confidenceScoreSpan.textContent = '待檢測';
 
71
  }
72
  });
73
 
74
+ // 「清除」按鈕:清空文字、圖片結果
75
  clearButton.addEventListener('click', () => {
76
  inputTextArea.value = '';
77
+ // 清空文字檢測結果
78
  normalOrScam.textContent = '待檢測';
79
  normalOrScam.style.color = 'inherit';
80
  confidenceScoreSpan.textContent = '待檢測';
81
  suspiciousPhrasesDiv.innerHTML = '<p>請輸入訊息並點擊「檢測!」按鈕。</p>';
82
  feedbackArea.style.display = 'none';
83
  feedbackStatus.textContent = '';
84
+
85
+ // 清空圖片OCR結果
86
  extractedTextSpan.textContent = '尚未上傳圖片';
87
  imgIsScamSpan.textContent = '尚未上傳圖片';
88
  imgConfidenceSpan.textContent = '尚未上傳圖片';
 
90
  imageUpload.value = '';
91
  });
92
 
93
+ // 使用者回饋
94
  feedbackCorrectBtn.addEventListener('click', () => submitFeedback('正確'));
95
  feedbackWrongBtn.addEventListener('click', () => submitFeedback('錯誤'));
96
 
 
104
  body: JSON.stringify(payload)
105
  });
106
  await r.json();
107
+ feedbackStatus.textContent = '✅ 感謝您的回饋!';
108
  feedbackCorrectBtn.style.display = 'none';
109
  feedbackWrongBtn.style.display = 'none';
110
  } catch (e) {
 
115
 
116
 
117
  // ─────────────────────────────────────────────────────────────────────────
118
+ // 2. 圖片OCR相關元素
119
  const imageUpload = document.getElementById('image_upload');
120
  const imageButton = document.getElementById('image_button');
121
  const extractedTextSpan = document.getElementById('extracted_text');
 
126
  const IMAGE_API = '/analyze-image';
127
 
128
  imageButton.addEventListener('click', async () => {
129
+ // 確認 user 已經選擇檔案
130
  if (!imageUpload.files.length) {
131
  alert('請先選擇一個圖片檔案。');
132
  return;
133
  }
134
 
135
+ // 顯示 Loading
136
  extractedTextSpan.textContent = '辨識中...';
137
  imgIsScamSpan.textContent = '辨識中...';
138
  imgConfidenceSpan.textContent = '辨識中...';
139
  imgSuspiciousDiv.innerHTML = '<p>正在分析圖片,請稍候...</p>';
140
 
141
+ // 建立 FormData,append 檔案
142
  const formData = new FormData();
143
  formData.append('file', imageUpload.files[0]);
144
 
 
145
  try {
146
  const resp = await fetch(IMAGE_API, {
147
  method: 'POST',
 
150
  if (!resp.ok) throw new Error(`伺服器錯誤: ${resp.status}`);
151
  const data = await resp.json();
152
 
153
+ // 此 data 格式:{ extracted_text: "...", analysis_result: { status, confidence, suspicious_keywords } }
154
  const extracted = data.extracted_text || '';
155
  const result = data.analysis_result || {};
156
 
157
+ // 更新前端OCR結果
158
  extractedTextSpan.textContent = extracted || '(無文字)';
159
  imgIsScamSpan.textContent = result.status || '(無法辨識)';
160
+ imgConfidenceSpan.textContent = (result.confidence !== undefined)
161
  ? result.confidence + '%'
162
  : '(無法辨識)';
163
  imgSuspiciousDiv.innerHTML = '';
 
180
  imgSuspiciousDiv.innerHTML = `<p style="color:red;">❌ ${err.message}</p>`;
181
  }
182
  });
183
+ // ─────────────────────────────────────────────────────────────────────────
184
  });