diff --git a/src/api/modules/course.js b/src/api/modules/course.js index 00db854c..197ee0e2 100644 --- a/src/api/modules/course.js +++ b/src/api/modules/course.js @@ -440,6 +440,12 @@ const queryCrowd=function(query){ const ids=function (data){ return ajax.postJson('/xboe/m/course/manage/ids',data); } + +const saveTip = function() { + return ajax.postJson('/xboe/m/course/manage/saveTip'); +} + + export default { saveBase, submitCourse, @@ -482,6 +488,7 @@ export default { exportCourseAudit, exportCourse, queryCrowd, - ids + ids, + saveTip } diff --git a/src/components/Course/courseForm.vue b/src/components/Course/courseForm.vue index 1641dfc3..fc28e01b 100644 --- a/src/components/Course/courseForm.vue +++ b/src/components/Course/courseForm.vue @@ -41,6 +41,41 @@ 确定 --> + + +
+
+
操作引导
+
+
+
1
+
+
设置内容分类
+
当选择内容分类后,其关联标签将在下拉列表中优先显示。
+
+
+
+
2
+
+
添加课程标签
+
为课程添加相关标签,最多5个,便于搜索和分类,可回车创建新标签
+
+
+
+ +
+
+ + +
+ + @@ -64,18 +99,26 @@ - + + :options="sysTypeListMap" + @focus="onContentTypeFocus" + @change="onContentTypeChange"> + - - + + + + + 选择 @@ -221,14 +264,16 @@ - + + :options="sysTypeListMap" + @focus="onContentTypeFocus" + @change="onContentTypeChange"> @@ -256,9 +301,13 @@ --> - - + + + + @@ -536,7 +585,13 @@ export default { dlgShow: false }, rightTypeId: {}, - catalogSortDialogShow: false + catalogSortDialogShow: false, + // 蒙层引导相关数据 + showGuidance: false, + currentStep: 1, + highlightStyle: {}, + guidanceElements: [], + isFirstCreate: false, // 标记是否为首次创建 }; }, created() { @@ -849,7 +904,7 @@ export default { }, resetCurCourseContent() { - this.curContent = { id: '', contentType: 0, contentName: '', content: '', csectionId: '', contentName: '', contentRefId: '', courseId: this.courseInfo.id }; + this.curContent = { id: '', contentType: 0, contentName: '', content: '', csectionId: '', contentRefId: '', courseId: this.courseInfo.id }; }, // chooseCourseType(item, idx, open) { // this.courseChooseId = item.id; @@ -897,6 +952,12 @@ export default { this.courseInfo = rs.result; this.curCourseId = this.courseInfo.id console.log('保存课程成功',this.curCourseId) + console.log('isTip ',this.courseInfo.isTip) + if(this.courseInfo.isTip){ + // 检查是否为首次创建,显示引导 + this.checkAndShowGuidance(); + } + if (this.courseChooseId == 1) { this.weike.dlgShow = true; } else { @@ -904,12 +965,102 @@ export default { } this.$nextTick(() => { this.initTagComponent(); + // 如果显示引导,初始化高亮元素 + if (this.showGuidance) { + this.$nextTick(() => { + this.initGuidanceElements(); + this.highlightCurrentStep(); + }); + } }); } else { this.$message.error(rs.message); } }); }, + // 检查并显示引导 + checkAndShowGuidance() { + // 检查本地存储,判断是否为首次创建 + const hasShownGuidance = localStorage.getItem('course_creation_guidance_shown'); + if (!hasShownGuidance) { + this.showGuidance = true; + this.currentStep = 1; + this.isFirstCreate = true; + // 标记引导已显示 + localStorage.setItem('course_creation_guidance_shown', 'true'); + apiCourse.saveTip(); + } + }, + // 初始化引导元素 + initGuidanceElements() { + this.guidanceElements = Array.from(document.querySelectorAll('.guidance-highlight')); + }, + + // 高亮当前步骤对应的元素 + highlightCurrentStep() { + if (this.guidanceElements.length === 0) return; + + const currentElement = this.guidanceElements[this.currentStep - 1]; + if (currentElement) { + const rect = currentElement.getBoundingClientRect(); + this.highlightStyle = { + top: `${rect.top}px`, + left: `${rect.left}px`, + width: `${rect.width}px`, + height: `${rect.height}px`, + }; + + // 滚动到可见区域 + currentElement.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + }, +// 下一步 + nextStep() { + if (this.currentStep < 2) { + this.currentStep++; + this.highlightCurrentStep(); + } else { + this.closeGuidance(); + } + }, + + // 上一步 + previousStep1() { + if (this.currentStep > 1) { + this.currentStep--; + this.highlightCurrentStep(); + } + }, + + // 关闭引导 + closeGuidance() { + this.showGuidance = false; + this.currentStep = 1; + this.highlightStyle = {}; + }, + // 内容分类获得焦点时的处理 + onContentTypeFocus() { + if (this.showGuidance && this.currentStep === 1) { + this.currentStep = 2; + this.highlightCurrentStep(); + } + }, + + // 内容分类改变时的处理 + onContentTypeChange() { + if (this.showGuidance && this.currentStep === 1) { + this.currentStep = 2; + this.highlightCurrentStep(); + } + }, + + // 标签获得焦点时的处理 + onTagFocus() { + if (this.showGuidance && this.currentStep === 2) { + this.closeGuidance(); + } + }, + // 新增初始化标签方法 initTagComponent() { if (this.$refs.courseTag) { @@ -1816,4 +1967,100 @@ export default { } } } + +/* 蒙层样式 */ +.guidance-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.6); + z-index: 9999; + display: flex; + justify-content: center; + align-items: center; +} + +.guidance-content { + background: white; + border-radius: 8px; + padding: 24px; + max-width: 500px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); + z-index: 10000; +} + +.guidance-title { + font-size: 18px; + font-weight: bold; + margin-bottom: 20px; + text-align: center; +} + +.guidance-steps { + margin-bottom: 20px; +} + +.guidance-step { + display: flex; + align-items: flex-start; + margin-bottom: 16px; + opacity: 0.5; + transition: opacity 0.3s; +} + +.guidance-step.active { + opacity: 1; +} + +.step-number { + width: 24px; + height: 24px; + background: #409EFF; + color: white; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin-right: 12px; + font-size: 14px; +} + +.step-content { + flex: 1; +} + +.step-title { + font-weight: bold; + margin-bottom: 4px; +} + +.step-desc { + color: #666; + font-size: 14px; +} + +.guidance-actions { + display: flex; + justify-content: center; + gap: 12px; +} + +/* 高亮元素样式 */ +.highlight-element { + position: fixed; + border: 2px solid #409EFF; + border-radius: 4px; + box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.4), 0 0 15px rgba(64, 158, 255, 0.5); + z-index: 9998; + pointer-events: none; + transition: all 0.3s ease; +} + +/* 被高亮元素的样式 */ +.guidance-highlight { + position: relative; + z-index: 10001; +} diff --git a/src/components/Course/courseTag.vue b/src/components/Course/courseTag.vue index 69a59981..39003d46 100644 --- a/src/components/Course/courseTag.vue +++ b/src/components/Course/courseTag.vue @@ -1,22 +1,22 @@ -