feat(market):添加公司公告功能

- 在市场页面添加公司公告选项卡
- 实现公司公告数据接口和组件
- 优化市场页面布局和功能
This commit is contained in:
ArvinLovegood 2025-06-16 17:40:35 +08:00
parent 2811786bfd
commit 02db6c2e87
15 changed files with 98 additions and 27 deletions

View File

@ -17,3 +17,6 @@ func (a *App) LongTigerRank(date string) *[]models.LongTigerRankData {
func (a *App) StockResearchReport(stockCode string) []any {
return data.NewMarketNewsApi().StockResearchReport(stockCode, 7)
}
func (a *App) StockNotice(stockCode string) []any {
return data.NewMarketNewsApi().StockNotice(stockCode)
}

View File

@ -433,3 +433,28 @@ func (m MarketNewsApi) StockResearchReport(stockCode string, days int) []any {
//logger.SugaredLogger.Infof("resp:%+v", respMap["data"])
return respMap["data"].([]any)
}
func (m MarketNewsApi) StockNotice(stock_list string) []any {
var stockCodes []string
for _, stockCode := range strings.Split(stock_list, ",") {
if strutil.ContainsAny(stockCode, []string{"."}) {
stockCode = strings.Split(stockCode, ".")[0]
stockCodes = append(stockCodes, stockCode)
}
}
url := "https://np-anotice-stock.eastmoney.com/api/security/ann?page_size=50&page_index=1&ann_type=SHA%2CCYB%2CSZA%2CBJA%2CINV&client_source=web&f_node=0&stock_list=" + strings.Join(stockCodes, ",")
resp, err := resty.New().SetTimeout(time.Duration(15)*time.Second).R().
SetHeader("Host", "np-anotice-stock.eastmoney.com").
SetHeader("Referer", "https://data.eastmoney.com/notices/hsa/5.html").
SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0").
Get(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"].(map[string]any))["list"].([]any)
}

View File

@ -72,3 +72,12 @@ func TestStockResearchReport(t *testing.T) {
logger.SugaredLogger.Debugf("value: %+v", a)
}
}
func TestStockNotice(t *testing.T) {
db.Init("../../data/stock.db")
resp := NewMarketNewsApi().StockNotice("600584,600900")
for _, a := range resp {
logger.SugaredLogger.Debugf("value: %+v", a)
}
}

View File

@ -261,6 +261,27 @@ const menuOptions = ref([
key: 'market7',
icon: renderIcon(NewspaperSharp),
},
{
label: () =>
h(
RouterLink,
{
href: '#',
to: {
name: 'market',
query: {
name: "公司公告",
}
},
onClick: () => {
EventsEmit("changeMarketTab", {ID: 0, name: '公司公告'})
},
},
{default: () => '公司公告',}
),
key: 'market8',
icon: renderIcon(NewspaperSharp),
},
]
},
{

View File

@ -356,7 +356,7 @@ function handleKLine(code,name){
chart.setOption(option);
chart.on('click',{seriesName:'日K'}, function(params) {
console.log("click:",params);
//console.log("click:",params);
});
})
}

View File

@ -15,7 +15,7 @@ const options = ref([])
function getStockResearchReport(value) {
StockResearchReport(value).then(result => {
console.log(result)
//console.log(result)
list.value = result
})
}
@ -97,7 +97,7 @@ function handleSearch(value) {
<n-tbody>
<n-tr v-for="item in list" :key="item.infoCode">
<!-- <n-td>{{item.stockCode}}</n-td>-->
<n-td>
<n-td :title="item.stockCode">
<n-popover trigger="hover" placement="right">
<template #trigger>
<n-tag type="info" :bordered="false">{{item.stockName}}</n-tag>

View File

@ -44,8 +44,8 @@ EventsOn("updateVersion",async (msg) => {
const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
console.log("GitHub UTC 时间:", utcDate);
console.log("转换后的本地时间:", formattedDate);
//console.log("GitHub UTC :", utcDate);
//console.log(":", formattedDate);
notify.info({
avatar: () =>
h(NAvatar, {

View File

@ -47,7 +47,7 @@ onBeforeMount(()=>{
})
GetFollowedFund().then(result => {
followList.value = result
console.log("followList",followList.value)
//console.log("followList",followList.value)
})
})
@ -60,7 +60,7 @@ onMounted(() => {
//ws.value = new WebSocket('ws://localhost:16688/ws'); // WebSocket
ws.value.onopen = () => {
console.log('WebSocket 连接已打开');
//console.log('WebSocket ');
};
ws.value.onmessage = (event) => {
@ -74,13 +74,13 @@ onMounted(() => {
};
ws.value.onclose = () => {
console.log('WebSocket 连接已关闭');
//console.log('WebSocket ');
};
ticker.value=setInterval(() => {
GetFollowedFund().then(result => {
followList.value = result
console.log("followList",followList.value)
//console.log("followList",followList.value)
})
}, 1000*60)
@ -103,7 +103,7 @@ function AddFund(){
message.success("关注成功")
GetFollowedFund().then(result => {
followList.value = result
console.log("followList",followList.value)
//console.log("followList",followList.value)
})
}
})
@ -114,7 +114,7 @@ function unFollow(code){
message.success("取消关注成功")
GetFollowedFund().then(result => {
followList.value = result
console.log("followList",followList.value)
//console.log("followList",followList.value)
})
}
})

View File

@ -42,7 +42,7 @@ function GetRankData(){
GetIndustryMoneyRankSina(fenlei.value,sort.value).then(result => {
if(result.length>0){
dataList.value = result
console.log(result)
//console.log(result)
}
})
}

View File

@ -25,6 +25,7 @@ import RankTable from "./rankTable.vue";
import IndustryMoneyRank from "./industryMoneyRank.vue";
import MoneyTrend from "./moneyTrend.vue";
import StockResearchReportList from "./StockResearchReportList.vue";
import StockNoticeList from "./StockNoticeList.vue";
const route = useRoute()
const icon = ref('https://raw.githubusercontent.com/ArvinLovegood/go-stock/master/build/appicon.png');
@ -129,7 +130,7 @@ function handleEXPLANATION(value, option){
}
function sortLongTigerRank(e){
console.log(e.target.dataset)
//console.log(e.target.dataset)
// let field= e.target.dataset.field;
// lhbList.value= _.sortBy(lhbList.value, function(o) { return o[field]; });
}
@ -224,7 +225,7 @@ function industryRank() {
GetIndustryRank(sort.value, 150).then(result => {
if (result.length > 0) {
console.log(result)
//console.log(result)
industryRanks.value = result
} else {
message.info("暂无数据")
@ -341,7 +342,7 @@ function share() {
}
function ReFlesh(source) {
console.log("ReFlesh:", source)
//console.log("ReFlesh:", source)
ReFleshTelegraphList(source).then(res => {
if (source === "财联社电报") {
telegraphList.value = res
@ -612,6 +613,9 @@ function ReFlesh(source) {
<n-form-item-gi :span="8" label="上榜原因" path="EXPLANATION" label-placement="left">
<n-select clearable placeholder="上榜原因过滤" v-model:value="SearchForm.EXPLANATION" :options="EXPLANATIONs" :on-update:value="handleEXPLANATION"/>
</n-form-item-gi>
<n-form-item-gi :span="10" label="" label-placement="left">
<n-text type="error">*当天的龙虎榜数据通常在收盘结束后一小时左右更新</n-text>
</n-form-item-gi>
</n-grid>
</n-form>
<n-table :single-line="false" striped>
@ -707,6 +711,9 @@ function ReFlesh(source) {
<n-tab-pane name="个股研报" tab="个股研报">
<StockResearchReportList/>
</n-tab-pane>
<n-tab-pane name="公司公告" tab="公司公告 ">
<StockNoticeList/>
</n-tab-pane>
</n-tabs>
</n-card>

View File

@ -68,7 +68,7 @@ const handleLine = (code, days) => {
}
}
console.log("volume", volume)
//console.log("volume", volume)
const upColor = '#ec0000';
const downColor = '#00da3c';
let option = {

View File

@ -79,12 +79,12 @@ onMounted(()=>{
formValue.value.darkTheme = res.darkTheme
formValue.value.enableFund = res.enableFund
console.log(res)
//console.log(res)
})
//message.info("")
GetPromptTemplates("","").then(res=>{
console.log(res)
//console.log(res)
promptTemplates.value=res
})
})
@ -165,7 +165,7 @@ function importConfig(){
let reader = new FileReader();
reader.onload = (e) => {
let config = JSON.parse(e.target.result);
console.log(config)
//console.log(config)
formValue.value.ID = config.ID
formValue.value.tushareToken = config.tushareToken
formValue.value.dingPush = {
@ -204,7 +204,7 @@ function importConfig(){
window.onerror = function (event, source, lineno, colno, error) {
console.log(event, source, lineno, colno, error)
//console.log(event, source, lineno, colno, error)
//
EventsEmit("frontendError", {
page: "settings.vue",
@ -237,14 +237,14 @@ function savePrompt(){
AddPrompt(formPrompt.value).then(res=>{
message.success(res)
GetPromptTemplates("","").then(res=>{
console.log(res)
//console.log(res)
promptTemplates.value=res
})
showManagePromptsModal.value=false
})
}
function editPrompt(prompt){
console.log(prompt)
//console.log(prompt)
formPrompt.value.ID=prompt.ID
formPrompt.value.Name=prompt.name
formPrompt.value.Content=prompt.content
@ -255,7 +255,7 @@ function deletePrompt(ID){
DelPrompt(ID).then(res=>{
message.success(res)
GetPromptTemplates("","").then(res=>{
console.log(res)
//console.log(res)
promptTemplates.value=res
})
})

View File

@ -178,7 +178,7 @@ onBeforeMount(()=>{
if(route.query.groupId){
message.success("切换分组:"+route.query.groupName)
currentGroupId.value=Number(route.query.groupId)
console.log("route.params",route.query)
//console.log("route.params",route.query)
}
})
GetStockList("").then(result => {
@ -531,7 +531,7 @@ function getStockList(value){
function blinkBorder(findId){
//
let element = document.getElementById(findId);
console.log("blinkBorder",findId,element)
//console.log("blinkBorder",findId,element)
if (element) {
//
element.scrollIntoView({ behavior: 'smooth'});
@ -652,7 +652,7 @@ function setStock(code,name){
modalShow.value=true
}
function clearFeishi(){
console.log("clearFeishi")
//console.log("clearFeishi")
clearInterval(feishiInterval.value)
}
function showFsChart(code, name) {
@ -1242,7 +1242,7 @@ function handleKLine(){
};
chart.setOption(option);
chart.on('click',{seriesName:'日K'}, function(params) {
console.log("click:",params);
//console.log("click:",params);
});
})
}

View File

@ -89,6 +89,8 @@ export function SetStockSort(arg1:number,arg2:string):Promise<void>;
export function ShareAnalysis(arg1:string,arg2:string):Promise<string>;
export function StockNotice(arg1:string):Promise<Array<any>>;
export function StockResearchReport(arg1:string):Promise<Array<any>>;
export function SummaryStockNews(arg1:string,arg2:any):Promise<void>;

View File

@ -174,6 +174,10 @@ export function ShareAnalysis(arg1, arg2) {
return window['go']['main']['App']['ShareAnalysis'](arg1, arg2);
}
export function StockNotice(arg1) {
return window['go']['main']['App']['StockNotice'](arg1);
}
export function StockResearchReport(arg1) {
return window['go']['main']['App']['StockResearchReport'](arg1);
}