后台同步异常时前端显示错误提示,不再卡住页面
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,7 @@ from app.database import SessionLocal
|
|||||||
from app.models import DailyBar, Contract
|
from app.models import DailyBar, Contract
|
||||||
from app.engine.lock_strategy import compute_amp_5d
|
from app.engine.lock_strategy import compute_amp_5d
|
||||||
|
|
||||||
_progress = {"running": False, "label": "", "done": 0, "total": 0, "result": 0, "finished": False}
|
_progress = {"running": False, "label": "", "done": 0, "total": 0, "result": 0, "finished": False, "error": ""}
|
||||||
_lock = threading.Lock()
|
_lock = threading.Lock()
|
||||||
|
|
||||||
|
|
||||||
@@ -18,11 +18,14 @@ def _start_bg(target, label):
|
|||||||
with _lock:
|
with _lock:
|
||||||
if _progress["running"]:
|
if _progress["running"]:
|
||||||
return False
|
return False
|
||||||
_progress.update(running=True, finished=False, label=label, done=0, total=0)
|
_progress.update(running=True, finished=False, label=label, done=0, total=0, error="")
|
||||||
|
|
||||||
def _run():
|
def _run():
|
||||||
try:
|
try:
|
||||||
target()
|
target()
|
||||||
|
except Exception as e:
|
||||||
|
with _lock:
|
||||||
|
_progress["error"] = str(e)
|
||||||
finally:
|
finally:
|
||||||
with _lock:
|
with _lock:
|
||||||
_progress["running"] = False
|
_progress["running"] = False
|
||||||
|
|||||||
@@ -192,6 +192,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
function escapeHtml(s) {
|
||||||
|
var d = document.createElement('div');
|
||||||
|
d.appendChild(document.createTextNode(s));
|
||||||
|
return d.innerHTML;
|
||||||
|
}
|
||||||
|
|
||||||
var syncTimer = null;
|
var syncTimer = null;
|
||||||
var progressShownAt = 0;
|
var progressShownAt = 0;
|
||||||
|
|
||||||
@@ -218,6 +224,19 @@ function pollProgress() {
|
|||||||
document.getElementById('sync-progress-pct').textContent = pct + '%';
|
document.getElementById('sync-progress-pct').textContent = pct + '%';
|
||||||
document.getElementById('sync-progress-label').textContent = data.label;
|
document.getElementById('sync-progress-label').textContent = data.label;
|
||||||
|
|
||||||
|
if (data.error) {
|
||||||
|
clearInterval(syncTimer);
|
||||||
|
syncTimer = null;
|
||||||
|
document.getElementById('sync-progress-bar').style.background = 'var(--danger)';
|
||||||
|
document.getElementById('sync-progress-label').innerHTML =
|
||||||
|
'<span style="color:var(--danger-fg);">✕ ' + escapeHtml(data.label) + '</span>' +
|
||||||
|
'<span style="display:block;font-size:0.78rem;color:var(--danger-fg);margin-top:4px;">' + escapeHtml(data.error) + '</span>';
|
||||||
|
document.getElementById('sync-progress-pct').textContent = '';
|
||||||
|
document.getElementById('sync-progress').insertAdjacentHTML('beforeend',
|
||||||
|
'<button onclick="hideProgress()" style="display:block;margin-top:10px;padding:4px 14px;border:1px solid var(--border);border-radius:5px;background:var(--surface);color:var(--fg);cursor:pointer;font-size:0.8rem;">关闭</button>');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (data.finished) {
|
if (data.finished) {
|
||||||
var elapsed = Date.now() - progressShownAt;
|
var elapsed = Date.now() - progressShownAt;
|
||||||
var delay = elapsed < 1000 ? 1000 - elapsed : 0;
|
var delay = elapsed < 1000 ? 1000 - elapsed : 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user