v1.3.0: 舆情驱动自动化(定期扫新闻→重要度评分→邮件通知) + 系统设置区(邮件SMTP/大模型接口/监控参数可配, 含测试邮件/测试LLM/立即扫描/通知日志)

This commit is contained in:
2026-08-19 21:29:42 +08:00
parent c05b1d54b3
commit e4f316efe7
10 changed files with 726 additions and 8 deletions
+1
View File
@@ -33,6 +33,7 @@
<a href="/strategies" class="nav-item" data-nav="/strategies">📈 量化策略</a>
<a href="/news" class="nav-item" data-nav="/news">📰 财经新闻</a>
<a href="/institutions" class="nav-item" data-nav="/institutions">🏦 机构动向</a>
<a href="/settings" class="nav-item" data-nav="/settings">🔧 系统设置</a>
<a href="/admin" class="nav-item" data-nav="/admin">⚙️ 数据管理</a>
</nav>
<div class="sidebar-foot">
+92
View File
@@ -0,0 +1,92 @@
{% extends "base.html" %}
{% block title %}系统设置{% endblock %}
{% block page_title %}系统设置{% endblock %}
{% block content %}
<div class="grid grid-2">
<!-- 邮件通知 -->
<div class="card">
<div class="between">
<div class="card-title" style="margin-bottom:0"><span class="bar"></span>📧 邮件通知</div>
<label class="switch"><input type="checkbox" id="emailEnabled"><span></span></label>
</div>
<div class="mt8 settings-form">
<div class="sf-row"><label>SMTP 服务器</label><input class="input" id="smtpHost" style="width:100%"></div>
<div class="sf-row"><label>端口</label><input class="input" id="smtpPort" type="number" style="width:100%"></div>
<div class="sf-row"><label>加密模式</label>
<select class="input" id="smtpMode" style="width:100%">
<option value="plain">无加密 (plain)</option>
<option value="starttls">STARTTLS</option>
<option value="ssl">SSL/TLS</option>
</select>
</div>
<div class="sf-row"><label>发件账号</label><input class="input" id="smtpUser" style="width:100%"></div>
<div class="sf-row"><label>发件密码</label><input class="input" id="smtpPass" type="password" style="width:100%"></div>
<div class="sf-row"><label>发件人名称</label><input class="input" id="senderName" style="width:100%"></div>
<div class="sf-row"><label>通知收件人</label><input class="input" id="emailTo" style="width:100%"></div>
</div>
<div class="flex mt16 wrap">
<button class="btn btn-primary" onclick="save('mail')">💾 保存邮件设置</button>
<button class="btn" onclick="testEmail()">📨 发送测试邮件</button>
</div>
</div>
<!-- 大模型 -->
<div class="card">
<div class="card-title"><span class="bar" style="background:var(--gold)"></span>🤖 大模型接口</div>
<div class="mt8 settings-form">
<div class="sf-row"><label>Base URL</label><input class="input" id="llmBaseUrl" style="width:100%"></div>
<div class="sf-row"><label>API Key</label><input class="input" id="llmApiKey" type="password" style="width:100%"></div>
<div class="sf-row"><label>模型</label><input class="input" id="llmModel" style="width:100%"></div>
</div>
<div class="flex mt16 wrap">
<button class="btn btn-primary" onclick="save('llm')">💾 保存模型设置</button>
<button class="btn" onclick="testLlm()">🔌 测试连接</button>
</div>
<div class="mt16" style="border-top:1px solid var(--border);padding-top:12px;color:var(--muted);font-size:12px;line-height:1.8">
用于 AI 深度研报生成。支持任意 OpenAI 兼容接口(DeepSeek / 火山方舟等)。修改后立即生效。
</div>
</div>
</div>
<!-- 舆情监控 -->
<div class="card mt16">
<div class="between">
<div class="card-title" style="margin-bottom:0"><span class="bar" style="background:var(--cyan)"></span>📰 舆情驱动自动化</div>
<label class="switch"><input type="checkbox" id="monitorEnabled"><span></span></label>
</div>
<div class="mt8 settings-form">
<div class="sf-row"><label>扫描间隔(分钟)</label><input class="input" id="monitorInterval" type="number" min="5" style="width:120px"></div>
<div class="sf-row"><label>重要度阈值 (0-100)</label><input class="input" id="monitorImportance" type="number" min="0" max="100" style="width:120px"></div>
<div class="sf-row"><label>情感权重</label><input class="input" id="monitorSentiment" type="number" step="0.05" style="width:120px"></div>
<div class="sf-row" style="align-items:flex-start"><label>监控分类</label>
<div class="chk-group" id="monitorCats">
<label><input type="checkbox" value="公司"> 公司</label>
<label><input type="checkbox" value="业绩"> 业绩</label>
<label><input type="checkbox" value="机构观点"> 机构观点</label>
<label><input type="checkbox" value="行业"> 行业</label>
<label><input type="checkbox" value="市场"> 市场</label>
</div>
</div>
<div class="sf-row" style="align-items:flex-start"><label>关键词(逗号分隔)</label><textarea class="input" id="monitorKeywords" rows="2" style="width:100%"></textarea></div>
</div>
<div class="flex mt16 wrap">
<button class="btn btn-primary" onclick="save('monitor')">💾 保存监控设置</button>
<button class="btn" onclick="scanNow()">⚡ 立即扫描</button>
</div>
<div class="mt16 mini-stats" id="monitorState"></div>
</div>
<!-- 通知日志 -->
<div class="card mt16">
<div class="card-title"><span class="bar" style="background:var(--cyan)"></span>通知日志</div>
<div style="overflow:auto;max-height:380px">
<table>
<thead><tr><th>时间</th><th>标题</th><th>分类</th><th>情感</th><th>重要度</th><th>状态</th></tr></thead>
<tbody id="logTb"><tr><td colspan="6" class="empty">暂无记录</td></tr></tbody>
</table>
</div>
</div>
{% endblock %}
{% block scripts %}
<script src="{{ url_for('static', filename='js/settings.js') }}"></script>
{% endblock %}