feat: 为"股票行情"和"财务全景"标签页添加 Mock 数据支持

问题:
     - 点击"股票行情"标签页:MarketDataView 组件需要市场数据接口
     - 点击"财务全景"标签页:FinancialPanorama 组件需要财务数据接口
     - 这些接口都没有 mock 数据,导致页面显示空白

     需要添加的接口:

     股票行情 (MarketDataView) - 7个接口

     1. /api/market/trade/:stockCode - 成交数据
     2. /api/market/funding/:stockCode - 资金流向
     3. /api/market/bigdeal/:stockCode - 大单统计
     4. /api/market/unusual/:stockCode - 异动分析
     5. /api/market/pledge/:stockCode - 股权质押
     6. /api/market/summary/:stockCode - 市场摘要
     7. /api/market/rise-analysis/:stockCode - 涨停分析
     8. /api/stock/:stockCode/latest-minute - 最新分时数据

     财务全景 (FinancialPanorama) - 9个接口

     1. /api/financial/stock-info/:stockCode - 股票基本信息
     2. /api/financial/balance-sheet/:stockCode - 资产负债表
     3. /api/financial/income-statement/:stockCode - 利润表
     4. /api/financial/cashflow/:stockCode - 现金流量表
     5. /api/financial/financial-metrics/:stockCode - 财务指标
     6. /api/financial/main-business/:stockCode - 主营业务
     7. /api/financial/forecast/:stockCode - 业绩预告
     8. /api/financial/industry-rank/:stockCode - 行业排名
     9. /api/financial/comparison/:stockCode - 期间对比

     实施步骤:
     1. 创建 src/mocks/data/market.js - 市场数据
     2. 创建 src/mocks/data/financial.js - 财务数据
     3. 创建 src/mocks/handlers/market.js - 市场接口handlers
     4. 创建 src/mocks/handlers/financial.js - 财务接口handlers
     5. 更新 src/mocks/handlers/index.js - 注册新handlers

     数据内容:
     - 为平安银行 (000001) 提供完整真实数据
     - 其他股票代码生成合理的模拟数据
This commit is contained in:
zdl
2025-10-27 15:10:03 +08:00
parent 39feae87a6
commit 199a54bc12
5 changed files with 479 additions and 0 deletions

View File

@@ -0,0 +1,121 @@
// src/mocks/handlers/financial.js
// 财务数据相关的 Mock Handlers
import { http, HttpResponse } from 'msw';
import { generateFinancialData } from '../data/financial';
// 模拟延迟
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
export const financialHandlers = [
// 1. 股票基本信息
http.get('/api/financial/stock-info/:stockCode', async ({ params }) => {
await delay(150);
const { stockCode } = params;
const data = generateFinancialData(stockCode);
return HttpResponse.json({
success: true,
data: data.stockInfo
});
}),
// 2. 资产负债表
http.get('/api/financial/balance-sheet/:stockCode', async ({ params, request }) => {
await delay(250);
const { stockCode } = params;
const url = new URL(request.url);
const limit = parseInt(url.searchParams.get('limit') || '4', 10);
const data = generateFinancialData(stockCode);
return HttpResponse.json({
success: true,
data: data.balanceSheet.slice(0, limit)
});
}),
// 3. 利润表
http.get('/api/financial/income-statement/:stockCode', async ({ params, request }) => {
await delay(250);
const { stockCode } = params;
const url = new URL(request.url);
const limit = parseInt(url.searchParams.get('limit') || '4', 10);
const data = generateFinancialData(stockCode);
return HttpResponse.json({
success: true,
data: data.incomeStatement.slice(0, limit)
});
}),
// 4. 现金流量表
http.get('/api/financial/cashflow/:stockCode', async ({ params, request }) => {
await delay(250);
const { stockCode } = params;
const url = new URL(request.url);
const limit = parseInt(url.searchParams.get('limit') || '4', 10);
const data = generateFinancialData(stockCode);
return HttpResponse.json({
success: true,
data: data.cashflow.slice(0, limit)
});
}),
// 5. 财务指标
http.get('/api/financial/financial-metrics/:stockCode', async ({ params, request }) => {
await delay(250);
const { stockCode } = params;
const url = new URL(request.url);
const limit = parseInt(url.searchParams.get('limit') || '4', 10);
const data = generateFinancialData(stockCode);
return HttpResponse.json({
success: true,
data: data.financialMetrics.slice(0, limit)
});
}),
// 6. 主营业务
http.get('/api/financial/main-business/:stockCode', async ({ params }) => {
await delay(200);
const { stockCode } = params;
const data = generateFinancialData(stockCode);
return HttpResponse.json({
success: true,
data: data.mainBusiness
});
}),
// 7. 业绩预告
http.get('/api/financial/forecast/:stockCode', async ({ params }) => {
await delay(200);
const { stockCode } = params;
const data = generateFinancialData(stockCode);
return HttpResponse.json({
success: true,
data: data.forecast
});
}),
// 8. 行业排名
http.get('/api/financial/industry-rank/:stockCode', async ({ params }) => {
await delay(250);
const { stockCode } = params;
const data = generateFinancialData(stockCode);
return HttpResponse.json({
success: true,
data: data.industryRank
});
}),
// 9. 期间对比
http.get('/api/financial/comparison/:stockCode', async ({ params }) => {
await delay(250);
const { stockCode } = params;
const data = generateFinancialData(stockCode);
return HttpResponse.json({
success: true,
data: data.periodComparison
});
}),
];

View File

@@ -10,6 +10,8 @@ import { industryHandlers } from './industry';
import { conceptHandlers } from './concept';
import { stockHandlers } from './stock';
import { companyHandlers } from './company';
import { marketHandlers } from './market';
import { financialHandlers } from './financial';
// 可以在这里添加更多的 handlers
// import { userHandlers } from './user';
@@ -24,5 +26,7 @@ export const handlers = [
...conceptHandlers,
...stockHandlers,
...companyHandlers,
...marketHandlers,
...financialHandlers,
// ...userHandlers,
];

View File

@@ -0,0 +1,74 @@
// src/mocks/handlers/market.js
// 市场行情相关的 Mock Handlers
import { http, HttpResponse } from 'msw';
import { generateMarketData } from '../data/market';
// 模拟延迟
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
export const marketHandlers = [
// 1. 成交数据
http.get('/api/market/trade/:stockCode', async ({ params, request }) => {
await delay(200);
const { stockCode } = params;
const data = generateMarketData(stockCode);
return HttpResponse.json(data.tradeData);
}),
// 2. 资金流向
http.get('/api/market/funding/:stockCode', async ({ params }) => {
await delay(200);
const { stockCode } = params;
const data = generateMarketData(stockCode);
return HttpResponse.json(data.fundingData);
}),
// 3. 大单统计
http.get('/api/market/bigdeal/:stockCode', async ({ params }) => {
await delay(200);
const { stockCode } = params;
const data = generateMarketData(stockCode);
return HttpResponse.json(data.bigDealData);
}),
// 4. 异动分析
http.get('/api/market/unusual/:stockCode', async ({ params }) => {
await delay(200);
const { stockCode } = params;
const data = generateMarketData(stockCode);
return HttpResponse.json(data.unusualData);
}),
// 5. 股权质押
http.get('/api/market/pledge/:stockCode', async ({ params }) => {
await delay(200);
const { stockCode } = params;
const data = generateMarketData(stockCode);
return HttpResponse.json(data.pledgeData);
}),
// 6. 市场摘要
http.get('/api/market/summary/:stockCode', async ({ params }) => {
await delay(200);
const { stockCode } = params;
const data = generateMarketData(stockCode);
return HttpResponse.json(data.summaryData);
}),
// 7. 涨停分析
http.get('/api/market/rise-analysis/:stockCode', async ({ params }) => {
await delay(200);
const { stockCode } = params;
const data = generateMarketData(stockCode);
return HttpResponse.json(data.riseAnalysisData);
}),
// 8. 最新分时数据
http.get('/api/stock/:stockCode/latest-minute', async ({ params }) => {
await delay(300);
const { stockCode } = params;
const data = generateMarketData(stockCode);
return HttpResponse.json(data.latestMinuteData);
}),
];