优化了AI提示词
This commit is contained in:
@@ -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"],
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user