const cloud = require('wx-server-sdk'); cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }); const CONFIG_PATH = 'content/page-config.json'; const DIFFICULTY_LABELS = { 1: '入门', 2: '基础', 3: '进阶', 4: '挑战', }; function ageBand(min, max) { return `${min}-${max}岁`; } function toDisplayItem(ws) { return { id: ws._id, title: ws.title || '', subtitle: ws.subtitle || '', previewImg: ws.previewImg || '', ageBand: ageBand(ws.ageMin || 0, ws.ageMax || 0), ageMin: ws.ageMin || 0, ageMax: ws.ageMax || 0, difficulty: ws.difficulty || 2, difficultyLabel: DIFFICULTY_LABELS[ws.difficulty] || '基础', path: ws.path || '', available: true, likes: ws.likes || 0, downloads: ws.downloads || 0, date: ws.updatedAt ? new Date(ws.updatedAt).toISOString().slice(0, 10) : new Date().toISOString().slice(0, 10), }; } async function readCurrentConfig() { try { const res = await cloud.downloadFile({ fileID: CONFIG_PATH }); return JSON.parse(res.fileContent.toString('utf-8')); } catch { return { home: null, category: null, age: null, version: 0 }; } } async function buildCategoryData(db) { // Get all categories const { data: categories } = await db .collection('categories') .orderBy('sortOrder', 'asc') .get(); // Get all active worksheets const { data: worksheets } = await db .collection('worksheets') .where({ status: 'active' }) .orderBy('sortOrder', 'asc') .orderBy('updatedAt', 'desc') .limit(100) .get(); // Group by category const grouped = {}; for (const ws of worksheets) { const cat = ws.category || 'unknown'; if (!grouped[cat]) grouped[cat] = []; grouped[cat].push(toDisplayItem(ws)); } const categoryData = { searchPlaceholder: '搜索练习纸...', categories: categories.map((cat) => ({ id: cat._id, name: cat.name || '', icon: cat.icon || '', items: grouped[cat._id] || [], })), }; const stats = {}; for (const cat of categoryData.categories) { stats[cat.id] = cat.items.length; } return { categoryData, stats }; } exports.main = async (event) => { try { const db = cloud.database(); const page = String(event.page || '').trim(); if (page !== 'category') { throw new Error('当前仅支持 page=category'); } const { categoryData, stats } = await buildCategoryData(db); // Read current config, merge, bump version const config = await readCurrentConfig(); config.category = categoryData; config.version = (config.version || 0) + 1; config.updatedAt = new Date().toISOString(); // Upload to cloud storage const buffer = Buffer.from(JSON.stringify(config), 'utf-8'); await cloud.uploadFile({ cloudPath: CONFIG_PATH, fileContent: buffer, }); return { success: true, data: { version: config.version, updatedAt: config.updatedAt, stats, }, }; } catch (error) { return { success: false, message: error instanceof Error ? error.message : '生成分类页数据失败', }; } };