feat:添加mock接口

1.  Profile 和 Settings 页面(2个文件)
  2.  EventDetail 页面(1个文件)
  3.  身份验证组件(WechatRegister.js)
  4.  Company 页面(CompanyOverview, index, FinancialPanorama, MarketDataView)
  5.  Concept 页面(ConceptTimelineModal, ConceptStatsPanel, index)
This commit is contained in:
zdl
2025-10-18 08:46:56 +08:00
parent bef96da3f1
commit 90263a488c
6 changed files with 91 additions and 91 deletions

View File

@@ -1,5 +1,6 @@
// src/views/Market/MarketDataPro.jsx
import React, { useState, useEffect, useMemo } from 'react';
import { logger } from '../../utils/logger';
import {
Box,
Container,
@@ -151,7 +152,7 @@ const marketService = {
}
return response.json();
} catch (error) {
console.error(`API request failed for ${url}:`, error);
logger.error('marketService', 'apiRequest', error, { url });
throw error;
}
},
@@ -317,6 +318,7 @@ const MarketDataView = ({ stockCode: propStockCode }) => {
// 加载数据
const loadMarketData = async () => {
logger.debug('MarketDataView', '开始加载市场数据', { stockCode, selectedPeriod });
setLoading(true);
try {
const [summaryRes, tradeRes, fundingRes, bigDealRes, unusualRes, pledgeRes, riseAnalysisRes] = await Promise.all([
@@ -337,12 +339,12 @@ const MarketDataView = ({ stockCode: propStockCode }) => {
if (pledgeRes.success) setPledgeData(pledgeRes.data);
if (riseAnalysisRes.success) {
setRiseAnalysisData(riseAnalysisRes.data);
// 创建分析数据映射
const tempAnalysisMap = {};
if (tradeRes.success && tradeRes.data && riseAnalysisRes.data) {
riseAnalysisRes.data.forEach(analysis => {
const dateIndex = tradeRes.data.findIndex(item =>
const dateIndex = tradeRes.data.findIndex(item =>
item.date.substring(0, 10) === analysis.trade_date
);
if (dateIndex !== -1) {
@@ -352,22 +354,14 @@ const MarketDataView = ({ stockCode: propStockCode }) => {
}
setAnalysisMap(tempAnalysisMap);
}
toast({
title: '数据加载成功',
status: 'success',
duration: 2000,
isClosable: true,
});
// ❌ 移除数据加载成功toast
logger.info('MarketDataView', '市场数据加载成功', { stockCode });
} catch (error) {
console.error('Failed to load market data:', error);
toast({
title: '数据加载失败',
description: error.message,
status: 'error',
duration: 5000,
isClosable: true,
});
logger.error('MarketDataView', 'loadMarketData', error, { stockCode, selectedPeriod });
// ❌ 移除数据加载失败toast
// toast({ title: '数据加载失败', description: error.message, status: 'error', duration: 5000, isClosable: true });
} finally {
setLoading(false);
}
@@ -375,6 +369,7 @@ const MarketDataView = ({ stockCode: propStockCode }) => {
// 获取分钟频数据
const loadMinuteData = async () => {
logger.debug('MarketDataView', '开始加载分钟频数据', { stockCode });
setMinuteLoading(true);
try {
const response = await fetch(
@@ -394,19 +389,17 @@ const MarketDataView = ({ stockCode: propStockCode }) => {
const data = await response.json();
if (data.data && Array.isArray(data.data)) {
setMinuteData(data);
logger.info('MarketDataView', '分钟频数据加载成功', { stockCode, dataPoints: data.data.length });
} else {
setMinuteData({ data: [], code: stockCode, name: '', trade_date: '', type: 'minute' });
logger.warn('MarketDataView', '分钟频数据为空', { stockCode });
}
} catch (error) {
console.error('Failed to load minute data:', error);
toast({
title: '分钟数据加载失败',
description: error.message,
status: 'error',
duration: 3000,
isClosable: true,
});
logger.error('MarketDataView', 'loadMinuteData', error, { stockCode });
// ❌ 移除分钟数据加载失败toast
// toast({ title: '分钟数据加载失败', description: error.message, status: 'error', duration: 3000, isClosable: true });
setMinuteData({ data: [], code: stockCode, name: '', trade_date: '', type: 'minute' });
} finally {
setMinuteLoading(false);