Files
ALL-teach_sys/frontend/convertCalendarData.js
KQL cd2e307402 初始化12个产业教务系统项目
主要内容:
- 包含12个产业的完整教务系统前端代码
- 智能启动脚本 (start-industry.sh)
- 可视化产业导航页面 (index.html)
- 项目文档 (README.md)

优化内容:
- 删除所有node_modules和.yoyo文件夹,从7.5GB减少到2.7GB
- 添加.gitignore文件避免上传不必要的文件
- 自动依赖管理和智能启动系统

产业列表:
1. 文旅产业 (5150)
2. 智能制造 (5151)
3. 智能开发 (5152)
4. 财经商贸 (5153)
5. 视觉设计 (5154)
6. 交通物流 (5155)
7. 大健康 (5156)
8. 土木水利 (5157)
9. 食品产业 (5158)
10. 化工产业 (5159)
11. 能源产业 (5160)
12. 环保产业 (5161)

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 14:14:14 +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} 个任务`);