refactor: 股票数据管理迁移到 Redux,新增类型化 Hooks

- stockSlice: 新增 loadAllStocks action(带缓存检查)
 - stockSlice: watchlist 结构升级为 { stock_code, stock_name }[]
 - store/hooks.ts: 新增 useAppDispatch, useAppSelector 类型化 hooks
 - stockService: 移除 getAllStocks(已迁移到 Redux)
 - mock: 股票搜索支持模糊匹配 + 相关性排序
This commit is contained in:
zdl
2025-12-05 17:21:36 +08:00
parent 74eae630dd
commit e8a9a6f180
5 changed files with 122 additions and 63 deletions

View File

@@ -123,12 +123,12 @@ const generateStockList = () => {
// 股票相关的 Handlers
export const stockHandlers = [
// 搜索股票(个股中心页面使用)
// 搜索股票(个股中心页面使用)- 支持模糊搜索
http.get('/api/stocks/search', async ({ request }) => {
await delay(200);
const url = new URL(request.url);
const query = url.searchParams.get('q') || '';
const query = (url.searchParams.get('q') || '').toLowerCase().trim();
const limit = parseInt(url.searchParams.get('limit') || '10');
console.log('[Mock Stock] 搜索股票:', { query, limit });
@@ -136,22 +136,44 @@ export const stockHandlers = [
const stocks = generateStockList();
// 如果没有搜索词,返回空结果
if (!query.trim()) {
if (!query) {
return HttpResponse.json({
success: true,
data: []
});
}
// 过滤匹配的股票
const results = stocks.filter(s =>
s.code.includes(query) || s.name.includes(query)
).slice(0, limit);
// 模糊搜索:代码 + 名称(不区分大小写)
const results = stocks.filter(s => {
const code = s.code.toLowerCase();
const name = s.name.toLowerCase();
return code.includes(query) || name.includes(query);
});
// 按相关性排序:完全匹配 > 开头匹配 > 包含匹配
results.sort((a, b) => {
const aCode = a.code.toLowerCase();
const bCode = b.code.toLowerCase();
const aName = a.name.toLowerCase();
const bName = b.name.toLowerCase();
// 计算匹配分数
const getScore = (code, name) => {
if (code === query || name === query) return 100; // 完全匹配
if (code.startsWith(query)) return 80; // 代码开头
if (name.startsWith(query)) return 60; // 名称开头
if (code.includes(query)) return 40; // 代码包含
if (name.includes(query)) return 20; // 名称包含
return 0;
};
return getScore(bCode, bName) - getScore(aCode, aName);
});
// 返回格式化数据
return HttpResponse.json({
success: true,
data: results.map(s => ({
data: results.slice(0, limit).map(s => ({
stock_code: s.code,
stock_name: s.name,
market: s.code.startsWith('6') ? 'SH' : 'SZ',