mirror of
https://github.com/ArvinLovegood/go-stock.git
synced 2025-07-19 00:00:09 +08:00
feat(frontend):添加个股研报功能
- 在前端新增 StockResearchReportList 组件,用于显示个股研报列表 - 在后端新增 StockResearchReport 接口和实现,获取个股研报数据- 在 App.d.ts 和 App.js 中添加相关函数声明和实现- 在 market.vue 中集成新增的个股研报功能
This commit is contained in:
parent
ed9d9cde77
commit
3ffcaa0374
@ -13,3 +13,7 @@ import (
|
|||||||
func (a *App) LongTigerRank(date string) *[]models.LongTigerRankData {
|
func (a *App) LongTigerRank(date string) *[]models.LongTigerRankData {
|
||||||
return data.NewMarketNewsApi().LongTiger(date)
|
return data.NewMarketNewsApi().LongTiger(date)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *App) StockResearchReport() []any {
|
||||||
|
return data.NewMarketNewsApi().StockResearchReport(7)
|
||||||
|
}
|
||||||
|
@ -377,3 +377,50 @@ func (m MarketNewsApi) LongTiger(date string) *[]models.LongTigerRankData {
|
|||||||
}
|
}
|
||||||
return ranks
|
return ranks
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m MarketNewsApi) StockResearchReport(days int) []any {
|
||||||
|
|
||||||
|
type Req struct {
|
||||||
|
BeginTime string `json:"beginTime"`
|
||||||
|
EndTime string `json:"endTime"`
|
||||||
|
IndustryCode string `json:"industryCode"`
|
||||||
|
RatingChange string `json:"ratingChange"`
|
||||||
|
Rating string `json:"rating"`
|
||||||
|
OrgCode interface{} `json:"orgCode"`
|
||||||
|
Code string `json:"code"`
|
||||||
|
Rcode string `json:"rcode"`
|
||||||
|
PageSize int `json:"pageSize"`
|
||||||
|
PageNo int `json:"pageNo"`
|
||||||
|
P int `json:"p"`
|
||||||
|
PageNum int `json:"pageNum"`
|
||||||
|
PageNumber int `json:"pageNumber"`
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "https://reportapi.eastmoney.com/report/list2"
|
||||||
|
beginDate := time.Now().Add(-time.Duration(days) * 24 * time.Hour).Format("2006-01-02")
|
||||||
|
endDate := time.Now().Format("2006-01-02")
|
||||||
|
logger.SugaredLogger.Infof("beginDate:%s endDate:%s", beginDate, endDate)
|
||||||
|
resp, err := resty.New().SetTimeout(time.Duration(15)*time.Second).R().
|
||||||
|
SetHeader("Host", "reportapi.eastmoney.com").
|
||||||
|
SetHeader("Origin", "https://data.eastmoney.com").
|
||||||
|
SetHeader("Referer", "https://data.eastmoney.com/report/stock.jshtml").
|
||||||
|
SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0").
|
||||||
|
SetHeader("Content-Type", "application/json").
|
||||||
|
SetBody(&Req{
|
||||||
|
BeginTime: beginDate,
|
||||||
|
EndTime: endDate,
|
||||||
|
PageNo: 1,
|
||||||
|
PageSize: 50,
|
||||||
|
P: 1,
|
||||||
|
PageNum: 1,
|
||||||
|
PageNumber: 1,
|
||||||
|
}).Post(url)
|
||||||
|
respMap := map[string]any{}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return []any{}
|
||||||
|
}
|
||||||
|
json.Unmarshal(resp.Body(), &respMap)
|
||||||
|
//logger.SugaredLogger.Infof("resp:%+v", respMap["data"])
|
||||||
|
return respMap["data"].([]any)
|
||||||
|
}
|
||||||
|
@ -64,3 +64,11 @@ func TestLongTiger(t *testing.T) {
|
|||||||
|
|
||||||
NewMarketNewsApi().LongTiger("2025-06-08")
|
NewMarketNewsApi().LongTiger("2025-06-08")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestStockResearchReport(t *testing.T) {
|
||||||
|
db.Init("../../data/stock.db")
|
||||||
|
resp := NewMarketNewsApi().StockResearchReport(7)
|
||||||
|
for _, a := range resp {
|
||||||
|
logger.SugaredLogger.Debugf("value: %+v", a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
103
frontend/src/components/StockResearchReportList.vue
Normal file
103
frontend/src/components/StockResearchReportList.vue
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
<script setup>
|
||||||
|
import {onBeforeMount, ref} from 'vue'
|
||||||
|
import {StockResearchReport} from "../../wailsjs/go/main/App";
|
||||||
|
import {ArrowDownOutline, CaretDown, CaretUp, PulseOutline, Refresh, RefreshCircleSharp,} from "@vicons/ionicons5";
|
||||||
|
|
||||||
|
import KLineChart from "./KLineChart.vue";
|
||||||
|
import MoneyTrend from "./moneyTrend.vue";
|
||||||
|
import {NButton} from "naive-ui";
|
||||||
|
import {BrowserOpenURL} from "../../wailsjs/runtime";
|
||||||
|
|
||||||
|
const list = ref([])
|
||||||
|
|
||||||
|
function getStockResearchReport() {
|
||||||
|
StockResearchReport().then(result => {
|
||||||
|
console.log(result)
|
||||||
|
list.value = result
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
onBeforeMount(()=>{
|
||||||
|
getStockResearchReport();
|
||||||
|
})
|
||||||
|
|
||||||
|
function ratingChangeName(ratingChange){
|
||||||
|
if(ratingChange===0){
|
||||||
|
return '调高'
|
||||||
|
}else if(ratingChange===1){
|
||||||
|
return '调低'
|
||||||
|
}else if(ratingChange===2){
|
||||||
|
return '首次'
|
||||||
|
}else if(ratingChange===3){
|
||||||
|
return '维持'
|
||||||
|
}else if (ratingChange===4){
|
||||||
|
return '无变化'
|
||||||
|
}else{
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function getmMarketCode(market,code) {
|
||||||
|
if(market==="SHENZHEN"){
|
||||||
|
return "sz"+code
|
||||||
|
}else if(market==="SHANGHAI"){
|
||||||
|
return "sh"+code
|
||||||
|
}else if(market==="BEIJING"){
|
||||||
|
return "bj"+code
|
||||||
|
}else if(market==="HONGKONG"){
|
||||||
|
return "hk"+code
|
||||||
|
}else{
|
||||||
|
return code
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function openWin(code) {
|
||||||
|
BrowserOpenURL("https://pdf.dfcfw.com/pdf/H3_"+code+"_1.pdf?1749744888000.pdf")
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<n-table striped size="small">
|
||||||
|
<n-thead>
|
||||||
|
<n-tr>
|
||||||
|
<!-- <n-th>代码</n-th>-->
|
||||||
|
<n-th>名称</n-th>
|
||||||
|
<n-th>行业</n-th>
|
||||||
|
<n-th>标题</n-th>
|
||||||
|
<n-th>东财评级</n-th>
|
||||||
|
<n-th>评级变动</n-th>
|
||||||
|
<n-th>机构评级</n-th>
|
||||||
|
<n-th>分析师</n-th>
|
||||||
|
<n-th>机构</n-th>
|
||||||
|
<n-th> <n-flex justify="space-between">日期<n-icon @click="getStockResearchReport" color="#409EFF" :size="20" :component="RefreshCircleSharp"/></n-flex></n-th>
|
||||||
|
</n-tr>
|
||||||
|
</n-thead>
|
||||||
|
<n-tbody>
|
||||||
|
<n-tr v-for="item in list" :key="item.infoCode">
|
||||||
|
<!-- <n-td>{{item.stockCode}}</n-td>-->
|
||||||
|
<n-td>
|
||||||
|
<n-popover trigger="hover" placement="right">
|
||||||
|
<template #trigger>
|
||||||
|
<n-tag type="info" :bordered="false">{{item.stockName}}</n-tag>
|
||||||
|
</template>
|
||||||
|
<k-line-chart style="width: 800px" :code="getmMarketCode(item.market,item.stockCode)" :chart-height="500" :name="item.stockName" :k-days="20" :dark-theme="true"></k-line-chart>
|
||||||
|
</n-popover>
|
||||||
|
</n-td>
|
||||||
|
<n-td><n-tag type="info" :bordered="false">{{item.indvInduName}}</n-tag></n-td>
|
||||||
|
<n-td>
|
||||||
|
<n-a type="info" @click="openWin(item.infoCode)">{{item.title}}</n-a>
|
||||||
|
</n-td>
|
||||||
|
<n-td><n-text :type="item.emRatingName==='增持'?'error':'info'">
|
||||||
|
{{item.emRatingName}}
|
||||||
|
</n-text></n-td>
|
||||||
|
<n-td><n-text :type="item.ratingChange===0?'error':'info'">{{ratingChangeName(item.ratingChange)}}</n-text></n-td>
|
||||||
|
<n-td>{{item.sRatingName}}</n-td>
|
||||||
|
<n-td>{{item.researcher}}</n-td>
|
||||||
|
<n-td>{{item.orgSName}}</n-td>
|
||||||
|
<n-td>{{item.publishDate.substring(0,10)}}</n-td>
|
||||||
|
</n-tr>
|
||||||
|
</n-tbody>
|
||||||
|
</n-table>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
@ -24,6 +24,7 @@ import {useRoute} from 'vue-router'
|
|||||||
import RankTable from "./rankTable.vue";
|
import RankTable from "./rankTable.vue";
|
||||||
import IndustryMoneyRank from "./industryMoneyRank.vue";
|
import IndustryMoneyRank from "./industryMoneyRank.vue";
|
||||||
import MoneyTrend from "./moneyTrend.vue";
|
import MoneyTrend from "./moneyTrend.vue";
|
||||||
|
import StockResearchReportList from "./StockResearchReportList.vue";
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const icon = ref('https://raw.githubusercontent.com/ArvinLovegood/go-stock/master/build/appicon.png');
|
const icon = ref('https://raw.githubusercontent.com/ArvinLovegood/go-stock/master/build/appicon.png');
|
||||||
@ -703,6 +704,9 @@ function ReFlesh(source) {
|
|||||||
</n-tbody>
|
</n-tbody>
|
||||||
</n-table>
|
</n-table>
|
||||||
</n-tab-pane>
|
</n-tab-pane>
|
||||||
|
<n-tab-pane name="个股研报" tab="个股研报">
|
||||||
|
<StockResearchReportList/>
|
||||||
|
</n-tab-pane>
|
||||||
|
|
||||||
</n-tabs>
|
</n-tabs>
|
||||||
</n-card>
|
</n-card>
|
||||||
|
2
frontend/wailsjs/go/main/App.d.ts
vendored
2
frontend/wailsjs/go/main/App.d.ts
vendored
@ -89,6 +89,8 @@ export function SetStockSort(arg1:number,arg2:string):Promise<void>;
|
|||||||
|
|
||||||
export function ShareAnalysis(arg1:string,arg2:string):Promise<string>;
|
export function ShareAnalysis(arg1:string,arg2:string):Promise<string>;
|
||||||
|
|
||||||
|
export function StockResearchReport():Promise<Array<any>>;
|
||||||
|
|
||||||
export function SummaryStockNews(arg1:string,arg2:any):Promise<void>;
|
export function SummaryStockNews(arg1:string,arg2:any):Promise<void>;
|
||||||
|
|
||||||
export function UnFollow(arg1:string):Promise<string>;
|
export function UnFollow(arg1:string):Promise<string>;
|
||||||
|
@ -174,6 +174,10 @@ export function ShareAnalysis(arg1, arg2) {
|
|||||||
return window['go']['main']['App']['ShareAnalysis'](arg1, arg2);
|
return window['go']['main']['App']['ShareAnalysis'](arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function StockResearchReport() {
|
||||||
|
return window['go']['main']['App']['StockResearchReport']();
|
||||||
|
}
|
||||||
|
|
||||||
export function SummaryStockNews(arg1, arg2) {
|
export function SummaryStockNews(arg1, arg2) {
|
||||||
return window['go']['main']['App']['SummaryStockNews'](arg1, arg2);
|
return window['go']['main']['App']['SummaryStockNews'](arg1, arg2);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user