diff --git a/package-lock.json b/package-lock.json index 4c0318b..eab616a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.2", "axios": "^1.15.2", + "echarts": "^6.0.0", "element-plus": "^2.13.7", "vue": "^3.5.32", "vue-router": "^4.6.4" @@ -765,6 +766,22 @@ "node": ">= 0.4" } }, + "node_modules/echarts": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", + "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.0.0" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, "node_modules/element-plus": { "version": "2.13.7", "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.13.7.tgz", @@ -1642,6 +1659,21 @@ "peerDependencies": { "vue": "^3.5.0" } + }, + "node_modules/zrender": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz", + "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" } } } diff --git a/package.json b/package.json index 3afec46..7b70900 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.2", "axios": "^1.15.2", + "echarts": "^6.0.0", "element-plus": "^2.13.7", "vue": "^3.5.32", "vue-router": "^4.6.4" diff --git a/src/App.vue b/src/App.vue index 030e00e..92df483 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,14 +2,6 @@ - - \ No newline at end of file diff --git a/src/api/common.js b/src/api/common.js new file mode 100644 index 0000000..88ef6f9 --- /dev/null +++ b/src/api/common.js @@ -0,0 +1,4 @@ +import request from '@/utils/request' +export function getTradeCalendar() { + return request({ url: '/common/trade-calendar', method: 'get' }) +} \ No newline at end of file diff --git a/src/api/stock.js b/src/api/stock.js index f5e4a2e..29757e3 100644 --- a/src/api/stock.js +++ b/src/api/stock.js @@ -1,11 +1,17 @@ -import axios from 'axios' +import request from '@/utils/request' -const request = axios.create({ - baseURL: 'http://localhost:18080/api/v1', // 指向你的 Go 后端 - timeout: 10000 -}) +export function getAnalyzeData(data) { + return request({ + url: '/stock/analyze', + method: 'post', + data + }) +} -// 获取涨停回落分析数据 -export const getAnalyzeData = (params) => { - return request.get('/stock/analyze', { params }) +// 新增:获取历史K线 +export function getKlineData(code) { + return request({ + url: `/stock/kline/${code}`, + method: 'get' + }) } \ No newline at end of file diff --git a/src/main.js b/src/main.js index b124320..6ff6db4 100644 --- a/src/main.js +++ b/src/main.js @@ -3,13 +3,24 @@ import App from './App.vue' import router from './router' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' -// 引入中文语言包 + +// 引入 Element Plus 中文语言包 import zhCn from 'element-plus/dist/locale/zh-cn.mjs' +// 引入图标 +import * as ElementPlusIconsVue from '@element-plus/icons-vue' + const app = createApp(App) +// 全局注册 Element Plus 图标组件 +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component) +} + +// 注册路由 app.use(router) -// 全局配置 Element Plus 使用中文 + +// 注册 Element Plus 并配置中文国际化 app.use(ElementPlus, { locale: zhCn, }) diff --git a/src/router/index.js b/src/router/index.js index 04b338e..a3e90b0 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -8,7 +8,8 @@ const routes = [ { path: '/stock/analyze', name: 'StockAnalyze', - component: () => import('../views/stock/Analyze.vue') + component: () => import('@/views/stock/Analyze.vue'), + meta: { title: '涨停回落分析' } } ] diff --git a/src/utils/request.js b/src/utils/request.js new file mode 100644 index 0000000..e09d02f --- /dev/null +++ b/src/utils/request.js @@ -0,0 +1,17 @@ +import axios from 'axios' +import { ElMessage } from 'element-plus' + +const service = axios.create({ + baseURL: '/api/v1', + timeout: 15000 +}) + +service.interceptors.response.use( + response => response.data, + error => { + ElMessage.error(error.response?.data?.error || '请求失败') + return Promise.reject(error) + } +) + +export default service \ No newline at end of file diff --git a/src/views/stock/Analyze.vue b/src/views/stock/Analyze.vue index 5684be0..497847d 100644 --- a/src/views/stock/Analyze.vue +++ b/src/views/stock/Analyze.vue @@ -1,178 +1,331 @@