Files
online_sys/frontend_智能开发/generateCourseLiveList.js

128 lines
4.5 KiB
JavaScript
Raw Normal View History

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)}门课程`);