智能荐股系统 v1.0.0:股票池/行情/新闻RAG/机构持仓/多因子评分/AI深度研报
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}数据管理{% endblock %}
|
||||
{% block page_title %}数据管理{% endblock %}
|
||||
{% block content %}
|
||||
<div class="grid grid-2">
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="bar"></span>数据库统计(SQLite)</div>
|
||||
<div id="dbBox"><div class="loading">加载中…</div></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="bar"></span>向量库状态(Chroma + bge 1024维)</div>
|
||||
<div id="vecBox"><div class="loading">加载中…</div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mt16">
|
||||
<div class="card-title"><span class="bar" style="background:var(--gold)"></span>系统维护</div>
|
||||
<div class="flex wrap">
|
||||
<button class="btn btn-primary" onclick="reseed()">♻️ 一键重灌数据(含向量重建)</button>
|
||||
<button class="btn" onclick="health()">🔌 依赖连通性检查</button>
|
||||
<button class="btn" onclick="refreshStats()">🔄 刷新统计</button>
|
||||
</div>
|
||||
<div id="healthBox" class="mt16"></div>
|
||||
<div class="mt16" style="border-top:1px solid var(--border);padding-top:14px;color:var(--muted);font-size:13px;line-height:2">
|
||||
<b>当前为模拟数据</b>,用于功能演示与系统验证。接入真实数据后(行情/新闻/机构),修改 <code>config.py</code> 中的 <code>IS_MOCK=False</code>,并替换 <code>seed_data.py</code> 为真实数据源即可,其余分析/检索逻辑无需改动。<br>
|
||||
技术栈:Python Flask + SQLite + Chroma 向量库 + bge-large-zh 语义检索 + DeepSeek 大模型(RAG 增强研报)。
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
<script src="{{ url_for('static', filename='js/admin.js') }}"></script>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,59 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}智能荐股系统{% endblock %} · {{ service }}</title>
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
|
||||
<script src="{{ url_for('static', filename='lib/marked.min.js') }}"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/echarts@5.5.0/dist/echarts.min.js"></script>
|
||||
<script>
|
||||
// ECharts CDN 加载失败时回退本地标记
|
||||
window.addEventListener('error', function (e) {
|
||||
if (e.target && e.target.tagName === 'SCRIPT' && e.target.src.includes('echarts')) {
|
||||
window.__ECHARTS_FAIL = true;
|
||||
}
|
||||
}, true);
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layout">
|
||||
<aside class="sidebar">
|
||||
<div class="logo">
|
||||
<div class="logo-badge">荐</div>
|
||||
<div>
|
||||
<div class="logo-title">智能荐股</div>
|
||||
<div class="logo-sub">{{ service }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<nav class="nav">
|
||||
<a href="/" class="nav-item" data-nav="/">📊 仪表盘</a>
|
||||
<a href="/stocks" class="nav-item" data-nav="/stocks">🏢 股票池</a>
|
||||
<a href="/recommend" class="nav-item" data-nav="/recommend">🎯 荐股中心</a>
|
||||
<a href="/news" class="nav-item" data-nav="/news">📰 财经新闻</a>
|
||||
<a href="/institutions" class="nav-item" data-nav="/institutions">🏦 机构动向</a>
|
||||
<a href="/admin" class="nav-item" data-nav="/admin">⚙️ 数据管理</a>
|
||||
</nav>
|
||||
<div class="sidebar-foot">
|
||||
{% if is_mock %}<div class="mock-tag">模拟数据 · 仅供演示</div>{% endif %}
|
||||
<div class="side-time" id="sideTime"></div>
|
||||
</div>
|
||||
</aside>
|
||||
<main class="main">
|
||||
<header class="topbar">
|
||||
<div class="topbar-left">
|
||||
<h1 class="page-title">{% block page_title %}{% endblock %}</h1>
|
||||
</div>
|
||||
<div class="topbar-right">
|
||||
<span class="sys-status"><i class="dot"></i>系统运行中</span>
|
||||
</div>
|
||||
</header>
|
||||
<div class="content">
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
<script src="{{ url_for('static', filename='js/common.js') }}"></script>
|
||||
{% block scripts %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,33 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}仪表盘{% endblock %}
|
||||
{% block page_title %}市场总览{% endblock %}
|
||||
{% block content %}
|
||||
<div class="grid grid-3" id="indexBox">
|
||||
<div class="card"><div class="loading">加载中…</div></div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-1-2 mt16">
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="bar"></span>今日荐股 TOP5</div>
|
||||
<div id="topRecBox"><div class="loading">加载中…</div></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="bar"></span>行业热度</div>
|
||||
<div id="heatBox"><div class="loading">加载中…</div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-1-2 mt16">
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="bar"></span>最新要闻</div>
|
||||
<div id="newsBox"><div class="loading">加载中…</div></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="bar"></span>自选股</div>
|
||||
<div id="watchBox"><div class="loading">加载中…</div></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
<script src="{{ url_for('static', filename='js/dashboard.js') }}"></script>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,38 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}机构动向{% endblock %}
|
||||
{% block page_title %}机构动向{% endblock %}
|
||||
{% block content %}
|
||||
<div class="grid grid-2">
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="bar"></span>评级变动(近45日)</div>
|
||||
<div id="upgradeBox"><div class="loading">加载中…</div></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="bar"></span>基金持仓变化</div>
|
||||
<div id="holdBox"><div class="loading">加载中…</div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mt16">
|
||||
<div class="between mb8">
|
||||
<div class="card-title" style="margin-bottom:0"><span class="bar"></span>机构列表</div>
|
||||
<div class="pill-bar" id="typePills" style="margin-bottom:0">
|
||||
<button class="pill active" data-t="">全部</button>
|
||||
<button class="pill" data-t="公募基金">公募基金</button>
|
||||
<button class="pill" data-t="券商研究">券商研究</button>
|
||||
<button class="pill" data-t="保险资管">保险资管</button>
|
||||
<button class="pill" data-t="外资机构">外资机构</button>
|
||||
<button class="pill" data-t="私募游资">私募游资</button>
|
||||
</div>
|
||||
</div>
|
||||
<div style="overflow:auto">
|
||||
<table>
|
||||
<thead><tr><th>机构</th><th>类型</th><th>简介</th><th>评级数</th><th>持仓数</th><th>操作</th></tr></thead>
|
||||
<tbody id="tb"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
<script src="{{ url_for('static', filename='js/institutions.js') }}"></script>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,25 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}财经新闻{% endblock %}
|
||||
{% block page_title %}财经新闻{% endblock %}
|
||||
{% block content %}
|
||||
<div class="card">
|
||||
<div class="input-group mb8 wrap">
|
||||
<input class="input" id="kw" placeholder="搜索标题 / 内容" style="width:220px">
|
||||
<select class="input" id="cat">
|
||||
<option value="">全部分类</option>
|
||||
<option>业绩</option><option>行业</option><option>公司</option><option>机构观点</option><option>市场</option>
|
||||
</select>
|
||||
<button class="btn btn-primary" onclick="load(1)">搜索</button>
|
||||
<span class="flex" style="margin-left:auto"><span id="count" style="color:var(--muted)"></span></span>
|
||||
</div>
|
||||
<div id="listBox"><div class="loading">加载中…</div></div>
|
||||
<div class="pagination">
|
||||
<button class="btn" id="prevBtn" onclick="page--;load()">上一页</button>
|
||||
<span class="page-info" id="pageInfo"></span>
|
||||
<button class="btn" id="nextBtn" onclick="page++;load()">下一页</button>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
<script src="{{ url_for('static', filename='js/news.js') }}"></script>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,26 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}荐股中心{% endblock %}
|
||||
{% block page_title %}荐股中心{% endblock %}
|
||||
{% block content %}
|
||||
<div class="card">
|
||||
<div class="pill-bar" id="ratingPills">
|
||||
<button class="pill active" data-r="all">全部</button>
|
||||
<button class="pill" data-r="强烈推荐">强烈推荐</button>
|
||||
<button class="pill" data-r="推荐">推荐</button>
|
||||
<button class="pill" data-r="关注">关注</button>
|
||||
<button class="pill" data-r="观望">观望</button>
|
||||
</div>
|
||||
<div style="overflow:auto">
|
||||
<table>
|
||||
<thead><tr>
|
||||
<th>排名</th><th>股票</th><th>现价</th><th>今日</th><th>5日</th>
|
||||
<th>评分</th><th>评级</th><th>六因子</th><th>推荐理由</th><th>操作</th>
|
||||
</tr></thead>
|
||||
<tbody id="tb"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
<script src="{{ url_for('static', filename='js/recommend.js') }}"></script>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,88 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}股票详情{% endblock %}
|
||||
{% block page_title %}<span id="headName">加载中…</span>{% endblock %}
|
||||
{% block content %}
|
||||
<div class="card" id="headCard">
|
||||
<div class="flex between wrap">
|
||||
<div class="flex">
|
||||
<div>
|
||||
<div style="font-size:22px;font-weight:800"><span id="stName">—</span> <span id="stCode" style="color:var(--muted);font-size:15px"></span></div>
|
||||
<div class="mt8 flex" style="gap:14px;color:var(--muted);font-size:13px">
|
||||
<span id="stIndustry">—</span><span id="stBoard">—</span>
|
||||
<span>市值 <b id="stCap" style="color:var(--text)"></b></span>
|
||||
<span>PE <b id="stPe" style="color:var(--text)"></b></span>
|
||||
<span>PB <b id="stPb" style="color:var(--text)"></b></span>
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin-left:28px">
|
||||
<div id="stPrice" class="num" style="font-size:32px;font-weight:800">—</div>
|
||||
<div class="flex mt8" style="gap:14px">
|
||||
<span id="stChg" class="num" style="font-weight:700">—</span>
|
||||
<span id="stChg5" class="num" style="font-size:13px;color:var(--muted)"></span>
|
||||
<span id="stChg20" class="num" style="font-size:13px;color:var(--muted)"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="card" style="padding:12px 18px;text-align:center">
|
||||
<div class="kpi-label" style="font-size:12px;color:var(--muted)">综合评分</div>
|
||||
<div class="score-wrap" style="justify-content:center;margin-top:4px">
|
||||
<div class="score-ring" id="ring"></div>
|
||||
</div>
|
||||
<div class="mt8"><span class="tag tag-观望" id="stRating">—</span></div>
|
||||
</div>
|
||||
<div style="display:flex;flex-direction:column;gap:8px;justify-content:center">
|
||||
<button class="btn btn-primary" id="watchBtn">⭐ 加入自选</button>
|
||||
<button class="btn" onclick="location.href='/?watch=1'">去仪表盘</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt16 kpi-grid" id="kpiBox"></div>
|
||||
<div class="mt16" id="reasonBox" style="color:var(--text2);line-height:1.9"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-2-1 mt16">
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="bar"></span>K线走势(日线)</div>
|
||||
<div id="klineChart" style="height:420px"></div>
|
||||
<div class="flex mt8">
|
||||
<button class="btn" data-days="30">1月</button>
|
||||
<button class="btn" data-days="60">3月</button>
|
||||
<button class="btn btn-primary" data-days="120">半年</button>
|
||||
<button class="btn" data-days="180">1年</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="bar"></span>六因子评分</div>
|
||||
<div id="scoreBarsBox" class="mt8"></div>
|
||||
<div class="card-title mt16" style="font-size:14px"><span class="bar" style="background:var(--gold)"></span>评分说明</div>
|
||||
<div style="color:var(--text2);font-size:12px;line-height:1.9">
|
||||
趋势(25) 均线多头排列<br>动量(20) 5日涨幅<br>技术(15) RSI健康度<br>量能(10) 量比<br>消息(15) 近7日新闻情感<br>机构(15) 评级+持仓动向
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mt16">
|
||||
<div class="card-title"><span class="bar" style="background:var(--gold)"></span>AI 深度分析(RAG 增强)</div>
|
||||
<div class="input-group">
|
||||
<input class="input" id="focusInput" placeholder="输入关注点,如:业绩预期 / 技术面 / 机构持仓(可选)" style="flex:1;min-width:220px">
|
||||
<button class="btn btn-primary" id="analyzeBtn">🤖 生成研报</button>
|
||||
</div>
|
||||
<div id="reportBox" class="mt16">
|
||||
<div class="empty">点击「生成研报」,系统将基于 新闻RAG检索 + 技术指标 + 机构数据 调用 DeepSeek 生成结构化研报(首次生成约需 30-90 秒)</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mt16">
|
||||
<div class="pill-bar" id="tabs">
|
||||
<button class="pill active" data-tab="news">相关新闻</button>
|
||||
<button class="pill" data-tab="ratings">机构评级</button>
|
||||
<button class="pill" data-tab="holdings">基金持仓</button>
|
||||
<button class="pill" data-tab="profile">公司概况</button>
|
||||
</div>
|
||||
<div id="tabBox"><div class="loading">加载中…</div></div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
<script src="{{ url_for('static', filename='js/stock_detail.js') }}"></script>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,44 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}股票池{% endblock %}
|
||||
{% block page_title %}股票池{% endblock %}
|
||||
{% block content %}
|
||||
<div class="card">
|
||||
<div class="input-group mb8 wrap">
|
||||
<input class="input" id="kw" placeholder="搜索代码 / 名称" style="width:200px">
|
||||
<select class="input" id="industry"><option value="">全部行业</option></select>
|
||||
<select class="input" id="board">
|
||||
<option value="">全部板块</option>
|
||||
<option>主板</option><option>创业板</option><option>科创板</option>
|
||||
</select>
|
||||
<select class="input" id="rating">
|
||||
<option value="">全部评级</option>
|
||||
<option>强烈推荐</option><option>推荐</option><option>关注</option><option>观望</option>
|
||||
</select>
|
||||
<select class="input" id="sort">
|
||||
<option value="score">按综合评分</option>
|
||||
<option value="change_pct">按今日涨跌幅</option>
|
||||
<option value="amount">按成交额</option>
|
||||
<option value="market_cap">按市值</option>
|
||||
</select>
|
||||
<button class="btn btn-primary" onclick="load(1)">查询</button>
|
||||
<span class="flex" style="margin-left:auto"><span id="stCount" style="color:var(--muted)"></span></span>
|
||||
</div>
|
||||
<div style="overflow:auto">
|
||||
<table>
|
||||
<thead><tr>
|
||||
<th>代码/名称</th><th>行业</th><th>板块</th><th>现价</th><th>今日</th>
|
||||
<th>5日</th><th>量比</th><th>成交额</th><th>市值</th><th>评分</th><th>评级</th><th>操作</th>
|
||||
</tr></thead>
|
||||
<tbody id="tb"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<button class="btn" id="prevBtn" onclick="page--;load()">上一页</button>
|
||||
<span class="page-info" id="pageInfo"></span>
|
||||
<button class="btn" id="nextBtn" onclick="page++;load()">下一页</button>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
<script src="{{ url_for('static', filename='js/stocks.js') }}"></script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user