diff --git a/schoolNewsWeb/src/apis/study/course.ts b/schoolNewsWeb/src/apis/study/course.ts index 900acea..2807058 100644 --- a/schoolNewsWeb/src/apis/study/course.ts +++ b/schoolNewsWeb/src/apis/study/course.ts @@ -5,7 +5,7 @@ */ import { api } from '@/apis/index'; -import type { Course, CourseChapter, ResultDomain,CourseVO,PageRequest, PageParam } from '@/types'; +import type { Course, CourseChapter, ResultDomain,CourseVO,PageRequest, PageParam, CourseNode } from '@/types'; /** * 课程API服务 @@ -60,8 +60,8 @@ export const courseApi = { * @param course 课程数据 * @returns Promise> */ - async updateCourse(course: Course): Promise> { - const response = await api.put(`${this.prefixCourse}/course`, course); + async updateCourse(courseVO: CourseVO): Promise> { + const response = await api.put(`${this.prefixCourse}/course`, courseVO); return response.data; }, @@ -81,10 +81,68 @@ export const courseApi = { * @param status 状态 * @returns Promise> */ - async updateCourseStatus(courseID: string, status: number): Promise> { - const response = await api.put(`${this.prefixCourse}/${courseID}/status`, null, { - params: { status } - }); + async updateCourseStatus(course: Course): Promise> { + const response = await api.put(`${this.prefixCourse}/course/status`, course); + return response.data; + }, + + /** + * 创建课程章节 + * @param chapter 章节数据 + * @returns Promise> + */ + async createCourseChapter(chapter: CourseChapter): Promise> { + const response = await api.post(`${this.prefixCourse}/course/chapter`, chapter); + return response.data; + }, + + /** + * 更新课程章节 + * @param chapter 章节数据 + * @returns Promise> + */ + async updateCourseChapter(chapter: CourseChapter): Promise> { + const response = await api.put(`${this.prefixCourse}/course/chapter`, chapter); + return response.data; + }, + + /** + * 删除课程章节 + * @param chapterID 章节ID + * @returns Promise> + */ + async deleteCourseChapter(chapterID: string): Promise> { + const response = await api.delete(`${this.prefixCourse}/course/chapter/${chapterID}`); + return response.data; + }, + + /** + * 创建课程章节节点 + * @param node 节点数据 + * @returns Promise> + */ + async createCourseChapterNode(node: CourseNode): Promise> { + const response = await api.post(`${this.prefixCourse}/course/chapter/node`, node); + return response.data; + }, + + /** + * 更新课程章节节点 + * @param node 节点数据 + * @returns Promise> + */ + async updateCourseChapterNode(node: CourseNode): Promise> { + const response = await api.put(`${this.prefixCourse}/course/chapter/node`, node); + return response.data; + }, + + /** + * 删除课程章节节点 + * @param nodeID 节点ID + * @returns Promise> + */ + async deleteCourseChapterNode(nodeID: string): Promise> { + const response = await api.delete(`${this.prefixCourse}/course/chapter/node/${nodeID}`); return response.data; }, diff --git a/schoolNewsWeb/src/apis/study/learning-task.ts b/schoolNewsWeb/src/apis/study/learning-task.ts index 9e147dc..6624b60 100644 --- a/schoolNewsWeb/src/apis/study/learning-task.ts +++ b/schoolNewsWeb/src/apis/study/learning-task.ts @@ -5,49 +5,60 @@ */ import { api } from '@/apis/index'; -import type { LearningTask, LearningProgress, ResultDomain } from '@/types'; +import type { LearningTask, LearningProgress, ResultDomain, PageParam, TaskVO, TaskUser, TaskItemVO } from '@/types'; /** * 学习任务API服务 */ export const learningTaskApi = { + learningTaskPrefix: '/study/tasks', /** * 获取学习任务列表 * @param filter 过滤条件 * @returns Promise> */ async getTaskList(filter?: Partial): Promise> { - const response = await api.get('/study/learning-task/list', filter); + const response = await api.get(`${this.learningTaskPrefix}/list`, filter); return response.data; }, /** * 根据ID获取任务详情 * @param taskID 任务ID - * @returns Promise> + * @returns Promise> */ - async getTaskById(taskID: string): Promise> { - const response = await api.get(`/study/learning-task/${taskID}`); + async getTaskById(taskID: string): Promise> { + const response = await api.get(`${this.learningTaskPrefix}/${taskID}`); return response.data; }, /** - * 创建学习任务 - * @param task 任务数据 + * 获取任务分页列表 + * @param pageParam 分页参数 + * @param filter 过滤条件 * @returns Promise> */ - async createTask(task: LearningTask): Promise> { - const response = await api.post('/study/learning-task/create', task); + async getTaskPage(pageParam: PageParam, filter: LearningTask): Promise> { + const response = await api.post(`${this.learningTaskPrefix}/page`, {pageParam, filter}); + return response.data; + }, + /** + * 创建学习任务 + * @param task 任务数据 + * @returns Promise> + */ + async createTask(task: TaskVO): Promise> { + const response = await api.post(`${this.learningTaskPrefix}/task`, task); return response.data; }, /** * 更新学习任务 * @param task 任务数据 - * @returns Promise> + * @returns Promise> */ - async updateTask(task: LearningTask): Promise> { - const response = await api.put('/study/learning-task/update', task); + async updateTask(task: TaskVO): Promise> { + const response = await api.put(`${this.learningTaskPrefix}/task`, task); return response.data; }, @@ -57,7 +68,7 @@ export const learningTaskApi = { * @returns Promise> */ async deleteTask(taskID: string): Promise> { - const response = await api.delete(`/study/learning-task/${taskID}`); + const response = await api.delete(`${this.learningTaskPrefix}/task/${taskID}`); return response.data; }, @@ -66,8 +77,8 @@ export const learningTaskApi = { * @param taskID 任务ID * @returns Promise> */ - async publishTask(taskID: string): Promise> { - const response = await api.post(`/study/learning-task/${taskID}/publish`); + async publishTask(task: LearningTask): Promise> { + const response = await api.put(`${this.learningTaskPrefix}/status`, task); return response.data; }, @@ -78,9 +89,47 @@ export const learningTaskApi = { * @returns Promise> */ async getUserTaskProgress(userID: string, taskID: string): Promise> { - const response = await api.get(`/study/learning-task/${taskID}/progress`, { + const response = await api.get(`${this.learningTaskPrefix}/task/${taskID}/progress`, { userID }); return response.data; + }, + + /** + * 分配任务给用户 + * @param taskID 任务ID + * @param userID 用户ID + * @returns Promise> + */ + async assignTaskToUser(taskID: string, userID: string): Promise> { + const response = await api.post(`${this.learningTaskPrefix}/${taskID}/assign`, null, { + params: { userID } + }); + return response.data; + }, + + /** + * 从用户移除任务 + * @param taskID 任务ID + * @param userID 用户ID + * @returns Promise> + */ + async removeTaskFromUser(taskID: string, userID: string): Promise> { + const response = await api.delete(`${this.learningTaskPrefix}/${taskID}/user/${userID}`); + return response.data; + }, + + /** + * 用户获取个人任务列表(用户视角) + * @param pageParam 分页参数 + * @param filter 过滤条件 + * @returns Promise> + */ + async getUserTaskPage(pageParam: PageParam, filter?: TaskItemVO): Promise> { + const response = await api.post(`${this.learningTaskPrefix}/users/page`, { + pageParam, + filter + }); + return response.data; } }; diff --git a/schoolNewsWeb/src/apis/system/user.ts b/schoolNewsWeb/src/apis/system/user.ts index 3812c88..6e124d2 100644 --- a/schoolNewsWeb/src/apis/system/user.ts +++ b/schoolNewsWeb/src/apis/system/user.ts @@ -5,7 +5,7 @@ */ import { api } from '@/apis/index'; -import type { SysUser, SysUserInfo, UserVO, UserDeptRoleVO, SysUserDeptRole, ResultDomain } from '@/types'; +import type { SysUser, SysUserInfo, UserVO, UserDeptRoleVO, SysUserDeptRole, ResultDomain, PageParam } from '@/types'; import { useStore } from 'vuex'; const store = useStore(); @@ -48,6 +48,31 @@ export const userApi = { return response.data; }, + /** + * 获取用户分页列表 + * @param pageParam 分页参数 + * @param filter 过滤条件 + * @returns Promise> + */ + async getUserPage(pageParam: PageParam, filter?: any): Promise> { + const response = await api.post('/users/page', { + pageParam, + filter + }); + return response.data; + }, + + /** + * 获取用户分页列表 + * @param pageParam 分页参数 + * @param filter 过滤条件 + * @returns Promise> + */ + async getUserPage(pageParam: PageParam, filter: SysUser): Promise> { + const response = await api.post('/users/page', { pageParam, filter }); + return response.data; + }, + /** * 创建用户 * @param user 用户信息 diff --git a/schoolNewsWeb/src/components/index.ts b/schoolNewsWeb/src/components/index.ts index 13bfdc9..eb9a65b 100644 --- a/schoolNewsWeb/src/components/index.ts +++ b/schoolNewsWeb/src/components/index.ts @@ -7,3 +7,6 @@ export * from './text'; // 导出 file 文件组件 export * from './file'; +// 导出 user 用户组件 +export * from './user'; + diff --git a/schoolNewsWeb/src/components/text/RichTextComponent.vue b/schoolNewsWeb/src/components/text/RichTextComponent.vue index 820dbdf..17f9a28 100644 --- a/schoolNewsWeb/src/components/text/RichTextComponent.vue +++ b/schoolNewsWeb/src/components/text/RichTextComponent.vue @@ -280,7 +280,6 @@ function initQuill() { // 启用图片/视频缩放模块 imageResize: { onResizeEnd: () => { - console.log('🔄 图片/视频拉伸结束,强制更新内容'); // 强制触发内容更新 if (quillInstance) { const html = quillInstance.root.innerHTML; @@ -321,7 +320,6 @@ function initQuill() { // 监听图片/视频尺寸变化 quillInstance.root.addEventListener('input', () => { - console.log('📝 input 事件触发,更新内容'); if (!quillInstance) return; const html = quillInstance.root.innerHTML; diff --git a/schoolNewsWeb/src/types/study/index.ts b/schoolNewsWeb/src/types/study/index.ts index bed4f75..9270874 100644 --- a/schoolNewsWeb/src/types/study/index.ts +++ b/schoolNewsWeb/src/types/study/index.ts @@ -4,7 +4,7 @@ * @since 2025-10-15 */ -import { BaseDTO } from '../base'; +import { BaseDTO, SysUser, Resource } from '@/types'; /** * 课程实体 @@ -213,6 +213,25 @@ export interface TaskResource extends BaseDTO { orderNum?: number; } +export interface TaskItemVO extends LearningTask { + courseID?: string; + courseName?: string; + resourceID?: string; + resourceName?: string; + userID?: string; + username?: string; + required?: boolean; + orderNum?: number; + status?: number; + progress?: boolean; + completeTime?: string; +} +export interface TaskVO extends BaseDTO { + learningTask: LearningTask; + taskCourses: TaskItemVO[]; + taskResources: TaskItemVO[]; + taskUsers: TaskItemVO[]; +} /** * 任务课程关联实体 */ diff --git a/schoolNewsWeb/src/utils/quill-resize.ts b/schoolNewsWeb/src/utils/quill-resize.ts index b23dab9..5638dbd 100644 --- a/schoolNewsWeb/src/utils/quill-resize.ts +++ b/schoolNewsWeb/src/utils/quill-resize.ts @@ -31,12 +31,10 @@ export class ImageResize { this.quill = quill; this.options = options; - console.log('🔄 ImageResize 模块初始化'); // 等待编辑器完全初始化 setTimeout(() => { this.initEventListeners(); - console.log('✅ ImageResize 事件监听器已添加'); }, 100); } @@ -51,14 +49,11 @@ export class ImageResize { handleClick(e: MouseEvent) { const target = e.target as HTMLElement; - console.log('🖱️ 点击事件:', target.tagName, target); // 检查是否点击了图片或视频 if (this.isResizableElement(target)) { - console.log('📷 检测到图片/视频点击,显示缩放控件'); this.showResizer(target as HTMLImageElement | HTMLVideoElement); } else if (!this.overlay || !this.overlay.contains(target)) { - console.log('❌ 隐藏缩放控件'); this.hideResizer(); } } @@ -79,7 +74,6 @@ export class ImageResize { showResizer(element: HTMLImageElement | HTMLVideoElement) { this.element = element; - console.log('🎯 显示缩放控件,元素:', element); // 创建遮罩层 if (!this.overlay) { @@ -91,7 +85,6 @@ export class ImageResize { // 更新遮罩层位置和大小 this.updateOverlayPosition(element); - console.log('✅ 缩放控件已显示'); } private updateOverlayPosition(element: HTMLImageElement | HTMLVideoElement) { @@ -99,13 +92,7 @@ export class ImageResize { const rect = element.getBoundingClientRect(); const containerRect = this.quill.root.getBoundingClientRect(); - - console.log('📐 元素尺寸:', { - width: rect.width, - height: rect.height, - left: rect.left, - top: rect.top - }); + this.overlay.style.display = 'block'; this.overlay.style.left = `${rect.left - containerRect.left + this.quill.root.scrollLeft}px`; @@ -305,7 +292,6 @@ export class ImageResize { private onResizeEnd() { if (!this.element) return; - console.log('🔄 拉伸结束,触发HTML更新'); // 调用自定义回调 if (this.options.onResizeEnd) { @@ -324,19 +310,16 @@ export class ImageResize { range: null, source: 'user' }); - console.log('✅ Quill text-change 事件已触发'); } // 方案2: 触发 DOM 事件 const inputEvent = new Event('input', { bubbles: true }); this.quill.root.dispatchEvent(inputEvent); - console.log('✅ DOM input 事件已触发'); // 方案3: 强制更新 Quill 内容 setTimeout(() => { if (this.quill.update) { this.quill.update(); - console.log('✅ Quill 内容已更新'); } }, 0); } diff --git a/schoolNewsWeb/src/views/admin/manage/study/StudyManagementView.vue b/schoolNewsWeb/src/views/admin/manage/study/StudyManagementView.vue index c6e9bb4..f824ccd 100644 --- a/schoolNewsWeb/src/views/admin/manage/study/StudyManagementView.vue +++ b/schoolNewsWeb/src/views/admin/manage/study/StudyManagementView.vue @@ -3,9 +3,7 @@

学习管理

- - - + @@ -16,7 +14,6 @@ + + diff --git a/schoolNewsWeb/src/views/admin/manage/study/TaskPublishView.vue b/schoolNewsWeb/src/views/admin/manage/study/TaskPublishView.vue deleted file mode 100644 index 4355ff5..0000000 --- a/schoolNewsWeb/src/views/admin/manage/study/TaskPublishView.vue +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - diff --git a/schoolNewsWeb/src/views/course/components/CourseAdd.vue b/schoolNewsWeb/src/views/course/components/CourseAdd.vue index 0727e71..d7ad6f7 100644 --- a/schoolNewsWeb/src/views/course/components/CourseAdd.vue +++ b/schoolNewsWeb/src/views/course/components/CourseAdd.vue @@ -19,11 +19,21 @@ - + - + + + +
+ 课程封面 + 暂无封面 +
- + 分钟 - + - + 未上线 已上线 已下架 @@ -76,7 +108,7 @@