import fs from 'fs'; // 读取CSV文件 const csvContent = fs.readFileSync('日历课程表.csv', 'utf-8'); const lines = csvContent.split('\n'); // 课程单元映射 const unitMap = { '岗位体系认知': 'unit1', '产业认知课': 'unit2', '旅游产业全景与文旅基础知识': 'unit3', '文旅服务:形象、沟通与体验的融合艺术': 'unit4', '文旅与供应链基础': 'unit5', '商业设计基础': 'unit6', 'AIGC人工智能生成内容': 'unit7', ' 全栈新媒体运营赋能文旅营销': 'unit8', // 注意CSV中前面有个空格 '活动策划基础': 'unit9', '智慧文旅应用': 'unit10' }; // 初始化课程列表结构 const courseLiveList = []; const unitCoursesMap = new Map(); // 处理每一行数据(跳过标题行) for (let i = 1; i < lines.length; i++) { const line = lines[i].trim(); if (!line) continue; const parts = line.split(','); if (parts.length < 10) continue; const date = parts[0]; const courseStatus = parts[2]; const courseName = parts[3]; const teacher = parts[6]; let unit = parts[7]; // 使用 let 以便可以重新赋值 const status = parts[8]; // 特殊处理:6月17日的单元小结应该属于商业设计基础(unit6) if (date === '2025/6/17' && courseName === '单元小结') { unit = '商业设计基础'; } // 只处理有课的数据 if (courseStatus === '有课' && courseName && unit && unitMap[unit]) { if (!unitCoursesMap.has(unit)) { unitCoursesMap.set(unit, { unitId: unitMap[unit], unitName: unit, courses: [] }); } const unitData = unitCoursesMap.get(unit); // 检查是否已存在相同课程(去重) const existingCourse = unitData.courses.find(c => c.courseName === courseName && c.date === date ); if (!existingCourse) { const [year, month, day] = date.split('/'); const formattedDate = `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`; // 判断课程状态 const today = new Date(); today.setHours(0, 0, 0, 0); // 重置时间部分,只比较日期 const courseDate = new Date(year, parseInt(month) - 1, parseInt(day)); courseDate.setHours(0, 0, 0, 0); const timeDiff = courseDate - today; const daysDiff = Math.floor(timeDiff / (24 * 60 * 60 * 1000)); // 判断课程状态: // - 已完成:日期在今天之前 // - 直播中(current):今天的课程 // - 即将开始(upcoming):未来的课程 // 注意:忽略CSV中的状态,根据日期自动判断 const isCompleted = daysDiff < 0; // 只根据日期判断,过去的课程为已完成 const isCurrent = daysDiff === 0; // 今天的课程设为直播中 const isUpcoming = daysDiff > 0; // 所有未来的课程都标记为即将开始 unitData.courses.push({ courseId: `c${unitData.unitId.replace('unit', '')}-${unitData.courses.length + 1}`, courseName: courseName.length > 20 ? courseName.substring(0, 20) + '...' : courseName, teacherName: teacher || '未知老师', date: formattedDate, completed: isCompleted, current: isCurrent, // 今天的课程标记为current upcoming: isUpcoming // 未来7天内的课程 }); } } } // 按单元顺序组装数据 const orderedUnits = [ '岗位体系认知', '产业认知课', '旅游产业全景与文旅基础知识', '文旅服务:形象、沟通与体验的融合艺术', '文旅与供应链基础', '商业设计基础', 'AIGC人工智能生成内容', ' 全栈新媒体运营赋能文旅营销', // 注意CSV中前面有个空格 '活动策划基础', '智慧文旅应用' ]; orderedUnits.forEach(unitName => { if (unitCoursesMap.has(unitName)) { const unitData = unitCoursesMap.get(unitName); // 按日期排序课程 unitData.courses.sort((a, b) => a.date.localeCompare(b.date)); courseLiveList.push(unitData); } }); // 输出结果 console.log('// 课程直播间的课程列表数据(从CSV生成)'); console.log('mockData.courseLiveList =', JSON.stringify(courseLiveList, null, 2), ';'); // 写入到文件 fs.writeFileSync('courseLiveListData.json', JSON.stringify({ courseLiveList }, null, 2)); console.log('\n✅ 课程列表数据已生成'); console.log(`📚 共${courseLiveList.length}个单元`); console.log(`📖 共${courseLiveList.reduce((acc, unit) => acc + unit.courses.length, 0)}门课程`);