Compare commits

...

8 Commits

Author SHA1 Message Date
ArvinLovegood
7069af869b feat(frontend):优化市场分析组件并增强标签处理逻辑
- 添加主要指数(mainIndex),包括中美日韩等地重要城市指数
- 更新图表展示逻辑,使用mainIndex代替原有的china索引
- 引入数字动画效果,提升用户体验
- 在后端增加标签类型过滤,仅处理type为"subject"的标签
- 调整标签词频,通过ReAddToken方法提高关键词权重
2025-11-25 12:23:54 +08:00
ArvinLovegood
dbb6789c05 feat(frontend):市场快讯里面添加全球股指展示功能并优化情绪分析图表
- 引入 GlobalStockIndexes 接口获取全球主要股指数据
- 添加中国主要股指筛选逻辑(上海、深圳、香港等)
- 优化市场情绪图表数值显示精度
- 调整图表布局结构,增强可视化效果
- 修改市场情绪强弱指标名称提升可读性
- 定时获取最新股指数据(每2秒刷新)
- 调整负面金融词汇权重以提高分析准确性
2025-11-24 18:08:10 +08:00
ArvinLovegood
8aed4d2753 feat(dict):优化金融股票分词字典结构与内容
- 删除重复或冗余的词条,如“人工智能”、“云计算”等在多个分类中重复出现的词汇
- 调整并统一章节编号,确保从一至九的连续性和逻辑性
- 移除不再适用的覆盖场景描述,提升字典的专业性与准确性
- 更新权重说明注释,去除不必要的分数细节,保持清晰易懂
- 重新组织词条顺序,使同类项集中,提高检索效率
- 清理负权重词汇列表中的多余条目,强化过滤机制
- 精简A股龙头公司条目,聚焦更广泛的财务与估值指标词条
- 统一格式排版,增强可读性和维护便利性
2025-11-23 20:48:28 +08:00
ArvinLovegood
6bd1bdae02 feat(dict):优化金融股票分词字典结构与内容
- 删除重复或冗余的词条,如“人工智能”、“云计算”等在多个分类中重复出现的词汇
- 调整并统一章节编号,确保从一至九的连续性和逻辑性
- 移除不再适用的覆盖场景描述,提升字典的专业性与准确性
- 更新权重说明注释,去除不必要的分数细节,保持清晰易懂
- 重新组织词条顺序,使同类项集中,提高检索效率
- 清理负权重词汇列表中的多余条目,强化过滤机制
- 精简A股龙头公司条目,聚焦更广泛的财务与估值指标词条
- 统一格式排版,增强可读性和维护便利性
2025-11-23 20:40:57 +08:00
ArvinLovegood
9a40d343aa feat(dict): 优化金融股票分词字典结构与内容
- 删除重复或冗余的词条,如“人工智能”、“云计算”等在多个分类中重复出现的词汇
- 调整并统一章节编号,确保从一至九的连续性和逻辑性
- 移除不再适用的覆盖场景描述,提升字典的专业性与准确性
- 更新权重说明注释,去除不必要的分数细节,保持清晰易懂
- 重新组织词条顺序,使同类项集中,提高检索效率
- 清理负权重词汇列表中的多余条目,强化过滤机制
- 精简A股龙头公司条目,聚焦更广泛的财务与估值指标词条
- 统一格式排版,增强可读性和维护便利性
2025-11-23 20:39:06 +08:00
ArvinLovegood
e4cdad6ffe feat(data): 更新用户词典,新增热点概念与板块词汇
- 添加负权重词汇以降低无差别匹配干扰
- 新增核心热点概念词汇,权重设为700分
- 扩展重点赛道板块词汇,权重设为500分
- 增加事件驱动型概念词汇,权重设为400分
- 调整部分已有词汇格式,确保兼容性
2025-11-23 20:22:29 +08:00
ArvinLovegood
a0005dab96 feat(data): 更新用户词典文件
- 调整了原有词汇的权重值从0.1为-0.1
- 新增多个金融及行业相关词汇,如基金、保险等
- 增加了热点概念词汇,例如冰雪旅游、新能源汽车等
- 添加了具体公司或产品名称,如摩尔线程及其相关概念
- 保留并确认具身智能一词的权重与分类不变
2025-11-23 20:03:23 +08:00
ArvinLovegood
c945ca9322 feat(data):调整新闻获取逻辑与情感分析词频权重
- 修改市场新闻接口查询逻辑,按创建时间倒序排序
- 增加单次获取新闻数量上限至10000条
- 调整股票名称及板块名称在分词器中的基础频率权重
- 修改标签添加时的基础频率值
- 更新情感分析中词语权重判断条件,使用动态基准频率替代固定值200
2025-11-23 19:12:07 +08:00
8 changed files with 273 additions and 109 deletions

View File

@@ -76,7 +76,7 @@ func (a *App) ChatWithAgent(question string, aiConfigId int, sysPromptId *int) {
func (a *App) AnalyzeSentimentWithFreqWeight(text string) map[string]any {
if text == "" {
telegraphs := data.NewMarketNewsApi().GetNews24HoursList("", 1000)
telegraphs := data.NewMarketNewsApi().GetNews24HoursList("", 1000*10)
messageText := strings.Builder{}
for _, telegraph := range *telegraphs {
messageText.WriteString(telegraph.Content + "\n")

View File

@@ -1,6 +1,5 @@
# 金融股票全场景分词字典(最终去重优化版)
# 格式:单词 权重 词性 | 权重280-350分核心术语优先匹配无重复词汇
# 覆盖:净买卖、股指、财务指标、交易操作、政策宏观、热点概念、机构媒体、美股中概股、十五五规划等全场景
# 一、净买卖与资金流向(核心交易表述)
净卖出 340 v
@@ -96,6 +95,7 @@
操纵市场 300 n
亏损 100 n
加工 100 n
# 三、全球主要股指(含中英文缩写)
# 中国市场
A股 350 n
@@ -117,63 +117,43 @@ A股 350 n
科创50指数 330 n
上证综指 350 n
富时中国A50指数 340 n
FTSE China A50 330 n
恒生指数 340 n
HSI 330 n
恒生科技指数 340 n
恒生国企指数 330 n
H股指数 330 n
# 美洲市场
道琼斯工业平均指数 350 n
DJIA 340 n
标普500指数 350 n
S&P 500 340 n
纳斯达克综合指数 340 n
纳斯达克100指数 340 n
Nasdaq 100 330 n
罗素2000指数 320 n
Russell 2000 310 n
标普400中型股指数 310 n
标普600小型股指数 310 n
纽约证交所综合指数 310 n
NYSE Composite 300 n
纳斯达克中国金龙指数 310 n
# 欧洲市场
德国DAX指数 330 n
DAX 30 320 n
法国CAC40指数 330 n
CAC 40 320 n
富时100指数 330 n
FTSE 100 320 n
欧元斯托克50指数 320 n
Euro Stoxx 50 310 n
英国富时250指数 310 n
FTSE 250 300 n
意大利富时MIB指数 310 n
FTSE MIB 300 n
西班牙IBEX 35指数 310 n
IBEX 35 300 n
# 亚太其他市场
日经225指数 330 n
Nikkei 225 320 n
日经500指数 310 n
韩国综合股价指数 320 n
韩国kospi指数 320 n
KOSPI 310 n
澳洲标普200指数 310 n
S&P/ASX 200 300 n
印度孟买敏感指数 310 n
Sensex 300 n
印度Nifty 50指数 310 n
Nifty 50 300 n
# 全球综合指数
MSCI指数 320 n
MSCI全球指数 330 n
MSCI World Index 320 n
MSCI新兴市场指数 330 n
MSCI Emerging Markets 320 n
富时罗素全球指数 320 n
FTSE Russell Global Index 310 n
摩根大通全球债券指数 310 n
全球股指 300 n
发达市场指数 300 n
@@ -198,38 +178,7 @@ G20国家指数 300 n
指数估值 310 n
指数市盈率 310 n
# 四、A股龙头公司资讯高频
贵州茅台 310 n
宁德时代 350 n
比亚迪 340 n
隆基绿能 300 n
长江电力 290 n
中国平安 300 n
招商银行 300 n
五粮液 290 n
美的集团 290 n
格力电器 290 n
海康威视 290 n
迈瑞医疗 290 n
恒瑞医药 290 n
中芯国际 300 n
中兴通讯 290 n
东方财富 290 n
爱尔眼科 290 n
通威股份 290 n
药明康德 320 n
阳光电源 290 n
天齐锂业 290 n
赣锋锂业 290 n
中国中免 290 n
海螺水泥 280 n
万科A 280 n
保利发展 280 n
招商蛇口 280 n
上汽集团 280 n
宝钢股份 280 n
# 五、财务与估值核心指标
# 四、财务与估值核心指标
市盈率 350 n
PE 350 n
动态市盈率 340 n
@@ -269,7 +218,7 @@ EPS 330 n
量比 320 n
振幅 320 n
# 、政策与宏观经济
# 、政策与宏观经济
货币政策 330 n
财政政策 330 n
稳健货币政策 320 n
@@ -307,7 +256,7 @@ PMI 330 n
黄金价格 310 n
有色金属价格 300 n
# 、金融产品与机构
# 、金融产品与机构
股票 320 n
基金 320 n
公募基金 310 n
@@ -351,7 +300,7 @@ QFII 300 n
RQFII 290 n
北向资金机构 300 n
# 、热点概念与行业
# 、热点概念与行业
AI 330 n
人工智能 350 n
算力 330 n
@@ -395,7 +344,7 @@ CXO 300 n
5G 300 n
6G 340 n
# 、交易操作与行情
# 、交易操作与行情
上涨 310 v
下跌 310 v
涨停 310 v
@@ -473,7 +422,7 @@ CXO 300 n
震荡上行 320 v
震荡下行 320 v
# 、委托交易与规则
# 、委托交易与规则
限价委托 340 n
市价委托 340 n
止损委托 330 n

View File

@@ -1,26 +1,185 @@
公司 0.1 n
国家 0.1 n
国际 0.1 n
会议 0.1 n
市场 0.1 n
经济 0.1 n
技术 0.1 n
记者 0.1 n
时间 0.1 n
项目 0.1 n
问题 0.1 n
企业 0.1 n
财联社 0.1 n
上涨 0.1 v
下跌 0.1 v
期货 0.1 n
跌幅 0.1 n
跌超 0.1 adj
股票 0.1 n
# 补充热点概念与板块Jieba/gse兼容格式
# 权重说明核心热点500-700分事件类400分负权重词汇按需求保留
# 一、负权重低优先级词汇(减少无差别匹配干扰)
公司 -0.1 n
国家 -0.1 n
国际 -0.1 n
会议 -0.1 n
市场 -0.1 n
经济 -0.1 n
技术 -0.1 n
记者 -0.1 n
时间 -0.1 n
项目 -0.1 n
问题 -0.1 n
企业 -0.1 n
财联社 -0.1 n
上涨 -0.1 v
下跌 -0.1 v
期货 -0.1 n
跌幅 -0.1 n
跌超 -0.1 adj
股票 -0.1 n
基金 -0.1 n
电讯 -0.1 n
建筑 -0.1 n
平开 -0.1 n
保险 -0.1 n
行业 -0.1 n
其他 -0.1 n
# 二、核心热点概念700分最高优先级
比特币 700 n
摩尔线程 700 n
摩尔线程概念 700 n
AI算力 700 n
生成式AI 700 n
量子计算 700 n
脑机接口 700 n
6G通信 700 n
人形机器人 700 n
固态电池 700 n
ChatGPT概念 700 n
Web3.0 700 n
元宇宙 700 n
数字孪生 700 n
量子通信 700 n
# 三、重点赛道板块500分高优先级
冰雪旅游 500 n
特高压 500 n
跨境电商 500 n
俄乌冲突 400 n
新能源汽车 500 n
机器人 500 n
具身智能 500 n
具身智能 500 n
油气 500 n
商业航天 500 n
光伏储能 500 n
锂电材料 500 n
半导体设备 500 n
集成电路 500 n
创新药 500 n
CXO 500 n
医疗器械 500 n
数字经济 500 n
数字货币 500 n
区块链 500 n
低空经济 500 n
工业互联网 500 n
物联网 500 n
5G应用 500 n
充电桩 500 n
氢能源 500 n
核聚变 500 n
工业母机 500 n
新材料 500 n
生物制造 500 n
智能网联汽车 500 n
乡村振兴 500 n
国企改革 500 n
央企重组 500 n
跨境金融 500 n
自贸港 500 n
一带一路 500 n
绿色低碳 500 n
碳交易 500 n
数据要素 500 n
数字基建 500 n
东数西算 500 n
国产替代 500 n
信创 500 n
网络安全 500 n
算力网络 500 n
边缘计算 500 n
虚拟现实 500 n
增强现实 500 n
智能穿戴 500 n
智能家居 500 n
车联网 500 n
激光雷达 500 n
氮化镓 500 n
碳化硅 500 n
第三代半导体 500 n
EDA工具 500 n
光刻胶 500 n
芯片设计 500 n
封装测试 500 n
储能电池 500 n
钠离子电池 500 n
氢燃料电池 500 n
光伏组件 500 n
风电设备 500 n
特高压设备 500 n
电力物联网 500 n
智能电网 500 n
轨道交通 500 n
航空航天 500 n
海洋工程 500 n
高端装备 500 n
军工电子 500 n
卫星互联网 500 n
北斗导航 500 n
国产大飞机 500 n
生物医药 500 n
基因测序 500 n
疫苗 500 n
医疗美容 500 n
养老产业 500 n
教育信息化 500 n
体育产业 500 n
文化创意 500 n
旅游复苏 500 n
预制菜 500 n
白酒 500 n
食品饮料 500 n
家电下乡 500 n
房地产复苏 500 n
基建投资 500 n
新型城镇化 500 n
冷链物流 500 n
快递物流 500 n
跨境支付 500 n
金融科技 500 n
消费电子 500 n
元宇宙基建 500 n
数字藏品 500 n
NFT 500 n
绿色电力 500 n
节能降碳 500 n
抽水蓄能 500 n
生物质能 500 n
地热能 500 n
潮汐能 500 n
# 四、事件驱动型概念400分中优先级
俄乌冲突 400 n
中东局势 400 n
美联储加息 400 n
降息预期 400 n
贸易摩擦 400 n
供应链重构 400 n
能源危机 400 n
粮食安全 400 n
疫情复苏 400 n
政策利好 400 n
产业扶持 400 n
技术突破 400 n
并购重组 400 n
IPO提速 400 n
解禁潮 400 n
北向资金流入 400 n
南向资金流入 400 n
主力资金异动 400 n
行业景气度 400 n
业绩预增 400 n
商誉减值 400 n
退市风险 400 n
监管新规 400 n
税收优惠 400 n
补贴政策 400 n
基建刺激 400 n
消费刺激 400 n
新能源补贴 400 n
碳达峰政策 400 n
碳中和目标 400 n

View File

@@ -1031,9 +1031,9 @@ func (m MarketNewsApi) CailianpressWeb(searchWords string) *models.CailianpressW
func (m MarketNewsApi) GetNews24HoursList(source string, limit int) *[]*models.Telegraph {
news := &[]*models.Telegraph{}
if source != "" {
db.Dao.Model(news).Preload("TelegraphTags").Where("source=? and created_at>?", source, time.Now().Add(-24*time.Hour)).Order("id desc,is_red desc").Limit(limit).Find(news)
db.Dao.Model(news).Preload("TelegraphTags").Where("source=? and created_at>?", source, time.Now().Add(-24*time.Hour)).Order("created_at desc,is_red desc").Limit(limit).Find(news)
} else {
db.Dao.Model(news).Preload("TelegraphTags").Where("created_at>?", time.Now().Add(-24*time.Hour)).Order("id desc,is_red desc").Limit(limit).Find(news)
db.Dao.Model(news).Preload("TelegraphTags").Where("created_at>?", time.Now().Add(-24*time.Hour)).Order("created_at desc,is_red desc").Limit(limit).Find(news)
}
// 内容去重
uniqueNews := make([]*models.Telegraph, 0)

View File

@@ -37,10 +37,10 @@ func (s SearchStockApi) SearchStock(pageSize int) map[string]any {
"matchWord": "",
"timestamp": "%d",
"shareToGuba": false,
"requestId": "RMd3Y76AJI98axPvdhdbKvbBDVwLlUK61761559950168",
"requestId": "",
"needCorrect": true,
"removedConditionIdList": [],
"xcId": "xc0d61279aad33008260",
"xcId": "",
"ownSelectAll": false,
"dxInfo": [],
"extraCondition": ""

View File

@@ -4,14 +4,22 @@ import (
"encoding/json"
"go-stock/backend/db"
"go-stock/backend/logger"
"math"
"testing"
"github.com/duke-git/lancet/v2/convertor"
"github.com/duke-git/lancet/v2/random"
)
func TestSearchStock(t *testing.T) {
db.Init("../../data/stock.db")
e := convertor.ToString(math.Floor(float64(9*random.RandFloat(0, 1, 12) + 1)))
for i := 0; i < 19; i++ {
e += convertor.ToString(math.Floor(float64(9 * random.RandFloat(0, 1, 12))))
}
logger.SugaredLogger.Infof("e:%s", e)
res := NewSearchStockApi("量比大于2基本面优秀2025年三季报已披露主力连续3日净流入非创业板非科创板非ST").SearchStock(20)
logger.SugaredLogger.Infof("res:%+v", res)
data := res["data"].(map[string]any)

View File

@@ -38,14 +38,14 @@ var (
// 负面金融词汇及其权重
negativeFinanceWords = map[string]float64{
"跌": 1.0, "下跌": 2.0, "跌停": 3.0, "熊市": 3.0, "回调": 1.5, "新低": 2.5,
"跌": 2.0, "下跌": 2.0, "跌停": 3.0, "熊市": 3.0, "回调": 2.5, "新低": 2.5,
"利空": 2.5, "减持": 2.0, "卖出": 2.0, "看空": 2.0, "亏损": 2.5,
"下滑": 2.0, "萎缩": 2.0, "不及预期": 2.5, "疲软": 1.5, "恶化": 2.0,
"衰退": 2.0, "跌破": 2.0, "创新低": 3.0, "走弱": 1.5, "下挫": 1.5,
"衰退": 2.0, "跌破": 2.0, "创新低": 3.0, "走弱": 2.5, "下挫": 2.5,
"利空消息": 3.0, "收益下降": 2.5, "利润下滑": 2.5, "业绩不佳": 2.5,
"垃圾股": 2.0, "风险股": 2.0, "弱势": 1.5, "走低": 1.5, "缩量": 2.5,
"大跌": 2.5, "暴跌": 3.0, "崩盘": 3.0, "跳水": 3.0, "重挫": 3.0, "跌超": 2.5, "跌逾": 2.5,
"被抓": 3.0, "被抓捕": 3.0,
"垃圾股": 2.0, "风险股": 2.0, "弱势": 2.5, "走低": 2.5, "缩量": 2.5,
"大跌": 2.5, "暴跌": 3.0, "崩盘": 3.0, "跳水": 3.0, "重挫": 3.0, "跌超": 2.5, "跌逾": 2.5, "跌近": 3.0,
"被抓": 3.0, "被抓捕": 3.0, "回吐": 3.0, "转跌": 3.0,
}
// 否定词,用于反转情感极性
@@ -88,9 +88,9 @@ func InitAnalyzeSentiment() {
if strutil.Trim(stock.Name) == "" {
continue
}
err := seg.AddToken(stock.Name, basefreq+500, "n")
err := seg.AddToken(stock.Name, basefreq+100, "n")
if strutil.Trim(stock.BKName) != "" {
err = seg.AddToken(stock.BKName, basefreq+500, "n")
err = seg.AddToken(stock.BKName, basefreq+100, "n")
}
if err != nil {
logger.SugaredLogger.Errorf("添加%s失败:%s", stock.Name, err.Error())
@@ -102,9 +102,9 @@ func InitAnalyzeSentiment() {
if strutil.Trim(stock.Name) == "" {
continue
}
err := seg.AddToken(stock.Name, basefreq+500, "n")
err := seg.AddToken(stock.Name, basefreq+100, "n")
if strutil.Trim(stock.BKName) != "" {
err = seg.AddToken(stock.BKName, basefreq+500, "n")
err = seg.AddToken(stock.BKName, basefreq+100, "n")
}
if err != nil {
logger.SugaredLogger.Errorf("添加%s失败:%s", stock.Name, err.Error())
@@ -119,9 +119,9 @@ func InitAnalyzeSentiment() {
// }
//}
tags := &[]models.Tags{}
db.Dao.Model(&models.Tags{}).Find(tags)
db.Dao.Model(&models.Tags{}).Where("type = ?", "subject").Find(tags)
for _, tag := range *tags {
err := seg.AddToken(tag.Name, basefreq, "n")
err := seg.ReAddToken(tag.Name, basefreq+100, "n")
if err != nil {
logger.SugaredLogger.Errorf("添加%s失败:%s", tag.Name, err.Error())
}
@@ -141,7 +141,7 @@ func InitAnalyzeSentiment() {
k := strutil.SplitAndTrim(line, " ")
switch len(k) {
case 1:
err = seg.ReAddToken(k[0], 100)
err = seg.ReAddToken(k[0], basefreq)
case 2:
freq, _ := convertor.ToFloat(k[1])
err = seg.ReAddToken(k[0], freq)
@@ -267,7 +267,7 @@ func countWordFrequencyWithWeight(text string) map[string]WordFreqWithWeight {
// 构建包含权重的结果
for word, frequency := range wordCount {
weight := getWordWeight(word)
if weight > 200 {
if weight > basefreq {
freqMap[word] = WordFreqWithWeight{
Word: word,
Frequency: frequency,

View File

@@ -1,6 +1,6 @@
<script setup>
import {AnalyzeSentimentWithFreqWeight} from "../../wailsjs/go/main/App";
import {AnalyzeSentimentWithFreqWeight,GlobalStockIndexes} from "../../wailsjs/go/main/App";
import * as echarts from "echarts";
import {onMounted,onUnmounted, ref} from "vue";
import _ from "lodash";
@@ -22,24 +22,60 @@ const { name,darkTheme,kDays ,chartHeight} = defineProps({
default: false
}
})
const common = ref([])
const america = ref([])
const europe = ref([])
const asia = ref([])
const mainIndex = ref([])
const chinaIndex = ref([])
const other = ref([])
const globalStockIndexes = ref(null)
const chartRef = ref(null);
const gaugeChartRef = ref(null);
const triggerAreas=ref(["main","extra","arrow"])
let handleChartInterval=null
let handleIndexInterval=null
onMounted(() => {
handleChart()
getIndex()
handleChartInterval=setInterval(function () {
handleChart()
}, 1000 * 60)
handleIndexInterval=setInterval(function () {
getIndex()
}, 1000 * 2)
})
onUnmounted(()=>{
clearInterval(handleChartInterval)
clearInterval(handleIndexInterval)
})
function getIndex() {
GlobalStockIndexes().then((res) => {
globalStockIndexes.value = res
common.value = res["common"]
america.value = res["america"]
europe.value = res["europe"]
asia.value = res["asia"]
other.value = res["other"]
mainIndex.value=asia.value.filter(function (item) {
return ['上海',"深圳","香港","台湾","北京","东京","首尔","纽约","纳斯达克"].includes(item.location)
}).concat(america.value.filter(function (item) {
return ['上海',"深圳","香港","台湾","北京","东京","首尔","纽约","纳斯达克"].includes(item.location)
}))
chinaIndex.value=asia.value.filter(function (item) {
return ['上海',"深圳","香港","台湾","北京"].includes(item.location)
})
})
}
function handleChart(){
const formatUtil = echarts.format;
AnalyzeSentimentWithFreqWeight("").then((res) => {
console.log(res)
//console.log(res)
const treemapchart = echarts.init(chartRef.value);
const gaugeChart=echarts.init(gaugeChartRef.value);
let data = res['frequencies'].map(item => ({
@@ -117,7 +153,7 @@ function handleChart(){
},
tooltip: {
formatter: function (info) {
var value = info.value;
var value = info.value.toFixed(2);
var frequency = info.data.frequency;
var weight = info.data.weight;
return [
@@ -235,7 +271,7 @@ function handleChart(){
data: [
{
value: res.result.Score*0.2,
name: '市场情绪'
name: '市场情绪强弱'
}
]
}
@@ -247,14 +283,26 @@ function handleChart(){
</script>
<template>
<n-grid :cols="24" :y-gap="0">
<n-gi span="6">
<div ref="gaugeChartRef" style="width: 100%;height: auto;--wails-draggable:no-drag" :style="{height:chartHeight+'px'}" ></div>
</n-gi>
<n-gi span="18">
<div ref="chartRef" style="width: 100%;height: auto;--wails-draggable:no-drag" :style="{height:chartHeight+'px'}" ></div>
</n-gi>
</n-grid>
<n-collapse :trigger-areas="triggerAreas" :default-expanded-names="['1']" display-directive="show">
<n-collapse-item name="1" >
<template #header>
<n-flex>
<n-tag size="small" :bordered="false" v-for="(item, index) in mainIndex" :type="item.zdf>0?'error':'success'"> {{item.name}} {{item.zxj}} <n-number-animation :precision="2" :from="0" :to="item.zdf"/>%</n-tag>
</n-flex>
</template>
<template #header-extra>
主要股指
</template>
<n-grid :cols="24" :y-gap="0">
<n-gi span="6">
<div ref="gaugeChartRef" style="width: 100%;height: auto;--wails-draggable:no-drag" :style="{height:chartHeight+'px'}" ></div>
</n-gi>
<n-gi span="18">
<div ref="chartRef" style="width: 100%;height: auto;--wails-draggable:no-drag" :style="{height:chartHeight+'px'}" ></div>
</n-gi>
</n-grid>
</n-collapse-item>
</n-collapse>
</template>
<style scoped>