Files
ZhiQiXiaoYuan/pages/schedule/schedule.js
ChuXun eaab9a762a 1
2025-10-19 20:28:31 +08:00

422 lines
11 KiB
JavaScript
Raw 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.
// pages/schedule/schedule.js
const learningTracker = require('../../utils/learningTracker.js')
Page({
data: {
weekDays: ['周一', '周二', '周三', '周四', '周五'],
timePeriods: ['1-2节', '3-4节', '5-6节', '7-8节', '9-10节'],
currentWeek: 1, // 当前查看的周次
totalWeeks: 20, // 总周数(一学期)
schedule: {},
scheduleData: [], // 用于视图渲染的二维数组
showEditModal: false,
editMode: 'add', // 'add' 或 'edit'
editDay: '',
editPeriod: '',
editCourse: {
name: '',
location: ''
}
},
onLoad() {
// 初始化当前周次(可以根据学期开始日期计算)
this.initCurrentWeek()
this.loadSchedule()
},
onShow() {
// 开始跟踪学习时间
learningTracker.onPageShow('tools')
// 更新自定义TabBar选中状态
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
this.getTabBar().setData({
selected: 2
})
}
// 刷新当前周的课表
this.loadSchedule()
},
onHide() {
// 停止跟踪学习时间
learningTracker.onPageHide()
},
onUnload() {
// 记录学习时长
learningTracker.onPageUnload()
},
// 初始化当前周次
initCurrentWeek() {
// 从缓存获取学期开始日期
let semesterStartDate = wx.getStorageSync('semesterStartDate')
if (!semesterStartDate) {
// 如果没有设置默认为当前学期第1周
// 实际应用中可以让用户设置学期开始日期
this.setData({ currentWeek: 1 })
return
}
// 计算当前是第几周
const startDate = new Date(semesterStartDate)
const today = new Date()
const diffTime = Math.abs(today - startDate)
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
const weekNumber = Math.ceil(diffDays / 7)
// 确保周数在有效范围内
const currentWeek = Math.min(Math.max(weekNumber, 1), this.data.totalWeeks)
this.setData({ currentWeek })
},
// 加载课程表
loadSchedule() {
const { currentWeek } = this.data
const allSchedules = wx.getStorageSync('allCourseSchedules') || {}
const savedSchedule = allSchedules[`week_${currentWeek}`] || {}
// 示例数据仅第1周有默认数据
let defaultSchedule = {}
if (currentWeek === 1 && Object.keys(savedSchedule).length === 0) {
defaultSchedule = {
'周一-1-2节': { name: '高等数学A', location: '主楼A201' },
'周一-3-4节': { name: '数据结构', location: '信息学馆301' },
'周二-1-2节': { name: '大学英语', location: '外语楼205' },
'周二-3-4节': { name: '大学物理', location: '主楼B305' },
'周三-1-2节': { name: '高等数学A', location: '主楼A201' },
'周三-5-6节': { name: 'Python程序设计', location: '实验室A' },
'周四-1-2节': { name: '大学物理', location: '主楼B305' },
'周四-5-6节': { name: '机器学习', location: '信息学馆505' },
'周五-1-2节': { name: '数据结构', location: '信息学馆301' }
}
}
const schedule = Object.keys(savedSchedule).length > 0 ? savedSchedule : defaultSchedule
// 构建二维数组用于渲染
const scheduleData = this.buildScheduleData(schedule)
this.setData({
schedule,
scheduleData
})
// 保存默认数据仅第1周
if (currentWeek === 1 && Object.keys(savedSchedule).length === 0 && Object.keys(defaultSchedule).length > 0) {
const allSchedules = wx.getStorageSync('allCourseSchedules') || {}
allSchedules[`week_${currentWeek}`] = defaultSchedule
wx.setStorageSync('allCourseSchedules', allSchedules)
}
},
// 上一周
onPrevWeek() {
const { currentWeek } = this.data
if (currentWeek > 1) {
this.setData({ currentWeek: currentWeek - 1 })
this.loadSchedule()
wx.showToast({
title: `${currentWeek - 1}`,
icon: 'none',
duration: 1000
})
} else {
wx.showToast({
title: '已经是第一周了',
icon: 'none',
duration: 1500
})
}
},
// 下一周
onNextWeek() {
const { currentWeek, totalWeeks } = this.data
if (currentWeek < totalWeeks) {
this.setData({ currentWeek: currentWeek + 1 })
this.loadSchedule()
wx.showToast({
title: `${currentWeek + 1}`,
icon: 'none',
duration: 1000
})
} else {
wx.showToast({
title: '已经是最后一周了',
icon: 'none',
duration: 1500
})
}
},
// 回到本周
onCurrentWeek() {
this.initCurrentWeek()
this.loadSchedule()
wx.showToast({
title: '已回到本周',
icon: 'success',
duration: 1000
})
},
// 构建课程表数据结构
buildScheduleData(schedule) {
const { weekDays, timePeriods } = this.data
const scheduleData = []
timePeriods.forEach(period => {
const row = {
period: period,
courses: []
}
weekDays.forEach(day => {
const key = `${day}-${period}`
const course = schedule[key] || null
row.courses.push({
day: day,
course: course,
hasCourse: !!course
})
})
scheduleData.push(row)
})
return scheduleData
},
// 点击添加课程按钮
onAddCourse() {
wx.showModal({
title: '添加课程',
content: '请点击课程表中的空白格子来添加课程',
showCancel: false,
confirmText: '知道了',
confirmColor: '#667eea'
})
},
// 点击课程格子
onCourseClick(e) {
const { day, period, course } = e.currentTarget.dataset
if (course) {
// 有课程,显示课程信息
wx.showModal({
title: course.name,
content: `上课时间:${day} ${period}\n上课地点:${course.location}`,
showCancel: true,
cancelText: '关闭',
confirmText: '编辑',
confirmColor: '#667eea',
success: (res) => {
if (res.confirm) {
this.openEditModal('edit', day, period, course)
}
}
})
} else {
// 无课程,添加课程
this.openEditModal('add', day, period, null)
}
},
// 长按课程格子
onCourseLongPress(e) {
const { day, period, course } = e.currentTarget.dataset
if (course) {
wx.showActionSheet({
itemList: ['编辑课程', '删除课程'],
success: (res) => {
if (res.tapIndex === 0) {
this.openEditModal('edit', day, period, course)
} else if (res.tapIndex === 1) {
this.deleteCourse(day, period)
}
}
})
}
},
// 打开编辑弹窗
openEditModal(mode, day, period, course) {
this.setData({
showEditModal: true,
editMode: mode,
editDay: day,
editPeriod: period,
editCourse: course ? { ...course } : { name: '', location: '' }
})
},
// 关闭编辑弹窗
closeEditModal() {
this.setData({
showEditModal: false,
editCourse: { name: '', location: '' }
})
},
// 课程名称输入
onCourseNameInput(e) {
this.setData({
'editCourse.name': e.detail.value
})
},
// 课程地点输入
onCourseLocationInput(e) {
this.setData({
'editCourse.location': e.detail.value
})
},
// 保存课程
onSaveCourse() {
const { editDay, editPeriod, editCourse, currentWeek } = this.data
if (!editCourse.name.trim()) {
wx.showToast({
title: '请输入课程名称',
icon: 'none'
})
return
}
if (!editCourse.location.trim()) {
wx.showToast({
title: '请输入上课地点',
icon: 'none'
})
return
}
const key = `${editDay}-${editPeriod}`
const schedule = this.data.schedule
schedule[key] = {
name: editCourse.name.trim(),
location: editCourse.location.trim()
}
// 保存到对应周次的课表
const allSchedules = wx.getStorageSync('allCourseSchedules') || {}
allSchedules[`week_${currentWeek}`] = schedule
wx.setStorageSync('allCourseSchedules', allSchedules)
// 更新视图
const scheduleData = this.buildScheduleData(schedule)
this.setData({
schedule,
scheduleData,
showEditModal: false,
editCourse: { name: '', location: '' }
})
wx.showToast({
title: '保存成功',
icon: 'success'
})
},
// 删除课程
onDeleteCourse() {
const { editDay, editPeriod } = this.data
wx.showModal({
title: '确认删除',
content: '确定要删除这门课程吗?',
confirmColor: '#FF5252',
success: (res) => {
if (res.confirm) {
this.deleteCourse(editDay, editPeriod)
this.closeEditModal()
}
}
})
},
// 删除课程逻辑
deleteCourse(day, period) {
const { currentWeek } = this.data
const key = `${day}-${period}`
const schedule = this.data.schedule
delete schedule[key]
// 保存到对应周次的课表
const allSchedules = wx.getStorageSync('allCourseSchedules') || {}
allSchedules[`week_${currentWeek}`] = schedule
wx.setStorageSync('allCourseSchedules', allSchedules)
// 更新视图
const scheduleData = this.buildScheduleData(schedule)
this.setData({
schedule,
scheduleData
})
wx.showToast({
title: '已删除',
icon: 'success'
})
},
// 复制当前周课表到其他周
onCopySchedule() {
const { currentWeek, schedule } = this.data
// 如果当前周没有课表,提示用户
if (Object.keys(schedule).length === 0) {
wx.showToast({
title: '当前周没有课程',
icon: 'none',
duration: 2000
})
return
}
wx.showModal({
title: '复制课表',
content: `是否将第${currentWeek}周的课表复制到所有周?(不会覆盖已有课程的周)`,
confirmText: '复制',
cancelText: '取消',
confirmColor: '#9B59B6',
success: (res) => {
if (res.confirm) {
const allSchedules = wx.getStorageSync('allCourseSchedules') || {}
let copiedCount = 0
// 复制到其他周(跳过已有课表的周)
for (let week = 1; week <= this.data.totalWeeks; week++) {
if (week !== currentWeek && !allSchedules[`week_${week}`]) {
allSchedules[`week_${week}`] = { ...schedule }
copiedCount++
}
}
wx.setStorageSync('allCourseSchedules', allSchedules)
wx.showToast({
title: `已复制到${copiedCount}`,
icon: 'success',
duration: 2000
})
}
}
})
},
// 阻止事件冒泡
doNothing() {}
})