diff --git a/backend/data/market_news_api.go b/backend/data/market_news_api.go index 628dd85..d1e5938 100644 --- a/backend/data/market_news_api.go +++ b/backend/data/market_news_api.go @@ -425,6 +425,15 @@ func (m MarketNewsApi) StockResearchReport(stockCode string, days int) []any { if strutil.ContainsAny(stockCode, []string{"."}) { stockCode = strings.Split(stockCode, ".")[0] beginDate = time.Now().Add(-time.Duration(days) * 365 * time.Hour).Format("2006-01-02") + } else { + stockCode = strutil.ReplaceWithMap(stockCode, map[string]string{ + "sh": "", + "sz": "", + "gb_": "", + "us": "", + "us_": "", + }) + beginDate = time.Now().Add(-time.Duration(days) * 365 * time.Hour).Format("2006-01-02") } logger.SugaredLogger.Infof("StockResearchReport-stockCode:%s", stockCode) @@ -481,6 +490,15 @@ func (m MarketNewsApi) StockNotice(stock_list string) []any { if strutil.ContainsAny(stockCode, []string{"."}) { stockCode = strings.Split(stockCode, ".")[0] stockCodes = append(stockCodes, stockCode) + } else { + stockCode = strutil.ReplaceWithMap(stockCode, map[string]string{ + "sh": "", + "sz": "", + "gb_": "", + "us": "", + "us_": "", + }) + stockCodes = append(stockCodes, stockCode) } } @@ -530,3 +548,29 @@ func (m MarketNewsApi) EMDictCode(code string, cache *freecache.Cache) []any { cache.Set([]byte(code), resp.Body(), 60*60*24) return respMap["data"].([]any) } + +func (m MarketNewsApi) TradingViewNews() *[]models.TVNews { + TVNews := &[]models.TVNews{} + url := "https://news-mediator.tradingview.com/news-flow/v2/news?filter=lang:zh-Hans&filter=provider:panews,reuters&client=screener&streaming=false" + resp, err := resty.New().SetProxy("http://127.0.0.1:10809").SetTimeout(time.Duration(30)*time.Second).R(). + SetHeader("Host", "news-mediator.tradingview.com"). + SetHeader("Origin", "https://cn.tradingview.com"). + SetHeader("Referer", "https://cn.tradingview.com/"). + SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0"). + Get(url) + if err != nil { + logger.SugaredLogger.Errorf("TradingViewNews err:%s", err.Error()) + return TVNews + } + respMap := map[string]any{} + err = json.Unmarshal(resp.Body(), &respMap) + if err != nil { + return TVNews + } + items, err := json.Marshal(respMap["items"]) + if err != nil { + return TVNews + } + json.Unmarshal(items, TVNews) + return TVNews +} diff --git a/backend/data/market_news_api_test.go b/backend/data/market_news_api_test.go index 87bccdd..01d489b 100644 --- a/backend/data/market_news_api_test.go +++ b/backend/data/market_news_api_test.go @@ -100,3 +100,11 @@ func TestEMDictCode(t *testing.T) { } } + +func TestTradingViewNews(t *testing.T) { + db.Init("../../data/stock.db") + resp := NewMarketNewsApi().TradingViewNews() + for _, a := range *resp { + logger.SugaredLogger.Debugf("value: %+v", a) + } +} diff --git a/backend/data/stock_sentiment_analysis_test.go b/backend/data/stock_sentiment_analysis_test.go index 3779b5e..b53a960 100644 --- a/backend/data/stock_sentiment_analysis_test.go +++ b/backend/data/stock_sentiment_analysis_test.go @@ -2,6 +2,7 @@ package data import ( "fmt" + "strings" "testing" ) @@ -19,6 +20,10 @@ func TestAnalyzeSentiment(t *testing.T) { //text = " 【三大指数均跌逾1% 下跌个股近4800只】财联社6月19日电,指数持续走弱,沪指下挫跌逾1.00%,深成指跌1.25%,创业板指跌1.39%。核聚变、风电、军工、食品消费等板块指数跌幅居前,沪深京三市下跌个股近4800只。\n" text = "【银行理财首单网下打新落地】财联社6月20日电,记者从多渠道获悉,光大理财以申报价格17元参与信通电子网下打新,并成功入围有效报价,成为行业内首家参与网下打新的银行理财公司。光大理财工作人员向证券时报记者表示,本次光大理财是以其管理的混合类产品“阳光橙增盈绝对收益策略”参与了此次网下打新,该产品为光大理财“固收+”银行理财产品。资料显示,信通电子成立于1996年,核心产品包括输电线路智能巡检系统、变电站智能辅控系统、移动智能终端及其他产品。根据其招股说明书,信通电子2023、2024年营业收入分别较上年增长19.08%和7.97%,净利润分别较上年增长5.6%和15.11%。 (证券时报)" text = " 【以军称拦截数枚伊朗导弹】财联社6月20日电,据央视新闻报道,以军在贝尔谢巴及周边区域拦截了数枚伊朗导弹,但仍有导弹或拦截残骸落地。以色列国防军发文表示,搜救队伍正在一处“空中物体落地”的所在区域开展工作,公众目前可以离开避难场所。伊朗方面对上述说法暂无回应。" + + words := splitWords(text) + fmt.Println(strings.Join(words, " ")) + result := AnalyzeSentiment(text) // 输出结果 diff --git a/backend/models/models.go b/backend/models/models.go index 4c2fe64..f513055 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -303,3 +303,17 @@ type LongTigerRankData struct { func (l LongTigerRankData) TableName() string { return "long_tiger_rank" } + +type TVNews struct { + Id string `json:"id"` + Title string `json:"title"` + Published int `json:"published"` + Urgency int `json:"urgency"` + Permission string `json:"permission"` + StoryPath string `json:"storyPath"` + Provider struct { + Id string `json:"id"` + Name string `json:"name"` + LogoId string `json:"logo_id"` + } `json:"provider"` +} diff --git a/frontend/src/components/StockNoticeList.vue b/frontend/src/components/StockNoticeList.vue index 8eabb74..4b910c0 100644 --- a/frontend/src/components/StockNoticeList.vue +++ b/frontend/src/components/StockNoticeList.vue @@ -6,11 +6,20 @@ import {RefreshCircleSharp} from "@vicons/ionicons5"; import _ from "lodash"; import KLineChart from "./KLineChart.vue"; import MoneyTrend from "./moneyTrend.vue"; +import {useMessage} from "naive-ui"; +const {stockCode}=defineProps( + { + stockCode: { + type: String, + default: '' + } + } +) const list = ref([]) const options = ref([]) - +const message=useMessage() function getNotice(stockCodes) { StockNotice(stockCodes).then(result => { console.log(result) @@ -19,7 +28,8 @@ function getNotice(stockCodes) { } onBeforeMount (()=>{ - getNotice(''); + //message.info("正在获取数据"+stockCode) + getNotice(stockCode); }) function findStockList(query){ diff --git a/frontend/src/components/StockResearchReportList.vue b/frontend/src/components/StockResearchReportList.vue index fa719b5..f4fb192 100644 --- a/frontend/src/components/StockResearchReportList.vue +++ b/frontend/src/components/StockResearchReportList.vue @@ -8,6 +8,15 @@ import MoneyTrend from "./moneyTrend.vue"; import {useMessage} from "naive-ui"; import {BrowserOpenURL} from "../../wailsjs/runtime"; +const {stockCode}=defineProps( + { + stockCode: { + type: String, + default: '' + } + } +) + const message=useMessage() const list = ref([]) @@ -21,7 +30,7 @@ function getStockResearchReport(value) { } onBeforeMount(()=>{ - getStockResearchReport(''); + getStockResearchReport(stockCode); }) function ratingChangeName(ratingChange){ diff --git a/frontend/src/components/market.vue b/frontend/src/components/market.vue index 2be0268..7944673 100644 --- a/frontend/src/components/market.vue +++ b/frontend/src/components/market.vue @@ -63,6 +63,7 @@ const sort = ref("0") const nowTab = ref("市场快讯") const indexInterval = ref(null) const indexIndustryRank = ref(null) +const stockCode= ref('') function getIndex() { GlobalStockIndexes().then((res) => { @@ -79,6 +80,7 @@ function getIndex() { onBeforeMount(() => { nowTab.value = route.query.name + stockCode.value = route.query.stockCode GetConfig().then(result => { summaryBTN.value = result.openAiEnable darkTheme.value = result.darkTheme @@ -547,10 +549,10 @@ function ReFlesh(source) { - + - + diff --git a/frontend/src/components/stock.vue b/frontend/src/components/stock.vue index 2d95abb..379b9cc 100644 --- a/frontend/src/components/stock.vue +++ b/frontend/src/components/stock.vue @@ -1609,6 +1609,25 @@ function delStockGroup(code,name,groupId){ message.info(result) }) } + +function searchNotice(stockCode){ + router.push({ + name: 'market', + query: { + name: '公司公告', + stockCode: stockCode, + }, + }) +} +function searchStockReport(stockCode){ + router.push({ + name: 'market', + query: { + name: '个股研报', + stockCode: stockCode, + }, + }) +} @@ -1824,23 +1846,25 @@ function delStockGroup(code,name,groupId){