feat(fund):添加基金监控和查询功能

- 新增基金数据 API,实现基金信息爬取和数据库操作
- 添加基金监控逻辑,定期更新基金净值信息
- 实现基金列表查询、关注和取消关注功能
- 新增基金相关前端组件,展示基金信息和操作
This commit is contained in:
ArvinLovegood 2025-03-09 19:32:08 +08:00
parent 9a6e210bae
commit db43da6577
3 changed files with 33 additions and 23 deletions

View File

@ -83,6 +83,12 @@ func (FundBasic) TableName() string {
// CrawlFundBasic 爬取基金基本信息
func (f *FundApi) CrawlFundBasic(fundCode string) (*FundBasic, error) {
defer func() {
if r := recover(); r != nil {
logger.SugaredLogger.Errorf("CrawlFundBasic panic: %v", r)
}
}()
crawler := CrawlerApi{
crawlerBaseInfo: CrawlerBaseInfo{
Name: "天天基金",
@ -254,6 +260,12 @@ func (f *FundApi) UnFollowFund(fundCode string) string {
}
func (f *FundApi) AllFund() {
defer func() {
if r := recover(); r != nil {
logger.SugaredLogger.Errorf("AllFund panic: %v", r)
}
}()
response, err := f.client.SetTimeout(time.Duration(f.config.CrawlTimeOut)*time.Second).R().
SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36").
Get("https://fund.eastmoney.com/allfund.html")
@ -272,8 +284,7 @@ func (f *FundApi) AllFund() {
name := text[0]
str := strutil.SplitAndTrim(name, "", "", "")
logger.SugaredLogger.Infof("%d,基金信息 code:%s,name:%s", cnt, str[0], str[1])
//f.CrawlFundBasic(str[0])
//go f.CrawlFundBasic(str[0])
fund := &FundBasic{
Code: str[0],
Name: str[1],
@ -282,8 +293,6 @@ func (f *FundApi) AllFund() {
db.Dao.Model(fund).Where("code=?", fund.Code).Count(&count)
if count == 0 {
db.Dao.Create(fund)
} else {
db.Dao.Model(fund).Where("code=?", fund.Code).Updates(fund)
}
}

View File

@ -124,7 +124,7 @@ function getFundList(value){
options.value=[]
result.forEach(item=>{
options.value.push({
label: item.name,
label: item.name+" ["+item.code+"]",
value: item.code,
})
})

37
main.go
View File

@ -75,7 +75,6 @@ func main() {
if stocksBinUS != nil && len(stocksBinUS) > 0 {
go initStockDataUS()
}
updateBasicInfo()
// Create an instance of the app structure
@ -191,34 +190,34 @@ func main() {
}
func initStockDataUS() {
var count int64
db.Dao.Model(&models.StockInfoUS{}).Count(&count)
if count > 0 {
return
}
var v []models.StockInfoUS
log.Printf("init stock data us %d", len(v))
err := json.Unmarshal(stocksBinUS, &v)
if err != nil {
return
}
for _, item := range v {
var count int64
db.Dao.Model(&models.StockInfoUS{}).Count(&count)
if count > 0 {
return
}
db.Dao.Model(&models.StockInfoUS{}).Create(&item)
}
log.Printf("init stock data us %d", len(v))
}
func initStockDataHK() {
var count int64
db.Dao.Model(&models.StockInfoHK{}).Count(&count)
if count > 0 {
return
}
var v []models.StockInfoHK
err := json.Unmarshal(stocksBinHK, &v)
if err != nil {
return
}
for _, item := range v {
var count int64
db.Dao.Model(&models.StockInfoHK{}).Count(&count)
if count > 0 {
continue
}
db.Dao.Model(&models.StockInfoHK{}).Create(&item)
}
log.Printf("init stock data hk %d", len(v))
@ -234,11 +233,6 @@ func updateBasicInfo() {
}
func initStockData() {
var count int64
db.Dao.Model(&data.StockBasic{}).Count(&count)
if count > 0 {
return
}
logger.NewDefaultLogger().Info("init stock data")
res := &data.TushareStockBasicResponse{}
err := json.Unmarshal(stocksBin, res)
@ -265,7 +259,14 @@ func initStockData() {
stock.Cnspell = convertor.ToString(item[14])
stock.Fullname = convertor.ToString(item[20])
stock.Ename = convertor.ToString(item[21])
db.Dao.Model(&data.StockBasic{}).FirstOrCreate(stock, &data.StockBasic{TsCode: stock.TsCode}).Updates(stock)
var count int64
db.Dao.Model(&data.StockBasic{}).Where("ts_code = ?", stock.TsCode).Count(&count)
if count > 0 {
continue
} else {
db.Dao.Create(stock)
}
}
}