no message

This commit is contained in:
aaron 2025-05-26 16:25:17 +08:00
parent eaefac1290
commit c8ff4ab869
3 changed files with 54 additions and 7 deletions

View File

@ -5,7 +5,7 @@ services:
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
image: tradus-web:1.3.24 image: tradus-web:1.3.25
container_name: tradus-web container_name: tradus-web
ports: ports:
- '6000:80' - '6000:80'

View File

@ -24,6 +24,15 @@ const agents = [
</svg>`, </svg>`,
route: '/analysis/stock', route: '/analysis/stock',
}, },
{
id: 'usstock-analysis',
name: '美股股票分析智能体',
description: '获取美股上市公司的深度AI智能分析报告',
icon: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/>
</svg>`,
route: '/analysis/usstock',
},
] ]
const navigateToAgent = (route: string) => { const navigateToAgent = (route: string) => {

View File

@ -50,6 +50,8 @@ const pageTitle = computed(() => {
switch (analysisType.value) { switch (analysisType.value) {
case 'stock': case 'stock':
return 'A股股票分析智能体' return 'A股股票分析智能体'
case 'usstock':
return '美股股票分析智能体'
case 'crypto': case 'crypto':
default: default:
return '加密货币分析智能体' return '加密货币分析智能体'
@ -60,6 +62,8 @@ const pageDescription = computed(() => {
switch (analysisType.value) { switch (analysisType.value) {
case 'stock': case 'stock':
return '获取A股上市公司的深度AI智能分析' return '获取A股上市公司的深度AI智能分析'
case 'usstock':
return '获取美股上市公司的深度AI智能分析'
case 'crypto': case 'crypto':
default: default:
return '获取加密货币的深度AI智能分析' return '获取加密货币的深度AI智能分析'
@ -70,6 +74,8 @@ const inputPlaceholder = computed(() => {
switch (analysisType.value) { switch (analysisType.value) {
case 'stock': case 'stock':
return '请输入上市公司股票代码' return '请输入上市公司股票代码'
case 'usstock':
return '请输入美股股票代码如AAPL、TSLA等'
case 'crypto': case 'crypto':
default: default:
return '请输入BTC、ETH 一次只能分析一个币种' return '请输入BTC、ETH 一次只能分析一个币种'
@ -77,7 +83,9 @@ const inputPlaceholder = computed(() => {
}) })
// //
const isStockMode = computed(() => analysisType.value === 'stock') const isStockMode = computed(
() => analysisType.value === 'stock' || analysisType.value === 'usstock',
)
// //
const commonItemsList = computed(() => { const commonItemsList = computed(() => {
@ -95,6 +103,19 @@ const commonItemsList = computed(() => {
{ code: '600036', label: '招商银行' }, { code: '600036', label: '招商银行' },
{ code: '603288', label: '海天味业' }, { code: '603288', label: '海天味业' },
] ]
case 'usstock':
return [
{ code: 'AAPL', label: '苹果 (AAPL)' },
{ code: 'TSLA', label: '特斯拉 (TSLA)' },
{ code: 'NVDA', label: '英伟达 (NVDA)' },
{ code: 'GOOGL', label: '谷歌 (GOOGL)' },
{ code: 'MSFT', label: '微软 (MSFT)' },
{ code: 'AMZN', label: '亚马逊 (AMZN)' },
{ code: 'META', label: 'Meta (META)' },
{ code: 'NFLX', label: '奈飞 (NFLX)' },
{ code: 'AMD', label: 'AMD (AMD)' },
{ code: 'BABA', label: '阿里巴巴 (BABA)' },
]
case 'crypto': case 'crypto':
default: default:
return [ return [
@ -143,9 +164,12 @@ const saveAnalysisHistory = async () => {
} }
// //
if (isStockMode.value) { if (analysisType.value === 'stock') {
payload.stock_code = symbolCode.value.trim() payload.symbol = symbolCode.value.trim()
payload.type = 'astock' payload.type = 'astock'
} else if (analysisType.value === 'usstock') {
payload.symbol = symbolCode.value.toUpperCase().trim()
payload.type = 'usstock'
} else { } else {
payload.symbol = symbolCode.value.toUpperCase().trim() payload.symbol = symbolCode.value.toUpperCase().trim()
payload.timeframe = selectedTimeframe.value payload.timeframe = selectedTimeframe.value
@ -169,11 +193,17 @@ const handleAnalysis = async () => {
if (!code || isAnalyzing.value) return if (!code || isAnalyzing.value) return
// //
if (isStockMode.value && !/^\d{6}$/.test(code)) { if (analysisType.value === 'stock' && !/^\d{6}$/.test(code)) {
setErrorMessage('请输入正确的6位股票代码') setErrorMessage('请输入正确的6位股票代码')
return return
} }
// 1-5
if (analysisType.value === 'usstock' && !/^[A-Za-z]{1,5}$/.test(code)) {
setErrorMessage('请输入正确的美股股票代码1-5位字母')
return
}
// //
showInitialView.value = false showInitialView.value = false
isAnalyzing.value = true isAnalyzing.value = true
@ -184,12 +214,18 @@ const handleAnalysis = async () => {
let requestData let requestData
// //
if (isStockMode.value) { if (analysisType.value === 'stock') {
// A // A
requestData = { requestData = {
stock_code: code, stock_code: code,
type: 'astock', type: 'astock',
} }
} else if (analysisType.value === 'usstock') {
//
requestData = {
stock_code: code.toUpperCase(),
type: 'usstock',
}
} else { } else {
// //
requestData = { requestData = {
@ -381,7 +417,9 @@ const parsedContent = computed(() => {
:placeholder="inputPlaceholder" :placeholder="inputPlaceholder"
@keydown="handleKeydown" @keydown="handleKeydown"
:disabled="isAnalyzing" :disabled="isAnalyzing"
:maxlength="isStockMode ? 6 : undefined" :maxlength="
analysisType === 'stock' ? 6 : analysisType === 'usstock' ? 5 : undefined
"
/> />
<button <button
v-if="symbolCode.trim() || analysisContent" v-if="symbolCode.trim() || analysisContent"