KangjieXu commited on
Commit
3718e52
·
verified ·
1 Parent(s): 5fd9df3

Update static/script.js

Browse files
Files changed (1) hide show
  1. static/script.js +68 -65
static/script.js CHANGED
@@ -1,65 +1,68 @@
1
- // 确保在整个网页文档加载完毕后才执行脚本
2
- document.addEventListener('DOMContentLoaded', function() {
3
-
4
- // 获取需要操作的网页元素
5
- const form = document.getElementById('prediction-form');
6
- const predictBtn = document.getElementById('predict-btn');
7
- const spinner = predictBtn.querySelector('.spinner-border');
8
- const resultsArea = document.getElementById('results-area');
9
- const errorAlert = document.getElementById('error-alert');
10
- const resultKcat = document.getElementById('result-kcat');
11
- const resultLogKcat = document.getElementById('result-log-kcat');
12
-
13
- // 监听表单的“提交”事件
14
- form.addEventListener('submit', function(event) {
15
- // 阻止表单的默认提交行为(即刷新页面)
16
- event.preventDefault();
17
-
18
- // 1. 准备开始预测,更新UI状态
19
- predictBtn.disabled = true;
20
- spinner.classList.remove('d-none'); // 显示加载动画
21
- resultsArea.classList.add('d-none'); // 隐藏旧结果
22
- errorAlert.classList.add('d-none'); // 隐藏旧错误
23
-
24
- // 2. 获取用户输入的数据
25
- const proteinSequence = document.getElementById('protein-sequence').value.trim();
26
- const substrateSmiles = document.getElementById('substrate-smiles').value.trim();
27
-
28
- // 3. 使用fetch API将数据发送到我们的Flask后端
29
- fetch('/predict', {
30
- method: 'POST',
31
- headers: {
32
- 'Content-Type': 'application/json',
33
- },
34
- body: JSON.stringify({
35
- protein_sequence: proteinSequence,
36
- substrate_smiles: substrateSmiles,
37
- }),
38
- })
39
- .then(response => response.json()) // 将返回的响应解析为JSON格式
40
- .then(data => {
41
- // 4. 处理从后端返回的数据
42
- if (data.success) {
43
- // 如果成功
44
- resultKcat.textContent = data.predicted_kcat.toFixed(4);
45
- resultLogKcat.textContent = data.predicted_log10_kcat.toFixed(4);
46
- resultsArea.classList.remove('d-none'); // 显示结果区域
47
- } else {
48
- // 如果失败
49
- errorAlert.textContent = 'Error: ' + data.error;
50
- errorAlert.classList.remove('d-none'); // 显示错误信息
51
- }
52
- })
53
- .catch(error => {
54
- // 处理网络请求本身发生的错误
55
- console.error('Fetch Error:', error);
56
- errorAlert.textContent = 'A network or server error occurred. Please try again later.';
57
- errorAlert.classList.remove('d-none');
58
- })
59
- .finally(() => {
60
- // 5. 无论成功还是失败,最后都要恢复按钮状态
61
- predictBtn.disabled = false;
62
- spinner.classList.add('d-none'); // 隐藏加载动画
63
- });
64
- });
65
- });
 
 
 
 
1
+ document.addEventListener('DOMContentLoaded', function () {
2
+ const form = document.getElementById('prediction-form');
3
+ const predictBtn = document.getElementById('predict-btn');
4
+ const spinner = predictBtn.querySelector('.spinner-border');
5
+ const resultsArea = document.getElementById('results-area');
6
+ const errorAlert = document.getElementById('error-alert');
7
+ const resultsTableBody = document.getElementById('results-table-body');
8
+ const consentCheckbox = document.getElementById('consent-checkbox');
9
+
10
+ form.addEventListener('submit', async function (event) {
11
+ event.preventDefault();
12
+
13
+ predictBtn.disabled = true;
14
+ spinner.classList.remove('d-none');
15
+ resultsArea.classList.add('d-none');
16
+ errorAlert.classList.add('d-none');
17
+ resultsTableBody.innerHTML = '';
18
+
19
+ const proteinSequences = document.getElementById('protein-sequence').value
20
+ .split('\n')
21
+ .map(seq => seq.trim())
22
+ .filter(seq => seq.length > 0);
23
+
24
+ const substrateSmiles = document.getElementById('substrate-smiles').value.trim();
25
+
26
+ if (proteinSequences.length === 0) {
27
+ errorAlert.textContent = '错误:请输入至少一条蛋白质序列。';
28
+ errorAlert.classList.remove('d-none');
29
+ predictBtn.disabled = false;
30
+ spinner.classList.add('d-none');
31
+ return;
32
+ }
33
+
34
+ try {
35
+ const response = await fetch('/predict', {
36
+ method: 'POST',
37
+ headers: { 'Content-Type': 'application/json' },
38
+ body: JSON.stringify({
39
+ protein_sequences: proteinSequences,
40
+ substrate_smiles: substrateSmiles,
41
+ consent_given: consentCheckbox.checked
42
+ }),
43
+ });
44
+
45
+ const data = await response.json();
46
+ if (!response.ok) throw new Error(data.error || '未知服务器错误。');
47
+
48
+ data.predictions.forEach((pred, index) => {
49
+ const row = resultsTableBody.insertRow();
50
+ row.innerHTML = `
51
+ <th scope="row">${index + 1}</th>
52
+ <td><code>${pred.sequence.substring(0, 40)}...</code></td>
53
+ <td>${pred.kcat}</td>
54
+ <td>${pred.log_kcat}</td>
55
+ `;
56
+ });
57
+
58
+ resultsArea.classList.remove('d-none');
59
+
60
+ } catch (error) {
61
+ errorAlert.textContent = '错误: ' + error.message;
62
+ errorAlert.classList.remove('d-none');
63
+ } finally {
64
+ predictBtn.disabled = false;
65
+ spinner.classList.add('d-none');
66
+ }
67
+ });
68
+ });