Files
TeachMate/TeachMate/Preview Content/PreviewData.swift
T

292 lines
11 KiB
Swift

//
// PreviewData.swift
// TeachMate
//
// Created by Hongli on 2025/3/18.
//
import SwiftUI
import SwiftData
/// 提供预览所需的示例数据
@MainActor
enum PreviewData {
// MARK: - 共享的日期和时间
/// 当前学期开始日期(2025年春季学期)
static let currentSemesterStartDate = Calendar.current.date(from: DateComponents(year: 2025, month: 2, day: 24))!
/// 当前学期结束日期
static let currentSemesterEndDate = Calendar.current.date(byAdding: .day, value: 18 * 7, to: currentSemesterStartDate)!
/// 上一学期开始日期(2024年秋季学期)
static let previousSemesterStartDate = Calendar.current.date(from: DateComponents(year: 2024, month: 9, day: 1))!
/// 上一学期结束日期
static let previousSemesterEndDate = Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 15))!
// MARK: - 示例颜色
/// 示例课程颜色
static let courseColors = [
"#D6EAF8", // 浅蓝色
"#FADBD8", // 浅红色
"#D5F5E3", // 浅绿色
"#FCF3CF", // 浅黄色
"#F5EEF8", // 浅紫色
"#EAEDED", // 浅灰色
"#FDEBD0" // 浅橙色
]
// MARK: - 示例课程名称和位置
/// 常见课程名称
static let courseNames = [
"高等数学", "线性代数", "程序设计", "数据结构",
"计算机网络", "操作系统", "软件工程", "数据库原理",
"计算机组成原理", "编译原理", "人工智能", "机器学习",
"离散数学", "概率论与数理统计", "算法设计与分析"
]
/// 常见教室位置
static let locations = [
"教学楼A-101", "教学楼A-102", "教学楼A-201", "教学楼A-202",
"教学楼B-101", "教学楼B-102", "教学楼B-201", "教学楼B-202",
"实验楼C-301", "实验楼C-302", "实验楼C-303", "实验楼C-304",
"图书馆-多媒体教室", "综合楼-报告厅", "科技楼-机房"
]
/// 常见班级
static let classes = [
"云计算G23-1", "软件G22-3", "软件G22-4", "软件工程2班",
"网络工程1班", "人工智能1班", "数据科学1班", "信息安全1班"
]
// MARK: - 创建预览容器
/// 创建预览用的ModelContainer(包含所有示例数据)
static func createContainer() -> ModelContainer {
let container = try! ModelContainer(for: Semester.self, CourseModel.self, ClassSession.self,
configurations: ModelConfiguration(isStoredInMemoryOnly: true))
// 创建示例学期
let currentSemester = Semester(
title: "2024-2025-2",
startDate: currentSemesterStartDate,
endDate: currentSemesterEndDate,
weeksCount: 18,
isCurrent: true
)
let previousSemester = Semester(
title: "2024-2025-1",
startDate: previousSemesterStartDate,
endDate: previousSemesterEndDate,
weeksCount: 18
)
container.mainContext.insert(currentSemester)
container.mainContext.insert(previousSemester)
// 创建示例课程
let course1 = CourseModel(name: courseNames[0], colorHex: courseColors[0])
course1.semester = currentSemester
course1.addSession(weekday: 1, timeSlot: 1, location: locations[0], schoolClass: classes[0])
course1.addSession(weekday: 3, timeSlot: 2, location: locations[0], schoolClass: classes[0])
let course2 = CourseModel(name: courseNames[1], colorHex: courseColors[1])
course2.semester = currentSemester
course2.addSession(weekday: 2, timeSlot: 3, location: locations[4], schoolClass: classes[0])
let course3 = CourseModel(name: courseNames[2], colorHex: courseColors[2], isNew: true)
course3.semester = currentSemester
course3.addSession(weekday: 4, timeSlot: 4, location: locations[8], schoolClass: classes[0])
course3.addSession(weekday: 5, timeSlot: 5, location: locations[8], schoolClass: classes[0])
let course4 = CourseModel(name: courseNames[3], colorHex: courseColors[3])
course4.semester = previousSemester
course4.addSession(weekday: 1, timeSlot: 2, location: locations[1], schoolClass: classes[0])
// 添加更多课程以展示丰富的数据
let course5 = CourseModel(name: courseNames[4], colorHex: courseColors[4])
course5.semester = currentSemester
course5.addSession(weekday: 2, timeSlot: 1, location: locations[5], schoolClass: classes[1])
let course6 = CourseModel(name: courseNames[5], colorHex: courseColors[5])
course6.semester = currentSemester
course6.addSession(weekday: 3, timeSlot: 3, location: locations[9], schoolClass: classes[1])
course6.addSession(weekday: 5, timeSlot: 4, location: locations[9], schoolClass: classes[1])
container.mainContext.insert(course1)
container.mainContext.insert(course2)
container.mainContext.insert(course3)
container.mainContext.insert(course4)
container.mainContext.insert(course5)
container.mainContext.insert(course6)
return container
}
/// 创建空的预览容器(用于添加新数据的表单)
static func createEmptyContainer() -> ModelContainer {
return try! ModelContainer(for: Semester.self, CourseModel.self, ClassSession.self,
configurations: ModelConfiguration(isStoredInMemoryOnly: true))
}
/// 创建包含大量数据的预览容器(用于性能测试)
static func createLargeDataContainer() -> ModelContainer {
let container = try! ModelContainer(for: Semester.self, CourseModel.self, ClassSession.self,
configurations: ModelConfiguration(isStoredInMemoryOnly: true))
// 创建多个学期
let oldStartDate1 = Calendar.current.date(byAdding: .year, value: -2, to: currentSemesterStartDate)!
let oldEndDate1 = Calendar.current.date(byAdding: .day, value: 18 * 7, to: oldStartDate1)!
let oldStartDate2 = Calendar.current.date(byAdding: .year, value: -1, to: currentSemesterStartDate)!
let oldEndDate2 = Calendar.current.date(byAdding: .day, value: 18 * 7, to: oldStartDate2)!
let prevEndDate = Calendar.current.date(byAdding: .day, value: 18 * 7, to: previousSemesterStartDate)!
let semesters = [
Semester(title: "2023-2024-1", startDate: oldStartDate1, endDate: oldEndDate1, weeksCount: 18),
Semester(title: "2023-2024-2", startDate: oldStartDate2, endDate: oldEndDate2, weeksCount: 18),
Semester(title: "2024-2025-1", startDate: previousSemesterStartDate, endDate: prevEndDate, weeksCount: 18),
Semester(title: "2024-2025-2", startDate: currentSemesterStartDate, endDate: currentSemesterEndDate, weeksCount: 18, isCurrent: true)
]
for semester in semesters {
container.mainContext.insert(semester)
}
// 为每个学期创建多个课程
for semester in semesters {
for i in 0..<10 {
let courseIndex = i % courseNames.count
let colorIndex = i % courseColors.count
let course = CourseModel(name: courseNames[courseIndex], colorHex: courseColors[colorIndex])
course.semester = semester
// 为每个课程添加1-3个课时
let sessionCount = (i % 3) + 1
for j in 0..<sessionCount {
let weekday = (j % 5) + 1
let timeSlot = (j % 5) + 1
let locationIndex = (i + j) % locations.count
let classIndex = i % classes.count
course.addSession(
weekday: weekday,
timeSlot: timeSlot,
location: locations[locationIndex],
schoolClass: classes[classIndex]
)
}
container.mainContext.insert(course)
}
}
return container
}
// MARK: - 专用预览容器
/// 创建仅包含学期的预览容器(用于ContentView预览)
static func createSemesterContainer() -> ModelContainer {
let config = ModelConfiguration(isStoredInMemoryOnly: true)
let container = try! ModelContainer(for: Semester.self, configurations: config)
// 创建示例学期
let currentSemester = Semester(
title: "2024-2025-2",
startDate: currentSemesterStartDate,
endDate: currentSemesterEndDate,
weeksCount: 18,
isCurrent: true
)
let previousSemester = Semester(
title: "2024-2025-1",
startDate: previousSemesterStartDate,
endDate: previousSemesterEndDate,
weeksCount: 18,
isCurrent: false
)
container.mainContext.insert(currentSemester)
container.mainContext.insert(previousSemester)
return container
}
// MARK: - 示例模型
/// 创建示例学期(用于日历视图和课程表视图)
static func createSampleSemester() -> Semester {
return Semester(
title: "2024-2025-2",
startDate: currentSemesterStartDate,
endDate: currentSemesterEndDate,
weeksCount: 18,
isCurrent: true
)
}
/// 创建示例课程(用于课程详情视图)
static func createSampleCourse() -> CourseModel {
let course = CourseModel(name: courseNames[0], colorHex: courseColors[0])
course.addSession(weekday: 1, timeSlot: 1, location: locations[0], schoolClass: classes[0])
course.addSession(weekday: 3, timeSlot: 2, location: locations[0], schoolClass: classes[0])
return course
}
/// 创建示例课时(用于课时详情视图)
static func createSampleSession() -> ClassSession {
let session = ClassSession(
weekday: 1,
timeSlot: 1,
location: locations[0],
schoolClass: classes[0]
)
// 设置关联的课程
let course = createSampleCourse()
session.course = course
return session
}
// MARK: - 辅助方法
/// 获取随机课程颜色
static func randomCourseColor() -> String {
return courseColors.randomElement() ?? courseColors[0]
}
/// 获取随机课程名称
static func randomCourseName() -> String {
return courseNames.randomElement() ?? courseNames[0]
}
/// 获取随机教室位置
static func randomLocation() -> String {
return locations.randomElement() ?? locations[0]
}
/// 获取随机班级
static func randomClass() -> String {
return classes.randomElement() ?? classes[0]
}
// MARK: - 预览修饰器
/// 为预览添加标准边距和背景
static func standardPreviewStyle<Content: View>(_ content: Content) -> some View {
content
.padding()
.background(Color.white) // 使用简单的白色背景
}
}