Files
online_sys/frontend_大健康/convertCalendarData.js
KQL a7242f0c69 Initial commit: 教务系统在线平台
- 包含4个产业方向的前端项目:智能开发、智能制造、大健康、财经商贸
- 已清理node_modules、.yoyo等大文件,项目大小从2.6GB优化至631MB
- 配置完善的.gitignore文件

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-12 18:16:55 +08:00

174 lines
5.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import fs from 'fs';
// 读取CSV文件
const csvContent = fs.readFileSync('日历课程表.csv', 'utf-8');
const lines = csvContent.split('\n');
// 解析CSV数据
const calendarEvents = [];
let eventId = 1;
// 获取当前日期
const today = new Date();
const currentYear = today.getFullYear();
const currentMonth = today.getMonth() + 1;
const currentDay = today.getDate();
// 颜色映射
const unitColors = {
'岗位体系认知': '#3b82f6',
'产业认知课': '#10b981',
'旅游产业全景与文旅基础知识': '#f59e0b',
'文旅服务:形象、沟通与体验的融合艺术': '#ef4444',
'文旅活动企划与实施': '#8b5cf6',
'设计能力提升': '#06b6d4',
'AIGC人工智能生成内容': '#ec4899',
'全栈新媒体运营赋能文旅营销': '#14b8a6',
'活动策划基础': '#f97316',
'智慧文旅应用': '#6366f1'
};
// 课程状态映射
const getEventStatus = (statusStr, dateStr) => {
const [year, month, day] = dateStr.split('/').map(Number);
const eventDate = new Date(year, month - 1, day);
const today = new Date();
today.setHours(0, 0, 0, 0);
eventDate.setHours(0, 0, 0, 0);
if (statusStr === '已结束') return 'completed';
if (statusStr === '未开始') {
// 检查是否是近期7天内
const daysDiff = Math.floor((eventDate - today) / (1000 * 60 * 60 * 24));
if (daysDiff >= 0 && daysDiff <= 7) return 'upcoming';
return 'future';
}
return 'pending';
};
// 处理每一行数据(跳过标题行)
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 weekday = parts[1];
const courseStatus = parts[2];
const courseName = parts[3];
const publicCourse = parts[4];
const time = parts[5];
const teacher = parts[6];
const unit = parts[7];
const status = parts[8];
const className = parts[9];
// 只处理有课的数据
if (courseStatus === '有课' && courseName) {
const [year, month, day] = date.split('/').map(Number);
const timeRange = time.split('~');
// 修复时间格式,去除中文冒号
const startTime = (timeRange[0] || '20:00').replace('', ':');
const endTime = (timeRange[1] || '21:00').replace('', ':');
// 截断过长的课程名称
const truncatedTitle = courseName.length > 12 ? courseName.substring(0, 11) + '...' : courseName;
const event = {
id: eventId++,
title: truncatedTitle,
fullTitle: courseName, // 保留完整标题
teacher: teacher,
unit: unit,
startTime: `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${startTime}`,
endTime: `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${endTime}`,
type: 'course',
color: unitColors[unit] || '#6b7280',
textColor: '#1d2129', // 添加文字颜色
description: `${unit} - ${teacher}老师`,
status: getEventStatus(status, date),
weekday: weekday
};
calendarEvents.push(event);
}
// 处理公开课
if (publicCourse && publicCourse !== '') {
const [year, month, day] = date.split('/').map(Number);
const timeRange = time.split('~');
const startTime = (timeRange[0] || '20:00').replace('', ':');
const endTime = (timeRange[1] || '21:00').replace('', ':');
// 截断过长的公开课名称
const truncatedTitle = publicCourse.length > 12 ? publicCourse.substring(0, 11) + '...' : publicCourse;
const publicEvent = {
id: eventId++,
title: truncatedTitle,
fullTitle: publicCourse,
teacher: '公开课讲师',
unit: '公开课',
startTime: `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${startTime}`,
endTime: `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${endTime}`,
type: 'public',
color: '#9333ea',
textColor: '#1d2129',
description: '职业技能公开课',
status: 'upcoming',
weekday: weekday
};
calendarEvents.push(publicEvent);
}
}
// 生成allTasks数据用于Dashboard的任务列表
const allTasks = calendarEvents
.filter(event => {
const eventDate = new Date(event.startTime.split(' ')[0]);
const today = new Date();
const daysDiff = Math.floor((eventDate - today) / (1000 * 60 * 60 * 24));
return daysDiff >= -30 && daysDiff <= 30; // 只保留前后30天的任务
})
.map((event, index) => {
const [date, time] = event.startTime.split(' ');
const typeMap = {
'course': 'HOMEWORK',
'public': 'OTHER',
'lab': 'PROJECT',
'meeting': 'INTERVIEW'
};
return {
id: index + 1,
title: `完成${event.title}课程学习`,
date: date,
time: time,
type: typeMap[event.type] || 'HOMEWORK',
courseName: event.title,
status: event.status === 'completed' ? 'COMPLETED' :
event.status === 'upcoming' ? 'PENDING' : 'PENDING',
teacherName: event.teacher,
teacherAvatar: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp",
duration: "1小时"
};
});
// 输出结果
console.log('// 日历事件数据从CSV生成');
console.log('calendarEvents:', JSON.stringify(calendarEvents, null, 2));
console.log('\n// 任务列表数据(从日历事件生成)');
console.log('allTasks:', JSON.stringify(allTasks.slice(0, 20), null, 2)); // 只显示前20个任务
// 写入到文件
const output = {
calendarEvents,
allTasks
};
fs.writeFileSync('calendarData.json', JSON.stringify(output, null, 2));
console.log('\n数据已保存到 calendarData.json');
console.log(`总共生成了 ${calendarEvents.length} 个日历事件和 ${allTasks.length} 个任务`);