feat: 1. 基础设施(2个文件)
- ✅ src/utils/logger.js - 统一日志工具 - API 请求/响应/错误日志 - 组件错误/警告/调试日志 - 开发环境详细分组,生产环境仅错误 - ✅ src/utils/axiosConfig.js - axios 全局拦截器 - 自动记录所有请求/响应 - 统一 baseURL 和 credentials 配置\ 2. 核心文件重构(8个文件)\ AuthFormContent.js | ✅ 保留登录/注册成功 toast❌ 移除验证码发送 toast✅ 添加 .trim()✅ 所有 API 添加 logger | ✅ 完成 | | Center.js | ❌ 移除所有 toast✅ 移除 toast 依赖✅ 添加错误 logger | ✅ 完成 | | Community/index.js | ❌ 移除所有 toast 和导入✅ 移除 toast 依赖✅ 添加错误 logger | ✅ 完成 | | authService.js | ✅ 统一 apiRequest 函数✅ 所有请求自动记录❌ 移除 console.error | ✅ 完成 | | eventService.js | ✅ 重构 apiRequest✅ 所有方法添加 logger❌ 移除 console.log/error | ✅ 完成 | | stockService | ✅ 所有方法添加 logger❌ 移除 console 输出 | ✅ 完成 | | indexService | ✅ 添加 logger❌ 移除 console 输出 | ✅ 完成 | | AuthContext.js | ✅ 保留注册/登出成功 toast❌ 移除验证码发送 toast✅ 所有方法添加 logger | ✅ 完成 |\ 3. Mock 数据完善(\ Mock 数据完善(1个文件) - ✅ src/mocks/handlers/account.js - 个人中心 Mock - ✅ 自选股列表 (GET /api/account/watchlist) - ✅ 实时行情 (GET /api/account/watchlist/realtime) - ✅ 添加自选股 (POST /api/account/watchlist/add) - ✅ 删除自选股 (DELETE /api/account/watchlist/:id) - ✅ 关注的事件 (GET /api/account/events/following) - ✅ 事件评论 (GET /api/account/events/comments) - ✅ 当前订阅 (GET /api/subscription/current)\ 4. API 文档(1个文件) - ✅ API_ENDPOINTS.md - 完整 API 接口文档 - 认证相关: 4个接口 - 个人中心: 12个接口 - 事件相关: 12个接口 - 总计: 28+个接口\ 5。Toast 策略执行: - ✅ 保留: 3种(登录成功、注册成功、登出成功) - ❌ 移除: 15+处(验证码、数据加载等) Logger 替换: - ✅ console.log → logger.debug/logger.info - ✅ console.error → logger.error\- console.warn → logger.warn Mock 数据: 已有: auth.js, event.js, users.js, events.js 新增: account.js(7个新接口) 6.用户体验改进 静默优化:不再弹出验证码发送成功提示(静默处理)不再弹出数据加载失败提示(console 记录) 仅在关键操作显示 toast(登录/注册/登出) 开发体验: Console 中有清晰的分组日志(🌐 🔴 ⚠️ 等图标), 所有 API 请求/响应自动记录,错误日志包含完整上下文和堆栈,Mock 服务完善 测试场景: 登录/注册 - 仅显示成功 toast,验证码静默发送 个人中心 - 加载自选股、实时行情、关注事件 社区页面 - 加载事件列表、Console 查看 9. 添加日志:API Request / ✅ API Response / ❌ API Error
This commit is contained in:
@@ -5,6 +5,133 @@ import { getCurrentUser } from '../data/users';
|
||||
// 模拟网络延迟(毫秒)
|
||||
const NETWORK_DELAY = 300;
|
||||
|
||||
// ==================== Mock 数据 ====================
|
||||
|
||||
// 模拟自选股数据
|
||||
const mockWatchlist = [
|
||||
{
|
||||
id: 1,
|
||||
stock_code: '000001.SZ',
|
||||
stock_name: '平安银行',
|
||||
added_at: '2024-01-15T10:30:00Z',
|
||||
industry: '银行',
|
||||
market_cap: 3200000000000
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
stock_code: '600519.SH',
|
||||
stock_name: '贵州茅台',
|
||||
added_at: '2024-01-10T14:20:00Z',
|
||||
industry: '白酒',
|
||||
market_cap: 2500000000000
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
stock_code: '000858.SZ',
|
||||
stock_name: '五粮液',
|
||||
added_at: '2024-01-08T09:15:00Z',
|
||||
industry: '白酒',
|
||||
market_cap: 800000000000
|
||||
}
|
||||
];
|
||||
|
||||
// 模拟实时行情数据
|
||||
const mockRealtimeQuotes = {
|
||||
'000001.SZ': {
|
||||
price: 12.34,
|
||||
change: 0.56,
|
||||
change_percent: 4.76,
|
||||
volume: 123456789,
|
||||
turnover: 1523456789.12,
|
||||
high: 12.50,
|
||||
low: 11.80,
|
||||
open: 11.90,
|
||||
prev_close: 11.78,
|
||||
timestamp: new Date().toISOString()
|
||||
},
|
||||
'600519.SH': {
|
||||
price: 1680.50,
|
||||
change: -12.30,
|
||||
change_percent: -0.73,
|
||||
volume: 2345678,
|
||||
turnover: 3945678901.23,
|
||||
high: 1695.00,
|
||||
low: 1675.00,
|
||||
open: 1692.80,
|
||||
prev_close: 1692.80,
|
||||
timestamp: new Date().toISOString()
|
||||
},
|
||||
'000858.SZ': {
|
||||
price: 156.78,
|
||||
change: 2.34,
|
||||
change_percent: 1.52,
|
||||
volume: 45678901,
|
||||
turnover: 7123456789.45,
|
||||
high: 158.00,
|
||||
low: 154.50,
|
||||
open: 155.00,
|
||||
prev_close: 154.44,
|
||||
timestamp: new Date().toISOString()
|
||||
}
|
||||
};
|
||||
|
||||
// 模拟关注的事件
|
||||
const mockFollowingEvents = [
|
||||
{
|
||||
id: 1,
|
||||
title: '央行降准0.5个百分点',
|
||||
importance: 'high',
|
||||
followed_at: '2024-01-12T08:00:00Z',
|
||||
event_date: '2024-01-10T00:00:00Z',
|
||||
category: '宏观政策'
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
title: 'ChatGPT-5 即将发布',
|
||||
importance: 'medium',
|
||||
followed_at: '2024-01-11T15:30:00Z',
|
||||
event_date: '2024-01-09T00:00:00Z',
|
||||
category: '科技创新'
|
||||
}
|
||||
];
|
||||
|
||||
// 模拟事件评论
|
||||
const mockEventComments = [
|
||||
{
|
||||
id: 1,
|
||||
event_id: 1,
|
||||
content: '这次降准对银行股是重大利好,建议关注四大行',
|
||||
created_at: '2024-01-12T10:30:00Z',
|
||||
likes: 15,
|
||||
event_title: '央行降准0.5个百分点'
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
event_id: 2,
|
||||
content: 'AI 板块又要起飞了,重点关注算力概念股',
|
||||
created_at: '2024-01-11T16:45:00Z',
|
||||
likes: 8,
|
||||
event_title: 'ChatGPT-5 即将发布'
|
||||
}
|
||||
];
|
||||
|
||||
// 模拟订阅信息(当前订阅)
|
||||
const mockSubscriptionCurrent = {
|
||||
plan: 'premium',
|
||||
plan_name: '专业版',
|
||||
expires_at: '2025-12-31T23:59:59Z',
|
||||
auto_renew: true,
|
||||
features: [
|
||||
'无限事件查看',
|
||||
'实时行情推送',
|
||||
'专业分析报告',
|
||||
'优先客服支持'
|
||||
],
|
||||
price: 299,
|
||||
currency: 'CNY',
|
||||
billing_cycle: 'monthly'
|
||||
};
|
||||
|
||||
export const accountHandlers = [
|
||||
// ==================== 用户资料管理 ====================
|
||||
|
||||
@@ -244,5 +371,172 @@ export const accountHandlers = [
|
||||
permissions
|
||||
}
|
||||
});
|
||||
})
|
||||
}),
|
||||
|
||||
// ==================== 自选股管理 ====================
|
||||
|
||||
// 6. 获取自选股列表
|
||||
http.get('/api/account/watchlist', async () => {
|
||||
await delay(NETWORK_DELAY);
|
||||
|
||||
const currentUser = getCurrentUser();
|
||||
if (!currentUser) {
|
||||
return HttpResponse.json(
|
||||
{ success: false, error: '未登录' },
|
||||
{ status: 401 }
|
||||
);
|
||||
}
|
||||
|
||||
console.log('[Mock] 获取自选股列表');
|
||||
|
||||
return HttpResponse.json({
|
||||
success: true,
|
||||
data: mockWatchlist
|
||||
});
|
||||
}),
|
||||
|
||||
// 7. 获取自选股实时行情
|
||||
http.get('/api/account/watchlist/realtime', async () => {
|
||||
await delay(200);
|
||||
|
||||
const currentUser = getCurrentUser();
|
||||
if (!currentUser) {
|
||||
return HttpResponse.json(
|
||||
{ success: false, error: '未登录' },
|
||||
{ status: 401 }
|
||||
);
|
||||
}
|
||||
|
||||
console.log('[Mock] 获取自选股实时行情');
|
||||
|
||||
return HttpResponse.json({
|
||||
success: true,
|
||||
data: mockRealtimeQuotes
|
||||
});
|
||||
}),
|
||||
|
||||
// 8. 添加自选股
|
||||
http.post('/api/account/watchlist/add', async ({ request }) => {
|
||||
await delay(NETWORK_DELAY);
|
||||
|
||||
const currentUser = getCurrentUser();
|
||||
if (!currentUser) {
|
||||
return HttpResponse.json(
|
||||
{ success: false, error: '未登录' },
|
||||
{ status: 401 }
|
||||
);
|
||||
}
|
||||
|
||||
const body = await request.json();
|
||||
const { stock_code, stock_name } = body;
|
||||
|
||||
console.log('[Mock] 添加自选股:', { stock_code, stock_name });
|
||||
|
||||
const newItem = {
|
||||
id: mockWatchlist.length + 1,
|
||||
stock_code,
|
||||
stock_name,
|
||||
added_at: new Date().toISOString(),
|
||||
industry: '未知',
|
||||
market_cap: 0
|
||||
};
|
||||
|
||||
mockWatchlist.push(newItem);
|
||||
|
||||
return HttpResponse.json({
|
||||
success: true,
|
||||
message: '添加成功',
|
||||
data: newItem
|
||||
});
|
||||
}),
|
||||
|
||||
// 9. 删除自选股
|
||||
http.delete('/api/account/watchlist/:id', async ({ params }) => {
|
||||
await delay(NETWORK_DELAY);
|
||||
|
||||
const currentUser = getCurrentUser();
|
||||
if (!currentUser) {
|
||||
return HttpResponse.json(
|
||||
{ success: false, error: '未登录' },
|
||||
{ status: 401 }
|
||||
);
|
||||
}
|
||||
|
||||
const { id } = params;
|
||||
console.log('[Mock] 删除自选股:', id);
|
||||
|
||||
const index = mockWatchlist.findIndex(item => item.id === parseInt(id));
|
||||
if (index !== -1) {
|
||||
mockWatchlist.splice(index, 1);
|
||||
}
|
||||
|
||||
return HttpResponse.json({
|
||||
success: true,
|
||||
message: '删除成功'
|
||||
});
|
||||
}),
|
||||
|
||||
// ==================== 事件关注管理 ====================
|
||||
|
||||
// 10. 获取关注的事件
|
||||
http.get('/api/account/events/following', async () => {
|
||||
await delay(NETWORK_DELAY);
|
||||
|
||||
const currentUser = getCurrentUser();
|
||||
if (!currentUser) {
|
||||
return HttpResponse.json(
|
||||
{ success: false, error: '未登录' },
|
||||
{ status: 401 }
|
||||
);
|
||||
}
|
||||
|
||||
console.log('[Mock] 获取关注的事件');
|
||||
|
||||
return HttpResponse.json({
|
||||
success: true,
|
||||
data: mockFollowingEvents
|
||||
});
|
||||
}),
|
||||
|
||||
// 11. 获取事件评论
|
||||
http.get('/api/account/events/comments', async () => {
|
||||
await delay(NETWORK_DELAY);
|
||||
|
||||
const currentUser = getCurrentUser();
|
||||
if (!currentUser) {
|
||||
return HttpResponse.json(
|
||||
{ success: false, error: '未登录' },
|
||||
{ status: 401 }
|
||||
);
|
||||
}
|
||||
|
||||
console.log('[Mock] 获取事件评论');
|
||||
|
||||
return HttpResponse.json({
|
||||
success: true,
|
||||
data: mockEventComments
|
||||
});
|
||||
}),
|
||||
|
||||
// ==================== 订阅信息 ====================
|
||||
|
||||
// 12. 获取当前订阅信息
|
||||
http.get('/api/subscription/current', async () => {
|
||||
await delay(NETWORK_DELAY);
|
||||
|
||||
const currentUser = getCurrentUser();
|
||||
if (!currentUser) {
|
||||
return HttpResponse.json(
|
||||
{ success: false, error: '未登录' },
|
||||
{ status: 401 }
|
||||
);
|
||||
}
|
||||
|
||||
console.log('[Mock] 获取当前订阅信息');
|
||||
|
||||
return HttpResponse.json({
|
||||
success: true,
|
||||
data: mockSubscriptionCurrent
|
||||
});
|
||||
}),
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user