228 lines
7.9 KiB
JavaScript
228 lines
7.9 KiB
JavaScript
// src/mocks/handlers/stock.js
|
||
// 股票相关的 Mock Handlers
|
||
|
||
import { http, HttpResponse } from 'msw';
|
||
import { generateTimelineData, generateDailyData } from '../data/kline';
|
||
|
||
// 模拟延迟
|
||
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
||
|
||
// 生成A股主要股票数据(包含各大指数成分股)
|
||
const generateStockList = () => {
|
||
const stocks = [
|
||
// 银行
|
||
{ code: '000001', name: '平安银行' },
|
||
{ code: '600000', name: '浦发银行' },
|
||
{ code: '600036', name: '招商银行' },
|
||
{ code: '601166', name: '兴业银行' },
|
||
{ code: '601169', name: '北京银行' },
|
||
{ code: '601288', name: '农业银行' },
|
||
{ code: '601328', name: '交通银行' },
|
||
{ code: '601398', name: '工商银行' },
|
||
{ code: '601818', name: '光大银行' },
|
||
{ code: '601939', name: '建设银行' },
|
||
{ code: '601998', name: '中信银行' },
|
||
|
||
// 证券
|
||
{ code: '600030', name: '中信证券' },
|
||
{ code: '600109', name: '国金证券' },
|
||
{ code: '600837', name: '海通证券' },
|
||
{ code: '600999', name: '招商证券' },
|
||
{ code: '601688', name: '华泰证券' },
|
||
{ code: '601901', name: '方正证券' },
|
||
|
||
// 保险
|
||
{ code: '601318', name: '中国平安' },
|
||
{ code: '601336', name: '新华保险' },
|
||
{ code: '601601', name: '中国太保' },
|
||
{ code: '601628', name: '中国人寿' },
|
||
|
||
// 白酒/食品饮料
|
||
{ code: '000568', name: '泸州老窖' },
|
||
{ code: '000596', name: '古井贡酒' },
|
||
{ code: '000858', name: '五粮液' },
|
||
{ code: '600519', name: '贵州茅台' },
|
||
{ code: '600600', name: '青岛啤酒' },
|
||
{ code: '600779', name: '水井坊' },
|
||
{ code: '603369', name: '今世缘' },
|
||
|
||
// 医药
|
||
{ code: '000538', name: '云南白药' },
|
||
{ code: '000661', name: '长春高新' },
|
||
{ code: '002422', name: '科伦药业' },
|
||
{ code: '002594', name: '比亚迪' },
|
||
{ code: '600276', name: '恒瑞医药' },
|
||
{ code: '600436', name: '片仔癀' },
|
||
{ code: '603259', name: '药明康德' },
|
||
|
||
// 科技/半导体
|
||
{ code: '000063', name: '中兴通讯' },
|
||
{ code: '000725', name: '京东方A' },
|
||
{ code: '002049', name: '紫光国微' },
|
||
{ code: '002415', name: '海康威视' },
|
||
{ code: '002475', name: '立讯精密' },
|
||
{ code: '600584', name: '长电科技' },
|
||
{ code: '600893', name: '航发动力' },
|
||
{ code: '603501', name: '韦尔股份' },
|
||
|
||
// 新能源/电力
|
||
{ code: '000002', name: '万科A' },
|
||
{ code: '002460', name: '赣锋锂业' },
|
||
{ code: '300750', name: '宁德时代' },
|
||
{ code: '600438', name: '通威股份' },
|
||
{ code: '601012', name: '隆基绿能' },
|
||
{ code: '601668', name: '中国建筑' },
|
||
|
||
// 汽车
|
||
{ code: '000625', name: '长安汽车' },
|
||
{ code: '600066', name: '宇通客车' },
|
||
{ code: '600104', name: '上汽集团' },
|
||
{ code: '601238', name: '广汽集团' },
|
||
{ code: '601633', name: '长城汽车' },
|
||
|
||
// 地产
|
||
{ code: '000002', name: '万科A' },
|
||
{ code: '000069', name: '华侨城A' },
|
||
{ code: '600340', name: '华夏幸福' },
|
||
{ code: '600606', name: '绿地控股' },
|
||
|
||
// 家电
|
||
{ code: '000333', name: '美的集团' },
|
||
{ code: '000651', name: '格力电器' },
|
||
{ code: '002032', name: '苏泊尔' },
|
||
{ code: '600690', name: '海尔智家' },
|
||
|
||
// 互联网/电商
|
||
{ code: '002024', name: '苏宁易购' },
|
||
{ code: '002074', name: '国轩高科' },
|
||
{ code: '300059', name: '东方财富' },
|
||
|
||
// 能源/化工
|
||
{ code: '600028', name: '中国石化' },
|
||
{ code: '600309', name: '万华化学' },
|
||
{ code: '600547', name: '山东黄金' },
|
||
{ code: '600585', name: '海螺水泥' },
|
||
{ code: '601088', name: '中国神华' },
|
||
{ code: '601857', name: '中国石油' },
|
||
|
||
// 电信/运营商
|
||
{ code: '600050', name: '中国联通' },
|
||
{ code: '600941', name: '中国移动' },
|
||
{ code: '601728', name: '中国电信' },
|
||
|
||
// 其他蓝筹
|
||
{ code: '600887', name: '伊利股份' },
|
||
{ code: '601111', name: '中国国航' },
|
||
{ code: '601390', name: '中国中铁' },
|
||
{ code: '601899', name: '紫金矿业' },
|
||
{ code: '603288', name: '海天味业' },
|
||
];
|
||
|
||
return stocks;
|
||
};
|
||
|
||
// 股票相关的 Handlers
|
||
export const stockHandlers = [
|
||
// 获取所有股票列表
|
||
http.get('/api/stocklist', async () => {
|
||
await delay(200);
|
||
|
||
try {
|
||
const stocks = generateStockList();
|
||
|
||
console.log('[Mock Stock] 获取股票列表成功:', { count: stocks.length });
|
||
|
||
return HttpResponse.json(stocks);
|
||
} catch (error) {
|
||
console.error('[Mock Stock] 获取股票列表失败:', error);
|
||
return HttpResponse.json(
|
||
{ error: '获取股票列表失败' },
|
||
{ status: 500 }
|
||
);
|
||
}
|
||
}),
|
||
|
||
// 获取指数K线数据
|
||
http.get('/api/index/:indexCode/kline', async ({ params, request }) => {
|
||
await delay(300);
|
||
|
||
const { indexCode } = params;
|
||
const url = new URL(request.url);
|
||
const type = url.searchParams.get('type') || 'timeline';
|
||
const eventTime = url.searchParams.get('event_time');
|
||
|
||
console.log('[Mock Stock] 获取指数K线数据:', { indexCode, type, eventTime });
|
||
|
||
try {
|
||
let data;
|
||
|
||
if (type === 'timeline') {
|
||
data = generateTimelineData(indexCode);
|
||
} else if (type === 'daily') {
|
||
data = generateDailyData(indexCode, 30);
|
||
} else {
|
||
return HttpResponse.json(
|
||
{ error: '不支持的类型' },
|
||
{ status: 400 }
|
||
);
|
||
}
|
||
|
||
return HttpResponse.json({
|
||
success: true,
|
||
data: data,
|
||
index_code: indexCode,
|
||
type: type,
|
||
message: '获取成功'
|
||
});
|
||
} catch (error) {
|
||
console.error('[Mock Stock] 获取K线数据失败:', error);
|
||
return HttpResponse.json(
|
||
{ error: '获取K线数据失败' },
|
||
{ status: 500 }
|
||
);
|
||
}
|
||
}),
|
||
|
||
// 获取股票K线数据
|
||
http.get('/api/stock/:stockCode/kline', async ({ params, request }) => {
|
||
await delay(300);
|
||
|
||
const { stockCode } = params;
|
||
const url = new URL(request.url);
|
||
const type = url.searchParams.get('type') || 'timeline';
|
||
const eventTime = url.searchParams.get('event_time');
|
||
|
||
console.log('[Mock Stock] 获取股票K线数据:', { stockCode, type, eventTime });
|
||
|
||
try {
|
||
let data;
|
||
|
||
if (type === 'timeline') {
|
||
// 股票使用指数的数据生成逻辑,但价格基数不同
|
||
data = generateTimelineData('000001.SH'); // 可以根据股票代码调整
|
||
} else if (type === 'daily') {
|
||
data = generateDailyData('000001.SH', 30);
|
||
} else {
|
||
return HttpResponse.json(
|
||
{ error: '不支持的类型' },
|
||
{ status: 400 }
|
||
);
|
||
}
|
||
|
||
return HttpResponse.json({
|
||
success: true,
|
||
data: data,
|
||
stock_code: stockCode,
|
||
type: type,
|
||
message: '获取成功'
|
||
});
|
||
} catch (error) {
|
||
console.error('[Mock Stock] 获取股票K线数据失败:', error);
|
||
return HttpResponse.json(
|
||
{ error: '获取K线数据失败' },
|
||
{ status: 500 }
|
||
);
|
||
}
|
||
}),
|
||
];
|