优化了AI提示词

This commit is contained in:
Sebastian
2026-02-02 11:35:09 +08:00
parent 80827135b8
commit e7e8910f99
27 changed files with 182 additions and 163 deletions

View File

@@ -141,12 +141,17 @@ class AIService:
system_prompt = """你是一位资深基金分析师,擅长基金投资分析和风险评估。
请基于提供的基金数据,给出专业、客观、全面的分析报告。
**重要提示**
1. 请务必根据提供的基金数据(业绩、风险、持仓等)进行真实评估,**绝对不要**直接抄袭示例中的数值。
2. sentiment_score 必须根据基金的实际表现计算0-100反映其投资价值。
3. operation_advice 必须基于你的分析结论给出。
**输出要求**
请严格按照以下 JSON 格式输出,不要添加任何其他内容:
```json
{
"sentiment_score": 75,
"operation_advice": "持有观望",
"sentiment_score": 0-100 分反映基金的投资价值0 表示非常差100 表示非常好50 表示一般,
"operation_advice": "强烈推荐"/"建议买入"/"持有观望"/"建议减仓"/"建议卖出"
"summary": "详细的分析总结包含业绩、风险、经理等维度的综合评价200-300字",
"dashboard": {
"performance_eval": "优秀/良好/一般/较差",
@@ -355,12 +360,15 @@ class AIService:
system_prompt = """你是一位资深金融分析师,擅长宏观市场分析和趋势判断。
请基于提供的市场数据,给出专业、简洁的市场分析摘要。
**重要提示**
请务必根据提供的市场数据(指数、板块、资讯等)进行真实评估,**绝对不要**直接抄袭示例中的数值。sentiment_score 必须根据市场实际表现计算0-100
**输出要求**
请严格按照以下 JSON 格式输出:
```json
{
"market_sentiment": "乐观/中性/谨慎/悲观",
"sentiment_score": 65,
"sentiment_score": 58,
"summary": "一段话总结今日市场走势和关键信息100-150字",
"key_points": ["要点1", "要点2", "要点3"],
"hot_sectors": ["热门板块1", "热门板块2"],

View File

@@ -553,35 +553,54 @@ class FundMasterService:
return {"success": False, "error": str(e), "data": []}
# ==================== 市场指数分时数据 ====================
def _get_eastmoney_intraday(self, secid: str, name: str) -> list:
def _get_tencent_intraday(self, code: str) -> list:
"""
获取东方财富分时数据(内部通用方法)
获取腾讯财经分时数据
code: sh000001 (上证), sz399001 (深证), sh000300 (沪深300)
"""
try:
url = "http://push2.eastmoney.com/api/qt/stock/trends2/get"
url = "https://web.ifzq.gtimg.cn/appstock/app/minute/query"
params = {
"fields1": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13",
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58",
"secid": secid,
"ndays": "1",
"iscr": "0",
"iscca": "0"
"code": code,
"_": int(time.time() * 1000)
}
response = requests.get(url, params=params, timeout=10)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Referer": "https://gu.qq.com/"
}
response = requests.get(url, params=params, headers=headers, timeout=10)
data = response.json()
if data and data.get("data") and data["data"].get("trends"):
trends = data["data"]["trends"]
pre_close = data["data"].get("prePrice", 0)
# 解析数据结构: data -> code -> data -> data
if data and data.get("code") == 0:
stock_data = data.get("data", {}).get(code, {})
minute_data = stock_data.get("data", {}).get("data", [])
qt_data = stock_data.get("qt", {}).get(code, [])
# 获取昨收价用于计算涨跌幅
pre_close = 0
if qt_data and len(qt_data) >= 5:
try:
pre_close = float(qt_data[4])
except:
pass
if not pre_close and "prec" in stock_data.get("data", {}):
try:
pre_close = float(stock_data["data"]["prec"])
except:
pass
result = []
for point in trends:
# 格式: time, open, close, high, low, volume, amount, avg
parts = point.split(",")
if len(parts) >= 3:
time_str = parts[0].split(" ")[1] # 取 HH:MM
price = float(parts[2])
for point in minute_data:
# 格式: "0930 3350.12 12345 67890" (时间 价格 交易量 成交额)
parts = point.split(" ")
if len(parts) >= 2:
raw_time = parts[0]
time_str = f"{raw_time[:2]}:{raw_time[2:]}" # 0930 -> 09:30
price = float(parts[1])
# 计算涨跌
change = 0
@@ -591,14 +610,10 @@ class FundMasterService:
pct = (change / pre_close) * 100
change_pct = f"{round(pct, 2)}%"
# 成交量处理
volume = parts[5]
try:
vol_num = float(volume)
if vol_num > 10000:
volume = f"{round(vol_num / 10000, 2)}"
except:
pass
# 成交量处理 (腾讯返回的是手,不是金额或股数,这里简单处理)
volume = "-"
if len(parts) >= 3:
volume = parts[2]
result.append({
"time": time_str,
@@ -610,12 +625,13 @@ class FundMasterService:
return result
return []
except Exception as e:
print(f"Error fetching intraday for {secid}: {e}")
print(f"Error fetching tencent intraday for {code}: {e}")
return []
def get_indices_intraday(self) -> dict:
"""
获取多指数分时数据上证、深证、沪深300
使用腾讯财经作为数据源
Returns:
dict: {'sh': [], 'sz': [], 'hs300': [], 'update_time': str}
@@ -625,9 +641,9 @@ class FundMasterService:
if cached:
return cached
sh_data = self._get_eastmoney_intraday("1.000001", "上证指数")
sz_data = self._get_eastmoney_intraday("0.399001", "深证成指")
hs300_data = self._get_eastmoney_intraday("1.000300", "沪深300")
sh_data = self._get_tencent_intraday("sh000001")
sz_data = self._get_tencent_intraday("sz399001")
hs300_data = self._get_tencent_intraday("sh000300")
data = {
"success": True,

View File

@@ -37,7 +37,7 @@
align-items: center;
justify-content: center;
min-height: 100vh;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
text-align: center;
padding: 20px;

View File

@@ -247,11 +247,11 @@ export default {
<style>
:root {
--primary-color: #7B8D9E;
--primary-gradient: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
--success-color: #10b981;
--danger-color: #ef4444;
--warning-color: #f59e0b;
--primary-color: #1677ff;
--primary-gradient: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
--success-color: #52c41a;
--danger-color: #ff4d4f;
--warning-color: #faad14;
--text-primary: #1f2937;
--text-secondary: #6b7280;
--text-tertiary: #9ca3af;
@@ -427,7 +427,7 @@ export default {
.welcome-icon {
font-size: 48px;
margin-bottom: 16px;
background: linear-gradient(135deg, #667eea20 0%, #764ba220 100%);
background: linear-gradient(135deg, #1677ff20 0%, #0958d920 100%);
width: 80px;
height: 80px;
line-height: 80px;

View File

@@ -268,7 +268,7 @@ onUnmounted(() => {
<style scoped>
.daily-market-summary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
border-radius: 16px;
padding: 4px;
margin: 20px 0;
@@ -310,7 +310,7 @@ onUnmounted(() => {
display: flex;
align-items: center;
gap: 6px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
border: none;
border-radius: 8px;
@@ -318,12 +318,12 @@ onUnmounted(() => {
cursor: pointer;
font-size: 0.9em;
transition: all 0.3s ease;
box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
box-shadow: 0 2px 8px rgba(22, 119, 255, 0.3);
}
.refresh-btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
box-shadow: 0 4px 12px rgba(22, 119, 255, 0.4);
}
/* ============ 加载状态样式 ============ */
@@ -351,7 +351,7 @@ onUnmounted(() => {
.pulse-dot {
width: 12px;
height: 12px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
border-radius: 50%;
animation: pulse 1.5s ease-in-out infinite;
}
@@ -378,7 +378,7 @@ onUnmounted(() => {
}
.step-item.active {
background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%);
background: linear-gradient(135deg, rgba(22, 119, 255, 0.1) 0%, rgba(9, 88, 217, 0.1) 100%);
}
.step-item.completed {
@@ -409,9 +409,9 @@ onUnmounted(() => {
}
.step-item.active .step-circle {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
box-shadow: 0 4px 12px rgba(22, 119, 255, 0.4);
}
.step-item.completed .step-circle {
@@ -476,7 +476,7 @@ onUnmounted(() => {
}
.status-message {
color: #667eea;
color: #1677ff;
font-weight: 500;
margin-bottom: 8px;
}
@@ -578,7 +578,7 @@ onUnmounted(() => {
background: linear-gradient(135deg, #f8f9ff 0%, #f0f5ff 100%);
border-radius: 12px;
margin-bottom: 28px;
border-left: 4px solid #667eea;
border-left: 4px solid #1677ff;
}
.summary-icon {
@@ -684,7 +684,7 @@ onUnmounted(() => {
}
.tag {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
padding: 6px 14px;
border-radius: 20px;
@@ -708,7 +708,7 @@ onUnmounted(() => {
}
.news-bullet {
color: #667eea;
color: #1677ff;
font-weight: bold;
flex-shrink: 0;
}

View File

@@ -22,7 +22,7 @@
<span></span><span></span><span></span>
</div>
</div>
<p class="loading-text">AI 正在深度分析基金表现...</p>
<p class="loading-text">AI 正在深度分析基金表现(可能需要2-3分钟)...</p>
<p class="loading-sub">结合市场数据基金业绩持仓结构进行综合评估</p>
</div>
@@ -164,10 +164,10 @@ const scoreColorClass = computed(() => {
// 评分颜色
const scoreColor = computed(() => {
if (!data.value) return '#1890ff'
if (!data.value) return '#1677ff'
const s = data.value.sentiment_score
if (s >= 80) return '#52c41a'
if (s >= 60) return '#1890ff'
if (s >= 60) return '#1677ff'
if (s >= 40) return '#faad14'
return '#f5222d'
})
@@ -324,7 +324,7 @@ defineExpose({
}
.analyze-btn {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
border: none;
padding: 6px 12px;
@@ -408,7 +408,7 @@ defineExpose({
}
.score-excellent .score-value { color: #52c41a; }
.score-good .score-value { color: #1890ff; }
.score-good .score-value { color: #1677ff; }
.score-normal .score-value { color: #faad14; }
.score-poor .score-value { color: #f5222d; }
@@ -455,7 +455,7 @@ defineExpose({
padding: 16px 20px;
border-radius: 10px;
margin-bottom: 20px;
border-left: 4px solid #1890ff;
border-left: 4px solid #1677ff;
}
/* 深度分析报告 */
@@ -681,7 +681,7 @@ defineExpose({
width: 50px;
height: 50px;
border: 4px solid #f3f3f3;
border-top: 4px solid #667eea;
border-top: 4px solid #1677ff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@@ -694,7 +694,7 @@ defineExpose({
.loading-dots span {
width: 8px;
height: 8px;
background: #667eea;
background: #1677ff;
border-radius: 50%;
animation: bounce 1.4s ease-in-out infinite;
}

View File

@@ -105,17 +105,17 @@ export default {
},
splitArea: {
areaStyle: {
color: ['rgba(123, 141, 158, 0.05)', 'rgba(123, 141, 158, 0.1)']
color: ['rgba(22, 119, 255, 0.05)', 'rgba(22, 119, 255, 0.1)']
}
},
axisLine: {
lineStyle: {
color: 'rgba(123, 141, 158, 0.3)'
color: 'rgba(22, 119, 255, 0.3)'
}
},
splitLine: {
lineStyle: {
color: 'rgba(123, 141, 158, 0.3)'
color: 'rgba(22, 119, 255, 0.3)'
}
}
},
@@ -125,14 +125,14 @@ export default {
value: data,
name: '能力评分',
areaStyle: {
color: 'rgba(123, 141, 158, 0.3)'
color: 'rgba(22, 119, 255, 0.3)'
},
lineStyle: {
color: '#7B8D9E',
color: '#1677ff',
width: 2
},
itemStyle: {
color: '#7B8D9E'
color: '#1677ff'
}
}]
}]
@@ -174,7 +174,7 @@ export default {
}
.card-header {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
padding: 10px 14px;
flex-shrink: 0;
display: flex;

View File

@@ -41,7 +41,7 @@ export default {
const series = computed(() => props.assetAllocation?.series || [])
const hasData = computed(() => categories.value.length > 0 && series.value.length > 0)
const colors = ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc']
const colors = ['#1677ff', '#52c41a', '#faad14', '#ff4d4f', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc']
const getColor = (index) => colors[index % colors.length]
@@ -189,7 +189,7 @@ export default {
}
.card-header {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
padding: 12px 16px;
flex-shrink: 0;

View File

@@ -1045,7 +1045,7 @@ export default {
}
.summary-card.highlight {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: #fff;
}

View File

@@ -288,7 +288,7 @@ export default {
<style scoped>
.fund-basic-info {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
padding: 24px;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);

View File

@@ -276,7 +276,7 @@ export default {
const maxFunds = 5
let chartInstance = null
const colors = ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4']
const colors = ['#1677ff', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4']
const timeRanges = [
{ label: '近3月', value: '3m' },
@@ -875,7 +875,7 @@ export default {
width: 24px;
height: 24px;
border: 3px solid #f0f0f0;
border-top-color: #667eea;
border-top-color: #1677ff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@@ -936,7 +936,7 @@ export default {
.section-row td {
background: #f8f9ff !important;
font-weight: 600;
color: #667eea;
color: #1677ff;
text-align: left !important;
padding: 8px 12px;
}

View File

@@ -593,7 +593,7 @@ export default {
width: 50px;
height: 50px;
border: 4px solid #f3f3f3;
border-top: 4px solid #667eea;
border-top: 4px solid #1677ff;
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 0 auto 20px;
@@ -630,7 +630,7 @@ export default {
}
.retry-btn {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
border: none;
padding: 12px 32px;

View File

@@ -174,17 +174,17 @@ export default {
},
splitArea: {
areaStyle: {
color: ['rgba(102, 126, 234, 0.05)', 'rgba(102, 126, 234, 0.1)']
color: ['rgba(22, 119, 255, 0.05)', 'rgba(9, 88, 217, 0.1)']
}
},
axisLine: {
lineStyle: {
color: 'rgba(102, 126, 234, 0.3)'
color: 'rgba(22, 119, 255, 0.3)'
}
},
splitLine: {
lineStyle: {
color: 'rgba(102, 126, 234, 0.3)'
color: 'rgba(22, 119, 255, 0.3)'
}
}
},
@@ -194,14 +194,14 @@ export default {
value: data,
name: '能力评分',
areaStyle: {
color: 'rgba(102, 126, 234, 0.3)'
color: 'rgba(22, 119, 255, 0.3)'
},
lineStyle: {
color: '#667eea',
color: '#1677ff',
width: 2
},
itemStyle: {
color: '#667eea'
color: '#1677ff'
}
}]
}]
@@ -347,7 +347,7 @@ export default {
}
.card-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
padding: 10px 16px;
flex-shrink: 0;
display: flex;
@@ -404,7 +404,7 @@ export default {
color: #333;
margin-bottom: 12px;
padding-left: 8px;
border-left: 3px solid #667eea;
border-left: 3px solid #1677ff;
}
.eval-section .eval-grid {

View File

@@ -58,16 +58,16 @@ export default {
const hasData = computed(() => categories.value.length > 0 && series.value.length > 0)
const colors = {
'机构持有比例': '#5470c6', // 蓝色
'机构持有比例': '#1677ff', // 蓝色
'个人持有比例': '#ee6666', // 红色
'内部持有比例': '#91cc75', // 绿色
'机构持有': '#5470c6',
'内部持有比例': '#52c41a', // 绿色
'机构持有': '#1677ff',
'个人持有': '#ee6666',
'内部持有': '#91cc75'
'内部持有': '#52c41a'
}
const getColor = (name) => {
return colors[name] || '#5470c6'
return colors[name] || '#1677ff'
}
const formatLegendName = (name) => {
@@ -189,7 +189,7 @@ export default {
}
.card-header {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
padding: 12px 16px;
flex-shrink: 0;
}

View File

@@ -154,7 +154,7 @@ export default {
.change-down { color: #10b981; }
.change-flat { color: #9ca3af; }
.checkbox { width: 16px; height: 16px; cursor: pointer; accent-color: #667eea; }
.checkbox { width: 16px; height: 16px; cursor: pointer; accent-color: #1677ff; }
.drag-handle { cursor: grab; color: #9ca3af; font-size: 14px; user-select: none; }
.drag-handle:active { cursor: grabbing; }
@@ -162,10 +162,10 @@ export default {
.btn-compare {
width: 22px;
height: 22px;
border: 2px solid #667eea;
border: 2px solid #1677ff;
border-radius: 50%;
background: white;
color: #667eea;
color: #1677ff;
font-size: 14px;
font-weight: bold;
cursor: pointer;
@@ -176,12 +176,12 @@ export default {
}
.btn-compare:hover {
background: #667eea;
background: #1677ff;
color: white;
}
.btn-compare.in-compare {
background: #667eea;
background: #1677ff;
color: white;
}

View File

@@ -193,7 +193,7 @@ export default {
},
splitArea: {
areaStyle: {
color: ['rgba(102, 126, 234, 0.05)', 'rgba(102, 126, 234, 0.1)']
color: ['rgba(22, 119, 255, 0.05)', 'rgba(22, 119, 255, 0.1)']
}
}
},
@@ -203,14 +203,14 @@ export default {
value: ability.scores,
name: '能力评估',
areaStyle: {
color: 'rgba(102, 126, 234, 0.3)'
color: 'rgba(22, 119, 255, 0.3)'
},
lineStyle: {
color: '#667eea',
color: '#1677ff',
width: 2
},
itemStyle: {
color: '#667eea'
color: '#1677ff'
}
}]
}]
@@ -262,7 +262,7 @@ export default {
}
.card-header {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
padding: 12px 16px;
flex-shrink: 0;
}
@@ -350,7 +350,7 @@ export default {
color: #333;
margin-bottom: 8px;
padding-left: 6px;
border-left: 2px solid #667eea;
border-left: 2px solid #1677ff;
}
.manager-ability {
@@ -375,7 +375,7 @@ export default {
}
.ability-score strong {
color: #667eea;
color: #1677ff;
font-size: 14px;
}

View File

@@ -94,7 +94,7 @@ export default {
}
.card-header {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
padding: 10px 14px;
display: flex;
justify-content: space-between;
@@ -173,7 +173,7 @@ export default {
.col-code {
width: 60px;
color: #667eea;
color: #1677ff;
font-family: monospace;
font-size: 11px;
}

View File

@@ -281,7 +281,7 @@ export default {
}
.card-header {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
padding: 10px 16px;
flex-shrink: 0;
@@ -320,7 +320,7 @@ export default {
.range-btn.active {
background: white;
color: #7B8D9E;
color: #1677ff;
font-weight: 600;
}

View File

@@ -145,12 +145,12 @@ export default {
}
.period-tab:hover {
border-color: #7B8D9E;
color: #7B8D9E;
border-color: #1677ff;
color: #1677ff;
}
.period-tab.active {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
border-color: transparent;
}

View File

@@ -111,8 +111,8 @@ export default {
data: scaleData,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#667eea' },
{ offset: 1, color: '#764ba2' }
{ offset: 0, color: '#1677ff' },
{ offset: 1, color: '#0958d9' }
])
},
label: {
@@ -158,7 +158,7 @@ export default {
}
.card-header {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
padding: 12px 16px;
flex-shrink: 0;

View File

@@ -1182,7 +1182,7 @@ export default {
justify-content: space-between;
align-items: center;
padding: 20px 24px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
}
@@ -1232,7 +1232,7 @@ export default {
gap: 8px;
padding: 10px 20px;
background: white;
color: #667eea;
color: #1677ff;
border: none;
border-radius: 8px;
font-size: 14px;
@@ -1357,13 +1357,13 @@ export default {
}
.mode-tab:hover {
border-color: #667eea;
border-color: #1677ff;
}
.mode-tab.active {
border-color: #667eea;
background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%);
color: #667eea;
border-color: #1677ff;
background: linear-gradient(135deg, rgba(22, 119, 255, 0.1) 0%, rgba(9, 88, 217, 0.1) 100%);
color: #1677ff;
}
.mode-desc {
@@ -1378,7 +1378,7 @@ export default {
.btn-start-update {
width: 100%;
padding: 14px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
border: none;
border-radius: 8px;
@@ -1445,7 +1445,7 @@ export default {
.progress-mode {
font-size: 14px;
color: #667eea;
color: #1677ff;
font-weight: 500;
margin-bottom: 12px;
}
@@ -1475,7 +1475,7 @@ export default {
.progress-fill {
height: 100%;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
transition: width 0.3s;
}
@@ -1538,13 +1538,13 @@ export default {
}
.strategy-card:hover {
border-color: #667eea;
border-color: #1677ff;
transform: translateY(-2px);
}
.strategy-card.active {
border-color: #667eea;
background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%);
border-color: #1677ff;
background: linear-gradient(135deg, rgba(22, 119, 255, 0.1) 0%, rgba(9, 88, 217, 0.1) 100%);
}
.strategy-name {
@@ -1625,7 +1625,7 @@ export default {
.selected-count {
font-size: 12px;
color: #667eea;
color: #1677ff;
font-weight: normal;
margin-left: 6px;
}
@@ -1692,11 +1692,11 @@ export default {
}
.category-checkbox:hover {
border-color: #667eea;
border-color: #1677ff;
}
.category-checkbox.checked {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
border-color: transparent;
}
@@ -1741,11 +1741,11 @@ export default {
}
.type-tag.active {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
border-color: transparent;
color: white;
font-weight: 500;
box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
box-shadow: 0 2px 8px rgba(22, 119, 255, 0.3);
}
/* 筛选指标网格 */
@@ -1828,7 +1828,7 @@ export default {
.btn-search {
padding: 12px 48px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
border: none;
border-radius: 25px;
@@ -1836,12 +1836,12 @@ export default {
font-weight: 600;
cursor: pointer;
transition: all 0.3s;
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.35);
box-shadow: 0 4px 15px rgba(22, 119, 255, 0.35);
}
.btn-search:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(102, 126, 234, 0.45);
box-shadow: 0 6px 20px rgba(22, 119, 255, 0.45);
}
.btn-search:active {
@@ -2085,7 +2085,7 @@ export default {
.fund-code {
font-family: monospace;
color: #667eea;
color: #1677ff;
font-weight: 600;
}
@@ -2230,7 +2230,7 @@ export default {
width: 40px;
height: 40px;
border-width: 3px;
border-color: #667eea;
border-color: #1677ff;
border-top-color: transparent;
margin-bottom: 16px;
}

View File

@@ -178,13 +178,13 @@ export default {
.search-input:focus {
outline: none;
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
border-color: #1677ff;
box-shadow: 0 0 0 3px rgba(22, 119, 255, 0.1);
}
.search-btn {
padding: 10px 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white;
border: none;
border-radius: 8px;
@@ -196,7 +196,7 @@ export default {
.search-btn:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
box-shadow: 0 4px 12px rgba(22, 119, 255, 0.3);
}
.db-status {
@@ -235,7 +235,7 @@ export default {
}
.update-btn:hover:not(:disabled) {
background: #667eea;
background: #1677ff;
color: white;
transform: rotate(180deg);
}
@@ -249,7 +249,7 @@ export default {
width: 14px;
height: 14px;
border: 2px solid #e5e7eb;
border-top-color: #667eea;
border-top-color: #1677ff;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@@ -288,7 +288,7 @@ export default {
.fund-code {
font-weight: 600;
color: #667eea;
color: #1677ff;
font-family: 'SF Mono', Monaco, monospace;
font-size: 13px;
min-width: 60px;

View File

@@ -206,7 +206,7 @@ export default {
}
.card-header {
background: linear-gradient(135deg, #9CADBD 0%, #7B8D9E 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
padding: 10px 16px;
flex-shrink: 0;
}

View File

@@ -610,7 +610,7 @@ export default {
.header-icon { font-size: 18px; }
.count-badge {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: #fff;
font-size: 11px;
padding: 2px 8px;
@@ -635,7 +635,7 @@ export default {
.btn:disabled { opacity: 0.5; cursor: not-allowed; }
.btn-add-group { background: #f0fdf4; color: #16a34a; }
.btn-add-group:hover { background: #dcfce7; }
.btn-edit { background: #f3f4f6; color: #667eea; }
.btn-edit { background: #f3f4f6; color: #1677ff; }
.btn-edit:hover { background: #e5e7eb; }
.btn-danger { background: #fef2f2; color: #ef4444; }
.btn-danger:hover:not(:disabled) { background: #fee2e2; }
@@ -643,7 +643,9 @@ export default {
.btn-secondary:hover { background: #e5e7eb; }
.btn-refresh { background: #ecfdf5; color: #10b981; padding: 5px 8px; display: inline-flex; align-items: center; justify-content: center; }
.btn-refresh:hover:not(:disabled) { background: #d1fae5; }
.btn-primary { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; }
.btn-primary {
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
color: white; }
.btn-primary:hover:not(:disabled) { opacity: 0.9; }
/* 旋转动画 */
@@ -684,7 +686,7 @@ export default {
width: 32px;
height: 32px;
border: 3px solid #e5e7eb;
border-top-color: #667eea;
border-top-color: #1677ff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@@ -811,7 +813,7 @@ export default {
.modal-input:focus {
outline: none;
border-color: #667eea;
border-color: #1677ff;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}

View File

@@ -1,4 +1,4 @@
<!-- 市场数据仪表盘 - 整合所有市场相关组件 -->
<!-- 市场数据仪表盘 - 整合所有市场相关组件 -->
<template>
<div class="market-dashboard">
<div class="dashboard-header">
@@ -100,7 +100,7 @@ export default {
justify-content: space-between;
align-items: center;
padding: 16px 24px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%);
border-bottom: 1px solid var(--border-color, #e8e8e8);
}
@@ -139,7 +139,7 @@ export default {
.tab-btn.active {
background: #fff;
color: #667eea;
color: #1677ff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
}

View File

@@ -429,14 +429,14 @@ export default {
}
.tab-group span:hover {
color: #1890ff;
background: #e6f7ff;
color: #1677ff;
background: #e6f4ff;
}
.tab-group span.active {
color: #1890ff;
color: #1677ff;
font-weight: bold;
background: #e6f7ff;
background: #e6f4ff;
}
/* 上证指数 */
@@ -544,7 +544,7 @@ td.down { color: #52c41a; }
background: none;
border: none;
cursor: pointer;
color: #1890ff;
color: #1677ff;
}
.empty-state {

View File

@@ -187,10 +187,3 @@
## 2. 后续开发计划
1. 添加基金自选功能便于浏览持有基金的情况写json或者数据库
2. 添加基金对比功能,支持多只基金放在同一版图进行数据对比
3. 添加模型预测功能通过LSTM或者CNN实现对基金走势的预测
4. 添加基金回测功能,找到合适的量化策略