From caeb1a56be3a046eba1e009c1c32ee5ed4aecd6c Mon Sep 17 00:00:00 2001 From: Lxy Date: Tue, 7 Jul 2026 23:42:10 +0800 Subject: [PATCH] =?UTF-8?q?tweak:=20=E5=93=81=E7=A7=8D=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BF=AE=E6=94=B9=E5=93=81=E7=B1=BB=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=93=81=E7=A7=8D=E6=97=B6=E5=8F=AF=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=93=81=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/static/index.html | 115 +++++++++++++++++++++++++++++++++++------- 1 file changed, 98 insertions(+), 17 deletions(-) diff --git a/app/static/index.html b/app/static/index.html index a77c5b2..483e270 100644 --- a/app/static/index.html +++ b/app/static/index.html @@ -355,6 +355,28 @@ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); } + .symbol-table .symbol-category-select { + font-size: 13px; + color: var(--gray-700); + padding: 6px 10px; + border: 1px solid var(--gray-200); + border-radius: 6px; + width: 120px; + background: white; + cursor: pointer; + transition: all 0.2s; + } + + .symbol-table .symbol-category-select:hover { + border-color: var(--primary-light); + } + + .symbol-table .symbol-category-select:focus { + outline: none; + border-color: var(--primary-light); + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); + } + .symbol-table .symbol-actions { display: flex; gap: 6px; @@ -902,7 +924,7 @@
手动添加品种
-
+
@@ -918,6 +940,12 @@
+
+ + +
+ - ` - ).join(''); + `; + }).join(''); return `
@@ -1631,6 +1668,7 @@ + @@ -1672,11 +1710,16 @@ const name = document.getElementById('newSymbolName').value.trim(); const code = document.getElementById('newSymbolCode').value.trim(); const type = document.getElementById('newSymbolType').value; + const category = document.getElementById('newSymbolCategory').value; if (!name || !code) { return showToast('请填写品种名称和代码', 'error'); } + if (!category) { + return showToast('请选择品种品类', 'error'); + } + const symbols = type === 'futures' ? (currentConfig.futures || {}) : (currentConfig.stock || {}); if (symbols[name]) { @@ -1684,6 +1727,9 @@ } symbols[name] = code; + + // 保存品类到 SYMBOL_CATEGORIES + SYMBOL_CATEGORIES[name] = category; const fullConfig = { futures: currentConfig.futures || {}, @@ -1779,23 +1825,34 @@ openEditSymbolModal(type, code, name); } - async function saveSymbolCode(type, name, btn) { + async function saveSymbolRow(type, name, btn) { const row = btn.closest('tr'); - const input = row.querySelector('.symbol-code-input'); - const newCode = input.value.trim(); - const originalCode = input.dataset.original; + const codeInput = row.querySelector('.symbol-code-input'); + const categorySelect = row.querySelector('.symbol-category-select'); + const newCode = codeInput.value.trim(); + const originalCode = codeInput.dataset.original; + const newCategory = categorySelect.value; + const originalCategory = categorySelect.dataset.original; if (!newCode) { return showToast('合约代码不能为空', 'error'); } - if (newCode === originalCode) { - return showToast('合约代码未修改', 'info'); + const codeChanged = newCode !== originalCode; + const categoryChanged = newCategory !== originalCategory; + + if (!codeChanged && !categoryChanged) { + return showToast('未做任何修改', 'info'); } // 更新配置 const symbols = type === 'futures' ? (currentConfig.futures || {}) : (currentConfig.stock || {}); - symbols[name] = newCode; + if (codeChanged) { + symbols[name] = newCode; + } + if (categoryChanged) { + SYMBOL_CATEGORIES[name] = newCategory; + } const fullConfig = { futures: currentConfig.futures || {}, @@ -1811,17 +1868,27 @@ }); if (res.ok) { - showToast('合约代码修改成功', 'success'); - input.dataset.original = newCode; + const changes = []; + if (codeChanged) changes.push('合约代码'); + if (categoryChanged) changes.push('品类'); + showToast(`${changes.join('、')}修改成功`, 'success'); + if (codeChanged) codeInput.dataset.original = newCode; + if (categoryChanged) categorySelect.dataset.original = newCategory; + // 如果品类修改了,需要重新渲染以更新 tab 分组 + if (categoryChanged) { + loadConfig(); + } } else { const data = await res.json(); showToast(data.detail || '修改失败', 'error'); // 恢复原始值 - input.value = originalCode; + codeInput.value = originalCode; + categorySelect.value = originalCategory; } } catch (e) { showToast(`修改失败: ${e.message}`, 'error'); - input.value = originalCode; + codeInput.value = originalCode; + categorySelect.value = originalCategory; } } @@ -3381,8 +3448,22 @@ document.getElementById('batchExportEndTime').value = today; } + // 初始化品类下拉框 + function initCategorySelect() { + const select = document.getElementById('newSymbolCategory'); + if (!select) return; + select.innerHTML = ''; + CATEGORY_ORDER.forEach(category => { + const option = document.createElement('option'); + option.value = category; + option.textContent = category; + select.appendChild(option); + }); + } + // 初始化 initDefaultDate(); + initCategorySelect(); loadConfig(); loadTasks();
品种名称 合约代码品类 操作