// ========== 模拟数据配置 ========== // 是否使用模拟数据(开发调试时设为 true,上线后改为 false) export const USE_MOCK_DATA = false // 模拟图片列表 const MOCK_IMAGES = [ // '/static/sucai/image-01.png', // '/static/sucai/image-02.png', '/static/sucai/image-03.png', // '/static/sucai/image-04.png', '/static/sucai/image-05.png', '/static/sucai/image-06.png', // '/static/sucai/image-07.png', '/static/sucai/image-08.png', // '/static/sucai/image-09.png', '/static/sucai/image-10.png', '/static/sucai/image-11.png', '/static/sucai/image-12.png', // '/static/sucai/image-13.png', '/static/sucai/image-14.png', '/static/sucai/image-15.png', '/static/sucai/image-16.png', '/static/sucai/image-18.png', ] // 模拟昵称列表 const NICKNAMES = [ '小明', '小红', '小刚', '小芳', '小强', '小美', '小华', '小丽', '小杰', '小婷', '小宇', '小雪', '小晨', '小曦', '小雷', '小雯', '小风', '小月', '小星', '小云', '小河', '小涛', '小琳', '小瑶', ] // ========== 分类 span 阈值配置 ========== // 每个分类有不同的 span 计算规则 export const SPAN_CONFIG = { // 人气王者:高点赞为主,大卡片多 hot: { thresholds: [ { max: 300, span: 1 }, // 300 以下 → span 1 { max: 600, span: 2 }, // 300-600 → span 2 { max: 1000, span: 3 }, // 600-1000 → span 3 { max: Infinity, span: 4 }, // 1000+ → span 4 ] }, // 新鲜上架:低点赞,小卡片为主 new: { thresholds: [ { max: 2, span: 1 }, // 2 以下 → span 1 { max: 5, span: 2 }, // 2-5 → span 2 { max: Infinity, span: 3 },// 5+ → span 3 ] }, // 潜力之星:中等点赞,中小卡片 potential: { thresholds: [ { max: 50, span: 1 }, // 50 以下 → span 1 { max: 100, span: 2 }, // 50-100 → span 2 { max: 150, span: 3 }, // 100-150 → span 3 { max: Infinity, span: 4 },// 150+ → span 4 ] }, // 随机寻宝:混合 random: { thresholds: [ { max: 100, span: 1 }, // 100 以下 → span 1 { max: 300, span: 2 }, // 100-300 → span 2 { max: 600, span: 3 }, // 300-600 → span 3 { max: Infinity, span: 4 },// 600+ → span 4 ] }, } // 根据分类和点赞数计算 span export function calcSpan(category, likes) { const config = SPAN_CONFIG[category] || SPAN_CONFIG.hot for (const t of config.thresholds) { if (likes < t.max) return t.span } return 1 } // ========== 人气王者 - 高点赞热门作品 ========== // span 由 WaterfallGrid._span() 根据 like_count 计算 export const MOCK_RENQIWANG = { items: [ { asset_id: 10001, name: '星光璀璨', cover_url: MOCK_IMAGES[0], like_count: 1258, owner_nickname: '小甜心' }, { asset_id: 10002, name: '爱的绽放', cover_url: MOCK_IMAGES[1], like_count: 986, owner_nickname: '爱豆粉' }, { asset_id: 10003, name: '温暖守护', cover_url: MOCK_IMAGES[2], like_count: 872, owner_nickname: '星星控' }, { asset_id: 10004, name: '甜蜜暴击', cover_url: MOCK_IMAGES[3], like_count: 768, owner_nickname: '追星族' }, { asset_id: 10005, name: '闪耀舞台', cover_url: MOCK_IMAGES[4], like_count: 654, owner_nickname: '小太阳' }, { asset_id: 10006, name: '为你疯狂', cover_url: MOCK_IMAGES[5], like_count: 589, owner_nickname: '小可爱' }, { asset_id: 10007, name: '心动时刻', cover_url: MOCK_IMAGES[6], like_count: 521, owner_nickname: '小天使' }, { asset_id: 10008, name: '永相随', cover_url: MOCK_IMAGES[7], like_count: 487, owner_nickname: '小甜豆' }, { asset_id: 10009, name: '粉红泡泡', cover_url: MOCK_IMAGES[8], like_count: 456, owner_nickname: '小迷糊' }, { asset_id: 10010, name: '爱的力量', cover_url: MOCK_IMAGES[9], like_count: 423, owner_nickname: '小幸运' }, { asset_id: 10011, name: '璀璨星河', cover_url: MOCK_IMAGES[10], like_count: 398, owner_nickname: '小浪漫' }, ], cursor: 'renqiwang_cursor_001', has_more: true, session_id: 'renqiwang_session', } // ========== 新鲜上架 - 新发布作品,点赞较低 ========== export const MOCK_XINXIANSHANG = { items: [ { asset_id: 30001, name: '刚刚发布', cover_url: MOCK_IMAGES[0], like_count: 1, owner_nickname: '新手小白' }, { asset_id: 30002, name: '今日新鲜', cover_url: MOCK_IMAGES[1], like_count: 2, owner_nickname: '小萌新' }, { asset_id: 30003, name: '刚出锅', cover_url: MOCK_IMAGES[2], like_count: 0, owner_nickname: '新来的' }, { asset_id: 30004, name: '热乎的', cover_url: MOCK_IMAGES[3], like_count: 1, owner_nickname: '小试牛刀' }, { asset_id: 30005, name: '新品上市', cover_url: MOCK_IMAGES[4], like_count: 2, owner_nickname: '初来乍到' }, { asset_id: 30006, name: '今日首发', cover_url: MOCK_IMAGES[5], like_count: 1, owner_nickname: '小透明' }, { asset_id: 30007, name: '刚出炉', cover_url: MOCK_IMAGES[6], like_count: 1, owner_nickname: '新手村' }, { asset_id: 30008, name: '最新创作', cover_url: MOCK_IMAGES[7], like_count: 3, owner_nickname: '小画师' }, { asset_id: 30009, name: '新鲜出炉', cover_url: MOCK_IMAGES[8], like_count: 0, owner_nickname: '小创作者' }, { asset_id: 30010, name: '首发作品', cover_url: MOCK_IMAGES[9], like_count: 2, owner_nickname: '小练手' }, { asset_id: 30011, name: '全新上线', cover_url: MOCK_IMAGES[10], like_count: 1, owner_nickname: '新起步' }, ], cursor: 'xinxianshang_cursor_001', has_more: true, session_id: 'xinxianshang_session', } // ========== 潜力之星 - 中等点赞有潜力的作品 ========== export const MOCK_QIANLIXING = { items: [ { asset_id: 20001, name: '初露锋芒', cover_url: MOCK_IMAGES[0], like_count: 128, owner_nickname: '小新芽' }, { asset_id: 20002, name: '蓄势待发', cover_url: MOCK_IMAGES[1], like_count: 115, owner_nickname: '小嫩草' }, { asset_id: 20003, name: '冉冉升起', cover_url: MOCK_IMAGES[2], like_count: 102, owner_nickname: '小泡泡' }, { asset_id: 20004, name: '明日之星', cover_url: MOCK_IMAGES[3], like_count: 98, owner_nickname: '小火苗' }, { asset_id: 20005, name: '潜力无限', cover_url: MOCK_IMAGES[4], like_count: 89, owner_nickname: '小萌芽' }, { asset_id: 20006, name: '闪耀新星', cover_url: MOCK_IMAGES[5], like_count: 82, owner_nickname: '小水滴' }, { asset_id: 20007, name: '小荷才露', cover_url: MOCK_IMAGES[6], like_count: 76, owner_nickname: '小竹笋' }, { asset_id: 20008, name: '锋芒初现', cover_url: MOCK_IMAGES[7], like_count: 71, owner_nickname: '小鸽子' }, { asset_id: 20009, name: '闪闪发光', cover_url: MOCK_IMAGES[8], like_count: 65, owner_nickname: '小萤火' }, { asset_id: 20010, name: '未来可期', cover_url: MOCK_IMAGES[9], like_count: 59, owner_nickname: '小芽芽' }, { asset_id: 20011, name: '新秀登场', cover_url: MOCK_IMAGES[10], like_count: 54, owner_nickname: '小藤蔓' }, ], cursor: 'qianlixing_cursor_001', has_more: true, session_id: 'qianlixing_session', } // ========== 随机寻宝 - 随机混合数据 ========== export const MOCK_SUIJIXUNBAO = { items: [ { asset_id: 40001, name: '神秘宝藏1', cover_url: MOCK_IMAGES[0], like_count: 450, owner_nickname: '寻宝达人' }, { asset_id: 40002, name: '神秘宝藏2', cover_url: MOCK_IMAGES[1], like_count: 320, owner_nickname: '探险家' }, { asset_id: 40003, name: '神秘宝藏3', cover_url: MOCK_IMAGES[2], like_count: 780, owner_nickname: '淘宝高手' }, { asset_id: 40004, name: '神秘宝藏4', cover_url: MOCK_IMAGES[3], like_count: 15, owner_nickname: '捡漏王' }, { asset_id: 40005, name: '神秘宝藏5', cover_url: MOCK_IMAGES[4], like_count: 85, owner_nickname: '挖宝专家' }, { asset_id: 40006, name: '神秘宝藏6', cover_url: MOCK_IMAGES[5], like_count: 550, owner_nickname: '收藏家' }, { asset_id: 40007, name: '神秘宝藏7', cover_url: MOCK_IMAGES[6], like_count: 2, owner_nickname: '淘宝达人' }, { asset_id: 40008, name: '神秘宝藏8', cover_url: MOCK_IMAGES[7], like_count: 120, owner_nickname: '猎奇者' }, { asset_id: 40009, name: '神秘宝藏9', cover_url: MOCK_IMAGES[8], like_count: 620, owner_nickname: '寻宝奇兵' }, { asset_id: 40010, name: '神秘宝藏10', cover_url: MOCK_IMAGES[9], like_count: 8, owner_nickname: '淘宝猎人' }, { asset_id: 40011, name: '神秘宝藏11', cover_url: MOCK_IMAGES[10], like_count: 95, owner_nickname: '挖宝小分队' }, ], cursor: 'suijixunbao_cursor_001', has_more: true, session_id: 'suijixunbao_session', } // ========== 分类映射 ========== export const MOCK_DATA_MAP = { hot: MOCK_RENQIWANG, new: MOCK_XINXIANSHANG, potential: MOCK_QIANLIXING, random: MOCK_SUIJIXUNBAO, } // 根据分类获取模拟数据 export function getMockDataByCategory(category) { return MOCK_DATA_MAP[category] || MOCK_RENQIWANG } // 随机生成更多模拟数据(用于追加) export function generateMockItems(category = 'hot', count = 20, startId = 50000) { const items = [] for (let i = 0; i < count; i++) { const id = startId + i let like_count // 根据分类生成不同的点赞数范围 switch (category) { case 'hot': like_count = 200 + Math.floor(Math.random() * 1000) // 200-1200 break case 'new': like_count = Math.floor(Math.random() * 5) // 0-5 break case 'potential': like_count = 30 + Math.floor(Math.random() * 150) // 30-180 break case 'random': like_count = Math.floor(Math.random() * 800) // 0-800 break default: like_count = Math.floor(Math.random() * 500) } items.push({ asset_id: id, name: `${category}_作品${id}`, cover_url: MOCK_IMAGES[i % MOCK_IMAGES.length], like_count, owner_nickname: NICKNAMES[i % NICKNAMES.length], }) } return items }