352 lines
13 KiB
JavaScript
352 lines
13 KiB
JavaScript
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|||
|
|
// 学科名称映射
|
|||
|
|
const subjectMap = {
|
|||
|
|
'live': '生活',
|
|||
|
|
'language': '语文',
|
|||
|
|
'math': '数学'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 年级名称映射
|
|||
|
|
const gradeNames = ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级'];
|
|||
|
|
|
|||
|
|
// 学期名称
|
|||
|
|
const semesterNames = ['上册', '下册'];
|
|||
|
|
|
|||
|
|
// 当前视图状态
|
|||
|
|
let currentView = {
|
|||
|
|
mode: 'semester', // 'semester' | 'courses'
|
|||
|
|
subject: null,
|
|||
|
|
grade: null,
|
|||
|
|
semester: null
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 根据学科、年级、学期动态生成图片路径的函数
|
|||
|
|
function getCourseImagePath(subject, gradeIndex, semesterIndex) {
|
|||
|
|
const subjectPrefix = {
|
|||
|
|
'math': 'math',
|
|||
|
|
'language': 'chinese', // 如果有语文图片的话
|
|||
|
|
'live': 'life' // 如果有生活图片的话
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const gradeNumber = gradeIndex + 1; // 转换为1-6
|
|||
|
|
const semesterText = semesterIndex === 0 ? '上' : '下';
|
|||
|
|
|
|||
|
|
const prefix = subjectPrefix[subject] || subject;
|
|||
|
|
return `../asset/course_img/${prefix}${gradeNumber}${semesterText}.png`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 当前选中的筛选条件
|
|||
|
|
let currentFilters = {
|
|||
|
|
subject: 'math', // 默认选中数学
|
|||
|
|
grade: 1 // 默认选中二年级 (索引1)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 生成学科标签
|
|||
|
|
function generateSubjectTags() {
|
|||
|
|
const container = document.getElementById('subject-tags');
|
|||
|
|
const courseList = GLOBAL_CONFIG.courseList;
|
|||
|
|
|
|||
|
|
Object.keys(courseList).forEach((subject, index) => {
|
|||
|
|
const tag = document.createElement('div');
|
|||
|
|
tag.className = 'filter-tag';
|
|||
|
|
tag.textContent = subjectMap[subject] || subject;
|
|||
|
|
tag.dataset.subject = subject;
|
|||
|
|
|
|||
|
|
if (subject === currentFilters.subject) {
|
|||
|
|
tag.classList.add('active');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tag.addEventListener('click', function () {
|
|||
|
|
container.querySelectorAll('.filter-tag').forEach(t => t.classList.remove('active'));
|
|||
|
|
this.classList.add('active');
|
|||
|
|
currentFilters.subject = subject;
|
|||
|
|
|
|||
|
|
// 重置视图状态
|
|||
|
|
currentView.mode = 'semester';
|
|||
|
|
updateCourseDisplay();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
container.appendChild(tag);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成类别标签
|
|||
|
|
function getCate() {
|
|||
|
|
const container = document.getElementById('Category');
|
|||
|
|
|
|||
|
|
if (!container) {
|
|||
|
|
console.warn('Category container not found');
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const cates = ['培智学校'];
|
|||
|
|
container.innerHTML = '';
|
|||
|
|
|
|||
|
|
cates.forEach((category, index) => {
|
|||
|
|
const tag = document.createElement('div');
|
|||
|
|
tag.className = 'filter-tag';
|
|||
|
|
tag.textContent = category;
|
|||
|
|
tag.dataset.category = category;
|
|||
|
|
|
|||
|
|
if (index === 0) {
|
|||
|
|
tag.classList.add('active');
|
|||
|
|
if (typeof currentFilters !== 'undefined') {
|
|||
|
|
currentFilters.category = category;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tag.addEventListener('click', function () {
|
|||
|
|
container.querySelectorAll('.filter-tag').forEach(t => t.classList.remove('active'));
|
|||
|
|
this.classList.add('active');
|
|||
|
|
|
|||
|
|
if (typeof currentFilters !== 'undefined') {
|
|||
|
|
currentFilters.category = category;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 重置视图状态
|
|||
|
|
currentView.mode = 'semester';
|
|||
|
|
updateCourseDisplay();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
container.appendChild(tag);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成年级标签
|
|||
|
|
function generateGradeTags() {
|
|||
|
|
const container = document.getElementById('grade-tags');
|
|||
|
|
|
|||
|
|
gradeNames.forEach((gradeName, index) => {
|
|||
|
|
const tag = document.createElement('div');
|
|||
|
|
tag.className = 'filter-tag';
|
|||
|
|
tag.textContent = gradeName;
|
|||
|
|
tag.dataset.grade = index;
|
|||
|
|
|
|||
|
|
if (index === currentFilters.grade) {
|
|||
|
|
tag.classList.add('active');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tag.addEventListener('click', function () {
|
|||
|
|
container.querySelectorAll('.filter-tag').forEach(t => t.classList.remove('active'));
|
|||
|
|
this.classList.add('active');
|
|||
|
|
currentFilters.grade = index;
|
|||
|
|
|
|||
|
|
// 重置视图状态
|
|||
|
|
currentView.mode = 'semester';
|
|||
|
|
updateCourseDisplay();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
container.appendChild(tag);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建返回按钮
|
|||
|
|
function createBackButton() {
|
|||
|
|
const backBtn = document.createElement('div');
|
|||
|
|
backBtn.className = 'back-button';
|
|||
|
|
backBtn.innerHTML = `
|
|||
|
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|||
|
|
<path d="m12 19-7-7 7-7"/>
|
|||
|
|
<path d="m19 12H5"/>
|
|||
|
|
</svg>
|
|||
|
|
返回学期选择
|
|||
|
|
`;
|
|||
|
|
|
|||
|
|
backBtn.addEventListener('click', function () {
|
|||
|
|
currentView.mode = 'semester';
|
|||
|
|
updateCourseDisplay();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
return backBtn;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 显示学期卡片
|
|||
|
|
function displaySemesterCards() {
|
|||
|
|
const container = document.getElementById('materials-container');
|
|||
|
|
const courseList = GLOBAL_CONFIG.courseList;
|
|||
|
|
|
|||
|
|
// 清空现有内容
|
|||
|
|
container.innerHTML = '';
|
|||
|
|
container.className = 'materials-grid'; // 重置为学期卡片样式
|
|||
|
|
|
|||
|
|
// 为上册和下册分别创建卡片
|
|||
|
|
semesterNames.forEach((semesterName, semesterIndex) => {
|
|||
|
|
const courses = courseList[currentFilters.subject]?.[currentFilters.grade]?.[semesterIndex] || [];
|
|||
|
|
const bookImage = getCourseImagePath(currentFilters.subject, currentFilters.grade, semesterIndex);
|
|||
|
|
|
|||
|
|
const card = document.createElement('div');
|
|||
|
|
card.className = 'material-card';
|
|||
|
|
|
|||
|
|
if (courses.length === 0) {
|
|||
|
|
card.innerHTML = `
|
|||
|
|
<div class="material-cover">
|
|||
|
|
<div class="material-image" style="background-image: url('${bookImage}');"></div>
|
|||
|
|
<div class="material-info">
|
|||
|
|
<h3>${subjectMap[currentFilters.subject]} ${gradeNames[currentFilters.grade]} ${semesterName}</h3>
|
|||
|
|
<div class="material-meta">
|
|||
|
|
<span style="color: #666; font-size: 14px;">暂无课程内容</span>
|
|||
|
|
</div>
|
|||
|
|
<div class="course-stats">
|
|||
|
|
此册正在筹备中...
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
`;
|
|||
|
|
} else {
|
|||
|
|
card.innerHTML = `
|
|||
|
|
<div class="material-cover">
|
|||
|
|
<div class="material-image" style="background-image: url('${bookImage}');"></div>
|
|||
|
|
<div class="material-info">
|
|||
|
|
<h3>${subjectMap[currentFilters.subject]} ${gradeNames[currentFilters.grade]} ${semesterName}</h3>
|
|||
|
|
<div class="material-meta">
|
|||
|
|
<span style="color: #666; font-size: 14px;">共${courses.length}个课程</span>
|
|||
|
|
</div>
|
|||
|
|
<div class="course-stats">
|
|||
|
|
点击进入章节学习
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
`;
|
|||
|
|
|
|||
|
|
// 添加点击事件
|
|||
|
|
card.addEventListener('click', function () {
|
|||
|
|
currentView.mode = 'courses';
|
|||
|
|
currentView.subject = currentFilters.subject;
|
|||
|
|
currentView.grade = currentFilters.grade;
|
|||
|
|
currentView.semester = semesterIndex;
|
|||
|
|
updateCourseDisplay();
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
container.appendChild(card);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 显示课程列表
|
|||
|
|
function displayCourseList() {
|
|||
|
|
const container = document.getElementById('materials-container');
|
|||
|
|
const courseList = GLOBAL_CONFIG.courseList;
|
|||
|
|
const classObject = GLOBAL_CONFIG.classObject;
|
|||
|
|
|
|||
|
|
// 清空现有内容
|
|||
|
|
container.innerHTML = '';
|
|||
|
|
container.className = 'course-grid'; // 使用课程卡片样式
|
|||
|
|
|
|||
|
|
// 添加返回按钮
|
|||
|
|
const backBtn = createBackButton();
|
|||
|
|
container.appendChild(backBtn);
|
|||
|
|
|
|||
|
|
// 获取当前学期的课程
|
|||
|
|
const courses = courseList[currentView.subject]?.[currentView.grade]?.[currentView.semester] || [];
|
|||
|
|
|
|||
|
|
if (courses.length === 0) {
|
|||
|
|
const emptyCourse = document.createElement('div');
|
|||
|
|
emptyCourse.className = 'empty-course';
|
|||
|
|
emptyCourse.innerHTML = `
|
|||
|
|
<div class="empty-content">
|
|||
|
|
<h3>暂无课程</h3>
|
|||
|
|
<p>该学期的课程正在筹备中...</p>
|
|||
|
|
</div>
|
|||
|
|
`;
|
|||
|
|
container.appendChild(emptyCourse);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建课程卡片
|
|||
|
|
courses.forEach((course, index) => {
|
|||
|
|
const courseData = classObject[currentView.subject]?.[course.id];
|
|||
|
|
|
|||
|
|
const courseCard = document.createElement('div');
|
|||
|
|
courseCard.className = 'course-card';
|
|||
|
|
|
|||
|
|
// 生成课程图片路径 - 根据实际的命名规则
|
|||
|
|
function getCourseSpecificImagePath(subject, grade, semester, courseIndex) {
|
|||
|
|
const subjectPrefix = {
|
|||
|
|
'math': 'math',
|
|||
|
|
'language': 'chinese',
|
|||
|
|
'live': 'life'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const gradeNumber = grade + 1;
|
|||
|
|
const semesterText = semester === 0 ? '上' : '下';
|
|||
|
|
const prefix = subjectPrefix[subject] || subject;
|
|||
|
|
|
|||
|
|
// 课程编号从1开始,所以是 courseIndex + 1
|
|||
|
|
return `../asset/course_img/${prefix}${gradeNumber}${semesterText}${courseIndex + 1}.png`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const courseImage = getCourseSpecificImagePath(currentView.subject, currentView.grade, currentView.semester, index);
|
|||
|
|
|
|||
|
|
courseCard.innerHTML = `
|
|||
|
|
<div class="course-cover">
|
|||
|
|
<div class="course-image" style="background-image: url('${courseImage}');"></div>
|
|||
|
|
<div class="course-info">
|
|||
|
|
<h4>${course.name}</h4>
|
|||
|
|
<p class="course-description">${course.des}</p>
|
|||
|
|
<div class="course-action">
|
|||
|
|
${courseData ? '开始学习' : '课程筹备中'}
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
`;
|
|||
|
|
|
|||
|
|
// 如果有课程数据,添加点击事件
|
|||
|
|
if (courseData) {
|
|||
|
|
courseCard.addEventListener('click', function () {
|
|||
|
|
// 这里可以跳转到具体的课程页面
|
|||
|
|
console.log('进入课程:', course.id);
|
|||
|
|
// window.location.href = `course.html?id=${course.id}`;
|
|||
|
|
window.open(`./courseHome.html?id=${course.id}`);
|
|||
|
|
});
|
|||
|
|
courseCard.style.cursor = 'pointer';
|
|||
|
|
} else {
|
|||
|
|
courseCard.classList.add('disabled');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
container.appendChild(courseCard);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新课程显示
|
|||
|
|
function updateCourseDisplay() {
|
|||
|
|
if (currentView.mode === 'semester') {
|
|||
|
|
displaySemesterCards();
|
|||
|
|
} else if (currentView.mode === 'courses') {
|
|||
|
|
displayCourseList();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 侧边栏菜单交互
|
|||
|
|
document.querySelectorAll('.sidebar-menu a').forEach(link => {
|
|||
|
|
link.addEventListener('click', function () {
|
|||
|
|
document.querySelectorAll('.sidebar-menu li').forEach(li => li.classList.remove('active'));
|
|||
|
|
this.parentElement.classList.add('active');
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 初始化页面
|
|||
|
|
generateSubjectTags();
|
|||
|
|
generateGradeTags();
|
|||
|
|
updateCourseDisplay();
|
|||
|
|
getCate();
|
|||
|
|
|
|||
|
|
// 1、导航条切换
|
|||
|
|
const navItems = document.querySelectorAll('.container-header-nav > div');
|
|||
|
|
|
|||
|
|
navItems.forEach(function (item) {
|
|||
|
|
item.addEventListener('click', function () {
|
|||
|
|
// 移除所有 div 元素的 active 类
|
|||
|
|
navItems.forEach(function (navItem) {
|
|||
|
|
navItem.classList.remove('active');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 为当前点击的 div 元素添加 active 类
|
|||
|
|
this.classList.add('active');
|
|||
|
|
|
|||
|
|
// 打开对应的数据 URL 页面
|
|||
|
|
const url = this.getAttribute('data-url');
|
|||
|
|
window.open(`./${url}.html`);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
});
|