mirror of
https://github.com/ArvinLovegood/go-stock.git
synced 2025-07-19 00:00:09 +08:00
feat(market):添加公司公告功能
- 在市场页面添加公司公告选项卡 - 实现公司公告数据接口和组件 - 优化市场页面布局和功能
This commit is contained in:
parent
2811786bfd
commit
02db6c2e87
@ -17,3 +17,6 @@ func (a *App) LongTigerRank(date string) *[]models.LongTigerRankData {
|
|||||||
func (a *App) StockResearchReport(stockCode string) []any {
|
func (a *App) StockResearchReport(stockCode string) []any {
|
||||||
return data.NewMarketNewsApi().StockResearchReport(stockCode, 7)
|
return data.NewMarketNewsApi().StockResearchReport(stockCode, 7)
|
||||||
}
|
}
|
||||||
|
func (a *App) StockNotice(stockCode string) []any {
|
||||||
|
return data.NewMarketNewsApi().StockNotice(stockCode)
|
||||||
|
}
|
||||||
|
@ -433,3 +433,28 @@ func (m MarketNewsApi) StockResearchReport(stockCode string, days int) []any {
|
|||||||
//logger.SugaredLogger.Infof("resp:%+v", respMap["data"])
|
//logger.SugaredLogger.Infof("resp:%+v", respMap["data"])
|
||||||
return respMap["data"].([]any)
|
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)
|
||||||
|
}
|
||||||
|
@ -72,3 +72,12 @@ func TestStockResearchReport(t *testing.T) {
|
|||||||
logger.SugaredLogger.Debugf("value: %+v", a)
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -261,6 +261,27 @@ const menuOptions = ref([
|
|||||||
key: 'market7',
|
key: 'market7',
|
||||||
icon: renderIcon(NewspaperSharp),
|
icon: renderIcon(NewspaperSharp),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: () =>
|
||||||
|
h(
|
||||||
|
RouterLink,
|
||||||
|
{
|
||||||
|
href: '#',
|
||||||
|
to: {
|
||||||
|
name: 'market',
|
||||||
|
query: {
|
||||||
|
name: "公司公告",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onClick: () => {
|
||||||
|
EventsEmit("changeMarketTab", {ID: 0, name: '公司公告'})
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{default: () => '公司公告',}
|
||||||
|
),
|
||||||
|
key: 'market8',
|
||||||
|
icon: renderIcon(NewspaperSharp),
|
||||||
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -356,7 +356,7 @@ function handleKLine(code,name){
|
|||||||
chart.setOption(option);
|
chart.setOption(option);
|
||||||
|
|
||||||
chart.on('click',{seriesName:'日K'}, function(params) {
|
chart.on('click',{seriesName:'日K'}, function(params) {
|
||||||
console.log("click:",params);
|
//console.log("click:",params);
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ const options = ref([])
|
|||||||
|
|
||||||
function getStockResearchReport(value) {
|
function getStockResearchReport(value) {
|
||||||
StockResearchReport(value).then(result => {
|
StockResearchReport(value).then(result => {
|
||||||
console.log(result)
|
//console.log(result)
|
||||||
list.value = result
|
list.value = result
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -97,7 +97,7 @@ function handleSearch(value) {
|
|||||||
<n-tbody>
|
<n-tbody>
|
||||||
<n-tr v-for="item in list" :key="item.infoCode">
|
<n-tr v-for="item in list" :key="item.infoCode">
|
||||||
<!-- <n-td>{{item.stockCode}}</n-td>-->
|
<!-- <n-td>{{item.stockCode}}</n-td>-->
|
||||||
<n-td>
|
<n-td :title="item.stockCode">
|
||||||
<n-popover trigger="hover" placement="right">
|
<n-popover trigger="hover" placement="right">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<n-tag type="info" :bordered="false">{{item.stockName}}</n-tag>
|
<n-tag type="info" :bordered="false">{{item.stockName}}</n-tag>
|
||||||
|
@ -44,8 +44,8 @@ EventsOn("updateVersion",async (msg) => {
|
|||||||
|
|
||||||
const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
||||||
|
|
||||||
console.log("GitHub UTC 时间:", utcDate);
|
//console.log("GitHub UTC 时间:", utcDate);
|
||||||
console.log("转换后的本地时间:", formattedDate);
|
//console.log("转换后的本地时间:", formattedDate);
|
||||||
notify.info({
|
notify.info({
|
||||||
avatar: () =>
|
avatar: () =>
|
||||||
h(NAvatar, {
|
h(NAvatar, {
|
||||||
|
@ -47,7 +47,7 @@ onBeforeMount(()=>{
|
|||||||
})
|
})
|
||||||
GetFollowedFund().then(result => {
|
GetFollowedFund().then(result => {
|
||||||
followList.value = 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 = new WebSocket('ws://localhost:16688/ws'); // 替换为你的 WebSocket 服务器地址
|
||||||
|
|
||||||
ws.value.onopen = () => {
|
ws.value.onopen = () => {
|
||||||
console.log('WebSocket 连接已打开');
|
//console.log('WebSocket 连接已打开');
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.value.onmessage = (event) => {
|
ws.value.onmessage = (event) => {
|
||||||
@ -74,13 +74,13 @@ onMounted(() => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
ws.value.onclose = () => {
|
ws.value.onclose = () => {
|
||||||
console.log('WebSocket 连接已关闭');
|
//console.log('WebSocket 连接已关闭');
|
||||||
};
|
};
|
||||||
|
|
||||||
ticker.value=setInterval(() => {
|
ticker.value=setInterval(() => {
|
||||||
GetFollowedFund().then(result => {
|
GetFollowedFund().then(result => {
|
||||||
followList.value = result
|
followList.value = result
|
||||||
console.log("followList",followList.value)
|
//console.log("followList",followList.value)
|
||||||
})
|
})
|
||||||
}, 1000*60)
|
}, 1000*60)
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ function AddFund(){
|
|||||||
message.success("关注成功")
|
message.success("关注成功")
|
||||||
GetFollowedFund().then(result => {
|
GetFollowedFund().then(result => {
|
||||||
followList.value = result
|
followList.value = result
|
||||||
console.log("followList",followList.value)
|
//console.log("followList",followList.value)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -114,7 +114,7 @@ function unFollow(code){
|
|||||||
message.success("取消关注成功")
|
message.success("取消关注成功")
|
||||||
GetFollowedFund().then(result => {
|
GetFollowedFund().then(result => {
|
||||||
followList.value = result
|
followList.value = result
|
||||||
console.log("followList",followList.value)
|
//console.log("followList",followList.value)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -42,7 +42,7 @@ function GetRankData(){
|
|||||||
GetIndustryMoneyRankSina(fenlei.value,sort.value).then(result => {
|
GetIndustryMoneyRankSina(fenlei.value,sort.value).then(result => {
|
||||||
if(result.length>0){
|
if(result.length>0){
|
||||||
dataList.value = result
|
dataList.value = result
|
||||||
console.log(result)
|
//console.log(result)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ 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";
|
import StockResearchReportList from "./StockResearchReportList.vue";
|
||||||
|
import StockNoticeList from "./StockNoticeList.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');
|
||||||
@ -129,7 +130,7 @@ function handleEXPLANATION(value, option){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sortLongTigerRank(e){
|
function sortLongTigerRank(e){
|
||||||
console.log(e.target.dataset)
|
//console.log(e.target.dataset)
|
||||||
// let field= e.target.dataset.field;
|
// let field= e.target.dataset.field;
|
||||||
// lhbList.value= _.sortBy(lhbList.value, function(o) { return o[field]; });
|
// lhbList.value= _.sortBy(lhbList.value, function(o) { return o[field]; });
|
||||||
}
|
}
|
||||||
@ -224,7 +225,7 @@ function industryRank() {
|
|||||||
|
|
||||||
GetIndustryRank(sort.value, 150).then(result => {
|
GetIndustryRank(sort.value, 150).then(result => {
|
||||||
if (result.length > 0) {
|
if (result.length > 0) {
|
||||||
console.log(result)
|
//console.log(result)
|
||||||
industryRanks.value = result
|
industryRanks.value = result
|
||||||
} else {
|
} else {
|
||||||
message.info("暂无数据")
|
message.info("暂无数据")
|
||||||
@ -341,7 +342,7 @@ function share() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ReFlesh(source) {
|
function ReFlesh(source) {
|
||||||
console.log("ReFlesh:", source)
|
//console.log("ReFlesh:", source)
|
||||||
ReFleshTelegraphList(source).then(res => {
|
ReFleshTelegraphList(source).then(res => {
|
||||||
if (source === "财联社电报") {
|
if (source === "财联社电报") {
|
||||||
telegraphList.value = res
|
telegraphList.value = res
|
||||||
@ -612,6 +613,9 @@ function ReFlesh(source) {
|
|||||||
<n-form-item-gi :span="8" label="上榜原因" path="EXPLANATION" label-placement="left">
|
<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-select clearable placeholder="上榜原因过滤" v-model:value="SearchForm.EXPLANATION" :options="EXPLANATIONs" :on-update:value="handleEXPLANATION"/>
|
||||||
</n-form-item-gi>
|
</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-grid>
|
||||||
</n-form>
|
</n-form>
|
||||||
<n-table :single-line="false" striped>
|
<n-table :single-line="false" striped>
|
||||||
@ -707,6 +711,9 @@ function ReFlesh(source) {
|
|||||||
<n-tab-pane name="个股研报" tab="个股研报">
|
<n-tab-pane name="个股研报" tab="个股研报">
|
||||||
<StockResearchReportList/>
|
<StockResearchReportList/>
|
||||||
</n-tab-pane>
|
</n-tab-pane>
|
||||||
|
<n-tab-pane name="公司公告" tab="公司公告 ">
|
||||||
|
<StockNoticeList/>
|
||||||
|
</n-tab-pane>
|
||||||
|
|
||||||
</n-tabs>
|
</n-tabs>
|
||||||
</n-card>
|
</n-card>
|
||||||
|
@ -68,7 +68,7 @@ const handleLine = (code, days) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
console.log("volume", volume)
|
//console.log("volume", volume)
|
||||||
const upColor = '#ec0000';
|
const upColor = '#ec0000';
|
||||||
const downColor = '#00da3c';
|
const downColor = '#00da3c';
|
||||||
let option = {
|
let option = {
|
||||||
|
@ -79,12 +79,12 @@ onMounted(()=>{
|
|||||||
formValue.value.darkTheme = res.darkTheme
|
formValue.value.darkTheme = res.darkTheme
|
||||||
formValue.value.enableFund = res.enableFund
|
formValue.value.enableFund = res.enableFund
|
||||||
|
|
||||||
console.log(res)
|
//console.log(res)
|
||||||
})
|
})
|
||||||
//message.info("加载完成")
|
//message.info("加载完成")
|
||||||
|
|
||||||
GetPromptTemplates("","").then(res=>{
|
GetPromptTemplates("","").then(res=>{
|
||||||
console.log(res)
|
//console.log(res)
|
||||||
promptTemplates.value=res
|
promptTemplates.value=res
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -165,7 +165,7 @@ function importConfig(){
|
|||||||
let reader = new FileReader();
|
let reader = new FileReader();
|
||||||
reader.onload = (e) => {
|
reader.onload = (e) => {
|
||||||
let config = JSON.parse(e.target.result);
|
let config = JSON.parse(e.target.result);
|
||||||
console.log(config)
|
//console.log(config)
|
||||||
formValue.value.ID = config.ID
|
formValue.value.ID = config.ID
|
||||||
formValue.value.tushareToken = config.tushareToken
|
formValue.value.tushareToken = config.tushareToken
|
||||||
formValue.value.dingPush = {
|
formValue.value.dingPush = {
|
||||||
@ -204,7 +204,7 @@ function importConfig(){
|
|||||||
|
|
||||||
|
|
||||||
window.onerror = function (event, source, lineno, colno, error) {
|
window.onerror = function (event, source, lineno, colno, error) {
|
||||||
console.log(event, source, lineno, colno, error)
|
//console.log(event, source, lineno, colno, error)
|
||||||
// 将错误信息发送给后端
|
// 将错误信息发送给后端
|
||||||
EventsEmit("frontendError", {
|
EventsEmit("frontendError", {
|
||||||
page: "settings.vue",
|
page: "settings.vue",
|
||||||
@ -237,14 +237,14 @@ function savePrompt(){
|
|||||||
AddPrompt(formPrompt.value).then(res=>{
|
AddPrompt(formPrompt.value).then(res=>{
|
||||||
message.success(res)
|
message.success(res)
|
||||||
GetPromptTemplates("","").then(res=>{
|
GetPromptTemplates("","").then(res=>{
|
||||||
console.log(res)
|
//console.log(res)
|
||||||
promptTemplates.value=res
|
promptTemplates.value=res
|
||||||
})
|
})
|
||||||
showManagePromptsModal.value=false
|
showManagePromptsModal.value=false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
function editPrompt(prompt){
|
function editPrompt(prompt){
|
||||||
console.log(prompt)
|
//console.log(prompt)
|
||||||
formPrompt.value.ID=prompt.ID
|
formPrompt.value.ID=prompt.ID
|
||||||
formPrompt.value.Name=prompt.name
|
formPrompt.value.Name=prompt.name
|
||||||
formPrompt.value.Content=prompt.content
|
formPrompt.value.Content=prompt.content
|
||||||
@ -255,7 +255,7 @@ function deletePrompt(ID){
|
|||||||
DelPrompt(ID).then(res=>{
|
DelPrompt(ID).then(res=>{
|
||||||
message.success(res)
|
message.success(res)
|
||||||
GetPromptTemplates("","").then(res=>{
|
GetPromptTemplates("","").then(res=>{
|
||||||
console.log(res)
|
//console.log(res)
|
||||||
promptTemplates.value=res
|
promptTemplates.value=res
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -178,7 +178,7 @@ onBeforeMount(()=>{
|
|||||||
if(route.query.groupId){
|
if(route.query.groupId){
|
||||||
message.success("切换分组:"+route.query.groupName)
|
message.success("切换分组:"+route.query.groupName)
|
||||||
currentGroupId.value=Number(route.query.groupId)
|
currentGroupId.value=Number(route.query.groupId)
|
||||||
console.log("route.params",route.query)
|
//console.log("route.params",route.query)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
GetStockList("").then(result => {
|
GetStockList("").then(result => {
|
||||||
@ -531,7 +531,7 @@ function getStockList(value){
|
|||||||
function blinkBorder(findId){
|
function blinkBorder(findId){
|
||||||
// 获取要滚动到的元素
|
// 获取要滚动到的元素
|
||||||
let element = document.getElementById(findId);
|
let element = document.getElementById(findId);
|
||||||
console.log("blinkBorder",findId,element)
|
//console.log("blinkBorder",findId,element)
|
||||||
if (element) {
|
if (element) {
|
||||||
// 滚动到该元素
|
// 滚动到该元素
|
||||||
element.scrollIntoView({ behavior: 'smooth'});
|
element.scrollIntoView({ behavior: 'smooth'});
|
||||||
@ -652,7 +652,7 @@ function setStock(code,name){
|
|||||||
modalShow.value=true
|
modalShow.value=true
|
||||||
}
|
}
|
||||||
function clearFeishi(){
|
function clearFeishi(){
|
||||||
console.log("clearFeishi")
|
//console.log("clearFeishi")
|
||||||
clearInterval(feishiInterval.value)
|
clearInterval(feishiInterval.value)
|
||||||
}
|
}
|
||||||
function showFsChart(code, name) {
|
function showFsChart(code, name) {
|
||||||
@ -1242,7 +1242,7 @@ function handleKLine(){
|
|||||||
};
|
};
|
||||||
chart.setOption(option);
|
chart.setOption(option);
|
||||||
chart.on('click',{seriesName:'日K'}, function(params) {
|
chart.on('click',{seriesName:'日K'}, function(params) {
|
||||||
console.log("click:",params);
|
//console.log("click:",params);
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
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 StockNotice(arg1:string):Promise<Array<any>>;
|
||||||
|
|
||||||
export function StockResearchReport(arg1:string):Promise<Array<any>>;
|
export function StockResearchReport(arg1:string):Promise<Array<any>>;
|
||||||
|
|
||||||
export function SummaryStockNews(arg1:string,arg2:any):Promise<void>;
|
export function SummaryStockNews(arg1:string,arg2:any):Promise<void>;
|
||||||
|
@ -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 StockNotice(arg1) {
|
||||||
|
return window['go']['main']['App']['StockNotice'](arg1);
|
||||||
|
}
|
||||||
|
|
||||||
export function StockResearchReport(arg1) {
|
export function StockResearchReport(arg1) {
|
||||||
return window['go']['main']['App']['StockResearchReport'](arg1);
|
return window['go']['main']['App']['StockResearchReport'](arg1);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user