From a8ecbf9329872644f35b39aadbb285bb1cee03ea Mon Sep 17 00:00:00 2001 From: ArvinLovegood Date: Thu, 12 Jun 2025 15:38:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(frontend):=E6=B7=BB=E5=8A=A0=E9=BE=99?= =?UTF-8?q?=E8=99=8E=E6=A6=9C=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在前端 App.vue 中添加龙虎榜相关路由和图标 - 实现龙虎榜数据获取和展示功能 - 添加龙虎榜数据模型和 API 接口 - 更新后端 MarketNewsApi 类,增加 LongTiger 方法获取龙虎榜数据 --- app_common.go | 15 + backend/data/market_news_api.go | 50 ++++ backend/data/market_news_api_test.go | 6 + backend/data/openai_api.go | 2 +- backend/models/models.go | 25 ++ frontend/src/App.vue | 41 ++- frontend/src/components/market.vue | 428 ++++++++++++++++++++------- frontend/src/router/router.js | 1 + frontend/wailsjs/go/main/App.d.ts | 2 + frontend/wailsjs/go/main/App.js | 4 + go.mod | 3 + go.sum | 6 + main.go | 1 + 13 files changed, 458 insertions(+), 126 deletions(-) create mode 100644 app_common.go diff --git a/app_common.go b/app_common.go new file mode 100644 index 0000000..0418174 --- /dev/null +++ b/app_common.go @@ -0,0 +1,15 @@ +package main + +import ( + "go-stock/backend/data" + "go-stock/backend/models" +) + +// @Author spark +// @Date 2025/6/8 20:45 +// @Desc +//----------------------------------------------------------------------------------- + +func (a *App) LongTigerRank(date string) *[]models.LongTigerRankData { + return data.NewMarketNewsApi().LongTiger(date) +} diff --git a/backend/data/market_news_api.go b/backend/data/market_news_api.go index f10600f..ce48c6f 100644 --- a/backend/data/market_news_api.go +++ b/backend/data/market_news_api.go @@ -10,6 +10,7 @@ import ( "github.com/go-resty/resty/v2" "github.com/robertkrimen/otto" "github.com/samber/lo" + "github.com/tidwall/gjson" "go-stock/backend/db" "go-stock/backend/logger" "go-stock/backend/models" @@ -318,3 +319,52 @@ func (m MarketNewsApi) TopStocksRankingList(date string) { }) } + +func (m MarketNewsApi) LongTiger(date string) *[]models.LongTigerRankData { + ranks := &[]models.LongTigerRankData{} + url := "https://datacenter-web.eastmoney.com/api/data/v1/get" + logger.SugaredLogger.Infof("url:%s", url) + params := make(map[string]string) + params["callback"] = "callback" + params["sortColumns"] = "TURNOVERRATE,TRADE_DATE,SECURITY_CODE" + params["sortTypes"] = "-1,-1,1" + params["pageSize"] = "500" + params["pageNumber"] = "1" + params["reportName"] = "RPT_DAILYBILLBOARD_DETAILSNEW" + params["columns"] = "SECURITY_CODE,SECUCODE,SECURITY_NAME_ABBR,TRADE_DATE,EXPLAIN,CLOSE_PRICE,CHANGE_RATE,BILLBOARD_NET_AMT,BILLBOARD_BUY_AMT,BILLBOARD_SELL_AMT,BILLBOARD_DEAL_AMT,ACCUM_AMOUNT,DEAL_NET_RATIO,DEAL_AMOUNT_RATIO,TURNOVERRATE,FREE_MARKET_CAP,EXPLANATION,D1_CLOSE_ADJCHRATE,D2_CLOSE_ADJCHRATE,D5_CLOSE_ADJCHRATE,D10_CLOSE_ADJCHRATE,SECURITY_TYPE_CODE" + params["source"] = "WEB" + params["client"] = "WEB" + params["filter"] = fmt.Sprintf("(TRADE_DATE<='%s')(TRADE_DATE>='%s')", date, date) + resp, err := resty.New().SetTimeout(time.Duration(15)*time.Second).R(). + SetHeader("Host", "datacenter-web.eastmoney.com"). + SetHeader("Referer", "https://data.eastmoney.com/stock/tradedetail.html"). + SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0"). + SetQueryParams(params). + Get(url) + if err != nil { + return ranks + } + js := string(resp.Body()) + logger.SugaredLogger.Infof("resp:%s", js) + + js = strutil.ReplaceWithMap(js, + map[string]string{ + "callback(": "var data=", + ");": ";", + }) + //logger.SugaredLogger.Info(js) + vm := otto.New() + _, err = vm.Run(js) + _, err = vm.Run("var data = JSON.stringify(data);") + value, err := vm.Get("data") + logger.SugaredLogger.Infof("resp-json:%s", value.String()) + data := gjson.Get(value.String(), "result.data") + logger.SugaredLogger.Infof("resp:%v", data) + err = json.Unmarshal([]byte(data.String()), ranks) + if err != nil { + logger.SugaredLogger.Error(err) + return ranks + } + db.Dao.Create(*ranks) + return ranks +} diff --git a/backend/data/market_news_api_test.go b/backend/data/market_news_api_test.go index 6d28745..dd2eabb 100644 --- a/backend/data/market_news_api_test.go +++ b/backend/data/market_news_api_test.go @@ -58,3 +58,9 @@ func TestGetStockMoneyTrendByDay(t *testing.T) { func TestTopStocksRankingList(t *testing.T) { NewMarketNewsApi().TopStocksRankingList("2025-05-19") } + +func TestLongTiger(t *testing.T) { + db.Init("../../data/stock.db") + + NewMarketNewsApi().LongTiger("2025-06-08") +} diff --git a/backend/data/openai_api.go b/backend/data/openai_api.go index 93d5ee8..b5a9ae4 100644 --- a/backend/data/openai_api.go +++ b/backend/data/openai_api.go @@ -161,7 +161,7 @@ func (o OpenAi) NewSummaryStockNewsStream(userQuestion string, sysPromptId *int) }() wg.Wait() - news := NewMarketNewsApi().GetNewsList("财联社电报", 100) + news := NewMarketNewsApi().GetNewsList("新浪财经", 100) messageText := strings.Builder{} for _, telegraph := range *news { messageText.WriteString("## " + telegraph.Time + ":" + "\n") diff --git a/backend/models/models.go b/backend/models/models.go index b121d34..55598a1 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -277,3 +277,28 @@ type SinaStockInfo struct { MarketValue string `json:"market_value"` PeRatio string `json:"pe_ratio"` } + +type LongTigerRankData struct { + ACCUMAMOUNT float64 `json:"ACCUM_AMOUNT"` + BILLBOARDBUYAMT float64 `json:"BILLBOARD_BUY_AMT"` + BILLBOARDDEALAMT float64 `json:"BILLBOARD_DEAL_AMT"` + BILLBOARDNETAMT float64 `json:"BILLBOARD_NET_AMT"` + BILLBOARDSELLAMT float64 `json:"BILLBOARD_SELL_AMT"` + CHANGERATE float64 `json:"CHANGE_RATE"` + CLOSEPRICE float64 `json:"CLOSE_PRICE"` + DEALAMOUNTRATIO float64 `json:"DEAL_AMOUNT_RATIO"` + DEALNETRATIO float64 `json:"DEAL_NET_RATIO"` + EXPLAIN string `json:"EXPLAIN"` + EXPLANATION string `json:"EXPLANATION"` + FREEMARKETCAP float64 `json:"FREE_MARKET_CAP"` + SECUCODE string `json:"SECUCODE"` + SECURITYCODE string `json:"SECURITY_CODE"` + SECURITYNAMEABBR string `json:"SECURITY_NAME_ABBR"` + SECURITYTYPECODE string `json:"SECURITY_TYPE_CODE"` + TRADEDATE string `json:"TRADE_DATE"` + TURNOVERRATE float64 `json:"TURNOVERRATE"` +} + +func (l LongTigerRankData) TableName() string { + return "long_tiger_rank" +} diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 689bef0..c0ca9c4 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -10,19 +10,19 @@ import { } from '../wailsjs/runtime' import {h, onBeforeMount, onBeforeUnmount, onMounted, ref} from "vue"; import {RouterLink, useRouter} from 'vue-router' -import {darkTheme, NIcon, NText,} from 'naive-ui' +import {darkTheme, NIcon, NText,dateZhCN,zhCN} from 'naive-ui' import { AlarmOutline, AnalyticsOutline, - BarChartSharp, - ExpandOutline, - Flame, + BarChartSharp, EaselSharp, + ExpandOutline, Flag, + Flame, FlameSharp, LogoGithub, NewspaperOutline, NewspaperSharp, - PowerOutline, + PowerOutline, Pulse, ReorderTwoOutline, - SettingsOutline, + SettingsOutline, Skull, SkullOutline, SkullSharp, SparklesOutline, StarOutline, Wallet, @@ -196,7 +196,7 @@ const menuOptions = ref([ {default: () => '行业排名',} ), key: 'market4', - icon: renderIcon(Flame), + icon: renderIcon(Flag), }, { label: () => @@ -217,8 +217,29 @@ const menuOptions = ref([ {default: () => '个股资金流向',} ), key: 'market5', - icon: renderIcon(Wallet), - } + icon: renderIcon(Pulse), + }, + { + label: () => + h( + RouterLink, + { + href: '#', + to: { + name: 'market', + query: { + name: "龙虎榜", + } + }, + onClick: () => { + EventsEmit("changeMarketTab", {ID: 0, name: '龙虎榜'}) + }, + }, + {default: () => '龙虎榜',} + ), + key: 'market6', + icon: renderIcon(Skull), + }, ] }, { @@ -457,7 +478,7 @@ onMounted(() => {