{"version":3,"file":"subject.478f9099.mjs","sources":["../../../../pages/course/subject.vue"],"sourcesContent":["<template>\n  <NuxtLayout >\n    <div v-loading=\"ctrl.loading\" class=\"app_container detail_content\">\n      <div class=\"course_info\" v-if=\"opts.info.id\">\n        <div ref=\"head\" class=\"course_info_header\">\n          <div class=\"course_info_content\">\n            <div class=\"course_nav\">\n              <el-breadcrumb :separator-icon=\"ArrowRight\">\n                <el-breadcrumb-item :to=\"{ path: '/' }\"><span class=\"nav_course_title\">首页</span></el-breadcrumb-item>\n                <el-breadcrumb-item :to=\"{ path: '/course/list' }\"><span class=\"nav_course_title\">课程中心</span></el-breadcrumb-item>\n                <el-breadcrumb-item :to=\"{ path: '/course/list',query:{courseType:opts.info.courseType} }\">\n                  <span class=\"nav_course_title\" >{{ opts.PeriodTypeEnum[opts.info.courseType] }}</span></el-breadcrumb-item>\n                <el-breadcrumb-item>\n                  <div class=\"nav_course_title tx-ov\">{{ opts.info.courseName }}</div>\n                </el-breadcrumb-item>\n              </el-breadcrumb>\n            </div>\n            <div class=\"course_message\">\n              <div class=\"course_cover\">\n                <img :src=\"opts.info.courseCover\" class=\"course_cover_img\">\n                <div v-if=\"opts.info.buyStatus\" :class=\"{success:!opts.info.overSet,danger:opts.info.overSet}\" class=\"update_status\">\n                  {{ !opts.info.overSet ? '更新中' : '已完结' }}\n                </div>\n              </div>\n              <div class=\"course_msg_content\">\n                <div class=\"course_price_content\">\n                  <div class=\"course_name\">\n                    <span class=\"course_name_tag\">{{ opts.PeriodTypeEnum[opts.info.courseType] }}</span>\n                    <span>{{ opts.info.courseName }}</span>\n                  </div>\n                  <div class=\"course_int\">\n                    <div class=\"course_int_text tx-ov\">课程描述：{{ opts.info.courseDesc || '无' }}</div>\n                    <client-only v-if=\"opts.info.courseDesc.length > 35\">\n                      <el-popover\n                        :width=\"600\"\n                        placement=\"bottom-end\"\n                        :offset=\"-24\"\n                        :show-arrow=\"false\"\n                        trigger=\"hover\"\n                      >\n                        <span style=\"line-height: 1.6;font-size: 14px;color:#999\">{{ opts.info.courseDesc }}</span>\n                        <template #reference>\n                          <span class=\"loadmore\">更多</span>\n                        </template>\n                      </el-popover>\n                    </client-only>\n                  </div>\n                </div>\n                <div class=\"course_price_info\">\n                  <div class=\"course_price\">\n                    <span class=\"course_tip\">价格：</span>\n                    <span :style=\"{color: '#F01414' }\" class=\"price_now\">\n                  <span v-if=\"opts.info.price>0\" class=\"price_icon\">￥</span>\n                  {{ opts.info.price ? opts.info.price.toFixed(2) : '免费' }}\n                </span>\n                    <span v-if=\"opts.info.linePrice > 0\" class=\"price_old\">\n                  <span class=\"price_icon\">￥</span>\n                  {{ opts.info.linePrice.toFixed(2) }}\n                </span>\n                  </div>\n                </div>\n                <div class=\"course_cell\">\n                  <span class=\"course_tip\">包含内容：</span>\n                  <span class=\"course_cell_item\"><img src=\"@/assets/class.svg\"/>&nbsp;课时数：{{ opts.info.resourceCount }}个</span>\n                  <span v-if=\"opts.info.certIssue\" class=\"course_cell_item\"><img src=\"@/assets/credential.svg\"/>&nbsp;课程证书：1张 </span>\n                </div>\n                <div class=\"course_int\" v-if=\"opts.info.courseAuthor\">\n                  <div class=\"course_int_text tx-ov\">课程作者：{{ opts.info.courseAuthor }}</div>\n                  <client-only v-if=\"opts.info.courseAuthor.length > 35\">\n                    <el-popover\n                      :width=\"600\"\n                      placement=\"bottom-end\"\n                      :offset=\"-24\"\n                      :show-arrow=\"false\"\n                      trigger=\"hover\"\n                    >\n                      <span style=\"line-height: 1.6;font-size: 14px;color:#999\">{{ opts.info.courseAuthor }}</span>\n                      <template #reference>\n                        <span class=\"loadmore\">更多</span>\n                      </template>\n                    </el-popover>\n                  </client-only>\n                </div>\n                <div v-if=\"opts.info.teacherExist\" class=\"course_cell\">\n                  <span class=\"course_tip\">授课教师：</span>\n                  <div class=\"flex_teacher\">\n                    <div class=\"course_cell_item teacher_wrap\">\n                      <div v-for=\"(teacher,i) in opts.info.teacherList.filter((item,i)=>i<5)\" class=\"teacher_warp_item\" @click=\"handleOpenTeacher(teacher)\">\n                        <img :key=\"i\" :src=\"teacher.headImg\" :title=\"teacher.nickname\" class=\"mgl3 cover_teacher\"/>\n                        <div class=\"teacher_name\">{{ teacher.nickname }}</div>\n                      </div>\n                    </div>\n                    <client-only>\n                      <el-popover\n                        v-if=\"opts.info.teacherList.length > 5\"\n                        :content=\"opts.info.courseDesc\"\n                        :width=\"600\"\n                        placement=\"bottom-end\"\n                        :offset=\"-24\"\n                        :show-arrow=\"false\"\n                        trigger=\"hover\"\n                    >\n                      <div class=\"course_cell_item\">\n                        <div v-for=\"(teacher,i) in opts.info.teacherList\" class=\"teacher_warp_item\"\n                             @click=\"handleOpenTeacher(teacher)\">\n                          <img :key=\"i\" :src=\"teacher.headImg\" :title=\"teacher.nickname\" class=\"mgl3 cover_teacher\"/>\n                          <div class=\"teacher_name\">{{ teacher.nickname }}</div>\n                        </div>\n                      </div>\n                      <template #reference>\n                        <div class=\"course_in_icon\" @click=\"handleChangeTeach\">\n                          更多\n                        </div>\n                      </template>\n                    </el-popover>\n                    </client-only>\n                  </div>\n                </div>\n                <div class=\"course_cell course_cell_valid\">\n                  <span class=\"course_tip\">有效期：</span>\n                  <template v-if=\"opts.info.courseStatus === 3\">\n                    <span class=\"valid_text\">已过期</span>\n                  </template>\n                  <template v-else>\n                    <span v-if=\"opts.info.validityType === 1\">永久有效</span>\n                    <span v-else-if=\"opts.info.validityType === 2\">\n                      {{ opts.info.beginTime }} 至 {{ opts.info.endTime }}\n                    </span>\n                    <span v-else-if=\"opts.info.validityType === 3\">\n                      {{ opts.info.days }}天\n                    </span>\n                  </template>\n                </div>\n                <div class=\"course_bottom\">\n                  <div class=\"course_btn_info\">\n                    <div class=\"course_btn\">\n                      <template v-if=\"opts.info.courseStatus\">\n                        <el-button v-if=\"opts.info.courseStatus === 1\" class=\"buy_btn\" type=\"primary\" @click=\"handleMake\">预约课程</el-button>\n                        <el-button v-if=\"opts.info.courseStatus === 2\" class=\"buy_btn\" type=\"info\">待开课</el-button>\n                        <el-button v-if=\"opts.info.courseStatus === 3\" class=\"buy_btn\" type=\"primary\" @click=\"handleOpenOther\">查看其它课程</el-button>\n                      </template>\n                      <el-button v-else class=\"buy_btn\" type=\"primary\" :disabled=\"!opts.info.buyStatus && !opts.info.supportAloneSales\" @click=\"handleBuy('learn')\">\n                        <template v-if=\"opts.info.supportAloneSales\">\n                          <template v-if=\"opts.info.buyStatus\">{{ !opts.info.enableFirst ? '继续学习' : '开始学习' }}</template>\n                          <template v-else>{{ opts.info.price ? '购买' : '开始学习' }}</template>\n                        </template>\n                        <template v-else>\n                          <template v-if=\"opts.info.buyStatus\">{{ !opts.info.enableFirst ? '继续学习' : '开始学习' }}</template>\n                          <template v-else>不支持单独售卖</template>\n                        </template>\n                      </el-button>\n                    </div>\n                    <div class=\"course_learn_msg\">\n                      <span class=\"learn_item\" v-if=\"shopData && shopData.config.showLearnUserCount && shopData.config.showCourseLearnUserCount\">{{ opts.info.studyNum }}人已学习</span>\n                      <span class=\"learn_item icon_btn\" @click=\"handleCollection\">\n                  <span :class=\"{'icon-collection':!opts.info.collectStatus,'icon-collections':opts.info.collectStatus}\" class=\"iconfont\"></span>\n                  <span class=\"icon_text_name\">收藏</span>\n                </span>\n                      <span class=\"learn_item icon_btn\" @click=\"handleShare\">\n                   <span class=\"iconfont icon-share\"></span>\n                  <span class=\"icon_text_name\">分享</span>\n                </span>\n                    </div>\n                  </div>\n                </div>\n              </div>\n\n            </div>\n          </div>\n          <div class=\"nav_tabs\">\n            <template v-for=\"item in tabEnum\">\n                <div\n                v-if=\"item.show\"\n                :key=\"item.command\"\n                :class=\"{active:map.tabs === item.command}\" class=\"nav_tabs_item\" @click=\"handleChangeType(item.command)\">\n                {{ item.label }}\n              </div>\n              </template>\n          </div>\n        </div>\n        <div v-if=\"map.tabs === 'details'\" class=\"detail_tab_pane\">\n          <div v-if=\"opts.info.courseViewDataList && opts.info.courseViewDataList.length > 0\" class=\"have_detail_list\">\n            <div class=\"have_detail_title\">包含该课程的还有</div>\n            <div class=\"have_scroll_view\">\n              <div v-if=\"opts.scrollX > 0\" class=\"have_scroll_left\" @click=\"lastScroll\">\n                <el-icon>\n                  <arrow-left/>\n                </el-icon>\n              </div>\n              <div ref=\"scroll\" :style=\"opts.style\" class=\"have_scroll_x\" @scroll=\"handleScrollX\">\n                <div v-for=\"(item,idx) in opts.info.courseViewDataList\" :key=\"idx\" class=\"course_have_item\" @click=\"handleOpenCourse(item)\">\n                  <img :src=\"item.courseCover\" class=\"course_have_img\" @click=\"handleOpenCourse(item)\"/>\n                  <div class=\"course_have_msg\">\n                    <div class=\"course_item_title\">{{ item.courseName }}</div>\n                    <span class=\"course_item_courseware\">{{ item.resourceCount }}个课件</span>\n                  </div>\n                </div>\n              </div>\n              <div v-if=\"getScrollRight()\" class=\"have_scroll_right\" @click=\"nextScroll\">\n                <el-icon>\n                  <arrow-right/>\n                </el-icon>\n              </div>\n            </div>\n          </div>\n          <div class=\"detail_desc_content\" v-html=\"opts.info.courseIntro\"></div>\n        </div>\n        <div v-if=\"map.tabs === 'directory'\" class=\"detail_tab_pane\">\n          <div class=\"menu_have_num\">共{{ opts.subNum }}节课</div>\n          <template v-if=\"opts.subjectList.length === 1\">\n            <div v-for=\"(sub,i) in opts.subjectList[0].periodList\" :key=\"i\" class=\"single_menu_item\" @click=\"handleBuy(sub)\">\n              <div class=\"single_item_top\">\n              <div class=\"single_item_name\">\n                <img v-if=\"sub.periodType === 1\" class=\"video_icon mgr10\" src=\"~/assets/video.svg\">\n                <span v-if=\"sub.periodType === 2\" class=\"video_icon iconfont icon-audio mgr10\"></span>\n                <span v-if=\"sub.periodType === 6\" class=\"video_icon iconfont icon-img mgr10\"></span>\n                <span v-if=\"sub.periodType === 7\" class=\"video_icon iconfont icon-live mgr10\"></span>\n                <span v-if=\"sub.periodType === 4\" class=\"video_icon iconfont icon-video_class mgr10\"></span>\n                <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.doc') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_Word.svg\">\n                <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.xls') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_Excel.svg\">\n                <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.ppt') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_PPT.svg\">\n                <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.pdf') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_PDF.svg\">\n                <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.txt') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_txt.svg\">\n                <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.sb3') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_link.svg\">\n                <img v-if=\"sub.periodType === 5\" class=\"video_icon mgr10\" src=\"~/assets/audio_class.svg\">\n                <img v-if=\"sub.periodType === 8\" class=\"video_icon mgr10\" src=\"~/assets/icon_link.svg\">\n                <div class=\"single_item_title tx-ov\">{{ sub.periodName }}</div>\n                <span v-if=\"sub.tryLearn\" class=\"tag_success\">免费试学</span>\n                <div v-if=\"sub.periodType === 7\">({{ sub.liveBeginTime }} 开播)</div>\n              </div>\n              <div v-if=\"[1,2,4,5].indexOf(sub.periodType) > -1\" class=\"single_item_status\">{{ formatDuring(sub.materialDuration * 1000) }}</div>\n              <div v-else-if=\"sub.periodType === 7\" class=\"single_item_status\">\n                <span v-if=\"sub.liveStatus === 1\" class=\"tag_status\">未开播</span>\n                <span v-else-if=\"sub.liveStatus === 2\" class=\"tag_status success\"><span class=\"iconfont icon-living mgr10\"></span>正在直播 </span>\n                <span v-else-if=\"sub.liveStatus === 3\" class=\"tag_status\"> 已结束 </span>\n                <span v-else-if=\"sub.liveStatus === 4\" class=\"tag_status\"> 回放生成 </span>\n              </div>\n              <div v-else-if=\"sub.periodType === 3\" class=\"single_item_status\">{{ getSize(sub.materialSize) }}</div>\n              <div v-else-if=\"sub.periodType === 6\" class=\"single_item_status\">预计阅读时间需要{{ (sub.duration / 60).toFixed(0) }}分钟</div>\n            </div>\n              <div v-if=\"sub.practiceExist || sub.examExist || sub.coursewareExist\" class=\"btn_course_class\">\n                <div v-if=\"sub.practiceExist\" class=\"course_class_item\" @click.stop=\"handlePractice(sub)\">\n                  <span class=\"iconfont icon-practice\"></span>\n                  <span class=\"course_btn_item_txt\">练习</span>\n                </div>\n                <div v-if=\"sub.examExist\" class=\"course_class_item\" @click.stop=\"handleExam(sub)\">\n                  <span class=\"iconfont icon-examination\"></span>\n                  <span class=\"course_btn_item_txt\">考试</span>\n                </div>\n                <div v-if=\"sub.coursewareExist\" class=\"course_class_item\" @click.stop=\"handleOpenCourseware(sub)\">\n                  <span class=\"iconfont icon-download\"></span>\n                  <span class=\"course_btn_item_txt\">课件</span>\n                </div>\n              </div>\n            </div>\n\n          </template>\n          <template v-if=\"opts.subjectList.length > 1\">\n            <div v-for=\"(subject,index) in opts.subjectList\" :key=\"index\" class=\"sub_menu_period\">\n              <div class=\"sub_period_title\">{{ subject.chapterName }}</div>\n              <div v-for=\"(sub,i) in subject.periodList\" :key=\"i\" class=\"sub_period_item\" @click=\"handleBuy(sub)\">\n                <div class=\"single_item_top\">\n                <div class=\"single_item_name\">\n                  <img v-if=\"sub.periodType === 1\" class=\"video_icon mgr10\" src=\"~/assets/video.svg\">\n                  <span v-if=\"sub.periodType === 2\" class=\"video_icon iconfont icon-audio mgr10\"></span>\n                  <span v-if=\"sub.periodType === 6\" class=\"video_icon iconfont icon-img mgr10\"></span>\n                  <span v-if=\"sub.periodType === 7\" class=\"video_icon iconfont icon-live mgr10\"></span>\n                  <span v-if=\"sub.periodType === 4\" class=\"video_icon iconfont icon-video_class mgr10\"></span>\n                  <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.doc') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_Word.svg\">\n                  <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.xls') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_Excel.svg\">\n                  <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.ppt') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_PPT.svg\">\n                  <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.pdf') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_PDF.svg\">\n                  <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.txt') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_txt.svg\">\n                  <img v-if=\"sub.periodType === 3 && sub.periodName.indexOf('.sb3') > -1\" class=\"video_icon mgr10\" src=\"~/assets/icon_link.svg\">\n                  <img v-if=\"sub.periodType === 5\" class=\"video_icon mgr10\" src=\"~/assets/audio_class.svg\">\n                  <img v-if=\"sub.periodType === 8\" class=\"video_icon mgr10\" src=\"~/assets/icon_link.svg\">\n                  <div :class=\"{mgr10:sub.periodType === 7}\" class=\"single_item_title tx-ov\">{{ sub.periodName }}</div>\n                  <span v-if=\"sub.tryLearn\" class=\"tag_success\">免费试学</span>\n                  <div v-if=\"sub.periodType === 7\">({{ sub.liveBeginTime }} 开播)</div>\n                </div>\n                <div v-if=\"[1,2,4,5].indexOf(sub.periodType) > -1\" class=\"single_item_status\">{{ formatDuring(sub.materialDuration * 1000) }}</div>\n                <div v-else-if=\"sub.periodType === 7\" class=\"single_item_status\">\n                  <span v-if=\"sub.liveStatus === 1\" class=\"tag_status\">未开播</span>\n                  <span v-else-if=\"sub.liveStatus === 2\" class=\"tag_status success\"><span class=\"iconfont icon-living mgr10\"></span>正在直播 </span>\n                  <span v-else-if=\"sub.liveStatus === 3\" class=\"tag_status\"> 已结束 </span>\n                  <span v-else-if=\"sub.liveStatus === 4\" class=\"tag_status\"> 回放生成 </span>\n                </div>\n                <div v-else-if=\"sub.periodType === 3\" class=\"single_item_status\">{{ getSize(sub.materialSize) }}</div>\n                <div v-else-if=\"sub.periodType === 6\" class=\"single_item_status\">预计阅读时间需要{{ (sub.duration / 60).toFixed(0) }}分钟</div>\n                </div>\n                <div v-if=\"sub.practiceExist || sub.examExist || sub.coursewareExist\" class=\"btn_course_class\">\n                  <div v-if=\"sub.practiceExist\" class=\"course_class_item\" @click.stop=\"handlePractice(sub)\">\n                    <span class=\"iconfont icon-practice\"></span>\n                    <span class=\"course_btn_item_txt\">练习</span>\n                  </div>\n                  <div v-if=\"sub.examExist\" class=\"course_class_item\" @click.stop=\"handleExam(sub)\">\n                    <span class=\"iconfont icon-examination\"></span>\n                    <span class=\"course_btn_item_txt\">考试</span>\n                  </div>\n                  <div v-if=\"sub.coursewareExist\" class=\"course_class_item\" @click.stop=\"handleOpenCourseware(sub)\">\n                    <span class=\"iconfont icon-download\"></span>\n                    <span class=\"course_btn_item_txt\">课件</span>\n                  </div>\n                </div>\n                </div>\n            </div>\n          </template>\n        </div>\n        <div v-if=\"map.tabs === 'notes'\" v-loading=\"ctrl.note\" class=\"detail_tab_pane note_pane\">\n          <div class=\"all_txt\">全部笔记&nbsp;{{ notePage.totalCount }}</div>\n          <div class=\"note_list\">\n            <div v-for=\"(note,index) in opts.noteList\" :key=\"index\" class=\"note_item\">\n              <div class=\"note_cover\">\n                <el-avatar :size=\"48\" :src=\"note.headImg\" class=\"note_img\"/>\n              </div>\n              <div class=\"note_info\">\n                <div class=\"note_info_header\">\n                  <span class=\"note_info_name tx-ov\">{{ note.userName }}</span>\n                  <span class=\"note_info_time\">{{ note.gmtCreate }}</span>\n                </div>\n                <div :class=\"{'tx-ov-2':!note.showChild,mgb30:!note.pic}\" class=\"note_info_content\">\n                  {{ note.content }}\n                </div>\n                <el-button v-if=\"note.content.length > 153\" type=\"text\" @click=\"note.showChild = !note.showChild\">{{ note.showChild ? '收起' : '展开' }}</el-button>\n                <div v-if=\"note.pic\" class=\"pic\">\n                  <el-image\n                    v-for=\"(pic, index) in note.pic.split(',')\"\n                    :src=\"pic\"\n                    :preview-teleported=\"true\"\n                    :preview-src-list=\"[pic]\"\n                    fit=\"cover\"\n                    :key=\"index\"\n                  />\n                </div>\n              </div>\n            </div>\n            <div class=\"loading_btn\">\n              <el-button v-if=\"notePage.totalPage > notePage.pageCurrent && !ctrl.note\" type=\"text\" @click=\"handleScroll\">查看更多</el-button>\n              <span v-if=\"ctrl.note\" class=\"loading_text\">加载中...</span>\n              <span v-if=\"notePage.totalPage <= notePage.pageCurrent && !ctrl.note\" class=\"loading_text\">已经到底部，没有更多内容了</span>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"map.tabs === 'comments'\" v-loading=\"ctrl.comment\" class=\"detail_tab_pane\">\n          <div v-if=\"token && opts.info.buyStatus && map.tabs === 'comments'\" class=\"comment_add_box relative\">\n            <div class=\"relative\">\n              <el-input\n                v-model=\"map.commentText\"\n                type=\"textarea\"\n                :rows=\"2\"\n                maxlength=\"500\"\n                show-word-limit\n                class=\"font14\"\n                placeholder=\"请输入...\"\n              ></el-input>\n              <span class=\"limit_count_box\">{{map.commentText.length}} / 500</span>\n            </div>\n            <div class=\"comment_add_btn\">\n              <emoji-box @select=\"handleSelectEmoji($event, map)\"></emoji-box>\n              <el-button :disabled=\"map.commentText === 0\" class=\"comment_btn\" type=\"primary\"\n                          @click=\"handleSaveComment(map.commentText)\">评论\n              </el-button>\n            </div>\n          </div>\n          <div class=\"all_txt\">全部评论&nbsp;{{ commentPage.totalCount }}</div>\n          <div class=\"course_comment_list\">\n            <div v-for=\"(comment,x) in opts.commentList\" :key=\"x\" class=\"course_comment_item\">\n              <div class=\"course_comment_cover\">\n                <el-avatar :size=\"48\" :src=\"comment.headPortrait\" class=\"comment_cover_img\"></el-avatar>\n              </div>\n              <div class=\"course_comment_content\">\n                <div class=\"course_comment_user\">{{ comment.userName }}</div>\n                <div :class=\"{'tx-ov-2':!comment.showContent}\" class=\"course_comment_int\">{{ comment.commentContent }}</div>\n                <el-button v-if=\"comment.commentContent.length > 137\" type=\"text\" @click=\"comment.showContent = !comment.showContent\">{{ comment.showContent ? '收起' : '展开' }}</el-button>\n                <div :class=\"{has:comment.replyList}\" class=\"course_comment_btn\">\n                  <div class=\"course_comment_time\">{{ comment.gmtCreate }}</div>\n                  <div class=\"comment_btn_list\">\n  <!--                  <div :class=\"{hover:comment.report}\" class=\"btn_icons\" @mouseleave=\"handleBlur(comment,'report')\" @mouseover=\"handleFocus(comment,'report')\">-->\n  <!--                    <span class=\"iconfont icon-report\"></span>-->\n  <!--                    <span class=\"btn_text\">举报</span>-->\n  <!--                  </div>-->\n                    <div v-if=\"userInfo&&userInfo.id !== comment.userId\" :class=\"{hover:comment.add}\" class=\"btn_icons\" @click=\"handleShowComment(comment)\" @mouseleave=\"handleBlur(comment,'add')\" @mouseover=\"handleFocus(comment,'add')\">\n                      <span class=\"iconfont icon-comment\"></span>\n                      <span class=\"btn_text\">回复</span>\n                    </div>\n  <!--                  <div :class=\"{hover:comment.love,active:comment.like}\" class=\"btn_icons\" @mouseleave=\"handleBlur(comment,'love')\" @mouseover=\"handleFocus(comment,'love')\">-->\n  <!--                    <span :class=\"{'icon-like':(!comment.love&&!comment.like),'icon-like1':comment.love||comment.like}\" class=\"iconfont\"></span>-->\n  <!--                    <span class=\"btn_text\">{{ comment.likeNum }}</span>-->\n  <!--                  </div>-->\n                  </div>\n                </div>\n                <div v-if=\"comment.showCommentChild && token\" class=\"comment_add_box relative\">\n                  <div class=\"relative\">\n                    <el-input\n                      v-model=\"comment.commentText\"\n                      type=\"textarea\"\n                      :rows=\"1\"\n                      maxlength=\"500\"\n                      show-word-limit\n                      class=\"font14\"\n                      :placeholder=\"`回复 ${comment.userName}`\"\n                    ></el-input>\n                    <span class=\"limit_count_box\">{{comment.commentText.length}} / 500</span>\n                  </div>\n                  <div class=\"comment_add_btn\">\n                    <emoji-box @select=\"handleSelectEmoji($event, comment)\"></emoji-box>\n                    <el-button :disabled=\"comment.commentText.length === 0\" class=\"comment_btn\"\n                                type=\"primary\" @click=\"handleSaveComment(comment.commentText,comment.id,comment)\">评论\n                    </el-button>\n                  </div>\n                </div>\n                <div v-if=\"comment.replyList\" class=\"course_child_comment\">\n                  <div v-for=\"(child,x) in comment.replyList\" :key=\"x\" :class=\"{hide:!comment.showAllReply && x > 1}\" class=\"course_comment_item\">\n                    <div class=\"course_comment_cover\">\n                      <el-avatar :size=\"48\" :src=\"child.headPortrait\" class=\"comment_cover_img\"></el-avatar>\n                    </div>\n                    <div class=\"course_comment_content\">\n                      <div class=\"course_comment_user\">{{ child.userName }}</div>\n                      <div :class=\"{'tx-ov-2':!child.showContent}\" class=\"course_comment_int\">回复 <span\n                        class=\"both\">{{ child.replyUserName }}</span> : {{ child.commentContent }}\n                      </div>\n                      <el-button v-if=\"child.commentContent.length > 137\" type=\"text\" @click=\"child.showContent = !child.showContent\">{{ child.showContent ? '收起' : '展开' }}</el-button>\n                      <div class=\"course_comment_btn\">\n                        <div class=\"course_comment_time\">{{ formatDay(child.gmtCreate) }}</div>\n                        <div class=\"comment_btn_list\">\n  <!--                        <div :class=\"{hover:child.report}\" class=\"btn_icons\" @mouseleave=\"handleBlur(child,'report')\" @mouseover=\"handleFocus(child,'report')\">-->\n  <!--                          <span class=\"iconfont icon-report\"></span>-->\n  <!--                          <span class=\"btn_text\">举报</span>-->\n  <!--                        </div>-->\n                          <div v-if=\"userInfo&&userInfo.id !== child.userId\" :class=\"{hover:child.add}\" class=\"btn_icons\" @click=\"handleShowComment(child)\" @mouseleave=\"handleBlur(child,'add')\" @mouseover=\"handleFocus(child,'add')\">\n                            <span class=\"iconfont icon-comment\"></span>\n                            <span class=\"btn_text\">回复</span>\n                          </div>\n  <!--                        <div :class=\"{hover:child.love,active:child.like}\" class=\"btn_icons\" @mouseleave=\"handleBlur(child,'love')\" @mouseover=\"handleFocus(child,'love')\">-->\n  <!--                          <span :class=\"{'icon-like':(!child.love&&!child.like),'icon-like1':child.love||child.like}\" class=\"iconfont\"></span>-->\n  <!--                          <span class=\"btn_text\">{{ child.likeNum }}</span>-->\n  <!--                        </div>-->\n                        </div>\n                      </div>\n                      <div v-if=\"child.showCommentChild\" class=\"comment_add_box relative\">\n                        <div class=\"relative\">\n                          <el-input\n                            v-model=\"child.commentText\"\n                            type=\"textarea\"\n                            :rows=\"1\"\n                            maxlength=\"500\"\n                            show-word-limit\n                            class=\"font14\"\n                            :placeholder=\"`回复 ${child.userName}`\"\n                          ></el-input>\n                          <span class=\"limit_count_box\">{{child.commentText.length}} / 500</span>\n                        </div>\n                        <div class=\"comment_add_btn\">\n                          <emoji-box @select=\"handleSelectEmoji($event, child)\"></emoji-box>\n                          <el-button :disabled=\"child.commentText.length === 0\" class=\"comment_btn\"\n                                      type=\"primary\" @click=\"handleSaveComment(child.commentText,child.id,child)\">评论\n                          </el-button>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <el-button v-if=\"comment.replyList.length > 2\" class=\"mgt20\" type=\"text\" @click=\"comment.showAllReply = !comment.showAllReply\">\n                    {{ comment.showAllReply ? '收起' : `查看全部${comment.replyList.length}条评论 >` }}\n                  </el-button>\n                </div>\n              </div>\n            </div>\n            <div class=\"loading_btn\">\n              <el-button v-if=\"commentPage.totalPage > commentPage.pageCurrent && !ctrl.comment\" class=\"warning_color\" type=\"text\" @click=\"handleScroll\">查看更多</el-button>\n              <span v-if=\"ctrl.comment\" class=\"loading_text\">加载中...</span>\n              <span v-if=\"commentPage.totalPage <= commentPage.pageCurrent && !ctrl.comment\" class=\"loading_text\">已经到底部，没有更多内容了</span>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"map.tabs === 'courseware'\" v-loading=\"ctrl.coursewareLoading\" class=\"detail_tab_pane\">\n          <div class=\"down_courseware_list\">\n            <div v-for=\"item in opts.coursewareList\" class=\"down_menu_item\" :key=\"item.id\">\n              <div class=\"down_item_name\">\n                <span class=\"iconfont icon-download mgr10\" @click=\"handleDown(item)\"></span>\n                <div class=\"down_item_title tx-ov\">{{ item.materialName }}</div>\n              </div>\n              <div class=\"down_item_status\">{{ getSize(item.materialSize) }}</div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"ctrl.fixed\" class=\"fixed_header\">\n          <div class=\"fixed_content\">\n            <a class=\"nav_logo\" href=\"/\">\n              <img v-if=\"componentInfo.websiteLogo\" :src=\"componentInfo.websiteLogo\" alt=\"\"/>\n            </a>\n            <div class=\"nav_tabs_header\">\n              <template v-for=\"item in tabEnum\">\n                <div\n                v-if=\"item.show\"\n                :key=\"item.command\"\n                :class=\"{active:map.tabs === item.command}\" class=\"nav_tabs_item\" @click=\"handleChangeType(item.command)\">\n                {{ item.label }}\n              </div>\n              </template>\n              <!--<div class=\"nav_tabs_item\" @click=\"handleChangeType('details')\" :class=\"{active:map.tabs === 'details'}\">详情</div>\n             <div class=\"nav_tabs_item\" @click=\"handleChangeType('directory')\" :class=\"{active:map.tabs === 'directory'}\">目录</div>\n             <div class=\"nav_tabs_item\" @click=\"handleChangeType('notes')\" :class=\"{active:map.tabs === 'notes'}\">笔记</div>\n             <div class=\"nav_tabs_item\" @click=\"handleChangeType('comments')\" :class=\"{active:map.tabs === 'comments'}\">评论</div>\n            <div class=\"nav_tabs_item\" @click=\"handleChangeType('courseware')\" :class=\"{active:map.tabs === 'courseware'}\">课件</div> -->\n            </div>\n            <div class=\"course_btn\">\n              <template v-if=\"opts.info.courseStatus\">\n                <el-button v-if=\"opts.info.courseStatus === 1\" class=\"buy_btn\" type=\"primary\" @click=\"handleMake\">预约课程</el-button>\n                <el-button v-if=\"opts.info.courseStatus === 2\" class=\"buy_btn\" type=\"info\">待开课</el-button>\n                <el-button v-if=\"opts.info.courseStatus === 3\" class=\"buy_btn\" type=\"primary\" @click=\"handleOpenOther\">查看其它课程</el-button>\n              </template>\n              <el-button v-else class=\"buy_btn\" type=\"primary\" :disabled=\"!opts.info.buyStatus && !opts.info.supportAloneSales\" @click=\"handleBuy('learn')\">\n                <template v-if=\"opts.info.supportAloneSales\">\n                  <template v-if=\"opts.info\">{{ !opts.info.enableFirst ? '继续学习' : '开始学习' }}</template>\n                  <template v-else>{{ opts.info.price ? '购买' : '开始学习' }}</template>\n                </template>\n                <template v-else>\n                  <template v-if=\"opts.info.buyStatus\">{{ !opts.info.enableFirst ? '继续学习' : '开始学习' }}</template>\n                  <template v-else>不支持单独售卖</template>\n                </template>\n              </el-button>\n            </div>\n          </div>\n        </div>\n      </div>\n      <client-only>\n        <course-share v-model=\"ctrl.share\" :info=\"opts.info\"></course-share>\n        <before-exam\n            v-if=\"ctrl.showBeforeExam\"\n            :chapter-id=\"opts.examObj.chapterId\"\n            :dialogVisible=\"ctrl.showBeforeExam\"\n            :exam-name=\"opts.examObj.examName\"\n            :paper-id=\"opts.examObj.paperId\"\n            :period-id=\"opts.examObj.periodId\"\n            :resource-id=\"opts.examObj.courseId\"\n            :resource-type=\"2\"\n            :single-course-id=\"opts.examObj.resourceId\"\n            @close=\"closeDialog\"\n        ></before-exam>\n        <before-exercise :practice-num=\"opts.examObj.practiceNum\" :exam-name=\"opts.examObj.practiceName\" :support-alone-sales=\"opts.info.supportAloneSales\" v-if=\"ctrl.showBeforeExercise\" v-model=\"ctrl.showBeforeExercise\" @close=\"handleCloseExercise\" @callback=\"handleOpenExercise\"></before-exercise>\n        <el-dialog v-model=\"ctrl.courseware\" :before-close=\"handleCloseCourseware\" title=\"课件下载\" width=\"600px\">\n          <div class=\"down_courseware_list\">\n            <div v-for=\"item in opts.coursewareList\" class=\"down_menu_item\" :key=\"item.id\">\n              <div class=\"down_item_name\">\n                <span class=\"iconfont icon-download mgr10\" @click=\"handleDown(item)\"></span>\n                <div class=\"down_item_title tx-ov\">{{ item.materialName }}</div>\n              </div>\n              <div class=\"down_item_status\">{{ getSize(item.materialSize) }}</div>\n            </div>\n          </div>\n        </el-dialog>\n      </client-only>\n      <div v-if=\"ctrl.showTip\" class=\"tip_bg_visible\">\n        <span class=\"tip_bg_visible\"><el-icon><warning-filled/></el-icon></span>\n        <div class=\"tip_visible_text\">{{ opts.tipText }}</div>\n      </div>\n    </div>\n  </NuxtLayout>\n</template>\n<script setup>\nimport EmojiBox from '@/components/comment/emojiBox.vue'\nimport {ArrowLeft, ArrowRight, WarningFilled} from '@element-plus/icons-vue'\nimport {useUserStore} from \"../../stores/user\";\nimport {\n  courseApiListCourseware,\n  courseAuthAppointment,\n  courseAuthNotesListData, courseAuthSubjectMenuView,\n  courseCommentPage,\n  courseCommentReplySave,\n  courseCommentSave,\n  courseListCourseware,\n  courseNotesListData,\n  courseSubjectMenuView, coursewareDownloadApi,\n  coursewareDownloadAuth,\n  getAuthCourseView,\n  getCourseView,\n  courseAuthGetResource,\n  materialPreview\n} from \"../../api/course\";\nimport {forbidCopy, formatDay, formatDuring, getSize} from '../../utils'\nimport {getHearder} from \"@/api/layouts\";\nimport cookie from '@/utils/cookies'\nimport {collectionUserDelete, collectionUserSave} from \"../../api/system\";\nimport {ElMessage} from \"element-plus\";\nimport {ElMessageBox} from \"element-plus\";\nimport {paperCheckStatus} from \"../../api/paper\";\nimport BeforeExercise from \"@/components/exam/beforeExercise.vue\";\nimport BeforeExam from '@/components/exam/beforeExam.vue'\nimport {setStore} from \"../../utils/storage\";\nconst route = useRoute()\n\nconst {data: componentInfo} = await useAsyncData(\"header\", async (ctx) => {\n  return getHearder();\n});\n\nlet cookieData = cookie.getShop()\n\nconst {getEnumList, getToken} = useUserStore()\nconst shopData = computed(() => {\n  return useUserStore().shopData\n})\nconst tabEnum = computed(()=>{\n return [{label: '课程介绍', command: 'details',show:true},  {label: '课程目录', command: 'directory',show:true}, {label: '课件下载', command: 'courseware',show: opts.info && opts.info.coursewareExist}, {label: '学习笔记', command: 'notes',show:opts.info && opts.info.enableCourseNote}, {label: '课程评论', command: 'comments',show:opts.info && opts.info.enableCourseComment}]\n})\n\n\nconst opts = reactive({\n  tipText: '',\n  errorNum: 0,\n  info: {},\n  examObj:{},\n  lastLearn: {},\n  subjectList: [],\n  subNum: computed(() => {\n    let num = 0\n    if (opts.subjectList.length > 0) {\n      opts.subjectList.forEach(el => {\n        num += el.recourseNum\n      })\n    }\n    return num\n  }),\n  style: {\n    width: '1100px'\n  },\n  infoTimer: null,\n  scrollX: 0,\n  PeriodTypeEnum: {},\n  commentList: [],\n  noteList: [],\n  coursewareList: []\n})\n\nconst token = computed(() => {\n  return getToken()\n})\n\n\nconst router = useRouter()\nconst store = useUserStore()\nconst head = ref(null)\nconst userInfo = computed(()=>store.userView)\nconst map = reactive({\n  id: '',\n  topicCourseId: '',\n  tabs: 'details',\n  commentText: '',\n  relevanceType: 2, //1:课程关联、2:专题关联\n  recordId: '' // 考试记录id\n})\n\nconst notePage = reactive({\n  pageCurrent: 1,\n  pageSize: 10,\n  totalPage: 1,\n  totalCount: 0\n})\nconst commentPage = reactive({\n  pageCurrent: 1,\n  pageSize: 10,\n  totalPage: 1,\n  totalCount: 0\n})\nconst ctrl = reactive({\n  showTip: false,\n  loading: false,\n  showDesc: false,\n  comment: false,\n  note: false,\n  coursewareLoading: false,\n  courseware: false,\n  fixed: false,\n  share: false,\n  showStartPractice: false,\n  showBeforeExam: false,\n  showBeforeExercise:false\n})\nconst closeDialog = (flag = false) => {\n  ctrl.showBeforeExam = false;\n  if (flag) {\n    setStore('examInfo',opts.examObj)\n    router.push({\n      path: '/exam/startExam',\n      query: {\n        controlShow: true,\n        examType: 2,\n        relevanceType: map.relevanceType\n      }\n    })\n  }\n}\nconst handleOpenExercise = () => {\n  ctrl.showBeforeExercise = false\n  // ctrl.showStartPractice = true\n  setStore('practiceInfo',opts.examObj)\n  router.push({\n    path: '/practice/startPractice',\n    query: {\n      controlShow: true,\n      examType: 2,\n      courseId: opts.examObj.resourceId,\n      subjectCourseId: opts.examObj.courseId,\n      periodId: opts.examObj.id,\n      courseTypeName: 'subject'\n    }\n  })\n}\nconst handleCloseExercise = () => {\n  ctrl.showBeforeExercise = false\n}\nconst handlePractice = (row) => {\n  if(!token.value){\n    ElMessage.error('你尚未登录')\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath)\n      }\n    })\n    return false\n  }\n  if(!opts.info.buyStatus && opts.info.price > 0){\n    ElMessage.error('你尚未购买本课程')\n    return false\n  }\n  if (!handleBeforeValid()) {\n    return false\n  }\n  opts.examObj = row\n  ctrl.showBeforeExercise = true\n}\nconst handleExam = (row) => {\n  if(!token.value){\n    ElMessage.error('你尚未登录')\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath)\n      }\n    })\n    return false\n  }\n  if(!opts.info.buyStatus && !opts.info.supportAloneSales){\n    ElMessage.error('你尚未购买本课程，请从课程介绍中查看包含课程的套餐中购买后查看')\n    return false\n  }\n  if(!opts.info.buyStatus && opts.info.price > 0){\n    ElMessage.error('你尚未购买本课程')\n    return false\n  }\n  if (!handleBeforeValid()) {\n    return false\n  }\n  if(token.value){\n    paperCheckStatus(row.paperId)\n        .then((res) => {\n          if (res === 1) {\n            opts.examObj = row\n            opts.examObj.scoreRecordRule = opts.info.scoreRecordRule\n            opts.examObj.chapterId = row.chapterId\n            opts.examObj.periodId = row.id\n            ctrl.showBeforeExam = true;\n          } else {\n            ElMessage.error(\"该试卷已下架\");\n          }\n        })\n        .catch((e) => {\n        });\n  }else{\n    opts.examObj = row\n    opts.examObj.scoreRecordRule = opts.info.scoreRecordRule\n    opts.examObj.chapterId = row.chapterId\n    opts.examObj.periodId = row.id\n    ctrl.showBeforeExam = true;\n  }\n\n}\nconst handleOpenCourseware = (row) => {\n  if (token.value) {\n    courseListCourseware({id: opts.info.id, periodId: row.id, topicCourseId: map.topicCourseId}).then(res => {\n      opts.periodId = row.id\n      opts.coursewareList = res\n      ctrl.courseware = true\n    })\n  } else {\n    courseApiListCourseware({id: opts.info.id, periodId: row.id, topicCourseId: map.topicCourseId}).then(res => {\n      opts.periodId = row.id\n      opts.coursewareList = res\n      ctrl.courseware = true\n    })\n  }\n}\nconst handleCloseCourseware = () => {\n  ctrl.courseware = false\n}\nconst handleShowTip = (text) => { // 提示框\n  opts.tipText = text\n  ctrl.showTip = true\n  setTimeout(() => {\n    ctrl.showTip = false\n  }, 3000)\n}\nconst handleShare = () => {\n  // 分享\n  ctrl.share = true\n}\nconst scroll = ref(null)\nconst getScrollRight = () => { // 获取右侧按钮是否显示\n  if (!opts.info.courseViewDataList) {\n    return false\n  } else {\n    if (scroll.value) {\n      let scrollLength = scroll.value.scrollWidth - scroll.value.offsetWidth\n      return scrollLength !== scroll.value.scrollLeft && opts.info.courseViewDataList.length > 3;\n    } else {\n      return false\n    }\n  }\n}\nconst handleShowComment = (comment) => { // 显示评论框\n  comment.showCommentChild = !comment.showCommentChild\n  if (comment.showCommentChild) {\n    comment.commentText = ''\n  }\n}\nconst handleDown = (row) => { // 下载\n  if (!handleBeforeValid()) {\n    return false\n  }\n  if(!opts.info.enableNotLoginWatch && !token.value) {\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath)\n      }\n    })\n    return false\n  }\n  getDwnUrl(row)\n}\nconst getDwnUrl = async (row) => {\n  let url = \"\"\n  if (token.value) {\n    url = await coursewareDownloadAuth({id: route.query.id, materialId: row.materialId, periodId: opts.periodId})\n  } else {\n    url = await coursewareDownloadApi({id: route.query.id, materialId: row.materialId, periodId: opts.periodId})\n  }\n  const link = document.createElement('a');\n  link.href = url;\n  link.download = row.materialName;\n  link.click();\n}\nconst handleBeforeValid = () => {\n  // 课程是否已过期\n  if (opts.info.courseStatus === 3) {\n    ElMessage.error('课程已过期')\n    return false\n  }else if(opts.info.courseStatus === 2){\n    ElMessage.error('课程未开课')\n    return false\n  }else if(opts.info.courseStatus === 1){\n    ElMessage.error('课程尚未预约')\n    return false\n  } else {\n    return true\n  }\n}\nconst handleMake = () => { // 预约\n  if (!token.value) {\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath)\n      }\n    })\n    return\n  }\n  courseAuthAppointment({id: opts.info.id}).then(res => {\n    if (res) {\n      ElMessageBox.alert('课程开课时，我们将以短信的形式通知您，请您留意哟~', '预约成功提醒', {\n        confirmButtonText: '知道了',\n        type: 'success',\n        center: true,\n      }).then(() => {\n      })\n      getInfo()\n    }\n  })\n}\nconst handleBuy = (row) => { // 购买\n  if (!handleBeforeValid()) {\n    return false\n  }\n  if (opts.info.courseStatus === 1) {\n    handleMake()\n    return\n  }\n  if (opts.info.courseStatus === 2) {\n    return\n  }\n  if (opts.info.courseStatus === 3) {\n    handleOpenOther()\n    return\n  }\n  if(!opts.info.buyStatus && !opts.info.supportAloneSales){\n    ElMessage.error('你尚未购买本课程，请从课程介绍中查看包含课程的套餐中购买后查看')\n    return false\n  }\n  if (opts.info.price > 0 && !row.tryLearn  && !opts.info.buyStatus) {\n    if (!shopData.value.config.enabledPay) {\n      ElMessage.error(shopData.value.config.disablePayTips)\n      return\n    }\n    if (!shopData.value.config.enabledAliPay && !shopData.value.config.enabledWxPay) {\n      handleShowTip(shopData.value.config.disablePayTips)\n      return\n    }\n  }\n  if (opts.info.price > 0 && !opts.info.buyStatus && !row.tryLearn) {\n    if (!opts.info.publishStatus) {\n      ElMessage.error('课程暂未发布')\n      return false\n    }\n    if (token.value) {\n      router.push({\n        path: '/pay/buy',\n        query: {\n          id: map.id\n        }\n      })\n    } else {\n      router.push({\n        path: '/login',\n        query: {\n          redirect: encodeURIComponent(route.fullPath)\n        }\n      })\n    }\n  } else {\n    let obj\n    if (row === 'learn') {\n      for (let i = 0; i < opts.subjectList.length; i++) {\n        if (opts.subjectList[i].periodList && opts.subjectList[i].periodList.length) {\n          // 查询到章节存在课时，选择存在课时的章节第一个课时开始学习，并退出循环\n          obj = opts.subjectList[i].periodList[0]\n          i = opts.subjectList.length\n        }\n      }\n      // 如果没有课程下没有课时，进行提示\n      if (!obj) {\n        ElMessage.error('课程暂无课时学习')\n      }\n    } else {\n      obj = row\n    }\n    if (!opts.info.enableNotLoginWatch && !opts.info.buyStatus && opts.info.price > 0 && !token.value && !row.tryLearn) {\n      ElMessage.error('请登录后再进行观看')\n      router.push({\n        path: '/login',\n        query: {\n          redirect: encodeURIComponent(route.fullPath)\n        }\n      })\n      return\n    }\n\n    let query = route.query || {}\n    let param = {\n      id: map.id,\n      periodId: obj.id,\n    }\n    if(map.topicCourseId){\n      param.topicId = map.topicCourseId\n    }\n    if (obj.periodType === 8) {\n      if (\n        !opts.info.enableNotLoginWatch &&\n        !opts.info.buyStatus &&\n        opts.info.price === 0 &&\n        !token.value &&\n        !obj.tryLearn\n      ) {\n        ElMessage.error(\"请登录后再进行观看\");\n        router.push({\n          path: \"/login\",\n          query: {\n            redirect: encodeURIComponent(route.fullPath),\n          },\n        });\n        return;\n      }\n      if (token.value) {\n        courseAuthGetResource({\n          courseId: opts.info.id,\n          courseType: opts.info.courseType,\n          resourceId: obj.id,\n          superiorResourceId: obj.superiorResourceId || [obj.chapterId, obj.id],\n        }).then(res => {\n          window.open(res.fileUrl, '_blank')\n        })\n      } else {\n        materialPreview({\n          courseId: obj.courseId,\n          courseType: obj.periodType,\n          id: obj.id,\n          coursePreview: true,\n          periodId: obj.id\n        }).then(res => {\n          window.open(res.fileUrl, '_blank')\n        })\n      }\n    } else {\n      if (row.periodName && row.periodName.indexOf('.sb3') > -1) {\n        handleDown(row)\n      } else {\n        router.push({\n          path: '/course/combine',\n          query: Object.assign(query, param)\n        })\n      }\n    }\n\n  }\n}\nconst handleFocus = (row, key) => { // 悬浮\n  row[key] = !row[key]\n}\nconst handleBlur = (row, key) => { // 离开悬浮\n  row[key] = false\n}\n// 向右滚动\nconst nextScroll = () => {\n  scroll.value.scrollLeft += (327 * 3)\n  opts.scrollX = scroll.value.scrollLeft\n}\n// 向左滚动\nconst lastScroll = () => {\n  scroll.value.scrollLeft -= (327 * 3)\n  if (scroll.value.scrollLeft < 0) {\n    scroll.value.scrollLeft = 0\n  }\n  opts.scrollX = scroll.value.scrollLeft\n}\n// 滚动轴事件\nconst handleScrollX = () => {\n  if (scroll.value.scrollLeft < 0) {\n    scroll.value.scrollLeft = 0\n  }\n  opts.scrollX = scroll.value.scrollLeft\n}\nconst handleNoteRemove = () => { // 移除笔记\n  notePage.pageCurrent = 1\n  getNotes()\n}\nconst handleUpdateNote = () => {\n  notePage.pageCurrent = 1\n  getNotes()\n}\n\n\n// 获取详情\nconst getInfo = () => {\n  ctrl.loading = true\n  if (token.value) {\n    getAuthCourseView(map).then(res => {\n      ctrl.loading = false\n      opts.info = res\n      opts.info.courseIntro = opts.info.courseIntro.replace(/<a style=\"position: relative; width: 144px; height: 80px; margin:  10px; display: inline-block;/, '<a style=\"position: relative; width: 144px; height: auto; margin:  10px; display: inline-block;').replace(/<img/g, '<img style=\"width:100%\"')\n      if (opts.infoTimer) {\n        clearInterval(opts.infoTimer)\n        opts.infoTimer = null\n      }\n      nextTick(() => {\n        if (opts.info && opts.info.enableForbidContentCopy) {\n          forbidCopy('.detail_desc_content')\n        }\n      })\n    }).catch(() => {\n      ctrl.loading = false\n      opts.errorNum++\n      if (!opts.infoTimer) {\n        opts.infoTimer = setInterval(getInfo, 3000)\n      }\n      if (opts.errorNum > 5) {\n        if (opts.infoTimer) {\n          clearInterval(opts.infoTimer)\n          opts.infoTimer = null\n        }\n      }\n    })\n  } else {\n    getCourseView(map).then(res => {\n      ctrl.loading = false\n      opts.info = res\n      // route.meta.title = opts.info.courseName\n      opts.info.courseIntro = opts.info.courseIntro.replace(/<a style=\"position: relative; width: 144px; height: 80px; margin:  10px; display: inline-block;/, '<a style=\"position: relative; width: 144px; height: auto; margin:  10px; display: inline-block;').replace(/<img/g, '<img style=\"width:100%\"')\n      if (opts.infoTimer) {\n        clearInterval(opts.infoTimer)\n        opts.infoTimer = null\n      }\n      nextTick(() => {\n        if (opts.info && opts.info.enableForbidContentCopy) {\n          forbidCopy('.detail_desc_content')\n        }\n      })\n    }).catch(() => {\n      ctrl.loading = false\n    })\n  }\n}\n\n\nconst handleOpenOther = () => {\n  router.push({\n    path: '/course/list'\n  })\n}\nconst handleScroll = () => {\n  // 滚动到底翻页\n  if (map.tabs === \"notes\") {\n    if (notePage.totalPage > notePage.pageCurrent) {\n      notePage.pageCurrent++;\n      getNotes();\n    }\n  } else if (map.tabs === \"comments\") {\n    if (commentPage.totalPage > commentPage.pageCurrent) {\n      commentPage.pageCurrent++;\n      getComment();\n    }\n  }\n}\n// 显示描述\nconst handleChangeDesc = () => {\n  ctrl.showDesc = !ctrl.showDesc\n}\n// tabs切换\nconst handleChangeType = (item) => {\n  map.tabs = item\n  if (map.tabs === 'directory' && opts.subjectList.length === 0) {\n    getMenuList()\n  } else if (map.tabs === 'notes' && opts.noteList.length === 0) {\n    notePage.pageCurrent = 1\n    getNotes()\n  } else if (map.tabs === 'comments' && opts.commentList.length === 0) {\n    commentPage.pageCurrent = 1\n    getComment()\n  } else if (map.tabs === 'courseware' && opts.coursewareList.length === 0) {\n    getCourseware()\n  }\n}\nconst getMenuList = () => { // 专题课目录\n  if(token.value){\n    courseAuthSubjectMenuView({id: map.id}).then(res => {\n      opts.subjectList = res\n    })\n  }else {\n    courseSubjectMenuView({id: map.id}).then(res => {\n      opts.subjectList = res\n    })\n  }\n}\nconst getCourseware = () => { // 课件\n  if (token.value) {\n    ctrl.coursewareLoading = true\n    courseListCourseware({id: map.id, topicCourseId: map.topicCourseId}).then(res => {\n      ctrl.coursewareLoading = false\n      opts.coursewareList = res || []\n    }).catch(() => {\n      ctrl.coursewareLoading = false\n    })\n  } else {\n    courseApiListCourseware({id: map.id, topicCourseId: map.topicCourseId}).then(res => {\n      ctrl.coursewareLoading = false\n      opts.coursewareList = res || []\n    }).catch(() => {\n      ctrl.coursewareLoading = false\n    })\n  }\n}\n// 评论列表\nconst getComment = () => {\n  ctrl.comment = true\n  courseCommentPage({courseId: map.id, goodsType: 1}, commentPage.pageCurrent, commentPage.pageSize).then(res => {\n    ctrl.comment = false\n    if (res.list) {\n      res.list.forEach(el => {\n        el.commentShow = false\n        el.showChild = false\n        if (el.replyList) {\n          el.replyList.forEach(e => {\n            e.commentShow = false\n          })\n        }\n      })\n    }\n    if (commentPage.pageCurrent === 1) {\n      opts.commentList = res.list || []\n    } else {\n      res.list = res.list || []\n      res.list.forEach(el => {\n        opts.commentList.push(el)\n      })\n    }\n    commentPage.pageCurrent = res.pageCurrent\n    commentPage.totalPage = res.totalPage\n    commentPage.totalCount = res.totalCount\n  })\n}\nconst handleSelectEmoji = (emoji, obj) => {\n  if (!obj.commentText) {\n    obj.commentText = emoji + ''\n  } else {\n    if (obj.commentText.length + 2 <= 500) {\n      obj.commentText += emoji\n    }\n  }\n}\nconst handleSaveComment = (content, id, row) => { // 保存评论\n  if(content.length > 500) {\n    ElMessage.error('字数已超出限制！')\n    return\n  }\n  if (row) {\n    courseCommentReplySave({\n      commentContent: content,\n      goodsType: 1,\n      parentId: id\n    }).then(res => {\n      row.commentText = ''\n      ElMessage.success(res)\n      getComment()\n    })\n  } else {\n    courseCommentSave({\n      commentContent: content,\n      courseId: opts.info.id,\n      goodsType: 1\n    }).then(res => {\n      map.commentText = ''\n      ElMessage.success(res)\n      getComment()\n    })\n  }\n}\n// 笔记列表\nconst getNotes = () => {\n  ctrl.note = true\n  if (token.value) {\n    courseAuthNotesListData({courseId: map.id, oneStatus: map.oneStatus}, notePage.pageCurrent, notePage.pageSize).then(res => {\n      ctrl.note = false\n      if (notePage.pageCurrent === 1) {\n        opts.noteList = res.list || []\n      } else {\n        res.list = res.list || []\n        res.list.forEach(el => {\n          opts.noteList.push(el)\n        })\n      }\n      notePage.pageCurrent = res.pageCurrent\n      notePage.totalPage = res.totalPage\n      notePage.totalCount = res.totalCount\n    }).catch(() => {\n      ctrl.note = false\n    })\n  } else {\n    courseNotesListData({courseId: map.id}, notePage.pageCurrent, notePage.pageSize).then(res => {\n      ctrl.note = false\n      if (notePage.pageCurrent === 1) {\n        opts.noteList = res.list || []\n      } else {\n        res.list = res.list || []\n        res.list.forEach(el => {\n          opts.noteList.push(el)\n        })\n      }\n      notePage.pageCurrent = res.pageCurrent\n      notePage.totalPage = res.totalPage\n      notePage.totalCount = res.totalCount\n    }).catch(() => {\n      ctrl.note = false\n    })\n  }\n}\nconst handleScrollBody = () => {\n  // if(opts.info.buyStatus ===1){\n  //   return false\n  // }\n  const app = document.querySelector('#app')\n  let top = Math.floor(app.scrollTop || window.pageYOffset)\n  if (top >= head.value.clientHeight - 10) {\n    ctrl.fixed = true\n  } else {\n    ctrl.fixed = false\n  }\n}\nconst handleCollection = () => { // 收藏\n  if (ctrl.isClick) {\n    return false\n  }\n  ctrl.isClick = true\n  if (!token.value) {\n    const route = useRoute()\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath)\n      }\n    })\n    return\n  }\n  if (opts.info.collectStatus) {\n    collectionUserDelete({collectionType: 1, resourceId: opts.info.id}).then(res => {\n      ElMessage.success(res)\n      ctrl.isClick = false\n      getInfo()\n    }).catch(() => {\n      ctrl.isClick = false\n    })\n  } else {\n    collectionUserSave({collectionType: 1, resourceId: opts.info.id}).then(res => {\n      ElMessage.success(res)\n      ctrl.isClick = false\n      getInfo()\n    }).catch(() => {\n      ctrl.isClick = false\n    })\n  }\n\n}\nconst handleOpenCourse = (row) => { // 跳转大专题\n  router.push({\n    path: '/course/topic',\n    query: {\n      id: row.id\n    }\n  })\n}\nconst handleOpenTeacher = (teacher) => { // 教师详情\n  router.push({\n    path: '/teacher/view',\n    query: {\n      id: teacher.id\n    }\n  })\n}\n\n\nconst { data, pending} = await useAsyncData(\"subject\" +  route.query.id, async () => {\n  return new Promise(async (resolve) => {\n    if (route.query.id) {\n      map.id = route.query.id\n    }\n    if (route.query.topicId) {\n      map.topicCourseId = route.query.topicId\n    }\n\n    let fn = getCourseView\n    let menuFn = courseSubjectMenuView\n    if (token.value) {\n      fn = getAuthCourseView\n      menuFn = courseAuthSubjectMenuView\n    }\n    Promise.allSettled([fn(map),getEnumList(\"CourseTypeEnum\", \"obj\"),menuFn({id:map.id})]).then(([course, PeriodTypeEnum,menu ])=>{\n      let data = {};\n      if(course.status === 'fulfilled') {\n        data.course = course.value\n      } else {\n        data.course = {}\n      }\n      if(PeriodTypeEnum.status === 'fulfilled') {\n        data.PeriodTypeEnum = PeriodTypeEnum.value\n      } else {\n        data.PeriodTypeEnum = []\n      }\n      if(menu.status === 'fulfilled') {\n        data.menu = menu.value\n      } else {\n        data.menu = []\n      }\n      resolve(data)\n    }, (err) => {\n      console.log(err)\n    })\n  })\n}, {initialCache:false});\n\n\nif (data.value && !pending.value) {\n  const d = data.value\n  if(d.course.courseIntro) {\n    d.course.courseIntro = d.course.courseIntro.replace(/<a style=\"position: relative; width: 144px; height: 80px; margin:  10px; display: inline-block;/, '<a style=\"position: relative; width: 144px; height: auto; margin:  10px; display: inline-block;').replace(/<img/g, '<img style=\"width:100%\"')\n  }\n  opts.info = d.course\n  opts.PeriodTypeEnum = d.PeriodTypeEnum\n  opts.subjectList = d.menu\n  useHead({\n    title: computed(() => `${opts.info.courseName ? opts.info.courseName + '-' + cookieData.shopName : '专题课详情'}`),\n    meta: [{\n      hid: 'keywords',\n      name: 'keywords',\n      content: opts.info.courseName\n    },\n      {\n        hid: 'description',\n        name: 'description',\n        content: opts.info.courseDesc ? opts.info.courseDesc : opts.info.courseName\n      }]\n  })\n}\n\n\nonMounted(() => {\n  window.addEventListener('scroll', handleScrollBody, true)\n  if (opts.info && opts.info.enableForbidContentCopy) {\n    forbidCopy('.detail_desc_content')\n  }\n})\n\nonUnmounted(() => {\n  window.removeEventListener('scroll', handleScrollBody, true)\n  if (opts.infoTimer) {\n    clearInterval(opts.infoTimer)\n    opts.infoTimer = null\n  }\n})\n\n</script>\n\n<style lang=\"scss\" scoped>\n.have_scroll_x {\n  overflow-x: auto;\n  display: inline-flex;\n\n  &::-webkit-scrollbar {\n    display: none\n  }\n\n  &:hover::-webkit-scrollbar {\n    display: block\n  }\n}\n\n.course_info_content {\n  padding: 20px calc((100vw - 1200px) / 2);\n  background-color: #FFFFFF;\n  border-top: 1px solid #EBEEF5;\n}\n\n.nav_tabs_header {\n  background-color: #FFFFFF;\n  display: flex;\n  flex: 1;\n  padding-left: 60px;\n\n  .nav_tabs_item {\n    display: flex;\n    align-items: center;\n    margin-right: 50px;\n    font-size: 16px;\n    line-height: 65px;\n    white-space: nowrap;\n  }\n\n  .nav_tabs_item:hover {\n    cursor: pointer;\n    position: relative;\n    color: var(--el-color-primary);\n  }\n\n  .nav_tabs_item:hover::after {\n    content: \"\";\n    position: absolute;\n    left: 0;\n    bottom: 0;\n    width: 64px;\n    height: 3px;\n    border-radius: 1.5px;\n    background-color: var(--el-color-primary);\n  }\n\n  .active {\n    position: relative;\n    color: var(--el-color-primary);\n  }\n\n  .active::after {\n    content: \"\";\n    position: absolute;\n    left: 0;\n    bottom: 0;\n    width: 64px;\n    height: 3px;\n    border-radius: 1.5px;\n    background-color: var(--el-color-primary);\n  }\n}\n\n.nav_tabs {\n  padding: 20px calc((100vw - 1200px) / 2) 0;\n  background-color: #FFFFFF;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  .nav_tabs_item {\n    margin-right: 60px;\n    font-style: normal;\n    font-weight: normal;\n    font-size: 16px;\n    padding-bottom: 20px;\n    color: #333333;\n    position: relative;\n    cursor: pointer;\n  }\n\n  .nav_tabs_item.active, .nav_tabs_item:hover {\n    color: #2256F6;\n\n    &:before {\n      content: '';\n      position: absolute;\n      bottom: 0;\n      background: #2256F6;\n      width: 64px;\n      padding-top: 3px;\n      left: 0;\n      border-radius: 10px;\n    }\n  }\n\n  .nav_tabs_item:last-child {\n    margin-right: 0;\n  }\n}\n\n.course_nav {\n  margin-bottom: 20px;\n}\n\n.nav_course_title {\n  color: #BECADB;\n  font-weight: 400;\n  max-width: 115px;\n}\n\n.course_name_tag {\n  padding: 5px 3px;\n  border-radius: 5px 0;\n  background: rgba(61, 127, 255, 0.1);\n  display: inline-block;\n  font-style: normal;\n  width: 46px;\n  position: relative;\n  top: -2px;\n  text-align: center;\n  font-weight: normal;\n  font-size: 10px;\n  color: #3D7FFF;\n  margin-right: 4px;\n}\n\n.course_cover_img {\n  width: 576px;\n  height: 320px;\n  object-fit: cover;\n  border-radius: 5px;\n}\n\n.course_name {\n  font-style: normal;\n  font-weight: 400;\n  font-size: 20px;\n  color: #333333;\n}\n\n.course_price_content {\n  width: 100%;\n}\n\n.course_msg_content {\n  width: 589px;\n  margin-left: 30px;\n  position: relative;\n}\n\n.course_message {\n  display: flex;\n  position: relative;\n}\n\n.course_int {\n  margin-top: 5px;\n  display: flex;\n\n  .course_in_icon {\n    min-width: 28px;\n    margin-left: 8px;\n    color: #666666;\n    cursor: pointer;\n  }\n\n  .course_int_text {\n    font-style: normal;\n    font-weight: normal;\n    font-size: 14px;\n    color: #999999;\n    width: 570px;\n  }\n  .loadmore {\n    font-size: 14px;\n    color: #666;\n  }\n}\n\n.course_cell {\n  overflow: hidden;\n  width: 100%;\n  display: flex;\n  align-items: center;\n\n  & + .course_cell {\n    margin-top: 12px;\n  }\n\n  .course_cell_item {\n    white-space: nowrap;\n    font-style: normal;\n    font-weight: normal;\n    font-size: 14px;\n    color: #333333;\n    display: flex;\n    align-items: center;\n  }\n\n  .course_cell_item + .course_cell_item {\n    padding-left: 24px;\n    position: relative;\n  }\n}\n\n.mgl3 {\n  margin-left: 3px;\n}\n\n.price_old {\n  color: #999999;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 12px;\n  text-decoration-line: line-through;\n  margin-left: 5px;\n}\n\n.price_now {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 26px;\n  color: #F01414;\n}\n\n.price_now .price_icon {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 18px;\n  color: #F61818;\n}\n\n.course_btn_info {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: 5px;\n}\n\n.buy_btn {\n  width: 154px;\n  height: 40px;\n  font-size: 16px;\n}\n\n.course_learn_msg {\n  display: flex;\n  align-items: center;\n}\n\n.learn_item {\n  position: relative;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 14px;\n  color: #999999;\n\n  & + .learn_item {\n    padding-left: 20px;\n  }\n}\n\n.icon_text_name {\n  margin-left: 3px;\n}\n\n.icon_btn {\n  cursor: pointer;\n\n  .iconfont {\n    //margin-right: 5px;\n  }\n}\n\n.detail_tab_pane {\n  padding: 30px;\n  background-color: #FFFFFF;\n  border-radius: 5px;\n  width: 1200px;\n  margin: 10px auto auto;\n}\n\n.have_detail_list {\n  margin-bottom: 30px;\n}\n\n.have_detail_title {\n  font-style: normal;\n  font-weight: 550;\n  font-size: 16px;\n  color: #333333;\n  margin-bottom: 10px;\n}\n\n.have_scroll_view {\n  display: flex;\n  align-items: center;\n}\n\n.have_scroll_left {\n  margin-right: 10px;\n}\n\n.have_scroll_right {\n  margin-left: 10px;\n}\n\n.have_scroll_left, .have_scroll_right {\n  background: #F6F8FB;\n  border-radius: 5px;\n  padding: 27px 7px;\n  cursor: pointer;\n}\n\n.course_have_item {\n  cursor: pointer;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  padding: 10px;\n  width: 317px;\n  max-width: 317px;\n  min-width: 317px;\n  border-radius: 10px;\n  background-color: #F6F8FB;\n  position: relative;\n\n  .course_have_img {\n    width: 90px;\n    height: 50px;\n    border-radius: 10px;\n    object-fit: cover;\n  }\n\n  & + .course_have_item {\n    margin-left: 10px;\n  }\n\n  .course_have_msg {\n    margin-left: 10px;\n    width: calc(100% - 20px - 90px - 10px);\n  }\n\n  .course_item_courseware {\n    font-style: normal;\n    font-weight: 400;\n    font-size: 12px;\n    color: #999999;\n  }\n\n  .course_item_title {\n    width: 100%;\n    font-style: normal;\n    font-weight: normal;\n    font-size: 14px;\n    color: #333333;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    white-space: nowrap;\n  }\n\n  &:before {\n    content: '>';\n    position: absolute;\n    right: 13.5px;\n    color: #BECADB;\n\n  }\n}\n\n.slide-forward-leave-active {\n  transition: all 1s;\n  transform: translate(-100%);\n}\n\n// router2\n.v-enter {\n  transform: translateX(100%);\n}\n\n.v-enter-active {\n  transition: all 3s;\n}\n\n.single_item_title {\n  max-width: 550px;\n}\n\n.single_item_name .video_icon {\n  font-size: 24px;\n}\n\n.single_item_name {\n  display: flex;\n  align-items: center;\n}\n\n.down_menu_item {\n  display: flex;\n  padding: 20px;\n  justify-content: space-between;\n  align-items: center;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 14px;\n  color: #999999;\n  border-bottom: 1px solid #EBEEF5;\n\n  .down_item_name {\n    display: flex;\n    align-items: center;\n  }\n\n  .iconfont {\n    color: #333333;\n    font-size: 24px;\n  }\n}\n\n.single_menu_item {\n  display: flex;\n  padding: 20px;\n  flex-direction: column;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 14px;\n  color: #999999;\n  border-bottom: 1px solid #EBEEF5;\n  cursor: pointer;\n  .single_item_top{\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n  }\n  &:hover {\n    background: rgba(34, 86, 246, 0.05);\n  }\n\n  .tag_status.success {\n    color: #2256F6;\n  }\n\n  .tag_status.success .iconfont {\n    color: #2256F6;\n  }\n}\n\n.all_txt {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 16px;\n  color: #333333;\n  margin-bottom: 20px;\n}\n\n.note_pane {\n  padding-top: 20px;\n}\n\n.note_item {\n  display: flex;\n  padding-bottom: 20px;\n  border-bottom: 1px solid #EBEEF5;\n\n  & + .note_item {\n    padding-top: 20px;\n  }\n}\n\n.note_cover {\n  margin-right: 20px;\n}\n\n.note_info {\n  width: calc(100% - 68px);\n}\n.pic {\n  margin: 10px 0;\n  display: flex;\n  flex-wrap: wrap;\n  .el-image {\n    width: 144px;\n    height: 80px;\n    margin-right: 10px;\n    margin-bottom: 10px;\n  }\n}\n\n.flex_note_img {\n  display: flex;\n  flex-wrap: wrap;\n  width: 100%;\n}\n\n.note_bg_img {\n  width: 144px;\n}\n\n.note_info_header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n\n  .note_info_name {\n    font-style: normal;\n    font-weight: 550;\n    font-size: 16px;\n  }\n\n  .note_info_time {\n    font-style: normal;\n    font-weight: normal;\n    font-size: 14px;\n    color: #999999;\n  }\n}\n\n.loading_btn {\n  text-align: center;\n  padding-top: 11px;\n  padding-bottom: 11px;\n  margin-top: 20px;\n\n  .loading_text {\n    font-style: normal;\n    font-weight: normal;\n    font-size: 12px;\n    color: #999999;\n  }\n}\n\n.comment_add_box {\n  margin-bottom: 30px;\n  :deep(.el-textarea__inner){\n    padding: 10px 11px;\n  }\n}\n\n.comment_add_btn {\n  margin-top: 15px;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n\n  .iconfont {\n    font-size: 24px;\n    color: #BECADB;\n  }\n\n  .comment_btn {\n    width: 100px;\n    height: 40px;\n    font-size: 14px;\n  }\n}\n\n.limit_count_box {\n  background: var(--el-fill-color-blank);\n  bottom: 5px;\n  color: var(--el-color-info);\n  font-size: 12px;\n  line-height: 14px;\n  position: absolute;\n  right: 10px;\n}\n\n.course_comment_item {\n  display: flex;\n  padding-bottom: 20px;\n  border-bottom: 1px solid #EBEEF5;\n\n  &.hide {\n    display: none;\n  }\n\n  & + .course_comment_item {\n    padding-top: 20px;\n  }\n\n  .course_comment_cover {\n    margin-right: 20px;\n  }\n\n  .course_comment_content {\n    width: calc(100% - 68px);\n  }\n\n  .course_comment_btn {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n\n  }\n\n  .course_comment_btn.has {\n    padding-bottom: 20px;\n  }\n\n  .course_child_comment .course_comment_btn {\n    padding-bottom: 0;\n  }\n\n  .course_comment_time {\n    font-style: normal;\n    font-weight: normal;\n    font-size: 14px;\n    color: #999999;\n  }\n\n  .comment_btn_list {\n    display: flex;\n    align-items: center;\n    margin-top: 10px;\n  }\n\n  .btn_icons {\n    font-style: normal;\n    font-weight: normal;\n    font-size: 12px;\n    color: #999999;\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n  }\n\n  .btn_icons.active, .btn_icons.hover {\n    color: #FF9D00;\n  }\n\n  .btn_icons:hover {\n    color: #FF9D00;\n  }\n\n  .btn_icons + .btn_icons {\n    margin-left: 15px;\n  }\n\n  .btn_icons .iconfont {\n    font-size: 16px;\n    margin-right: 3px;\n  }\n\n  .course_comment_user {\n    font-style: normal;\n    font-weight: 550;\n    font-size: 16px;\n  }\n\n  .course_comment_int {\n    font-style: normal;\n    font-weight: normal;\n    font-size: 14px;\n    margin-top: 10px;\n    margin-bottom: 10px;\n    color: #999999;\n  }\n}\n\n.warning_color {\n  color: #FF9D00;\n}\n\n.course_child_comment {\n  padding: 20px;\n  background: #F6F8FB;\n  border-radius: 5px;\n  position: relative;\n\n  &:before {\n    content: '';\n    width: 15px;\n    height: 15px;\n    position: absolute;\n    top: -7.5px;\n    transform: rotate(45deg);\n    background: #F6F8FB;\n  }\n}\n\n.course_bottom {\n  margin-top: 29px;\n  width: 100%;\n}\n\n.fixed_header {\n  position: fixed;\n  top: 0;\n  height: 66px;\n  background-color: #FFFFFF;\n  width: 100%;\n  z-index: 10000;\n\n  .fixed_content {\n    width: 1200px;\n    height: 100%;\n    margin: auto;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n  }\n\n  .nav_logo {\n    width: 170px;\n    height: 36px;\n\n    img {\n      width: 170px;\n      height: 36px;\n      object-fit: cover;\n    }\n  }\n}\n\n.detail_content {\n  min-height: 100%;\n}\n\n.menu_have_num {\n  margin-bottom: 20px;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 16px;\n}\n\n.sub_menu_period {\n  display: flex;\n  flex-direction: column;\n\n  .sub_period_title {\n    font-style: normal;\n    font-weight: 550;\n    font-size: 16px;\n    padding-top: 20px;\n    padding-bottom: 20px;\n    border-bottom: 1px solid #EBEEF5;\n  }\n\n  .sub_period_item {\n    display: flex;\n    flex-direction: column;\n    padding: 18px 20px 18px 20px;\n    border-bottom: 1px solid #EBEEF5;\n    font-style: normal;\n    font-weight: normal;\n    font-size: 14px;\n    color: #999999;\n    cursor: pointer;\n    .single_item_top{\n      padding-left: 40px;\n      padding-right: 40px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n    }\n    &:hover {\n      background: rgba(34, 86, 246, 0.05);\n    }\n  }\n}\n.btn_course_class {\n  width: 100%;\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  margin-top: 5px;\n  position: relative;\n  z-index: 99;\n  padding-left: 40px;\n  padding-right: 40px;\n  .course_class_item {\n    color: #BECADB;\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n\n    &:hover {\n      color: #2256f6;\n    }\n  }\n\n  .course_class_item .iconfont {\n    font-size: 16px;\n  }\n\n  .course_class_item + .course_class_item {\n    margin-left: 20px;\n  }\n}\n.icon-audio {\n  color: #CB4EF7;\n  font-size: 24px;\n}\n\n.icon-img {\n  color: #0FB48C;\n  font-size: 24px;\n}\n\n.icon-live {\n  color: #FE2C55;\n  font-size: 24px;\n}\n\n.icon-video_class {\n  color: #3A5EF4;\n}\n\n.icon-icon_txt {\n  color: #FCCC5A;\n}\n\n.icon-excel {\n  color: #5ACC9B;\n}\n\n.icon-word {\n  color: #3CACFF;\n}\n\n.icon-ppt {\n  color: #FF6A4D;\n}\n\n.icon-pdf {\n  color: #F10707;\n}\n\n.course_cell_valid {\n  margin-top: 5px;\n  font-style: normal;\n  font-weight: 400;\n  font-size: 14px;\n\n  .course_tip {\n    letter-spacing: 0.32em;\n  }\n}\n\n.tag_success {\n  background: rgba(88, 184, 92, 0.1);\n  border-radius: 5px;\n  color: #58B85C;\n  padding: 4px 10px;\n  margin-left: 10px;\n}\n\n.cover_teacher {\n  width: 26px;\n  height: 26px;\n  border-radius: 50%;\n  cursor: pointer;\n\n  & + .cover_teacher {\n\n    transition: all 0.3s;\n    margin-left: 3px;\n  }\n\n  &.hover {\n    transform: scale(1.5);\n    // border: 1px solid #2256F6;\n    // box-shadow: 0px 5px 15px rgba(54, 41, 183, 0.06);\n  }\n}\n\n.course_cover {\n  position: relative;\n}\n\n.update_status {\n  position: absolute;\n  padding: 4px 9.5px;\n  border-radius: 5px;\n  color: #FFFFFF;\n  right: 10px;\n  top: 10px;\n\n  &.success {\n    background: #19CF8A;\n  }\n\n  &.danger {\n    background: #FF4844;\n  }\n}\n\n.course_price_info {\n  margin-top: 10px;\n  margin-bottom: 12px;\n  background: #F5F5F5;\n  padding: 13px 10px 17px;\n\n  .course_tip {\n    letter-spacing: 0.6em;\n  }\n}\n\n.course_tip {\n  font-style: normal;\n  font-weight: 400;\n  font-size: 14px;\n  color: #999999;\n}\n\n.teacher_warp_item {\n  display: flex;\n  align-items: center;\n  cursor: pointer;\n  margin-right: 10px;\n  height: 40px;\n  & + .teacher_warp_item {\n    margin-right: 10px;\n  }\n\n  .teacher_name {\n\n    margin-left: 4px;\n  }\n\n  &:hover .teacher_name {\n    color: #3D7FFF;\n  }\n}\n\n.flex_teacher {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  width: calc(100% - 70px);\n\n  .course_in_icon {\n    width: 29px;\n    cursor: pointer;\n  }\n\n  .course_cell_item.teacher_wrap {\n    padding-right: 10px;\n  }\n\n}\n\n.course_cell_item {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  word-break: break-all;\n  overflow: auto;\n}\n\n.course_cell_item.teacher_wrap {\n  display: flex;\n  align-items: center;\n  flex-wrap: nowrap;\n  text-overflow: clip;\n  overflow: hidden;\n}\n\n.valid_text {\n  font-weight: 400;\n  font-size: 14px;\n  color: #F01414;\n}\n</style>\n"],"names":["route","useRoute","data","componentInfo","__temp","__restore","_withAsyncContext","useAsyncData","async","ctx","getHearder","cookieData","cookie","getShop","getEnumList","getToken","useUserStore","shopData","computed","tabEnum","label","command","show","opts","info","coursewareExist","enableCourseNote","enableCourseComment","reactive","tipText","errorNum","examObj","lastLearn","subjectList","subNum","num","length","forEach","el","recourseNum","style","width","infoTimer","scrollX","PeriodTypeEnum","commentList","noteList","coursewareList","token","router","useRouter","store","head","ref","userInfo","userView","map","id","topicCourseId","tabs","commentText","relevanceType","recordId","notePage","pageCurrent","pageSize","totalPage","totalCount","commentPage","ctrl","showTip","loading","showDesc","comment","note","coursewareLoading","courseware","fixed","share","showStartPractice","showBeforeExam","showBeforeExercise","closeDialog","flag","setStore","push","path","query","controlShow","examType","handleOpenExercise","courseId","resourceId","subjectCourseId","periodId","courseTypeName","handleCloseExercise","handlePractice","row","value","buyStatus","price","ElMessage","error","handleBeforeValid","redirect","encodeURIComponent","fullPath","handleExam","supportAloneSales","paperCheckStatus","paperId","then","res","scoreRecordRule","chapterId","catch","e","handleOpenCourseware","courseListCourseware","courseApiListCourseware","handleCloseCourseware","handleShare","scroll","getScrollRight","courseViewDataList","scrollWidth","offsetWidth","scrollLeft","handleShowComment","showCommentChild","handleDown","enableNotLoginWatch","getDwnUrl","url","coursewareDownloadAuth","materialId","coursewareDownloadApi","link","document","createElement","href","download","materialName","click","courseStatus","handleMake","courseAuthAppointment","ElMessageBox","alert","confirmButtonText","type","center","getInfo","handleBuy","tryLearn","config","enabledPay","disablePayTips","enabledAliPay","enabledWxPay","text","setTimeout","publishStatus","obj","i","periodList","param","topicId","periodType","courseAuthGetResource","courseType","superiorResourceId","window","open","fileUrl","materialPreview","coursePreview","periodName","indexOf","Object","assign","handleOpenOther","handleFocus","key","handleBlur","nextScroll","lastScroll","handleScrollX","getAuthCourseView","courseIntro","replace","clearInterval","nextTick","enableForbidContentCopy","forbidCopy","setInterval","getCourseView","handleScroll","handleChangeType","item","getMenuList","getNotes","getComment","getCourseware","courseAuthSubjectMenuView","courseSubjectMenuView","courseCommentPage","goodsType","list","commentShow","showChild","replyList","handleSelectEmoji","emoji","handleSaveComment","content","courseCommentReplySave","commentContent","parentId","success","courseCommentSave","courseAuthNotesListData","oneStatus","courseNotesListData","handleScrollBody","app","querySelector","Math","floor","scrollTop","pageYOffset","clientHeight","handleCollection","isClick","collectStatus","collectionUserDelete","collectionType","collectionUserSave","handleOpenCourse","handleOpenTeacher","teacher","pending","Promise","resolve","fn","menuFn","allSettled","course","menu","status","err","initialCache","d","useHead","title","courseName","shopName","meta","hid","name","courseDesc","onMounted","addEventListener","onUnmounted","removeEventListener"],"mappings":"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"}