mirror of
https://github.com/ArvinLovegood/go-stock.git
synced 2025-07-19 00:00:09 +08:00
feat(frontend):添加热门策略功能并优化选股组件
- 在 App.d.ts 和 App.js 中添加 GetHotStrategy 函数 - 在 app_common.go 中实现 GetHotStrategy 方法 - 在 search_stock_api.go 中添加 HotStrategy 方法获取热门策略数据 - 更新 SelectStock.vue 组件,集成热门策略功能并优化界面布局
This commit is contained in:
parent
528482db48
commit
062df80712
@ -59,3 +59,6 @@ func (a App) ClsCalendar() []any {
|
|||||||
func (a App) SearchStock(words string) map[string]any {
|
func (a App) SearchStock(words string) map[string]any {
|
||||||
return data.NewSearchStockApi(words).SearchStock(5000)
|
return data.NewSearchStockApi(words).SearchStock(5000)
|
||||||
}
|
}
|
||||||
|
func (a App) GetHotStrategy() map[string]any {
|
||||||
|
return data.NewSearchStockApi("").HotStrategy()
|
||||||
|
}
|
||||||
|
@ -53,3 +53,20 @@ func (s SearchStockApi) SearchStock(pageSize int) map[string]any {
|
|||||||
//logger.SugaredLogger.Infof("resp:%+v", respMap["data"])
|
//logger.SugaredLogger.Infof("resp:%+v", respMap["data"])
|
||||||
return respMap
|
return respMap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s SearchStockApi) HotStrategy() map[string]any {
|
||||||
|
url := fmt.Sprintf("https://np-ipick.eastmoney.com/recommend/stock/heat/ranking?count=20&trace=%d&client=web&biz=web_smart_tag", time.Now().Unix())
|
||||||
|
resp, err := resty.New().SetTimeout(time.Duration(30)*time.Second).R().
|
||||||
|
SetHeader("Host", "np-ipick.eastmoney.com").
|
||||||
|
SetHeader("Origin", "https://xuangu.eastmoney.com").
|
||||||
|
SetHeader("Referer", "https://xuangu.eastmoney.com/").
|
||||||
|
SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0").
|
||||||
|
Get(url)
|
||||||
|
if err != nil {
|
||||||
|
logger.SugaredLogger.Errorf("HotStrategy-err:%+v", err)
|
||||||
|
return map[string]any{}
|
||||||
|
}
|
||||||
|
respMap := map[string]any{}
|
||||||
|
json.Unmarshal(resp.Body(), &respMap)
|
||||||
|
return respMap
|
||||||
|
}
|
||||||
|
@ -23,3 +23,14 @@ func TestSearchStock(t *testing.T) {
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSearchStockApi_HotStrategy(t *testing.T) {
|
||||||
|
db.Init("../../data/stock.db")
|
||||||
|
res := NewSearchStockApi("").HotStrategy()
|
||||||
|
logger.SugaredLogger.Infof("res:%+v", res)
|
||||||
|
dataList := res["data"].([]any)
|
||||||
|
for _, v := range dataList {
|
||||||
|
d := v.(map[string]any)
|
||||||
|
logger.SugaredLogger.Infof("v:%+v", d)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {h, onBeforeMount, onMounted, onUnmounted, ref} from 'vue'
|
import {h, onBeforeMount, onMounted, onUnmounted, ref} from 'vue'
|
||||||
import {SearchStock} from "../../wailsjs/go/main/App";
|
import {SearchStock,GetHotStrategy} from "../../wailsjs/go/main/App";
|
||||||
import {useMessage, NText, NTag} from 'naive-ui'
|
import {useMessage, NText, NTag} from 'naive-ui'
|
||||||
|
import {RefreshCircleSharp} from "@vicons/ionicons5";
|
||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
const search = ref('')
|
const search = ref('')
|
||||||
const columns = ref([])
|
const columns = ref([])
|
||||||
const dataList = ref([])
|
const dataList = ref([])
|
||||||
|
const hotStrategy = ref([])
|
||||||
const traceInfo = ref('')
|
const traceInfo = ref('')
|
||||||
function Search() {
|
function Search() {
|
||||||
if(!search.value){
|
if(!search.value){
|
||||||
@ -16,12 +18,11 @@ function Search() {
|
|||||||
const loading = message.loading("正在获取选股数据...", {duration: 0});
|
const loading = message.loading("正在获取选股数据...", {duration: 0});
|
||||||
SearchStock(search.value).then(res => {
|
SearchStock(search.value).then(res => {
|
||||||
loading.destroy()
|
loading.destroy()
|
||||||
console.log(res)
|
// console.log(res)
|
||||||
if(res.code==100){
|
if(res.code==100){
|
||||||
traceInfo.value=res.data.traceInfo.showText
|
traceInfo.value=res.data.traceInfo.showText
|
||||||
message.success(res.msg)
|
// message.success(res.msg)
|
||||||
columns.value=res.data.result.columns.filter(item=>!item.hiddenNeed&&(item.title!="市场码"&&item.title!="市场简称")).map(item=>{
|
columns.value=res.data.result.columns.filter(item=>!item.hiddenNeed&&(item.title!="市场码"&&item.title!="市场简称")).map(item=>{
|
||||||
|
|
||||||
if(item.children){
|
if(item.children){
|
||||||
return {
|
return {
|
||||||
title:item.title+(item.unit?'['+item.unit+']':''),
|
title:item.title+(item.unit?'['+item.unit+']':''),
|
||||||
@ -68,28 +69,84 @@ function isNumeric(value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onBeforeMount(() => {
|
onBeforeMount(() => {
|
||||||
|
GetHotStrategy().then(res => {
|
||||||
|
console.log(res)
|
||||||
|
if(res.code==1){
|
||||||
|
hotStrategy.value=res.data
|
||||||
|
search.value=hotStrategy.value[0].question
|
||||||
Search()
|
Search()
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
message.error(err)
|
||||||
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
function DoSearch(question){
|
||||||
|
search.value= question
|
||||||
|
Search()
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<n-grid :cols="24" style="max-height: calc(100vh - 170px)">
|
||||||
|
<n-gi :span="4" >
|
||||||
|
<n-list bordered style="text-align: left;" hoverable clickable>
|
||||||
|
<n-scrollbar style="max-height: calc(100vh - 170px);" >
|
||||||
|
<n-list-item v-for="item in hotStrategy" :key="item.rank" @click="DoSearch(item.question)">
|
||||||
|
<n-ellipsis line-clamp="1" :tooltip="true" >
|
||||||
|
<n-tag size="small" :bordered="false" type="info">#{{item.rank}}</n-tag><n-text type="warning">{{item.question }}</n-text>
|
||||||
|
<template #tooltip>
|
||||||
|
<div style="text-align: center;max-width: 180px">
|
||||||
|
<n-text type="warning">{{item.question }}</n-text>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</n-ellipsis>
|
||||||
|
</n-list-item>
|
||||||
|
</n-scrollbar>
|
||||||
|
</n-list>
|
||||||
|
|
||||||
|
<!-- <n-virtual-list :items="hotStrategy" :item-size="hotStrategy.length">-->
|
||||||
|
<!-- <template #default="{ item, index }">-->
|
||||||
|
<!-- <n-card :title="''" size="small">-->
|
||||||
|
<!-- <template #header-extra>-->
|
||||||
|
<!-- {{item.rank}}-->
|
||||||
|
<!-- </template>-->
|
||||||
|
<!-- <n-ellipsis expand-trigger="click" line-clamp="3" :tooltip="false" >-->
|
||||||
|
<!-- <n-text type="warning">{{item.question }}</n-text>-->
|
||||||
|
<!-- </n-ellipsis>-->
|
||||||
|
<!-- </n-card>-->
|
||||||
|
|
||||||
|
<!-- </template>-->
|
||||||
|
<!-- </n-virtual-list>-->
|
||||||
|
</n-gi>
|
||||||
|
<n-gi :span="20" >
|
||||||
<n-flex>
|
<n-flex>
|
||||||
<n-input-group>
|
<n-input-group style="text-align: left">
|
||||||
<n-input clearable v-model:value="search" placeholder="请输入选股指标或者要求" />
|
<n-input :rows="1" clearable v-model:value="search" placeholder="请输入选股指标或者要求" />
|
||||||
<n-button type="primary" @click="Search">搜索A股</n-button>
|
<n-button type="primary" @click="Search">搜索A股</n-button>
|
||||||
</n-input-group>
|
</n-input-group>
|
||||||
</n-flex>
|
</n-flex>
|
||||||
<n-flex justify="start" v-if="traceInfo">
|
<n-flex justify="start" v-if="traceInfo" style="margin: 5px 0">
|
||||||
<n-tag type="info" :bordered="false">当前选股条件:<n-tag type="warning" :bordered="true">{{traceInfo}}</n-tag></n-tag>
|
|
||||||
<!-- <n-button type="primary" size="small">保存策略</n-button>-->
|
<n-ellipsis line-clamp="1" :tooltip="true" >
|
||||||
|
<n-text type="info" :bordered="false">选股条件:</n-text><n-text type="warning" :bordered="true">{{traceInfo}}</n-text>
|
||||||
|
<template #tooltip>
|
||||||
|
<div style="text-align: center;max-width: 580px">
|
||||||
|
<n-text type="warning">{{traceInfo}}</n-text>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</n-ellipsis>
|
||||||
|
|
||||||
|
<!-- <n-button type="primary" size="small">保存策略</n-button>-->
|
||||||
</n-flex>
|
</n-flex>
|
||||||
<n-data-table
|
<n-data-table
|
||||||
:max-height="'calc(100vh - 312px)'"
|
:striped="true"
|
||||||
size="small"
|
:max-height="'calc(100vh - 250px)'"
|
||||||
|
size="medium"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
:data="dataList"
|
:data="dataList"
|
||||||
:pagination="false"
|
:pagination="{pageSize: 9}"
|
||||||
:scroll-x="1800"
|
:scroll-x="1800"
|
||||||
:render-cell="(value, rowData, column) => {
|
:render-cell="(value, rowData, column) => {
|
||||||
|
|
||||||
@ -117,6 +174,11 @@ onBeforeMount(() => {
|
|||||||
}
|
}
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
|
<n-text>共找到<n-tag type="info" :bordered="false">{{dataList.length}}</n-tag>只股</n-text>
|
||||||
|
</n-gi>
|
||||||
|
</n-grid>
|
||||||
|
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
2
frontend/wailsjs/go/main/App.d.ts
vendored
2
frontend/wailsjs/go/main/App.d.ts
vendored
@ -39,6 +39,8 @@ export function GetGroupList():Promise<Array<data.Group>>;
|
|||||||
|
|
||||||
export function GetGroupStockList(arg1:number):Promise<Array<data.GroupStock>>;
|
export function GetGroupStockList(arg1:number):Promise<Array<data.GroupStock>>;
|
||||||
|
|
||||||
|
export function GetHotStrategy():Promise<Record<string, any>>;
|
||||||
|
|
||||||
export function GetIndustryMoneyRankSina(arg1:string,arg2:string):Promise<Array<Record<string, any>>>;
|
export function GetIndustryMoneyRankSina(arg1:string,arg2:string):Promise<Array<Record<string, any>>>;
|
||||||
|
|
||||||
export function GetIndustryRank(arg1:string,arg2:number):Promise<Array<any>>;
|
export function GetIndustryRank(arg1:string,arg2:number):Promise<Array<any>>;
|
||||||
|
@ -74,6 +74,10 @@ export function GetGroupStockList(arg1) {
|
|||||||
return window['go']['main']['App']['GetGroupStockList'](arg1);
|
return window['go']['main']['App']['GetGroupStockList'](arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function GetHotStrategy() {
|
||||||
|
return window['go']['main']['App']['GetHotStrategy']();
|
||||||
|
}
|
||||||
|
|
||||||
export function GetIndustryMoneyRankSina(arg1, arg2) {
|
export function GetIndustryMoneyRankSina(arg1, arg2) {
|
||||||
return window['go']['main']['App']['GetIndustryMoneyRankSina'](arg1, arg2);
|
return window['go']['main']['App']['GetIndustryMoneyRankSina'](arg1, arg2);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user