Skip to content

Commit e3e06d3

Browse files
author
spark
committed
feat(backend): 添加股票价格信息查询功能
- 新增 SearchStockPriceInfo 函数,用于查询股票价格信息 - 更新 NewChatStream 函数,增加股票代码参数- 在前端添加股票代码参数传递 - 优化后端接口测试用例
1 parent 16e187b commit e3e06d3

File tree

8 files changed

+83
-21
lines changed

8 files changed

+83
-21
lines changed

app.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,8 +377,8 @@ func (a *App) NewChat(stock string) string {
377377
return data.NewDeepSeekOpenAi().NewChat(stock)
378378
}
379379

380-
func (a *App) NewChatStream(stock string) {
381-
msgs := data.NewDeepSeekOpenAi().NewChatStream(stock)
380+
func (a *App) NewChatStream(stock, stockCode string) {
381+
msgs := data.NewDeepSeekOpenAi().NewChatStream(stock, stockCode)
382382
for msg := range msgs {
383383
runtime.EventsEmit(a.ctx, "newChatStream", msg)
384384
}

backend/data/openai_api.go

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"github.com/go-resty/resty/v2"
77
"strings"
8+
"sync"
89
)
910

1011
// @Author spark
@@ -108,7 +109,7 @@ func (o OpenAi) NewChat(stock string) string {
108109
//logger.SugaredLogger.Infof("%v", res.Choices[0].Message.Content)
109110
return res.Choices[0].Message.Content
110111
}
111-
func (o OpenAi) NewChatStream(stock string) <-chan string {
112+
func (o OpenAi) NewChatStream(stock, stockCode string) <-chan string {
112113
ch := make(chan string)
113114
go func() {
114115
defer close(ch)
@@ -124,21 +125,42 @@ func (o OpenAi) NewChatStream(stock string) <-chan string {
124125
},
125126
}
126127

127-
messages := SearchStockInfo(stock, "depth")
128-
for _, message := range *messages {
129-
msg = append(msg, map[string]interface{}{
130-
"role": "assistant",
131-
"content": message,
132-
})
133-
}
128+
wg := &sync.WaitGroup{}
134129

135-
messages = SearchStockInfo(stock, "telegram")
136-
for _, message := range *messages {
130+
wg.Add(3)
131+
go func() {
132+
defer wg.Done()
133+
messages := SearchStockPriceInfo(stockCode)
134+
price := ""
135+
for _, message := range *messages {
136+
price += message + ";"
137+
}
137138
msg = append(msg, map[string]interface{}{
138139
"role": "assistant",
139-
"content": message,
140+
"content": stock + "当前价格:" + price,
140141
})
141-
}
142+
}()
143+
go func() {
144+
defer wg.Done()
145+
messages := SearchStockInfo(stock, "depth")
146+
for _, message := range *messages {
147+
msg = append(msg, map[string]interface{}{
148+
"role": "assistant",
149+
"content": message,
150+
})
151+
}
152+
}()
153+
go func() {
154+
defer wg.Done()
155+
messages := SearchStockInfo(stock, "telegram")
156+
for _, message := range *messages {
157+
msg = append(msg, map[string]interface{}{
158+
"role": "assistant",
159+
"content": message,
160+
})
161+
}
162+
}()
163+
wg.Wait()
142164

143165
msg = append(msg, map[string]interface{}{
144166
"role": "user",
@@ -157,13 +179,15 @@ func (o OpenAi) NewChatStream(stock string) <-chan string {
157179
Post("/chat/completions")
158180

159181
if err != nil {
182+
ch <- err.Error()
160183
return
161184
}
162185
defer resp.RawBody().Close()
163186

164187
scanner := bufio.NewScanner(resp.RawBody())
165188
for scanner.Scan() {
166189
line := scanner.Text()
190+
//logger.SugaredLogger.Infof("Received data: %s", line)
167191
if strings.HasPrefix(line, "data: ") {
168192
data := strings.TrimPrefix(line, "data: ")
169193
if data == "[DONE]" {

backend/data/openai_api_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
func TestNewDeepSeekOpenAiConfig(t *testing.T) {
99
db.Init("../../data/stock.db")
1010
ai := NewDeepSeekOpenAi()
11-
res := ai.NewChatStream("闻泰科技")
11+
res := ai.NewChatStream("闻泰科技", "sh600745")
1212
for {
1313
select {
1414
case msg := <-res:

backend/data/stock_data_api.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,38 @@ func (IndexBasic) TableName() string {
510510
return "tushare_index_basic"
511511
}
512512

513+
func SearchStockPriceInfo(stockCode string) *[]string {
514+
url := "https://www.cls.cn/stock?code=" + stockCode
515+
// 创建一个 chromedp 上下文
516+
ctx, cancel := chromedp.NewContext(
517+
context.Background(),
518+
)
519+
defer cancel()
520+
var htmlContent string
521+
err := chromedp.Run(ctx,
522+
chromedp.Navigate(url),
523+
// 等待页面加载完成,可以根据需要调整等待时间
524+
chromedp.Sleep(3*time.Second),
525+
chromedp.OuterHTML("html", &htmlContent, chromedp.ByQuery),
526+
)
527+
if err != nil {
528+
logger.SugaredLogger.Error(err.Error())
529+
return &[]string{}
530+
}
531+
document, err := goquery.NewDocumentFromReader(strings.NewReader(htmlContent))
532+
if err != nil {
533+
logger.SugaredLogger.Error(err.Error())
534+
return &[]string{}
535+
}
536+
var messages []string
537+
document.Find("div.quote-text-border,span.quote-price").Each(func(i int, selection *goquery.Selection) {
538+
text := strutil.RemoveNonPrintable(selection.Text())
539+
logger.SugaredLogger.Info(text)
540+
messages = append(messages, text)
541+
542+
})
543+
return &messages
544+
}
513545
func SearchStockInfo(stock, msgType string) *[]string {
514546
// 创建一个 chromedp 上下文
515547
ctx, cancel := chromedp.NewContext(

backend/data/stock_data_api_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ func TestGetTelegraphSearch(t *testing.T) {
4949
logger.SugaredLogger.Info(message)
5050
}
5151

52+
//https://www.cls.cn/stock?code=sh600745
53+
}
54+
func TestGetTelegraphSearch2(t *testing.T) {
55+
SearchStockPriceInfo("sh600745")
56+
5257
}
5358

5459
func TestParseFullSingleStockData(t *testing.T) {

frontend/src/components/stock.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -378,12 +378,13 @@ function SendMessage(result,type){
378378
SendDingDingMessageByType(msg,result["股票代码"],type)
379379
}
380380
381-
function aiCheckStock(stock){
381+
function aiCheckStock(stock,stockCode){
382382
data.airesult=""
383383
data.name=stock
384+
data.code=stockCode
384385
modalShow4.value=true
385386
message.loading("ai检测中...")
386-
NewChatStream(stock)
387+
NewChatStream(stock,stockCode)
387388
}
388389
389390
function getTypeName(type){
@@ -443,7 +444,7 @@ function getHeight() {
443444
<n-button size="tiny" secondary type="primary" @click="removeMonitor(result['股票代码'],result['股票名称'],result.key)">
444445
取消关注
445446
</n-button>&nbsp;
446-
<n-button size="tiny" v-if="data.openAiEnable" secondary type="warning" @click="aiCheckStock(result['股票名称'])"> AI分析 </n-button>
447+
<n-button size="tiny" v-if="data.openAiEnable" secondary type="warning" @click="aiCheckStock(result['股票名称'],result['股票代码'])"> AI分析 </n-button>
447448

448449
</template>
449450
<template #footer>

frontend/wailsjs/go/main/App.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export function Greet(arg1:string):Promise<data.StockInfo>;
1414

1515
export function NewChat(arg1:string):Promise<string>;
1616

17-
export function NewChatStream(arg1:string):Promise<void>;
17+
export function NewChatStream(arg1:string,arg2:string):Promise<void>;
1818

1919
export function SendDingDingMessage(arg1:string,arg2:string):Promise<string>;
2020

frontend/wailsjs/go/main/App.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ export function NewChat(arg1) {
2626
return window['go']['main']['App']['NewChat'](arg1);
2727
}
2828

29-
export function NewChatStream(arg1) {
30-
return window['go']['main']['App']['NewChatStream'](arg1);
29+
export function NewChatStream(arg1, arg2) {
30+
return window['go']['main']['App']['NewChatStream'](arg1, arg2);
3131
}
3232

3333
export function SendDingDingMessage(arg1, arg2) {

0 commit comments

Comments
 (0)