完整的教务系统前端项目 - 包含所有修复和9月份数据

This commit is contained in:
KQL
2025-09-03 13:26:13 +08:00
commit 87b06d3176
270 changed files with 116169 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
{
"permissions": {
"allow": [
"mcp__serena__replace_regex",
"mcp__ide__getDiagnostics",
"Bash(node:*)",
"Bash(cat:*)",
"Bash(grep:*)",
"Bash(npx eslint:*)",
"Bash(npm run dev:*)",
"Bash(python3:*)",
"Bash(pip3 install:*)",
"Bash(/usr/bin/python3:*)",
"mcp__serena__think_about_whether_you_are_done",
"mcp__serena__activate_project",
"Bash(npm install:*)",
"Bash(pnpm add:*)",
"Bash(lsof:*)",
"mcp__serena__search_for_pattern",
"mcp__serena__find_symbol",
"Bash(npx babel-node:*)",
"Bash(curl:*)",
"Bash(sed:*)",
"Read(///**)",
"mcp__serena__find_file",
"mcp__serena__list_dir",
"mcp__serena__read_file",
"mcp__serena__replace_symbol_body",
"mcp__serena__execute_shell_command",
"mcp__serena__get_symbols_overview",
"mcp__serena__create_text_file",
"Bash(git remote add:*)",
"Bash(git add:*)",
"Bash(git remote remove:*)",
"Bash(git commit:*)",
"Bash(git push:*)",
"Read(/private/tmp/**)",
"Read(/private/tmp/reference_repo/src/components/ClassRank/**)",
"Bash(pnpm run dev:*)",
"Read(//**)",
"Bash(for func in \"calculateStageProgress\" \"checkMilestoneBlockage\" \"generateCalendarDays\" \"getCurrentActiveStage\" \"getOverallProgress\" \"getWeekDays\" \"updateStageStatuses\")",
"Bash(do)",
"Bash(echo \"=== $func ===\")",
"Bash(done)",
"Bash(git checkout:*)",
"Bash(git branch:*)",
"Bash(git clone:*)",
"Bash(git restore:*)",
"Bash(git init:*)"
],
"deny": [],
"ask": []
}
}

4
.env.development Normal file
View File

@@ -0,0 +1,4 @@
# Development environment variables
VITE_API_BASE_URL=http://localhost:2025
VITE_APP_TITLE=教务管理系统
VITE_APP_ENV=development

4
.env.production Normal file
View File

@@ -0,0 +1,4 @@
# Production environment variables
VITE_API_BASE_URL=/api
VITE_APP_TITLE=教务管理系统
VITE_APP_ENV=production

24
.gitignore vendored Normal file
View File

@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

1
.serena/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/cache

68
.serena/project.yml Normal file
View File

@@ -0,0 +1,68 @@
# language of the project (csharp, python, rust, java, typescript, go, cpp, or ruby)
# * For C, use cpp
# * For JavaScript, use typescript
# Special requirements:
# * csharp: Requires the presence of a .sln file in the project folder.
language: typescript
# whether to use the project's gitignore file to ignore files
# Added on 2025-04-07
ignore_all_files_in_gitignore: true
# list of additional paths to ignore
# same syntax as gitignore, so you can use * and **
# Was previously called `ignored_dirs`, please update your config if you are using that.
# Added (renamed) on 2025-04-07
ignored_paths: []
# whether the project is in read-only mode
# If set to true, all editing tools will be disabled and attempts to use them will result in an error
# Added on 2025-04-18
read_only: false
# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details.
# Below is the complete list of tools for convenience.
# To make sure you have the latest list of tools, and to view their descriptions,
# execute `uv run scripts/print_tool_overview.py`.
#
# * `activate_project`: Activates a project by name.
# * `check_onboarding_performed`: Checks whether project onboarding was already performed.
# * `create_text_file`: Creates/overwrites a file in the project directory.
# * `delete_lines`: Deletes a range of lines within a file.
# * `delete_memory`: Deletes a memory from Serena's project-specific memory store.
# * `execute_shell_command`: Executes a shell command.
# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced.
# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type).
# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type).
# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes.
# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file.
# * `initial_instructions`: Gets the initial instructions for the current project.
# Should only be used in settings where the system prompt cannot be set,
# e.g. in clients you have no control over, like Claude Desktop.
# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol.
# * `insert_at_line`: Inserts content at a given line in a file.
# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
# * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
# * `list_memories`: Lists memories in Serena's project-specific memory store.
# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context).
# * `read_file`: Reads a file within the project directory.
# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store.
# * `remove_project`: Removes a project from the Serena configuration.
# * `replace_lines`: Replaces a range of lines within a file with new content.
# * `replace_symbol_body`: Replaces the full definition of a symbol.
# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen.
# * `search_for_pattern`: Performs a search for a pattern in the project.
# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase.
# * `switch_modes`: Activates modes by providing a list of their names
# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information.
# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task.
# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed.
# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store.
excluded_tools: []
# initial prompt for the project. It will always be given to the LLM upon activating the project
# (contrary to the memories, which are loaded on demand).
initial_prompt: ""
project_name: "frontend"

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 KiB

15
README.md Normal file
View File

@@ -0,0 +1,15 @@
# README
## 安装
```
pnpm
```
## 运行命令
### 开发环境
```
pnpm dev
```

1776
calendarData.json Normal file

File diff suppressed because it is too large Load Diff

174
convertCalendarData.js Normal file
View File

@@ -0,0 +1,174 @@
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} 个任务`);

964
courseLiveListData.json Normal file
View File

@@ -0,0 +1,964 @@
{
"courseLiveList": [
{
"unitId": "unit1",
"unitName": "岗位体系认知",
"courses": [
{
"courseId": "c1-1",
"courseName": "教育体系认知",
"teacherName": "刘杰",
"date": "2025-03-04",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c1-2",
"courseName": "现代文旅类企业的管理体系",
"teacherName": "刘杰",
"date": "2025-03-05",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c1-3",
"courseName": "专科生的职业规划",
"teacherName": "刘杰",
"date": "2025-03-06",
"completed": true,
"current": false,
"upcoming": false
}
]
},
{
"unitId": "unit2",
"unitName": "产业认知课",
"courses": [
{
"courseId": "c2-1",
"courseName": "文旅产业认知课",
"teacherName": "刘杰",
"date": "2025-03-11",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c2-2",
"courseName": "行业详解:旅游行业",
"teacherName": "刘杰",
"date": "2025-03-12",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c2-3",
"courseName": "行业详解:酒店与民宿行业",
"teacherName": "刘杰",
"date": "2025-03-13",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c2-4",
"courseName": "行业详解:活动与会展行业",
"teacherName": "刘杰",
"date": "2025-03-18",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c2-5",
"courseName": "行业详解:文化服务行业",
"teacherName": "刘杰",
"date": "2025-03-19",
"completed": true,
"current": false,
"upcoming": false
}
]
},
{
"unitId": "unit3",
"unitName": "旅游产业全景与文旅基础知识",
"courses": [
{
"courseId": "c3-1",
"courseName": "现代文旅产业生态图谱",
"teacherName": "刘杰",
"date": "2025-03-20",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c3-2",
"courseName": "文旅政策法规与风险管理",
"teacherName": "刘杰",
"date": "2025-03-25",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c3-3",
"courseName": "旅游产品与旅游资源",
"teacherName": "刘杰",
"date": "2025-03-26",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c3-4",
"courseName": "游客行为心理学基础",
"teacherName": "刘杰",
"date": "2025-03-27",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c3-5",
"courseName": "可持续旅游发展",
"teacherName": "刘杰",
"date": "2025-04-01",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c3-6",
"courseName": "单元小结",
"teacherName": "刘杰",
"date": "2025-04-02",
"completed": true,
"current": false,
"upcoming": false
}
]
},
{
"unitId": "unit4",
"unitName": "文旅服务:形象、沟通与体验的融合艺术",
"courses": [
{
"courseId": "c4-1",
"courseName": "文旅场景职业形象IP塑造",
"teacherName": "郭建辉",
"date": "2025-04-03",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c4-2",
"courseName": "情境化服务体验设计",
"teacherName": "郭建辉",
"date": "2025-04-08",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c4-3",
"courseName": "政务商务接待专项礼仪",
"teacherName": "郭建辉",
"date": "2025-04-09",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c4-4",
"courseName": "文旅服务中的非语言表达",
"teacherName": "郭建辉",
"date": "2025-04-10",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c4-5",
"courseName": "服务沟通技巧与表达训练",
"teacherName": "郭建辉",
"date": "2025-04-15",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c4-6",
"courseName": "多元文化下的服务表达差异",
"teacherName": "郭建辉",
"date": "2025-04-16",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c4-7",
"courseName": "单元小结",
"teacherName": "郭建辉",
"date": "2025-04-17",
"completed": true,
"current": false,
"upcoming": false
}
]
},
{
"unitId": "unit5",
"unitName": "文旅与供应链基础",
"courses": [
{
"courseId": "c5-1",
"courseName": "供应链管理的内容",
"teacherName": "赵志强",
"date": "2025-04-22",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c5-2",
"courseName": "文旅资源调度",
"teacherName": "赵志强",
"date": "2025-04-23",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c5-3",
"courseName": "文旅产品全生命周期管理",
"teacherName": "赵志强",
"date": "2025-04-24",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c5-4",
"courseName": "文旅商品供应链",
"teacherName": "赵志强",
"date": "2025-04-29",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c5-5",
"courseName": "住宿业资源协同",
"teacherName": "赵志强",
"date": "2025-04-30",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c5-6",
"courseName": "小型文旅项目的供应链角色模拟",
"teacherName": "赵志强",
"date": "2025-05-01",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c5-7",
"courseName": "文旅项目供应链特征",
"teacherName": "赵志强",
"date": "2025-05-06",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c5-8",
"courseName": "文旅供应链中的B2B与B2C模式",
"teacherName": "赵志强",
"date": "2025-05-07",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c5-9",
"courseName": "单元小结",
"teacherName": "赵志强",
"date": "2025-05-08",
"completed": true,
"current": false,
"upcoming": false
}
]
},
{
"unitId": "unit6",
"unitName": "商业设计基础",
"courses": [
{
"courseId": "c6-1",
"courseName": "现代设计行业的发展现状",
"teacherName": "赵志强",
"date": "2025-05-13",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-2",
"courseName": "设计基础",
"teacherName": "赵志强",
"date": "2025-05-14",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-3",
"courseName": "字体设计与中文字体情绪表达",
"teacherName": "赵志强",
"date": "2025-05-15",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-4",
"courseName": "商业平面色彩搭配",
"teacherName": "赵志强",
"date": "2025-05-20",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-5",
"courseName": "平面设计构图",
"teacherName": "赵志强",
"date": "2025-05-21",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-6",
"courseName": "图像编辑工具Photoshop",
"teacherName": "赵志强",
"date": "2025-05-22",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-7",
"courseName": "图像编辑工具Photoshop",
"teacherName": "赵志强",
"date": "2025-05-27",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-8",
"courseName": "矢量与标志设计Illustrator",
"teacherName": "赵志强",
"date": "2025-05-28",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-9",
"courseName": "矢量与标志设计Illustrator",
"teacherName": "赵志强",
"date": "2025-05-29",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-10",
"courseName": "快速设计工具使用Canva",
"teacherName": "赵志强",
"date": "2025-06-03",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-11",
"courseName": "快速设计工具使用Canva",
"teacherName": "赵志强",
"date": "2025-06-04",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-12",
"courseName": "移动端视觉原型设计Figma",
"teacherName": "赵志强",
"date": "2025-06-05",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-13",
"courseName": "移动端视觉原型设计Figma",
"teacherName": "赵志强",
"date": "2025-06-10",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-14",
"courseName": "视频剪辑入门:剪映",
"teacherName": "赵志强",
"date": "2025-06-11",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-15",
"courseName": "视频剪辑入门:剪映",
"teacherName": "赵志强",
"date": "2025-06-12",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c6-16",
"courseName": "单元小结",
"teacherName": "赵志强",
"date": "2025-06-17",
"completed": true,
"current": false,
"upcoming": false
}
]
},
{
"unitId": "unit7",
"unitName": "AIGC人工智能生成内容",
"courses": [
{
"courseId": "c7-1",
"courseName": "AIGC发展简史与基本逻辑",
"teacherName": "赵志强",
"date": "2025-09-02",
"completed": true,
"current": false,
"upcoming": false
},
{
"courseId": "c7-2",
"courseName": "AIGC的基本概念与各领域的应用",
"teacherName": "赵志强",
"date": "2025-09-03",
"completed": false,
"current": true,
"upcoming": false
},
{
"courseId": "c7-3",
"courseName": "AIGC语言模型chatgpt的灵活应...",
"teacherName": "赵志强",
"date": "2025-09-04",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c7-4",
"courseName": "AIGC生成内容的版权问题与合规使用",
"teacherName": "刘杰",
"date": "2025-09-09",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c7-5",
"courseName": "AIGC图像生成模型Stable Di...",
"teacherName": "刘杰",
"date": "2025-09-10",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c7-6",
"courseName": "AIGC图像生成模型Stable Di...",
"teacherName": "刘杰",
"date": "2025-09-11",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c7-7",
"courseName": "AIGC图像生成模型Stable Di...",
"teacherName": "刘杰",
"date": "2025-09-16",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c7-8",
"courseName": "AIGC图像生成模型Stable Di...",
"teacherName": "刘杰",
"date": "2025-09-17",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c7-9",
"courseName": "AIGC视频应用音视频生成与AI自动剪...",
"teacherName": "赵志强",
"date": "2025-09-18",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c7-10",
"courseName": "AIGC视频应用音视频生成与AI自动剪...",
"teacherName": "赵志强",
"date": "2025-09-23",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c7-11",
"courseName": "AI词曲创作suno",
"teacherName": "赵志强",
"date": "2025-09-24",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c7-12",
"courseName": "AI词曲创作suno",
"teacherName": "赵志强",
"date": "2025-09-25",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c7-13",
"courseName": "单元小结",
"teacherName": "赵志强",
"date": "2025-09-30",
"completed": false,
"current": false,
"upcoming": true
}
]
},
{
"unitId": "unit8",
"unitName": " 全栈新媒体运营赋能文旅营销",
"courses": [
{
"courseId": "c8-1",
"courseName": "新媒体应用传播学",
"teacherName": "赵志强",
"date": "2025-10-01",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-2",
"courseName": "新媒体故事结构入门",
"teacherName": "赵志强",
"date": "2025-10-02",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-3",
"courseName": "新媒体产品策划",
"teacherName": "赵志强",
"date": "2025-10-07",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-4",
"courseName": "平台账号经营与内容赛道",
"teacherName": "赵志强",
"date": "2025-10-08",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-5",
"courseName": "各平台变现方式与具体方法",
"teacherName": "赵志强",
"date": "2025-10-09",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-6",
"courseName": "内容运营:短视频的制作工具",
"teacherName": "赵志强",
"date": "2025-10-14",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-7",
"courseName": "内容运营:短视频的制作工具",
"teacherName": "赵志强",
"date": "2025-10-15",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-8",
"courseName": "内容运营:短视频的制作工具",
"teacherName": "赵志强",
"date": "2025-10-16",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-9",
"courseName": "内容运营:短视频的制作工具",
"teacherName": "赵志强",
"date": "2025-10-21",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-10",
"courseName": "内容运营:短视频制作内容对标",
"teacherName": "刘杰",
"date": "2025-10-22",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-11",
"courseName": "内容运营:短视频制作内容对标",
"teacherName": "刘杰",
"date": "2025-10-23",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-12",
"courseName": "直播运营:直播间的搭建",
"teacherName": "刘杰",
"date": "2025-10-28",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-13",
"courseName": "直播运营:直播间的搭建",
"teacherName": "刘杰",
"date": "2025-10-29",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-14",
"courseName": "品牌运营当地文化IP数字化传播",
"teacherName": "刘杰",
"date": "2025-10-30",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-15",
"courseName": "品牌运营当地文化IP数字化传播",
"teacherName": "刘杰",
"date": "2025-11-04",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-16",
"courseName": "品牌运营:跨界营销创新",
"teacherName": "赵志强",
"date": "2025-11-05",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-17",
"courseName": "品牌运营:跨界营销创新",
"teacherName": "赵志强",
"date": "2025-11-06",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-18",
"courseName": "私域运营:私域流量池的运营",
"teacherName": "赵志强",
"date": "2025-11-11",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-19",
"courseName": "私域运营:私域流量池的运营",
"teacherName": "赵志强",
"date": "2025-11-12",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c8-20",
"courseName": "单元小结",
"teacherName": "赵志强",
"date": "2025-11-13",
"completed": false,
"current": false,
"upcoming": true
}
]
},
{
"unitId": "unit9",
"unitName": "活动策划基础",
"courses": [
{
"courseId": "c9-1",
"courseName": "活动类型与功能认知",
"teacherName": "郭建辉",
"date": "2025-11-18",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-2",
"courseName": "受众定位与主题创意方法",
"teacherName": "郭建辉",
"date": "2025-11-19",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-3",
"courseName": "活动宣传渠道与推广方式",
"teacherName": "郭建辉",
"date": "2025-11-20",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-4",
"courseName": "活动宣传渠道与推广方式",
"teacherName": "郭建辉",
"date": "2025-11-25",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-5",
"courseName": "活动文案写作与表达技巧",
"teacherName": "郭建辉",
"date": "2025-11-26",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-6",
"courseName": "活动文案写作与表达技巧",
"teacherName": "郭建辉",
"date": "2025-11-27",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-7",
"courseName": "活动流程设计与时间节点把控",
"teacherName": "郭建辉",
"date": "2025-12-02",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-8",
"courseName": "活动流程设计与时间节点把控",
"teacherName": "郭建辉",
"date": "2025-12-03",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-9",
"courseName": "活动场地选择与布置基础",
"teacherName": "郭建辉",
"date": "2025-12-04",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-10",
"courseName": "活动预算与资源统筹",
"teacherName": "赵志强",
"date": "2025-12-09",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-11",
"courseName": "应急预案与活动风险管理",
"teacherName": "赵志强",
"date": "2025-12-10",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-12",
"courseName": "活动复盘报告撰写与数据分析方法",
"teacherName": "赵志强",
"date": "2025-12-11",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-13",
"courseName": "活动复盘报告撰写与数据分析方法",
"teacherName": "赵志强",
"date": "2025-12-16",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c9-14",
"courseName": "单元小结",
"teacherName": "赵志强",
"date": "2025-12-17",
"completed": false,
"current": false,
"upcoming": true
}
]
},
{
"unitId": "unit10",
"unitName": "智慧文旅应用",
"courses": [
{
"courseId": "c10-1",
"courseName": "智慧文旅概论",
"teacherName": "赵志强",
"date": "2025-12-18",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c10-2",
"courseName": "OTA平台运营",
"teacherName": "赵志强",
"date": "2025-12-23",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c10-3",
"courseName": "票务分销平台",
"teacherName": "刘杰",
"date": "2025-12-24",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c10-4",
"courseName": "景区智能导览系统",
"teacherName": "赵志强",
"date": "2025-12-25",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c10-5",
"courseName": "智能导览设备运用",
"teacherName": "刘杰",
"date": "2025-12-30",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c10-6",
"courseName": "智慧酒店/智慧景区体验场景模拟",
"teacherName": "刘杰",
"date": "2025-12-31",
"completed": false,
"current": false,
"upcoming": true
},
{
"courseId": "c10-7",
"courseName": "单元小结",
"teacherName": "刘杰",
"date": "2026-01-01",
"completed": false,
"current": false,
"upcoming": true
}
]
}
]
}

619
dashboardTasksData.json Normal file
View File

@@ -0,0 +1,619 @@
{
"todayTasks": [
{
"id": 48,
"title": "完成AIGC的基本概念与各领域的应用课程学习",
"courseName": "AIGC的基本概念与各领域的应用",
"date": "2025-09-03",
"deadline": "2025-09-03 21:00",
"priority": "high",
"status": "IN_PROGRESS",
"teacher": "赵志强",
"unit": "AIGC人工智能生成内容",
"type": "course"
}
],
"allTasks": [
{
"id": 1,
"title": "完成教育体系认知课程学习",
"courseName": "教育体系认知",
"date": "2025-03-04",
"deadline": "2025-03-04 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "岗位体系认知",
"type": "course"
},
{
"id": 2,
"title": "完成现代文旅类企业的管理体系课程学习",
"courseName": "现代文旅类企业的管理体系",
"date": "2025-03-05",
"deadline": "2025-03-05 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "岗位体系认知",
"type": "course"
},
{
"id": 3,
"title": "完成专科生的职业规划课程学习",
"courseName": "专科生的职业规划",
"date": "2025-03-06",
"deadline": "2025-03-06 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "岗位体系认知",
"type": "course"
},
{
"id": 4,
"title": "完成文旅产业认知课课程学习",
"courseName": "文旅产业认知课",
"date": "2025-03-11",
"deadline": "2025-03-11 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "产业认知课",
"type": "course"
},
{
"id": 5,
"title": "完成行业详解:旅游行业课程学习",
"courseName": "行业详解:旅游行业",
"date": "2025-03-12",
"deadline": "2025-03-12 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "产业认知课",
"type": "course"
},
{
"id": 6,
"title": "完成行业详解:酒店与民宿行业课程学习",
"courseName": "行业详解:酒店与民宿行业",
"date": "2025-03-13",
"deadline": "2025-03-13 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "产业认知课",
"type": "course"
},
{
"id": 7,
"title": "完成行业详解:活动与会展行业课程学习",
"courseName": "行业详解:活动与会展行业",
"date": "2025-03-18",
"deadline": "2025-03-18 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "产业认知课",
"type": "course"
},
{
"id": 8,
"title": "完成行业详解:文化服务行业课程学习",
"courseName": "行业详解:文化服务行业",
"date": "2025-03-19",
"deadline": "2025-03-19 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "产业认知课",
"type": "course"
},
{
"id": 9,
"title": "完成现代文旅产业生态图谱课程学习",
"courseName": "现代文旅产业生态图谱",
"date": "2025-03-20",
"deadline": "2025-03-20 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "旅游产业全景与文旅基础知识",
"type": "course"
},
{
"id": 10,
"title": "完成文旅政策法规与风险管理课程学习",
"courseName": "文旅政策法规与风险管理",
"date": "2025-03-25",
"deadline": "2025-03-25 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "旅游产业全景与文旅基础知识",
"type": "course"
},
{
"id": 11,
"title": "完成旅游产品与旅游资源课程学习",
"courseName": "旅游产品与旅游资源",
"date": "2025-03-26",
"deadline": "2025-03-26 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "旅游产业全景与文旅基础知识",
"type": "course"
},
{
"id": 12,
"title": "完成游客行为心理学基础课程学习",
"courseName": "游客行为心理学基础",
"date": "2025-03-27",
"deadline": "2025-03-27 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "旅游产业全景与文旅基础知识",
"type": "course"
},
{
"id": 13,
"title": "完成可持续旅游发展课程学习",
"courseName": "可持续旅游发展",
"date": "2025-04-01",
"deadline": "2025-04-01 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "旅游产业全景与文旅基础知识",
"type": "course"
},
{
"id": 14,
"title": "完成单元小结课程学习",
"courseName": "单元小结",
"date": "2025-04-02",
"deadline": "2025-04-02 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "刘杰",
"unit": "旅游产业全景与文旅基础知识",
"type": "course"
},
{
"id": 15,
"title": "完成文旅场景职业形象IP塑造课程学习",
"courseName": "文旅场景职业形象IP塑造",
"date": "2025-04-03",
"deadline": "2025-04-03 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "郭建辉",
"unit": "文旅服务:形象、沟通与体验的融合艺术",
"type": "course"
},
{
"id": 16,
"title": "完成情境化服务体验设计课程学习",
"courseName": "情境化服务体验设计",
"date": "2025-04-08",
"deadline": "2025-04-08 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "郭建辉",
"unit": "文旅服务:形象、沟通与体验的融合艺术",
"type": "course"
},
{
"id": 17,
"title": "完成政务商务接待专项礼仪课程学习",
"courseName": "政务商务接待专项礼仪",
"date": "2025-04-09",
"deadline": "2025-04-09 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "郭建辉",
"unit": "文旅服务:形象、沟通与体验的融合艺术",
"type": "course"
},
{
"id": 18,
"title": "完成文旅服务中的非语言表达课程学习",
"courseName": "文旅服务中的非语言表达",
"date": "2025-04-10",
"deadline": "2025-04-10 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "郭建辉",
"unit": "文旅服务:形象、沟通与体验的融合艺术",
"type": "course"
},
{
"id": 19,
"title": "完成服务沟通技巧与表达训练课程学习",
"courseName": "服务沟通技巧与表达训练",
"date": "2025-04-15",
"deadline": "2025-04-15 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "郭建辉",
"unit": "文旅服务:形象、沟通与体验的融合艺术",
"type": "course"
},
{
"id": 20,
"title": "完成多元文化下的服务表达差异课程学习",
"courseName": "多元文化下的服务表达差异",
"date": "2025-04-16",
"deadline": "2025-04-16 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "郭建辉",
"unit": "文旅服务:形象、沟通与体验的融合艺术",
"type": "course"
},
{
"id": 21,
"title": "完成单元小结课程学习",
"courseName": "单元小结",
"date": "2025-04-17",
"deadline": "2025-04-17 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "郭建辉",
"unit": "文旅服务:形象、沟通与体验的融合艺术",
"type": "course"
},
{
"id": 22,
"title": "完成供应链管理的内容课程学习",
"courseName": "供应链管理的内容",
"date": "2025-04-22",
"deadline": "2025-04-22 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "文旅与供应链基础",
"type": "course"
},
{
"id": 23,
"title": "完成文旅资源调度课程学习",
"courseName": "文旅资源调度",
"date": "2025-04-23",
"deadline": "2025-04-23 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "文旅与供应链基础",
"type": "course"
},
{
"id": 24,
"title": "完成文旅产品全生命周期管理课程学习",
"courseName": "文旅产品全生命周期管理",
"date": "2025-04-24",
"deadline": "2025-04-24 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "文旅与供应链基础",
"type": "course"
},
{
"id": 25,
"title": "完成文旅商品供应链课程学习",
"courseName": "文旅商品供应链",
"date": "2025-04-29",
"deadline": "2025-04-29 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "文旅与供应链基础",
"type": "course"
},
{
"id": 26,
"title": "完成住宿业资源协同课程学习",
"courseName": "住宿业资源协同",
"date": "2025-04-30",
"deadline": "2025-04-30 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "文旅与供应链基础",
"type": "course"
},
{
"id": 27,
"title": "完成小型文旅项目的供应链角色模拟课程学习",
"courseName": "小型文旅项目的供应链角色模拟",
"date": "2025-05-01",
"deadline": "2025-05-01 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "文旅与供应链基础",
"type": "course"
},
{
"id": 28,
"title": "完成文旅项目供应链特征课程学习",
"courseName": "文旅项目供应链特征",
"date": "2025-05-06",
"deadline": "2025-05-06 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "文旅与供应链基础",
"type": "course"
},
{
"id": 29,
"title": "完成文旅供应链中的B2B与B2C模式课程学习",
"courseName": "文旅供应链中的B2B与B2C模式",
"date": "2025-05-07",
"deadline": "2025-05-07 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "文旅与供应链基础",
"type": "course"
},
{
"id": 30,
"title": "完成单元小结课程学习",
"courseName": "单元小结",
"date": "2025-05-08",
"deadline": "2025-05-08 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "文旅与供应链基础",
"type": "course"
},
{
"id": 31,
"title": "完成现代设计行业的发展现状课程学习",
"courseName": "现代设计行业的发展现状",
"date": "2025-05-13",
"deadline": "2025-05-13 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 32,
"title": "完成设计基础课程学习",
"courseName": "设计基础",
"date": "2025-05-14",
"deadline": "2025-05-14 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 33,
"title": "完成字体设计与中文字体情绪表达课程学习",
"courseName": "字体设计与中文字体情绪表达",
"date": "2025-05-15",
"deadline": "2025-05-15 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 34,
"title": "完成商业平面色彩搭配课程学习",
"courseName": "商业平面色彩搭配",
"date": "2025-05-20",
"deadline": "2025-05-20 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 35,
"title": "完成平面设计构图课程学习",
"courseName": "平面设计构图",
"date": "2025-05-21",
"deadline": "2025-05-21 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 36,
"title": "完成图像编辑工具Photoshop课程学习",
"courseName": "图像编辑工具Photoshop",
"date": "2025-05-22",
"deadline": "2025-05-22 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 37,
"title": "完成图像编辑工具Photoshop课程学习",
"courseName": "图像编辑工具Photoshop",
"date": "2025-05-27",
"deadline": "2025-05-27 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 38,
"title": "完成矢量与标志设计Illustrator课程学习",
"courseName": "矢量与标志设计Illustrator",
"date": "2025-05-28",
"deadline": "2025-05-28 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 39,
"title": "完成矢量与标志设计Illustrator课程学习",
"courseName": "矢量与标志设计Illustrator",
"date": "2025-05-29",
"deadline": "2025-05-29 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 40,
"title": "完成快速设计工具使用Canva课程学习",
"courseName": "快速设计工具使用Canva",
"date": "2025-06-03",
"deadline": "2025-06-03 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 41,
"title": "完成快速设计工具使用Canva课程学习",
"courseName": "快速设计工具使用Canva",
"date": "2025-06-04",
"deadline": "2025-06-04 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 42,
"title": "完成移动端视觉原型设计Figma课程学习",
"courseName": "移动端视觉原型设计Figma",
"date": "2025-06-05",
"deadline": "2025-06-05 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 43,
"title": "完成移动端视觉原型设计Figma课程学习",
"courseName": "移动端视觉原型设计Figma",
"date": "2025-06-10",
"deadline": "2025-06-10 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 44,
"title": "完成视频剪辑入门:剪映课程学习",
"courseName": "视频剪辑入门:剪映",
"date": "2025-06-11",
"deadline": "2025-06-11 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 45,
"title": "完成视频剪辑入门:剪映课程学习",
"courseName": "视频剪辑入门:剪映",
"date": "2025-06-12",
"deadline": "2025-06-12 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 46,
"title": "完成单元小结课程学习",
"courseName": "单元小结",
"date": "2025-06-17",
"deadline": "2025-06-17 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "商业设计基础",
"type": "course"
},
{
"id": 47,
"title": "完成AIGC发展简史与基本逻辑课程学习",
"courseName": "AIGC发展简史与基本逻辑",
"date": "2025-09-02",
"deadline": "2025-09-02 21:00",
"priority": "low",
"status": "COMPLETED",
"teacher": "赵志强",
"unit": "AIGC人工智能生成内容",
"type": "course"
},
{
"id": 48,
"title": "完成AIGC的基本概念与各领域的应用课程学习",
"courseName": "AIGC的基本概念与各领域的应用",
"date": "2025-09-03",
"deadline": "2025-09-03 21:00",
"priority": "high",
"status": "IN_PROGRESS",
"teacher": "赵志强",
"unit": "AIGC人工智能生成内容",
"type": "course"
},
{
"id": 49,
"title": "完成AIGC语言模型chatgpt的灵活应...课程学习",
"courseName": "AIGC语言模型chatgpt的灵活应...",
"date": "2025-09-04",
"deadline": "2025-09-04 21:00",
"priority": "medium",
"status": "PENDING",
"teacher": "赵志强",
"unit": "AIGC人工智能生成内容",
"type": "course"
},
{
"id": 50,
"title": "完成AIGC生成内容的版权问题与合规使用课程学习",
"courseName": "AIGC生成内容的版权问题与合规使用",
"date": "2025-09-09",
"deadline": "2025-09-09 21:00",
"priority": "medium",
"status": "PENDING",
"teacher": "刘杰",
"unit": "AIGC人工智能生成内容",
"type": "course"
}
],
"todayStr": "2025-09-03"
}

53
eslint.config.js Normal file
View File

@@ -0,0 +1,53 @@
import js from "@eslint/js";
import globals from "globals";
import reactHooks from "eslint-plugin-react-hooks";
import reactRefresh from "eslint-plugin-react-refresh";
import { defineConfig, globalIgnores } from "eslint/config";
export default defineConfig([
globalIgnores(["dist"]),
{
files: ["**/*.{js,jsx}"],
extends: [
js.configs.recommended,
reactHooks.configs["recommended-latest"],
reactRefresh.configs.vite,
],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
parserOptions: {
ecmaVersion: "latest",
ecmaFeatures: { jsx: true },
sourceType: "module",
},
},
rules: {
"no-unused-vars": [
"warn",
{
varsIgnorePattern: "^[A-Z_]",
argsIgnorePattern: "^_",
},
],
"react-hooks/exhaustive-deps": 0, // 关闭hooks依赖检测
"no-console": 1,
"react-hooks/rules-of-hooks": "error",
"no-nested-ternary": 0, // 允许嵌套三元表达式
"no-script-url": 0, // 允许javascript:;
"prefer-destructuring": 0, // 关闭强制使用解构
"no-plusplus": 0, // 允许使用++和--的操作
"array-callback-return": 0, // 允许数组map不返回值
"consistent-return": 0,
"no-param-reassign": 0, // 允许修改函数形参
"no-unused-expressions": 0,
"no-restricted-syntax": 0,
"react/prop-types": 0,
"no-prototype-builtins": 0,
"react/no-deprecated": 0, // 关闭react弃用检测
"react/no-string-refs": 0,
"no-useless-escape": 0,
"react-refresh/only-export-components": 0, // 允许匿名导出
},
},
]);

128
generateCourseLiveList.js Normal file
View File

@@ -0,0 +1,128 @@
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)}门课程`);

54
generateTeacherData.js Normal file
View File

@@ -0,0 +1,54 @@
import fs from 'fs';
// 手动定义导师数据因为CSV格式较复杂
const teacherData = {
"刘杰": {
name: "刘杰",
introduction: "15年民宿产业化研发与标准设计经验专注民宿产品创新、职业化培训体系搭建及乡村文旅业态升级主导多项国家级行业标准制定与落地实践。木亚文旅创始人兼董事长全面负责民宿产业研发、标准制定及全国业务拓展同时也是莫干山民宿行业协会执行会长兼秘书长以及浙江大学城市学院旅游管理专业校外导师。曾作为核心起草人主持《乡村民宿服务质量规范》《民宿管家职业技能等级评定规范》等国标编制推动民宿行业标准化发展申报并推动'民宿管家'入选国家新职业目录,建立首个国家级职业技能评定体系。",
specialties: ["一听就懂", "思路很清晰", "课堂不枯燥", "学习氛围爆棚"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJBE4VCCx.png",
type: "复合课导师",
courses: []
},
"郭建辉": {
name: "郭建辉",
introduction: "拥有18年文化旅游规划与产业运营经验专注景区产品创新设计、文旅人才培养体系构建及城市文化更新模式研究主导多项省部级文旅项目及行业标准实践落地。山行文旅研究院创始人兼院长全面负责文旅规划研发、运营标准制定与全国学术交流同时兼任中国文化旅游协会文创专委会副主任委员、华东师范大学旅游与会展专业硕士生导师。",
specialties: ["经验传授权威", "实用可落地", "表达沟通提升", "跨界经验丰富"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJBMNLZL5.png",
type: "复合课导师",
courses: []
},
"赵志强": {
name: "赵志强",
introduction: "深耕乡村旅游与民宿产业12年从一线管家服务到国家级标准制定全程参与中国民宿职业化与产业化进程。曾作为首席讲师为苏浙沪皖四地文旅部门提供'乡村振兴十大模式'培训,设计桑蚕文化园、谢家路村等沉浸式研学路线,促成区域人才协作机制,获江苏省人社厅列为省级高级研修示范项目。曾担任标准起草专家组核心成员,牵头《德清县地方民宿管理办法》试点,联合政府申报'民宿管理师'新职业,制定长三角区域民宿评级体系,推动了紫蓬山民宿学校(安徽)、吴江农文旅融合示范区落地,形成可复制的'民宿+'乡村振兴模式。",
specialties: ["讲解有节奏", "讲解通俗", "幽默又有料", "善于启发"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJC2oLPpC.png",
type: "复合课导师",
courses: []
},
"孙应战": {
name: "孙应战",
introduction: "拥有18年制造业与产品营销经验曾在上市公司与世界500强外企任职参与大众MEB平台、奥迪EA888发动机及新能源汽车项目开发。作为德企内训讲师、国际演讲学会资深会员和中国心理卫生协会会员善于将实践经验转化为通俗讲解课堂氛围轻松易懂。",
specialties: ["经验传授权威", "实用可落地", "表达沟通提升", "跨界经验丰富"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJCc6qecx.jpg",
type: "公共课导师",
courses: []
},
"魏立慧": {
name: "魏立慧",
introduction: "企业资深一线HR主讲专注于为求职者提供一对一的个性化指导。通过真实招聘视角深入剖析个人优势与短板、传授面试技巧、规划职业定位与发展路径帮助学生快速提升求职竞争力。求职策略以实用落地为核心注重互动交流与角色定位让学员在轻松氛围中获得直击痛点的求职策略。",
specialties: ["点评直击要害", "擅长挖掘优势", "职业规划达人", "深谙用人逻辑"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpSO4gUtJz.png",
type: "企业资深HR",
courses: []
}
};
// 输出结果
console.log('// 导师信息数据');
console.log('export const teacherData =', JSON.stringify(teacherData, null, 2), ';');
// 写入到文件
fs.writeFileSync('teacherData.json', JSON.stringify({ teacherData }, null, 2));
console.log('\n✅ 导师信息数据已生成');
console.log(`👨‍🏫 共${Object.keys(teacherData).length}位导师`);

13
index.html Normal file
View File

@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>多多畅职教育系统</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>

44
package.json Normal file
View File

@@ -0,0 +1,44 @@
{
"name": "demo",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite --host",
"dev:docker": "vite --config vite.config.docker.js",
"build": "vite build",
"lint": "eslint .",
"preview": "vite preview",
"build:prod": "vite build --mode production",
"preview:local": "vite preview --host 0.0.0.0 --port 4173",
"deploy": "vercel",
"deploy:prod": "vercel --prod"
},
"dependencies": {
"@arco-design/web-react": "^2.66.5",
"@reduxjs/toolkit": "^2.8.2",
"axios": "^1.11.0",
"echarts": "^6.0.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-echarts": "^0.1.1",
"react-markdown": "^10.1.0",
"react-redux": "^9.2.0",
"react-router-dom": "^7.7.1",
"redux": "^5.0.1"
},
"devDependencies": {
"@eslint/js": "^9.30.1",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@vitejs/plugin-react": "^4.6.0",
"autoprefixer": "^10.4.21",
"eslint": "^9.30.1",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20",
"globals": "^16.3.0",
"postcss": "^8.5.6",
"postcss-px-to-viewport": "^1.1.1",
"vite": "^7.0.4"
}
}

3111
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

14
postcss.config.js Normal file
View File

@@ -0,0 +1,14 @@
export default {
plugins: {
"postcss-px-to-viewport": {
viewportWidth: 1440, // 设计稿宽度
viewportHeight: 1133, // 设计稿高度
unitPrecision: 5, // 转换后的精度,即小数点位数
viewportUnit: "vw", // 希望使用的视口单位
selectorBlackList: ["ignore"], // 不需要转换的类名
minPixelValue: 1, // 小于或等于1px则不进行转换
mediaQuery: true, // 是否在媒体查询中也进行转换
exclude: /node_modules/i, // 排除node_modules目录
},
},
};

BIN
public/live.mp4 Normal file

Binary file not shown.

View File

@@ -0,0 +1,86 @@
import fs from 'fs';
// 读取更新后的mockData
const mockDataContent = fs.readFileSync('src/data/mockData.js', 'utf-8');
// 提取courseLiveList数据
const courseLiveListMatch = mockDataContent.match(/mockData\.courseLiveList = (\[[\s\S]*?\]);/);
if (!courseLiveListMatch) {
console.error('无法找到courseLiveList数据');
process.exit(1);
}
const courseLiveList = eval('(' + courseLiveListMatch[1] + ')');
// 重新生成任务数据
const today = new Date();
today.setHours(0, 0, 0, 0);
const todayStr = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;
console.log('今天的日期:', todayStr);
// 查找今天的课程9月3日
const todaysCourses = [];
courseLiveList.forEach(unit => {
unit.courses.forEach(course => {
if (course.date === todayStr) {
todaysCourses.push({
...course,
unitName: unit.unitName,
unitId: unit.unitId
});
}
});
});
console.log('找到今天的课程:', todaysCourses.length, '门');
todaysCourses.forEach(course => {
console.log(` - ${course.courseName} (${course.teacherName})`);
});
// 生成allTasks
const allTasks = [];
let taskId = 1;
courseLiveList.forEach(unit => {
unit.courses.forEach(course => {
const courseDate = new Date(course.date);
const status = course.completed ? 'COMPLETED' :
course.current ? 'IN_PROGRESS' :
courseDate > today ? 'PENDING' : 'COMPLETED';
allTasks.push({
id: taskId++,
title: `完成${course.courseName}课程学习`,
courseName: course.courseName,
date: course.date,
deadline: `${course.date} 21:00`,
priority: course.current ? 'high' : course.upcoming ? 'medium' : 'low',
status: status,
teacher: course.teacherName,
unit: unit.unitName,
type: 'course'
});
});
});
// 过滤今天的任务
const todayTasks = allTasks.filter(task => task.date === todayStr);
console.log('\n生成的今日任务', todayTasks.length, '个');
todayTasks.forEach(task => {
console.log(` - ${task.title}`);
console.log(` 状态: ${task.status}, 优先级: ${task.priority}`);
});
// 输出结果到文件
const result = {
todayTasks,
allTasks: allTasks.slice(0, 50), // 限制数量
todayStr
};
fs.writeFileSync('dashboardTasksData.json', JSON.stringify(result, null, 2));
console.log('\n✅ Dashboard任务数据已生成到 dashboardTasksData.json');
console.log(`📝 今日任务: ${todayTasks.length}`);
console.log(`📋 总任务: ${allTasks.length}`);

69
removeDuplicates.js Normal file
View File

@@ -0,0 +1,69 @@
import fs from 'fs';
const content = fs.readFileSync('src/data/mockData.js', 'utf-8');
const lines = content.split('\n');
// 要删除的重复函数及其行号范围
const duplicatesToRemove = [
{ name: 'generateCalendarDays', start: 6018 },
{ name: 'getWeekDays', start: 6091 },
{ name: 'calculateStageProgress', start: 6108 },
{ name: 'getCurrentActiveStage', start: 6133 },
{ name: 'checkMilestoneBlockage', start: 6149 },
{ name: 'updateStageStatuses', start: 6182 },
{ name: 'getOverallProgress', start: 6214 }
];
// 找到每个函数的结束行
duplicatesToRemove.forEach(func => {
let braceCount = 0;
let inFunction = false;
for (let i = func.start - 1; i < lines.length; i++) {
const line = lines[i];
if (!inFunction && line.includes('export const ' + func.name)) {
inFunction = true;
}
if (inFunction) {
// 计算大括号
for (const char of line) {
if (char === '{') braceCount++;
if (char === '}') braceCount--;
}
// 函数结束
if (braceCount === 0 && line.includes('};')) {
func.end = i + 1; // 行号从1开始
break;
}
}
}
});
// 标记要删除的行
const linesToDelete = new Set();
duplicatesToRemove.forEach(func => {
if (func.end) {
for (let i = func.start; i <= func.end; i++) {
linesToDelete.add(i);
}
console.log(`标记删除 ${func.name}: 行 ${func.start}-${func.end}`);
}
});
// 创建新内容,跳过标记的行
const newLines = [];
lines.forEach((line, index) => {
const lineNum = index + 1;
if (!linesToDelete.has(lineNum)) {
newLines.push(line);
}
});
// 写入文件
fs.writeFileSync('src/data/mockData.js', newLines.join('\n'));
console.log(`\n✅ 已删除 ${duplicatesToRemove.length} 个重复的函数`);
console.log(`📄 文件已更新`);

56
src/App.jsx Normal file
View File

@@ -0,0 +1,56 @@
import { BrowserRouter, Route, Routes } from "react-router-dom";
import { useEffect } from "react";
import { useDispatch } from "react-redux";
import Layout from "./components/Layout";
import routes from "./routes";
import { mockData } from "./data/mockData";
import { setStudentInfo } from "./store/slices/studentSlice";
// 样式文件导入
import "./global.css";
import "@arco-design/web-react/dist/css/arco.css";
const getAllRoutes = (routes) => {
const result = [];
const traverse = (routeItems) => {
routeItems.forEach((item) => {
if (item.routes) {
// 如果有子路由,递归处理
traverse(item.routes);
} else if (item.path && item.element) {
// 如果是单个路由项,添加到结果数组
result.push(item);
}
});
};
traverse(routes);
return result;
};
function App() {
const dispatch = useDispatch();
const allRoutes = getAllRoutes(routes);
useEffect(() => {
// 初始化学生信息
if (mockData.profileOverview?.studentInfo) {
dispatch(setStudentInfo(mockData.profileOverview.studentInfo));
}
}, [dispatch]);
return (
<BrowserRouter>
<Layout>
<Routes>
{allRoutes?.map((item) => (
<Route {...item} key={item.path} />
))}
</Routes>
</Layout>
</BrowserRouter>
);
}
export default App;

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 709 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1013 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 999 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 959 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Some files were not shown because too many files have changed in this diff Show More