2026-02-28 16:41:39 +08:00
|
|
|
import { http } from './index';
|
|
|
|
|
|
|
|
|
|
// ==================== 课程类型 ====================
|
|
|
|
|
|
|
|
|
|
export interface CourseLesson {
|
|
|
|
|
id: number;
|
|
|
|
|
courseId: number;
|
|
|
|
|
lessonType: string;
|
|
|
|
|
name: string;
|
|
|
|
|
description?: string;
|
|
|
|
|
duration: number;
|
|
|
|
|
videoPath?: string;
|
|
|
|
|
videoName?: string;
|
|
|
|
|
pptPath?: string;
|
|
|
|
|
pptName?: string;
|
|
|
|
|
pdfPath?: string;
|
|
|
|
|
pdfName?: string;
|
|
|
|
|
objectives?: string;
|
|
|
|
|
preparation?: string;
|
|
|
|
|
extension?: string;
|
|
|
|
|
reflection?: string;
|
|
|
|
|
assessmentData?: string;
|
|
|
|
|
useTemplate: boolean;
|
|
|
|
|
sortOrder: number;
|
|
|
|
|
steps?: LessonStep[];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface LessonStep {
|
|
|
|
|
id: number;
|
|
|
|
|
lessonId: number;
|
|
|
|
|
name: string;
|
|
|
|
|
content?: string;
|
|
|
|
|
duration: number;
|
|
|
|
|
objective?: string;
|
|
|
|
|
resourceIds?: string;
|
|
|
|
|
sortOrder: number;
|
|
|
|
|
stepResources?: StepResource[];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface StepResource {
|
|
|
|
|
id: number;
|
|
|
|
|
stepId: number;
|
|
|
|
|
resourceId: number;
|
|
|
|
|
sortOrder: number;
|
|
|
|
|
resource: CourseResource;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface CourseResource {
|
|
|
|
|
id: number;
|
|
|
|
|
courseId: number;
|
|
|
|
|
resourceType: string;
|
|
|
|
|
resourceName: string;
|
|
|
|
|
fileUrl: string;
|
|
|
|
|
fileSize?: number;
|
|
|
|
|
mimeType?: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface CreateLessonData {
|
|
|
|
|
lessonType: string;
|
|
|
|
|
name: string;
|
|
|
|
|
description?: string;
|
|
|
|
|
duration?: number;
|
|
|
|
|
videoPath?: string;
|
|
|
|
|
videoName?: string;
|
|
|
|
|
pptPath?: string;
|
|
|
|
|
pptName?: string;
|
|
|
|
|
pdfPath?: string;
|
|
|
|
|
pdfName?: string;
|
|
|
|
|
objectives?: string;
|
|
|
|
|
preparation?: string;
|
|
|
|
|
extension?: string;
|
|
|
|
|
reflection?: string;
|
|
|
|
|
assessmentData?: string;
|
|
|
|
|
useTemplate?: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface CreateStepData {
|
|
|
|
|
name: string;
|
|
|
|
|
content?: string;
|
|
|
|
|
duration?: number;
|
|
|
|
|
objective?: string;
|
|
|
|
|
resourceIds?: number[];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ==================== 超管端 API ====================
|
|
|
|
|
|
|
|
|
|
// 获取课程列表
|
|
|
|
|
export function getLessonList(courseId: number) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.get(`/v1/admin/courses/${courseId}/lessons`);
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取课程详情
|
|
|
|
|
export function getLessonDetail(courseId: number, lessonId: number) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.get(`/v1/admin/courses/${courseId}/lessons/${lessonId}`);
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 按类型获取课程
|
|
|
|
|
export function getLessonByType(courseId: number, lessonType: string) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.get(`/v1/admin/courses/${courseId}/lessons/type/${lessonType}`);
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建课程
|
|
|
|
|
export function createLesson(courseId: number, data: CreateLessonData) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.post(`/v1/admin/courses/${courseId}/lessons`, data);
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新课程
|
|
|
|
|
export function updateLesson(lessonId: number, data: Partial<CreateLessonData>) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.put(`/v1/admin/courses/0/lessons/${lessonId}`, data);
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除课程
|
|
|
|
|
export function deleteLesson(courseId: number, lessonId: number) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.delete(`/v1/admin/courses/${courseId}/lessons/${lessonId}`);
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 重新排序课程
|
|
|
|
|
export function reorderLessons(courseId: number, lessonIds: number[]) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.put(`/v1/admin/courses/${courseId}/lessons/reorder`, { lessonIds });
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ==================== 教学环节 API ====================
|
|
|
|
|
|
|
|
|
|
// 获取环节列表
|
|
|
|
|
export function getStepList(courseId: number, lessonId: number) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.get(`/v1/admin/courses/${courseId}/lessons/${lessonId}/steps`);
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建环节
|
|
|
|
|
export function createStep(courseId: number, lessonId: number, data: CreateStepData) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.post(`/v1/admin/courses/${courseId}/lessons/${lessonId}/steps`, data);
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新环节
|
|
|
|
|
export function updateStep(stepId: number, data: Partial<CreateStepData>) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.put(`/v1/admin/courses/0/lessons/steps/${stepId}`, data);
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除环节
|
2026-03-12 13:05:20 +08:00
|
|
|
export function deleteStep(courseId: number, _lessonId: number, stepId: number) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.delete(`/v1/admin/courses/${courseId}/lessons/steps/${stepId}`);
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 重新排序环节
|
|
|
|
|
export function reorderSteps(courseId: number, lessonId: number, stepIds: number[]) {
|
2026-03-13 14:13:46 +08:00
|
|
|
return http.put(`/v1/admin/courses/${courseId}/lessons/${lessonId}/steps/reorder`, { stepIds });
|
2026-02-28 16:41:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ==================== 教师端 API ====================
|
|
|
|
|
|
|
|
|
|
// 获取教师端课程列表
|
|
|
|
|
export function getTeacherLessonList(courseId: number) {
|
|
|
|
|
return http.get(`/teacher/courses/${courseId}/lessons`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取教师端课程详情
|
|
|
|
|
export function getTeacherLessonDetail(courseId: number, lessonId: number) {
|
|
|
|
|
return http.get(`/teacher/courses/${courseId}/lessons/${lessonId}`);
|
|
|
|
|
}
|