diff --git a/public/serch/背景.png b/public/serch/背景.png new file mode 100644 index 0000000..2a37227 Binary files /dev/null and b/public/serch/背景.png differ diff --git a/src/api/modules/course.ts b/src/api/modules/course.ts index bf9b7e2..9d3a3e1 100644 --- a/src/api/modules/course.ts +++ b/src/api/modules/course.ts @@ -286,8 +286,85 @@ export class CourseApi { } // 搜索课程 - static searchCourses(params: SearchRequest): Promise>> { - return ApiRequest.get('/courses/search', params) + static async searchCourses(params: { + keyword?: string + limit?: string + page?: number + }): Promise & { total?: number }> { + try { + console.log('🔍 搜索课程:', params) + + const queryParams: any = {} + if (params.keyword) queryParams.keyword = params.keyword + if (params.limit) queryParams.limit = params.limit + + const response = await ApiRequest.get('/aiol/index/search', queryParams) + console.log('✅ 搜索课程成功:', response) + + // 处理后端响应格式 + if (response.data && response.data.success && response.data.result) { + // 转换后端数据格式为前端格式 + const courses: Course[] = response.data.result.map((item: BackendCourseItem) => ({ + id: item.id, + title: item.name || '', + description: item.description || '', + instructor: item.school || '未知讲师', + teacherList: item.teacherList || [], + duration: item.arrangement || '待定', + level: this.mapDifficultyToLevel(item.difficulty), + category: item.subject || '其他', + thumbnail: item.cover || '', + price: 0, + rating: 0, + studentsCount: item.enrollCount || 0, + lessonsCount: 0, + tags: [], + isEnrolled: item.isEnrolled || false, + progress: 0, + createdAt: this.formatTimestamp(item.createTime), + updatedAt: this.formatTimestamp(item.updateTime), + status: item.status === 1 ? 'published' : 'draft', + enrollmentCount: item.enrollCount || 0, + maxEnrollment: item.maxEnroll || 0, + startDate: item.startTime || '', + endDate: item.endTime || '', + outline: item.outline || '', + prerequisite: item.prerequisite || '', + reference: item.reference || '', + target: item.target || '', + question: item.question || '', + video: item.video || '', + izAi: item.izAi, + // 添加AI伴学相关字段 + hasAiCompanion: item.izAi === 1, + aiEnabled: item.izAi === 1, + instructors: item.teacherList || [] + })) + + return { + code: 200, + message: '搜索成功', + data: courses, + total: courses.length + } + } else { + console.warn('⚠️ 搜索API返回格式异常:', response) + return { + code: 500, + message: response.data?.message || '搜索失败', + data: [], + total: 0 + } + } + } catch (error: any) { + console.error('❌ 搜索课程失败:', error) + return { + code: 500, + message: error.message || '搜索失败', + data: [], + total: 0 + } + } } // 获取热门课程 diff --git a/src/router/index.ts b/src/router/index.ts index 1974abe..04b1bd3 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -558,6 +558,12 @@ const routes: RouteRecordRaw[] = [ component: Courses, meta: { title: '课程列表' } }, + { + path: '/search', + name: 'SearchResults', + component: () => import('@/views/SearchResults.vue'), + meta: { title: '搜索结果' } + }, { path: '/course/:id', name: 'CourseDetail', diff --git a/src/views/SearchResults.vue b/src/views/SearchResults.vue new file mode 100644 index 0000000..5704032 --- /dev/null +++ b/src/views/SearchResults.vue @@ -0,0 +1,716 @@ + + + + +