{"version":3,"file":"view.e2193b1e.mjs","sources":["../../../../components/PreviewRichText/index.vue","../../../../assets/images/apply_cert.png","../../../../pages/grade/view.vue"],"sourcesContent":["<template>\n  <el-dialog :title=\"title\" :model-value=\"visible\" :width=\"width\" :before-close=\"handleClose\" :append-to-body=\"true\">\n    <div class=\"dialog_content\" v-html=\"content\" @click=\"handleRichTextClick\"/>\n  </el-dialog>\n</template>\n<script setup>\nimport { watch,ref, toRefs } from \"vue\";\nimport bus from '@/utils/bus';\nconst props = defineProps({\n  modelValue: {\n    type: Boolean,\n    default: false,\n  },\n  title: {\n    type: String,\n    default: null,\n  },\n\n  content: {\n    type: String,\n    default: null,\n  },\n  width: {\n    type: [String, Number],\n    default: 800,\n  },\n});\nconst visible = ref(false)\nconst {modelValue } = toRefs(props)\nwatch(modelValue,(value)=>{\n  visible.value = value\n})\nconst emit = defineEmits(['update:modelValue'])\nconst handleRichTextClick = (e)=>{\n  if (e && e.path) {\n      if(e.path[2] && e.path[2].dataset && e.path[2].dataset.id) {\n        const resourceId = e.path[2].dataset.id\n        bus.emit('preview-resource',resourceId)\n      } else if(e.path[1] && e.path[1].dataset && e.path[1].dataset.id) {\n        const resourceId =  e.path[1].dataset.id\n        bus.emit('preview-resource',resourceId)\n      }\n    }\n}\nfunction handleClose() {\n  visible.value = false\n  emit('update:modelValue',false);\n}\n</script>\n<style lang=\"scss\" scoped>\n.dialog_content{\n  min-height: 500px;\n}\n</style>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMoSURBVHgB3VXPaxNBFH5vNqkWUSKCFFRYvIo0HnoS++MgjXqosejRetGr1X+g7R8gKN68tDcVhOZW8KAtWKRWaYt6rE0rCiJotMW22Zl5vvmR3aSbVDzqwGaHmXnf973vvdkA/OsDd9ukheIQKTUKpMoIclFpmgFVhQB1J6/3AukcgirhmVdjf01ALwshZbMrRApQK17wj5ZA9p2s6Sjqy559N90MR7QkyASTHMngEQuNwMyJ1ds1igj8mtkPhBxvhdOUgOYLIxycN2r5XQMjIKOe11QUEzE5PzJUT4+P/9GiaL7QGxCNsNQe0BpN+hzMh7SxhtgaNNYgSSbTSNYmWW9XmQWMZS58nUgR0Hz/gNZU4igLagIMEMuzREkdeE0r9CSuJiyGm4CsIKVQkBrGgZ/3GizSUhfRWRI/TIR2rqLEKiURjS38JhVhfMaclxGLsbZdTNeAtr9TDG4yMICJ36CrnpTfezpQdL8AUfgIeLCLXNGZGPjNpGxZJUVAsrrkOoWLxwdROWUYtHtgt2dIMf8AoP2oCzxccJkosy9tjdjX6RRBoGA6bsFalxzqAeyeA3H6mVVt107eAThwwgX9WgNYvk9J1lwTZIeIlmq4mbiDYCsXaHK++wuEezrcJqsVXY+BvkwBHrniwVeBZvuJNlbQALM/LJxM3/CgXCoDoat5l0FdoT89Ilh/70mOAYY3vJoK0NxlovUPFtxaTKYjmYZnzJBPETBwD8S3VroW3f6G+vUQwOYa1A96cx2gsmBmDrphoGHpTBGY/m1oUdsNPN9YBj173lpix9vbRJ9LXrED9L8JEUIumdYIpsJQQ/ScUwjRXyZzqdDeZu1ucHY/UfQj9YF0/lvzeaIrSqi+tiIsNlp0rlwWoPrYngmwl8fa5DPjuvDnwoDXK63N42yQSlWhTtXAGzKoH3Jy3zVGHWf17lMBHia2xMxxZ+xYMChHU9lBiyGfZCeEoKuJ19DUFg9SEoOy2Oxcy/+DIIiGGWHV2UC0s1sSW6CyLeStVji7/mVuPoSwrS1z06hgs2aiILu4F7YqUmbyQsAAh+cERnfxEizBfzt+A8B5Zvx0WprdAAAAAElFTkSuQmCC\"","<template>\n  <NuxtLayout>\n    <div v-if=\"show\" :class=\"{ 'show-content': isShowContent }\">\n      <div class=\"grade_cover_bg\">\n        <img class=\"cover_bg\" :src=\"map.info.coverUrl\" alt=\"\" />\n      </div>\n      <div class=\"grade_detail_main w\">\n        <div ref=\"head\">\n          <div class=\"navigation\">\n            <el-breadcrumb :separator-icon=\"ArrowRight\">\n              <el-breadcrumb-item :to=\"{ path: '/' }\">首页</el-breadcrumb-item>\n              <el-breadcrumb-item :to=\"{ path: '/grade/list' }\">班级中心</el-breadcrumb-item>\n              <el-breadcrumb-item>\n                <div class=\"now_title\">{{ map.info.classroomName }}</div>\n              </el-breadcrumb-item>\n            </el-breadcrumb>\n            <div class=\"learn_wrap\">\n              <span class=\"learn_item icon_btn\" @click=\"handleCollection\">\n                <span :class=\"{ 'icon-collection': !map.info.collectStatus, 'icon-collections': map.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 class=\"course_message\">\n            <div class=\"course_cover\">\n              <img :src=\"map.info.coverUrl\" class=\"course_cover_img\" />\n            </div>\n            <div class=\"course_msg_content\">\n              <div class=\"course_price_content\">\n                <div class=\"course_name\">\n                  <span>{{ map.info.classroomName }}</span>\n                </div>\n              </div>\n              <div class=\"course_cell\" v-if=\"map.info.classroomDesc\">\n                <div v-if=\"map.info.classroomDesc.length < 36\" class=\"course_int_text tx-ov\">班级描述：{{ map.info.classroomDesc }}</div>\n                <client-only v-else>\n                  <el-popover :width=\"864\" placement=\"bottom\" :offset=\"-20\" :show-arrow=\"false\" trigger=\"hover\">\n                    <span style=\"line-height: 1.6; font-size: 14px; color: #999\">班级描述：{{ map.info.classroomDesc }}</span>\n                    <template #reference>\n                      <div class=\"course_int_text tx-ov\">班级描述：{{ map.info.classroomDesc }}</div>\n                    </template>\n                  </el-popover>\n                </client-only>\n              </div>\n              <div class=\"course_cell course_cell_valid\">\n                <span class=\"course_tip\">有效期限：</span>\n                <template v-if=\"map.info.buyStatus === 3\">\n                  <span class=\"valid_text\">已过期</span>\n                </template>\n                <template v-else>\n                  <span v-if=\"map.info.validityType === 1\">永久有效</span>\n                  <span v-else-if=\"map.info.validityType === 2\"\n                    >{{ map.info.beginTime }} 至\n                    {{ map.info.endTime }}\n                  </span>\n                  <span v-else-if=\"map.info.validityType === 3 && map.info.buyStatus !== 2\"> {{ map.info.days }}天 </span>\n                  <span v-else-if=\"map.info.validityType === 3 && map.info.buyStatus === 2\"> 至{{ map.info.endTime }} </span>\n                </template>\n              </div>\n\n              <div v-if=\"map.info.teacherList && map.info.teacherList.length\" 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 map.info.teacherList\" :key=\"i\" class=\"teacher_warp_item\" @click=\"handleOpenTeacher(teacher)\">\n                      <img :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=\"map.info.teacherList.length > 7\"\n                      :content=\"map.info.courseDesc\"\n                      :width=\"864\"\n                      placement=\"bottom-end\"\n                      :offset=\"5\"\n                      :show-arrow=\"false\"\n                      trigger=\"hover\"\n                    >\n                      <div class=\"course_cell_item\">\n                        <div class=\"teacher_warp_item\">授课教师：</div>\n                        <div class=\"course_cell_item_content\">\n                          <div v-for=\"(teacher, i) in map.info.teacherList\" class=\"teacher_warp_item\" :key=\"i\" @click=\"handleOpenTeacher(teacher)\">\n                            <img :src=\"teacher.headImg\" :title=\"teacher.nickname\" class=\"mgl3 cover_teacher\" />\n                            <div class=\"teacher_name\">{{ teacher.nickname }}</div>\n                          </div>\n                        </div>\n                      </div>\n                      <template #reference>\n                        <div class=\"course_in_icon\" @click=\"handleChangeTeach\">更多</div>\n                      </template>\n                    </el-popover>\n                  </client-only>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"buy_message\">\n            <div class=\"buy_data\">\n              <template v-if=\"map.info.buyStatus === 2\">\n                <div class=\"buy_data_item\">\n                  <span class=\"count_data\">{{ map.info.courseCompleteRate }}</span\n                  ><span class=\"unit\">%</span>\n                  <div class=\"label\">课程完成率</div>\n                </div>\n                <div class=\"buy_data_item\">\n                  <span class=\"count_data\">{{ map.info.taskCompleteRate }}</span\n                  ><span class=\"unit\">%</span>\n                  <div class=\"label\">作业完成率</div>\n                </div>\n                <div class=\"buy_data_item\">\n                  <span class=\"count_data\">{{ map.info.examCompleteRate }}</span\n                  ><span class=\"unit\">%</span>\n                  <div class=\"label\">考试完成率</div>\n                </div>\n                <div class=\"buy_data_item\">\n                  <span class=\"count_data\">{{ formatSecond(map.info.studyDuration)[0] }}</span\n                  ><span class=\"unit\">{{ formatSecond(map.info.studyDuration)[1] }}</span>\n                  <div class=\"label\">学习时长</div>\n                </div>\n              </template>\n              <template v-else>\n                <div class=\"buy_data_item\" v-if=\"shopData && shopData.config.showLearnUserCount && shopData.config.showClassroomLearnUserCount\">\n                  <span class=\"count_data\">{{ map.info.studentCount }}</span\n                  ><span class=\"unit\">人</span>\n                  <div class=\"label\">学习人数</div>\n                </div>\n                <div class=\"buy_data_item\">\n                  <span class=\"count_data\">{{ durationFilter(map.info.courseDuration).val }}</span\n                  ><span class=\"unit\">{{ durationFilter(map.info.courseDuration).unit }}</span>\n                  <div class=\"label\">课程时长</div>\n                </div>\n                <div class=\"buy_data_item\">\n                  <span class=\"count_data\">{{ map.info.courseCount }}</span\n                  ><span class=\"unit\">个</span>\n                  <div class=\"label\">课程数</div>\n                </div>\n              </template>\n            </div>\n            <div class=\"buy_btn_wrap\">\n              <div v-if=\"map.info.certIssue === 1\" class=\"cert_apply mgr30 flex flex-middle pointer\" @click=\"handleOpenApplyCertModel\">\n                <img class=\"mgr6\" src=\"@/assets/images/apply_cert.png\" />\n                申请认证证书\n              </div>\n              <div class=\"price_box\">\n                <div :style=\"{ color: '#F01414' }\" class=\"price_now\">\n                  <span v-if=\"map.info.price > 0\" class=\"price_icon\">￥</span>\n                  {{ map.info.price ? map.info.price.toFixed(2) : '免费' }}\n                </div>\n                <div v-if=\"map.info.linePrice > 0\" class=\"price_old\">\n                  <span class=\"price_icon\">￥</span>\n                  {{ map.info.linePrice.toFixed(2) }}\n                </div>\n              </div>\n              <div class=\"buy_box\">\n                <el-button v-if=\"validityStatus === 1\" class=\"buy_btn\" type=\"primary\" disabled> 未开班 </el-button>\n                <template v-if=\"validityStatus === 2\">\n                  <template v-if=\"!map.info.reachUserLimit || map.info.classroomStudent\">\n                    <template v-if=\"!map.info.classroomStudent || map.info.buyStatus === 1\">\n                      <el-button v-if=\"!map.info.price\" class=\"buy_btn\" type=\"primary\" @click=\"handleJoinGrade\">加入班级 </el-button>\n                      <el-button v-if=\"map.info.price\" class=\"buy_btn\" type=\"primary\" @click=\"handleBuy('learn')\">立即购买 </el-button>\n                    </template>\n                    <el-button v-if=\"map.info.buyStatus === 2 && classroomStatus === 1\" class=\"buy_btn\" type=\"primary\" @click=\"handleBuy('learn')\">\n                      {{ map.info.studyDuration > 0 ? '继续学习' : '开始学习' }}\n                    </el-button>\n                  </template>\n                  <template v-else>\n                    <el-button class=\"buy_btn\" type=\"primary\" disabled>已满员</el-button>\n                  </template>\n                </template>\n                <el-button v-if=\"validityStatus === 3\" class=\"buy_btn\" type=\"primary\" disabled> 已过期 </el-button>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"nav_tabs\">\n          <template v-for=\"item in tabEnum\">\n            <a\n              v-if=\"item.show\"\n              :href=\"'#' + item.command\"\n              :key=\"item.command\"\n              :class=\"{ active: map.tabs === item.command }\"\n              class=\"nav_tabs_item\"\n              @click=\"handleChangeType(item.command)\"\n            >\n              {{ item.label }}\n            </a>\n          </template>\n        </div>\n        <div id=\"details\" class=\"placeholder\"></div>\n        <div class=\"introduce\" v-html=\"map.info.classroomIntro\"></div>\n        <div id=\"course\" class=\"placeholder\"></div>\n        <div class=\"course\" v-loading=\"loading\">\n          <div class=\"block_title\">全部课程（{{ courseModel.page.totalCount }}个）</div>\n          <ul class=\"course_list_wrap\">\n            <li\n              class=\"course_item\"\n              :class=\"{ active: item.isHover }\"\n              v-for=\"(item, index) in courseModel.list\"\n              @mouseover=\"item.isHover = true\"\n              @mouseout=\"item.isHover = false\"\n            >\n              <div class=\"course_info\">\n                <span class=\"course_type\" :class=\"{ finish_progress: !item.isHover && item.progress === 100 }\">{{\n                  courseModel.courseTypeEnum[item.courseType]\n                }}</span\n                ><span class=\"course_name\">{{ item.courseName }}</span>\n              </div>\n              <div class=\"course_handle\">\n                <span class=\"course_duration\" v-show=\"!item.isHover\">{{ formatDuring(item.duration * 1000) }}</span\n                ><el-button class=\"learn_btn\" type=\"primary\" v-show=\"item.isHover\" round @click=\"handleBuy(item)\">\n                  <template v-if=\"item.progress === 0\"> 开始学习 </template>\n                  <template v-else-if=\"item.progress === 100\"> 再次学习 </template>\n                  <template v-else> 继续学习 </template>\n                </el-button>\n              </div>\n            </li>\n          </ul>\n          <div class=\"pagination\" v-if=\"courseModel.page.totalPage > 1\">\n            <el-pagination\n              background\n              layout=\"total, prev, pager, next, jumper\"\n              :total=\"courseModel.page.totalCount\"\n              v-model:currentPage=\"courseModel.page.pageCurrent\"\n              v-model:pageSize=\"courseModel.page.pageSize\"\n              @current-change=\"handleCourseCurrentChange\"\n            >\n            </el-pagination>\n          </div>\n        </div>\n        <div id=\"homework\" class=\"placeholder\"></div>\n        <div class=\"exam\">\n          <div class=\"flex flex-between\">\n            <div class=\"block_title\">全部作业（{{ homeworkModel.page.totalCount }}个）</div>\n            <el-input\n              size=\"default\"\n              class=\"w210\"\n              v-model=\"homeworkModel.seekForm.taskName\"\n              @input=\"handleSearchHomework\"\n              placeholder=\"根据作业名称搜索\"\n              clearable\n            >\n              <template #prefix>\n                <el-icon class=\"el-input__icon\">\n                  <search />\n                </el-icon>\n              </template>\n            </el-input>\n          </div>\n          <ul class=\"exam_list_wrap\">\n            <li class=\"exam_item\" v-for=\"(item, index) in homeworkModel.list\">\n              <div class=\"exam_info\">\n                <div class=\"exam_name\">【{{ homeworkModel.classroomTaskTypeEnum[item.taskType] }}】{{ item.taskName }}</div>\n                <div class=\"exam_timerange\">\n                  作业期限：\n                  <span v-if=\"item.validityType === 1\">永久有效</span>\n                  <span v-else-if=\"item.validityType === 2\"\n                    >{{ item.beginTime }} 至\n                    {{ item.endTime }}\n                  </span>\n                  <span v-else-if=\"item.validityType === 3 && item.buyStatus !== 2\"> {{ item.days }}天 </span>\n                  <span v-else-if=\"item.validityType === 3 && item.buyStatus === 2\"> 至{{ item.endTime }} </span>\n                </div>\n              </div>\n              <div class=\"course_handle\">\n                <el-button type=\"primary\" round @click=\"handleStartHomework(item)\">{{\n                  ['', '开始作业', '修改作业', '批改中', '查看点评', '查看作业'][item.taskStatus]\n                }}</el-button>\n              </div>\n              <div class=\"exam_status\" :class=\"['', 'danger', 'warning', 'primary', 'success', 'info'][item.taskStatus]\">\n                {{ homeworkModel.frontClassroomTaskStatusEnum[item.taskStatus] }}\n              </div>\n            </li>\n          </ul>\n          <div class=\"pagination\" v-if=\"examModel.page.totalPage > 1\">\n            <el-pagination\n              background\n              layout=\"total, prev, pager, next, jumper\"\n              :total=\"examModel.page.totalCount\"\n              v-model:currentPage=\"examModel.page.pageCurrent\"\n              v-model:pageSize=\"examModel.page.pageSize\"\n              @current-change=\"handleHomeworkCurrentChange\"\n            >\n            </el-pagination>\n          </div>\n        </div>\n        <div id=\"exam\" class=\"placeholder\"></div>\n        <div class=\"exam\">\n          <div class=\"flex flex-between\">\n            <div class=\"block_title\">全部考试（{{ examModel.page.totalCount }}个）</div>\n            <el-input\n              size=\"default\"\n              class=\"w210\"\n              v-model=\"examModel.seekForm.examName\"\n              placeholder=\"根据考试名称搜索\"\n              @input=\"handleSearchExam\"\n              clearable\n            >\n              <template #prefix>\n                <el-icon class=\"el-input__icon\">\n                  <search />\n                </el-icon>\n              </template>\n            </el-input>\n          </div>\n          <ul class=\"exam_list_wrap\">\n            <li class=\"exam_item\" v-for=\"(item, index) in examModel.list\">\n              <div class=\"exam_info\">\n                <div class=\"exam_name\">{{ item.examName }}</div>\n                <div class=\"exam_timerange\">\n                  考试期限：\n                  <span v-if=\"item.validityType === 1\">永久有效</span>\n                  <span v-else-if=\"item.validityType === 2\"\n                    >{{ item.beginTime }} 至\n                    {{ item.endTime }}\n                  </span>\n                  <span v-else-if=\"item.validityType === 3 && item.buyStatus !== 2\"> {{ item.days }}天 </span>\n                  <span v-else-if=\"item.validityType === 3 && item.buyStatus === 2\"> 至{{ item.endTime }} </span>\n                </div>\n              </div>\n              <div class=\"course_handle\">\n                <el-button type=\"text\" @click=\"handleOpenBeforeExamModel(item, 2)\">考试记录</el-button>\n                <el-button type=\"primary\" round @click=\"handleOpenBeforeExamModel(item, 1)\">前往考试</el-button>\n              </div>\n              <div class=\"exam_status\" :class=\"['', 'danger', 'warning', 'success', 'info'][item.examStatus]\">\n                {{ examModel.examStatusEnum[item.examStatus] }}\n              </div>\n            </li>\n          </ul>\n          <div class=\"pagination\" v-if=\"examModel.page.totalPage > 1\">\n            <el-pagination\n              background\n              layout=\"total, prev, pager, next, jumper\"\n              :total=\"examModel.page.totalCount\"\n              v-model:currentPage=\"examModel.page.pageCurrent\"\n              v-model:pageSize=\"examModel.page.pageSize\"\n              @current-change=\"handleExamCurrentChange\"\n            >\n            </el-pagination>\n          </div>\n        </div>\n        <div id=\"notice\" class=\"placeholder\"></div>\n        <div class=\"notice\">\n          <div class=\"block_title\">全部公告（{{ noticeModel.page.totalCount }}个）</div>\n          <ul class=\"notice_list_wrap\">\n            <li class=\"notice_item flex flex-between flex-middle\" v-for=\"(item, index) in noticeModel.list\" @click=\"handleViewNoticeContent(item)\">\n              <div class=\"notice_info\">\n                <span class=\"notice_name\">{{ item.title }}</span>\n              </div>\n              <div class=\"notice_handle\">\n                <span class=\"notice_duration\">{{ item.gmtCreate }}</span>\n              </div>\n            </li>\n          </ul>\n          <div class=\"pagination\" v-if=\"noticeModel.page.totalPage > 1\">\n            <el-pagination\n              background\n              layout=\"total, prev, pager, next, jumper\"\n              :total=\"noticeModel.page.totalCount\"\n              v-model:currentPage=\"noticeModel.page.pageCurrent\"\n              v-model:pageSize=\"noticeModel.page.pageSize\"\n              @current-change=\"handleNoticeCurrentChange\"\n            >\n            </el-pagination>\n          </div>\n        </div>\n        <div id=\"comment\" class=\"placeholder\"></div>\n        <div class=\"comment\" v-if=\"map.info.enableComment\">\n          <div v-if=\"token && map.info.buyStatus === 2\" class=\"comment_add_box mgb20 relative\">\n            <div class=\"relative\">\n              <el-input\n                v-model=\"map.commentText\"\n                type=\"textarea\"\n                :rows=\"3\"\n                maxlength=\"500\"\n                show-word-limit\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\n                :disabled=\"map.commentText === 0 || commentLoading\"\n                class=\"comment_btn\"\n                type=\"primary\"\n                @click=\"handleSaveComment(map.commentText)\"\n                >评论\n              </el-button>\n            </div>\n          </div>\n          <div class=\"block_title all_txt\">全部评论&nbsp;{{ commentModel.page.totalCount }}</div>\n          <div class=\"course_comment_list\">\n            <div v-for=\"(comment, x) in commentModel.list\" :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\n                  v-if=\"comment.commentContent && comment.commentContent.length > 137\"\n                  type=\"text\"\n                  @click=\"comment.showContent = !comment.showContent\"\n                  >{{ comment.showContent ? '收起' : '展开' }}\n                </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\"-->\n                    <!--                       @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\n                      v-if=\"userInfo && userInfo.id !== comment.userId && map.info.buyStatus === 2\"\n                      :class=\"{ hover: comment.add }\"\n                      class=\"btn_icons\"\n                      @click=\"handleShowComment(comment)\"\n                      @mouseleave=\"handleBlur(comment, 'add')\"\n                      @mouseover=\"handleFocus(comment, 'add')\"\n                    >\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\"-->\n                    <!--                       @mouseleave=\"handleBlur(comment,'love')\" @mouseover=\"handleFocus(comment,'love')\">-->\n                    <!--                    <span :class=\"{'icon-like':(!comment.love&&!comment.like),'icon-like1':comment.love||comment.like}\"-->\n                    <!--                          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 mgb20\">\n                  <div class=\"relative\">\n                    <el-input\n                      v-model=\"comment.commentText\"\n                      type=\"textarea\"\n                      :rows=\"2\"\n                      maxlength=\"500\"\n                      show-word-limit\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\n                      :disabled=\"comment.commentContent && (comment.commentText.length === 0 || commentLoading)\"\n                      class=\"comment_btn\"\n                      type=\"primary\"\n                      @click=\"handleSaveComment(comment.commentText, comment.id, comment)\"\n                      >评论\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\">\n                        回复 <span class=\"both\">{{ child.replyUserName }}</span> : {{ child.commentContent }}\n                      </div>\n                      <el-button\n                        v-if=\"child.commentContent && child.commentContent.length > 137\"\n                        type=\"text\"\n                        @click=\"child.showContent = !child.showContent\"\n                        >{{ child.showContent ? '收起' : '展开' }}\n                      </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\"-->\n                          <!--                             @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\n                            v-if=\"userInfo && userInfo.id !== child.userId && map.info.buyStatus === 2\"\n                            :class=\"{ hover: child.add }\"\n                            class=\"btn_icons\"\n                            @click=\"handleShowComment(child)\"\n                            @mouseleave=\"handleBlur(child, 'add')\"\n                            @mouseover=\"handleFocus(child, 'add')\"\n                          >\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\"-->\n                          <!--                             @mouseleave=\"handleBlur(child,'love')\" @mouseover=\"handleFocus(child,'love')\">-->\n                          <!--                          <span :class=\"{'icon-like':(!child.love&&!child.like),'icon-like1':child.love||child.like}\"-->\n                          <!--                                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 mgb20\">\n                        <div class=\"relative\">\n                          <el-input\n                            v-model=\"child.commentText\"\n                            type=\"textarea\"\n                            :rows=\"2\"\n                            maxlength=\"500\"\n                            show-word-limit\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\n                            :disabled=\"child.commentContent && (child.commentText.length === 0 || commentLoading)\"\n                            class=\"comment_btn\"\n                            type=\"primary\"\n                            @click=\"handleSaveComment(child.commentText, child.id, child)\"\n                            >评论\n                          </el-button>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <el-button\n                    v-if=\"comment.replyList && comment.replyList.length > 2\"\n                    class=\"mgt20\"\n                    type=\"text\"\n                    @click=\"comment.showAllReply = !comment.showAllReply\"\n                  >\n                    {{ comment.showAllReply ? '收起' : `查看全部${comment.replyList.length}条评论 >` }}\n                  </el-button>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"pagination\" v-if=\"commentModel.page.totalPage > 1\">\n            <el-pagination\n              background\n              layout=\"total, prev, pager, next, jumper\"\n              :total=\"commentModel.page.totalCount\"\n              v-model:currentPage=\"commentModel.page.pageCurrent\"\n              v-model:pageSize=\"commentModel.page.pageSize\"\n              @current-change=\"handleCommentCurrentChange\"\n            >\n            </el-pagination>\n          </div>\n        </div>\n      </div>\n      <div v-if=\"ctrl.fixed\" class=\"fixed_header\">\n        <div class=\"fixed_content\">\n          <div class=\"nav_tabs_header\">\n            <template v-for=\"item in tabEnum\">\n              <a\n                v-if=\"item.show\"\n                :href=\"'#' + item.command\"\n                :key=\"item.command\"\n                :class=\"{ active: map.tabs === item.command }\"\n                class=\"nav_tabs_item\"\n                @click=\"handleChangeType(item.command)\"\n              >\n                {{ item.label }}\n              </a>\n            </template>\n          </div>\n          <div class=\"buy_box\">\n            <el-button v-if=\"validityStatus === 1\" class=\"buy_btn\" type=\"primary\" disabled> 未开班 </el-button>\n            <template v-if=\"validityStatus === 2\">\n              <template v-if=\"!map.info.reachUserLimit || map.info.classroomStudent\">\n                <template v-if=\"!map.info.classroomStudent || map.info.buyStatus === 1\">\n                  <el-button v-if=\"!map.info.price\" class=\"buy_btn\" type=\"primary\" @click=\"handleJoinGrade\">加入班级 </el-button>\n                  <el-button v-if=\"map.info.price\" class=\"buy_btn\" type=\"primary\" @click=\"handleBuy('learn')\">立即购买 </el-button>\n                </template>\n                <el-button v-if=\"map.info.buyStatus === 2 && classroomStatus === 1\" class=\"buy_btn\" type=\"primary\" @click=\"handleBuy('learn')\">\n                  {{ map.info.studyDuration > 0 ? '继续学习' : '开始学习' }}\n                </el-button>\n              </template>\n              <template v-else>\n                <el-button class=\"buy_btn\" type=\"primary\" disabled>已满员</el-button>\n              </template>\n            </template>\n            <el-button v-if=\"validityStatus === 3\" class=\"buy_btn\" type=\"primary\" disabled> 已过期 </el-button>\n          </div>\n        </div>\n      </div>\n      <div v-if=\"ctrl.showTip\" class=\"tip_bg_visible\">\n        <span class=\"tip_bg_visible\"\n          ><el-icon><warning-filled /></el-icon\n        ></span>\n        <div class=\"tip_visible_text\">{{ map.tipText }}</div>\n      </div>\n      <client-only>\n        <before-exam\n          v-if=\"beforeExamModel.visible\"\n          :dialogVisible=\"beforeExamModel.visible\"\n          :exam-name=\"beforeExamModel.examName\"\n          :paper-id=\"beforeExamModel.paperId\"\n          :resource-id=\"beforeExamModel.resourceId\"\n          :resource-type=\"2\"\n          :exam-type=\"3\"\n          :tab-type=\"beforeExamModel.tabType\"\n          :biz-type=\"beforeExamModel.bizType\"\n          @close=\"closeBeforeExamModel\"\n        ></before-exam>\n        <preview-rich-text v-model=\"richTextModel.visible\" :content=\"richTextModel.content\" :title=\"richTextModel.title\" />\n        <el-dialog v-model=\"applyCertModel.visible\" :width=\"466\" center :append-to-body=\"true\">\n          <div class=\"apply_cert_title\">{{ applyCertModel.info.title }}</div>\n          <div class=\"apply_cert_time\"><span class=\"label\">申请时间：</span>{{ applyCertModel.info.applyTime }}</div>\n          <template v-if=\"validityStatus === 1\">\n            <div class=\"apply_cert_row\">\n              <img :src=\"teacherImg\" alt=\"\" />\n              <div class=\"apply_cert_content\">班级暂未开课，可先了解班级规章。老师开发证书申请后，若达到证书要求，即可获得班级认证证书。</div>\n            </div>\n            <div class=\"apply_cert_row\">\n              <img :src=\"teacherImg\" alt=\"\" />\n              <div class=\"apply_cert_content\">申请条件：{{ applyCertModel.info.applyCondition }}</div>\n            </div>\n          </template>\n          <template v-if=\"validityStatus === 2\">\n            <div class=\"apply_cert_row\">\n              <img :src=\"teacherImg\" alt=\"\" />\n              <div class=\"apply_cert_content\">申请条件：{{ applyCertModel.info.applyCondition }}</div>\n            </div>\n            <div class=\"apply_cert_row\">\n              <img :src=\"teacherImg\" alt=\"\" />\n              <div class=\"apply_cert_content\">审核结果将会在【个人中心】-【消息通知】通知您。审核过程中请勿重复提交申请。</div>\n            </div>\n          </template>\n          <template v-if=\"validityStatus === 3\">\n            <div class=\"apply_cert_row\">\n              <img :src=\"teacherImg\" alt=\"\" />\n              <div class=\"apply_cert_content\">证书申请已经结束。感谢一路以来的辛苦付出，你的努力一定不会白费。</div>\n            </div>\n          </template>\n          <template #footer>\n            <span class=\"dialog-footer\">\n              <el-button type=\"primary\" size=\"default\" round v-if=\"validityStatus === 1 || validityStatus === 3\" @click=\"applyCertModel.visible = false\"\n                >知道了</el-button\n              >\n              <el-button type=\"primary\" size=\"default\" round v-if=\"validityStatus === 2\" @click=\"handleApplyCert\">确认申请</el-button>\n            </span>\n          </template>\n        </el-dialog>\n        <grade-share :info=\"gradeShareModel.info\" v-model=\"gradeShareModel.visible\"></grade-share>\n      </client-only>\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 cookie from '@/utils/cookies'\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { useUserStore } from '@/stores/user'\nimport {\n  gradeView,\n  gradeCourseView,\n  gradeExamView,\n  gradeNoticeView,\n  gradeNoticeDetail,\n  gradeCommentView,\n  gradeCommentSave,\n  gradeCommentReplySave,\n  gradeJoin,\n  gradeHomeworkPage,\n  gradeCertApply,\n} from '@/api/grade.js'\nimport { collectionUserDelete, collectionUserSave } from '@/api/system'\nimport { forbidCopy, formatDay, formatDuring, formatSecond, getSize } from '@/utils'\nimport BeforeExam from '@/components/exam/beforeExam.vue'\nimport { paperCheckStatus, paperRecordCheck } from '@/api/paper'\nimport { setStore } from '@/utils/storage'\nimport { Search } from '@element-plus/icons-vue'\n\nconst store = useUserStore()\nconst { getEnumList, getToken, userView } = useUserStore()\nconst route = useRoute()\nconst router = useRouter()\nconst token = computed(() => {\n  return getToken()\n})\nconst userInfo = computed(() => {\n  return store.userView\n})\nconst shopData = computed(() => {\n  return store.shopData\n})\nlet cookieData = cookie.getShop()\nconst map = reactive({\n  info: {},\n  id: '',\n  tabs: 'details',\n  commentText: '',\n  recordId: '',\n  relevanceType: 1,\n  isExamination: false,\n  tipText: '',\n})\nconst show = computed(() => {\n  return map.info && Object.keys(map.info).length\n})\nconst head = ref(null)\nconst isShowContent = ref(true)\n\nconst durationFilter = (val) => {\n  if (val < 60) {\n    return {\n      val,\n      unit: '秒'\n    }\n  } else if (val < 60 * 60) {\n    return {\n      val: Math.ceil(val / 60),\n      unit: '分钟'\n    }\n  } else if (val < 60 * 60 * 60) {\n    return {\n      val: Math.ceil(val / 60 / 60),\n      unit: '小时'\n    }\n  }\n}\nconst handleScrollBody = () => {\n  // 顶部菜单显示\n  const app = document.querySelector('#app')\n  let top = Math.floor(app.scrollTop || window.pageYOffset)\n  if (top >= head.value.clientHeight + 100) {\n    ctrl.fixed = true\n  } else {\n    ctrl.fixed = false\n  }\n  tabEnum.value.reduce((prev, cur) => {\n    if (top - 40 >= prev.offsetTop && top - 40 < cur.offsetTop) {\n      map.tabs = prev.command\n      return cur\n    }\n    if (top - 40 >= cur.offsetTop) {\n      map.tabs = cur.command\n    }\n    return cur\n  })\n}\nconst ctrl = reactive({\n  share: false,\n  isClick: false,\n  fixed: false,\n  showBeforeExam: false,\n  showTip: false,\n})\nconst { data, pending } = await useAsyncData(\n  'gradeView',\n  () => {\n    return new Promise(async (resolve, reject) => {\n      // 课程列表的请求\n      Promise.allSettled([gradeView(route.query.id)]).then(([gradeInfo]) => {\n        let data = {}\n\n        if (gradeInfo.status === 'fulfilled') {\n          data.gradeInfo = gradeInfo\n        } else {\n          data.gradeInfo = {}\n        }\n        resolve(data)\n      })\n    })\n  },\n  { initialCache: false }\n)\nlet gradeInfo = {}\nif (!pending.value && data.value) {\n  const d = data.value\n  map.info = d.gradeInfo.value\n  gradeInfo = d.gradeInfo\n}\nuseHead({\n  title: computed(() => `${gradeInfo.value ? gradeInfo.value.classroomName : '班级详情'}-${cookieData.shopName}`),\n  meta: [\n    {\n      hid: 'keywords',\n      name: 'keywords',\n      content: gradeInfo.value ? gradeInfo.value.classroomName : '班级详情',\n    },\n    {\n      hid: 'description',\n      name: 'description',\n      content: gradeInfo.value ? gradeInfo.value.classroomName : '班级详情',\n    },\n  ],\n})\n\nconst handleOpenTeacher = (teacher) => {\n  // 教师详情\n  console.log(teacher)\n  router.push({\n    path: '/teacher/view',\n    query: {\n      id: teacher.teacherId,\n    },\n  })\n}\n\nconst beforeExamModel = reactive({\n  visible: false,\n  examName: '',\n  paperId: '',\n  resourceId: '',\n  exam: null,\n  tabType: 1,\n  bizType: 5\n})\nconst handleOpenBeforeExamModel = (row, tabType) => {\n  if (!handleBeforeValid()) return\n  if (!checkIsBuy()) return\n  beforeExamModel.visible = true\n  beforeExamModel.resourceId = row.id\n  beforeExamModel.examName = row.examName\n  beforeExamModel.exam = row\n  beforeExamModel.tabType = tabType\n}\nconst handleBeforeValid = () => {\n  if (classroomStatus.value === 2) {\n    ElMessage.warning('班级未开班')\n    return false\n  }\n  if (classroomStatus.value === 3) {\n    ElMessage.warning('班级已过期')\n    return false\n  }\n  if (classroomStatus.value === 4) {\n    ElMessage.warning('请先加入班级')\n    return false\n  }\n  return true\n}\nconst handleBeforeTimeValid = () => {\n  if (validityStatus.value === 1) {\n    ElMessage.warning('班级未开班')\n    return false\n  }\n  if (validityStatus.value === 3) {\n    ElMessage.warning('班级已过期')\n    return false\n  }\n  return true\n}\nconst classroomStatus = computed(() => {\n  const nowTime = new Date().getTime()\n  const { buyStatus, validityType, beginTime, endTime, days, classroomStudent, price } = map.info\n  if (buyStatus === 3) {\n    return 3\n  }\n  if (buyStatus === 2) {\n    if (validityType === 1) {\n      return 1\n    }\n    if (validityType === 2 || validityType === 3) {\n      const begin = new Date(beginTime).getTime()\n      const end = new Date(endTime).getTime()\n      if (nowTime < begin) {\n        return 2\n      }\n      if (nowTime > end) {\n        return 3\n      }\n      return 1\n    }\n  }\n  if (!classroomStudent) {\n    if (price === 0) {\n      return 4\n    } else {\n      return 1\n    }\n  }\n  return 1\n})\nconst closeBeforeExamModel = (flag = false) => {\n  beforeExamModel.visible = false\n  if (flag) {\n    if (!handleBeforeValid()) {\n      return false\n    }\n    paperRecordCheck().then((res) => {\n      if (!res.isExamination) {\n        map.isExamination = false\n        // ctrl.showStartExam = true;\n        setStore('examInfo', beforeExamModel.exam)\n        router.push({\n          path: '/exam/startExam',\n          query: {\n            controlShow: true,\n            examType: 3,\n            isExamination: res.isExamination,\n            recordId: map.recordId,\n            relevanceType: map.relevanceType,\n          },\n        })\n      } else {\n        ElMessageBox.confirm('请继续未完成的考试', '提示', {\n          cancelButtonText: '取消',\n          confirmButtonText: '确定',\n          type: 'warning',\n        })\n          .then(() => {\n            map.isExamination = true\n            map.recordId = res.recordId\n            // ctrl.showStartExam = true;\n            setStore('examInfo', beforeExamModel.exam)\n            router.push({\n              path: '/exam/startExam',\n              query: {\n                controlShow: true,\n                examType: 3,\n                isExamination: map.isExamination,\n                recordId: map.recordId,\n                relevanceType: map.relevanceType,\n              },\n            })\n          })\n          .catch((err) => {\n            console.log(err)\n          })\n      }\n    })\n  }\n}\nconst courseModel = reactive({\n  list: [],\n  page: {\n    totalCount: 0,\n    pageCurrent: 1,\n    pageSize: 20,\n    totalPage: 1,\n  },\n  courseTypeEnum: {},\n})\n\nconst handleCourseCurrentChange = (v) => {\n  courseModel.page.pageCurrent = v\n  getGradeCourseList().then(() => {\n    setTabOffsetTop()\n  })\n}\nconst getGradeCourseList = () => {\n  return new Promise((resolve) => {\n    gradeCourseView({\n      pageCurrent: courseModel.page.pageCurrent,\n      pageSize: courseModel.page.pageSize,\n      classroomId: route.query.id,\n    }).then((res) => {\n      if (res) {\n        courseModel.list = res.list || []\n        courseModel.page.pageCurrent = res.pageCurrent\n        courseModel.page.totalCount = res.totalCount\n        courseModel.page.totalPage = res.totalPage\n        resolve()\n      }\n    })\n  })\n}\n\nconst homeworkModel = reactive({\n  list: [],\n  page: {\n    totalCount: 0,\n    pageCurrent: 1,\n    pageSize: 20,\n    totalPage: 1,\n  },\n  seekForm: {\n    taskName: '',\n  },\n  frontClassroomTaskStatusEnum: {},\n  classroomTaskTypeEnum: {},\n})\nconst handleSearchHomework = () => {\n  homeworkModel.page.pageCurrent = 1\n  getGradeHomeworkList().then(() => {\n    setTabOffsetTop()\n  })\n}\nconst handleHomeworkCurrentChange = (v) => {\n  homeworkModel.page.pageCurrent = v\n  getGradeHomeworkList().then(() => {\n    setTabOffsetTop()\n  })\n}\nconst getGradeHomeworkList = () => {\n  return new Promise((resolve) => {\n    gradeHomeworkPage({\n      pageCurrent: homeworkModel.page.pageCurrent,\n      pageSize: homeworkModel.page.pageSize,\n      classroomId: route.query.id,\n      ...homeworkModel.seekForm,\n    }).then((res) => {\n      if (res) {\n        homeworkModel.list = res.list || []\n        homeworkModel.page.pageCurrent = res.pageCurrent\n        homeworkModel.page.totalCount = res.totalCount\n        homeworkModel.page.totalPage = res.totalPage\n        resolve()\n      }\n    })\n  })\n}\nconst checkHomeworkValid = (row) => {\n  const nowTime = new Date().getTime()\n  const { validityType, beginTime, taskStatus } = row\n  if (validityType === 2 || validityType === 3) {\n    const begin = new Date(beginTime).getTime()\n    if (nowTime < begin) {\n      ElMessage.warning('作业未开始')\n      return false\n    }\n  }\n  if (taskStatus === 3) {\n    ElMessage.warning('教师批改中')\n    return false\n  }\n  return true\n}\nconst checkIsBuy = () => {\n  const { buyStatus, price } = map.info\n  if (price > 0 && buyStatus === 1) {\n    ElMessage.warning('请先加入班级')\n    return false\n  }\n  return true\n}\nconst handleStartHomework = (row) => {\n  if (!checkLogin()) return\n  if (!handleBeforeValid()) return\n  if (!handleBeforeTimeValid()) return\n  if (!checkIsBuy()) return\n  if (!checkHomeworkValid(row)) return\n  if (row.taskType === 1) {\n    router.push({\n      path: '/grade/homework',\n      query: {\n        id: row.id,\n      },\n    })\n  }\n  if (row.taskType === 2) {\n    router.push({\n      path: '/grade/practice',\n      query: {\n        id: row.id,\n      },\n    })\n  }\n}\n\nconst examModel = reactive({\n  list: [],\n  page: {\n    totalCount: 0,\n    pageCurrent: 1,\n    pageSize: 20,\n    totalPage: 1,\n  },\n  seekForm: {\n    examName: '',\n  },\n  examStatusEnum: {},\n})\nconst handleSearchExam = () => {\n  examModel.page.pageCurrent = 1\n  getGradeExamList().then(() => {\n    setTabOffsetTop()\n  })\n}\nconst handleExamCurrentChange = (v) => {\n  examModel.page.pageCurrent = v\n  getGradeExamList().then(() => {\n    setTabOffsetTop()\n  })\n}\nconst getGradeExamList = () => {\n  return new Promise((resolve) => {\n    gradeExamView({\n      pageCurrent: courseModel.page.pageCurrent,\n      pageSize: courseModel.page.pageSize,\n      classroomId: route.query.id,\n      ...examModel.seekForm,\n    }).then((res) => {\n      if (res) {\n        examModel.list = res.list || []\n        examModel.page.pageCurrent = res.pageCurrent\n        examModel.page.totalCount = res.totalCount\n        examModel.page.totalPage = res.totalPage\n        resolve()\n      }\n    })\n  })\n}\nconst noticeModel = reactive({\n  list: [],\n  page: {\n    totalCount: 0,\n    pageCurrent: 1,\n    pageSize: 20,\n    totalPage: 1,\n  },\n})\nconst handleNoticeCurrentChange = (v) => {\n  noticeModel.page.pageCurrent = v\n  getGradeNoticeList().then(() => {\n    setTabOffsetTop()\n  })\n}\nconst getGradeNoticeList = () => {\n  return new Promise((resolve) => {\n    gradeNoticeView({\n      pageCurrent: noticeModel.page.pageCurrent,\n      pageSize: noticeModel.page.pageSize,\n      classroomId: route.query.id,\n    }).then((res) => {\n      if (res) {\n        noticeModel.list = res.list || []\n        noticeModel.page.pageCurrent = res.pageCurrent\n        noticeModel.page.totalCount = res.totalCount\n        noticeModel.page.totalPage = res.totalPage\n        resolve()\n      }\n    })\n  })\n}\nconst richTextModel = reactive({\n  visible: false,\n  content: '',\n  title: '',\n})\nconst handleViewNoticeContent = async (row) => {\n  const res = await gradeNoticeDetail(row.id)\n  if (res) {\n    richTextModel.title = row.title\n    richTextModel.content = res.noticeContent\n    richTextModel.visible = true\n  }\n}\nconst handleFocus = (row, key) => {\n  // 悬浮\n  row[key] = !row[key]\n}\nconst handleBlur = (row, key) => {\n  // 离开悬浮\n  row[key] = false\n}\nconst handleShowComment = (comment) => {\n  // 显示评论框\n  if (!checkLogin()) return\n  comment.showCommentChild = !comment.showCommentChild\n  if (comment.showCommentChild) {\n    comment.commentText = ''\n  }\n}\nconst commentModel = reactive({\n  list: [],\n  page: {\n    totalCount: 0,\n    pageCurrent: 1,\n    pageSize: 20,\n    totalPage: 1,\n  },\n})\nconst handleCommentCurrentChange = (v) => {\n  commentModel.page.pageCurrent = v\n  getGradeCommentList().then(() => {\n    setTabOffsetTop()\n  })\n}\nconst getGradeCommentList = () => {\n  return new Promise((resolve) => {\n    gradeCommentView({\n      pageCurrent: commentModel.page.pageCurrent,\n      pageSize: commentModel.page.pageSize,\n      courseId: route.query.id,\n      goodsType: 2,\n    }).then((res) => {\n      if (res) {\n        commentModel.list = res.list || []\n        commentModel.page.pageCurrent = res.pageCurrent\n        commentModel.page.totalCount = res.totalCount\n        commentModel.page.totalPage = res.totalPage\n        resolve()\n      }\n    })\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 commentLoading = ref(false)\nconst handleSaveComment = (content, id, row) => {\n  if (!content) {\n    ElMessage.error('评论内容不能为空！')\n    return false\n  }\n  if (content.length > 500) {\n    ElMessage.error('字数已超出限制！')\n    return false\n  }\n  commentLoading.value = true\n  // 保存评论\n  if (row) {\n    gradeCommentReplySave({\n      commentContent: content,\n      goodsType: 2,\n      parentId: id,\n    }).then((res) => {\n      commentLoading.value = false\n      row.commentText = ''\n      ElMessage.success(res)\n      getGradeCommentList()\n    })\n  } else {\n    gradeCommentSave({\n      commentContent: content,\n      courseId: route.query.id,\n      goodsType: 2,\n    }).then((res) => {\n      commentLoading.value = false\n      map.commentText = ''\n      ElMessage.success(res)\n      getGradeCommentList()\n    })\n  }\n}\nconst setTabOffsetTop = () => {\n  setTimeout(() => {\n    const tabEnumMap = {\n      details: document.querySelector('#details').offsetTop,\n      course: document.querySelector('#course').offsetTop,\n      homework: document.querySelector('#homework').offsetTop,\n      exam: document.querySelector('#exam').offsetTop,\n      notice: document.querySelector('#notice').offsetTop,\n      comment: document.querySelector('#comment').offsetTop,\n    }\n    tabEnum.value = tabEnum.value.map((item) => {\n      item.offsetTop = tabEnumMap[item.command]\n      return item\n    })\n  }, 200)\n}\nonMounted(() => {\n  setTimeout(() => {\n    isShowContent.value = false\n  }, 200)\n  getEnumList('CourseTypeEnum', 'obj').then((res) => {\n    courseModel.courseTypeEnum = res\n  })\n  getEnumList('FrontClassroomExamStatusEnum', 'obj').then((res) => {\n    examModel.examStatusEnum = res\n  })\n  getEnumList('FrontClassroomTaskStatusEnum', 'obj').then((res) => {\n    homeworkModel.frontClassroomTaskStatusEnum = res\n  })\n  getEnumList('ClassroomTaskTypeEnum', 'obj').then((res) => {\n    homeworkModel.classroomTaskTypeEnum = res\n  })\n  Promise.all([getGradeCourseList(), getGradeHomeworkList(), getGradeExamList(), getGradeNoticeList(), getGradeCommentList()]).then(() => {\n    setTabOffsetTop()\n  })\n  if (map.info && map.info.enableForbidContentCopy) {\n    forbidCopy('.content')\n    forbidCopy('.now_title')\n  }\n  window.addEventListener('scroll', handleScrollBody, true)\n})\nonUnmounted(() => {\n  window.removeEventListener('scroll', handleScrollBody, true)\n})\n\nconst handleCollection = () => {\n  // 收藏\n  if (ctrl.isClick) {\n    return false\n  }\n  ctrl.isClick = true\n  if (!checkLogin()) return\n  if (map.info.collectStatus) {\n    collectionUserDelete({ collectionType: 2, resourceId: map.info.id })\n      .then((res) => {\n        ElMessage.success(res)\n        ctrl.isClick = false\n        getInfo()\n      })\n      .catch(() => {\n        ctrl.isClick = false\n      })\n  } else {\n    collectionUserSave({ collectionType: 2, resourceId: map.info.id })\n      .then((res) => {\n        ElMessage.success(res)\n        ctrl.isClick = false\n        getInfo()\n      })\n      .catch(() => {\n        ctrl.isClick = false\n      })\n  }\n}\nconst handleJoinGrade = () => {\n  if (!checkLogin()) return\n  gradeJoin({ classroomId: route.query.id }).then((res) => {\n    if (res) {\n      ElMessage.success('加入班级成功')\n      getInfo()\n    }\n  })\n}\nconst getInfo = async () => {\n  loading.value = true\n  const res = await gradeView(route.query.id)\n  if (res) {\n    loading.value = false\n    map.info = res\n  }\n}\nconst tabEnum = ref([\n    { label: '班级介绍', command: 'details', offsetTop: 0, show: true },\n    { label: '课程大纲', command: 'course', offsetTop: 0, show: true },\n    { label: '班级作业', command: 'homework', offsetTop: 0, show: true },\n    { label: '班级考试', command: 'exam', offsetTop: 0, show: true },\n    { label: '班级公告', command: 'notice', offsetTop: 0, show: true },\n    { label: '班级评论', command: 'comment', offsetTop: 0, show: map.info && map.info.enableComment },\n  ])\nconst handleChangeType = (item) => {\n  if (item === 'course') {\n    getGradeCourseList()\n  }\n  if (item === 'homework') {\n    getGradeHomeworkList()\n  }\n  if (item === 'exam') {\n    getGradeExamList()\n  }\n  if (item === 'notice') {\n    getGradeNoticeList()\n  }\n  if (item === 'comment') {\n    getGradeCommentList()\n  }\n  setTimeout(() => {\n    map.tabs = item\n  }, 200)\n}\nconst handleShowTip = (text) => {\n  // 提示框\n  map.tipText = text\n  ctrl.showTip = true\n  setTimeout(() => {\n    ctrl.showTip = false\n  }, 3000)\n}\nconst navigateEnum = {\n  1: '/course/live',\n  2: '/course/video',\n  3: '/course/audio',\n  4: '/course/graphic',\n  5: '/course/subject',\n  6: '/course/topic',\n}\nconst checkLogin = () => {\n  if (!token.value) {\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath),\n      },\n    })\n    return false\n  }\n  return true\n}\nconst handleBuy = (row) => {\n  if (!checkLogin()) return\n  // 购买\n\n  if (!map.info.publishStatus) {\n    ElMessage.error('班级暂未发布')\n    return false\n  }\n\n  if (!handleBeforeValid()) {\n    return false\n  }\n\n  if (map.info.price > 0 && map.info.buyStatus === 1) {\n    if (map.info.price > 0) {\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\n    if (token.value) {\n      router.push({\n        path: '/pay/buy',\n        query: {\n          id: map.info.id,\n          type: 2,\n        },\n      })\n    }\n  } else {\n    let obj = {}\n    if (row === 'learn') {\n      obj = courseModel.list.length > 0 ? courseModel.list[0] : {}\n      console.log(obj)\n    } else {\n      obj = row\n    }\n    if (!shopData.value.config.enableNotLoginWatch && !map.info.buyStatus && map.info.price === 0 && !token.value) {\n      ElMessage.error('请登录后再进行观看')\n      router.push({\n        path: '/login',\n        query: {\n          redirect: encodeURIComponent(route.fullPath),\n        },\n      })\n      return\n    }\n    if (obj.id) {\n      const { href } = router.resolve({\n        path: navigateEnum[obj.courseType],\n        query: {\n          id: obj.id,\n        },\n      })\n      window.open(href, '_blank')\n    }\n  }\n}\nconst applyCertModel = reactive({\n  visible: false,\n  info: {\n    title: '',\n    applyTime: '',\n    applyCondition: '',\n  },\n})\nconst validityStatus = computed(() => {\n  const { validityType, beginTime, endTime } = map.info\n  console.log('map.info', map.info)\n  if (validityType === 1 || validityType === 3) {\n    return 2\n  }\n  if (validityType === 2) {\n    const end = new Date(endTime).getTime()\n    const start = new Date(beginTime).getTime()\n    const nowTime = new Date().getTime()\n    if (nowTime < end && nowTime > start) {\n      return 2\n    }\n    if (nowTime > end) {\n      return 3\n    }\n    if (nowTime < start) {\n      return 1\n    }\n    return 0\n  }\n})\nconst validityText = computed(() => {\n  const { validityType, beginTime, endTime } = map.info\n  if (validityType === 1) return '永久有效'\n  if (validityType === 2) {\n    return beginTime + ' 至 ' + endTime\n  }\n  if (validityType === 3) {\n    return ' 至 ' + endTime\n  }\n  return ''\n})\nconst teacherImg = computed(() => {\n  const { teacherList } = map.info\n  const teacher = teacherList.find((item) => item.teacherType === 1)\n  return teacher && teacher.headImg\n})\nconst handleOpenApplyCertModel = () => {\n  if (!checkLogin()) return\n  if (!handleBeforeValid()) return\n  if (!checkIsBuy()) return\n  const titleEnum = { 1: '证书申请暂未开放', 2: '证书申请进行中', 3: '证书申请已结束' }\n  applyCertModel.info.title = titleEnum[validityStatus.value]\n  applyCertModel.info.applyTime = validityText.value\n  applyCertModel.info.applyCondition = map.info.certIssueStandard\n  applyCertModel.visible = true\n}\nconst handleApplyCert = () => {\n  const { certStatus } = map.info\n  if (certStatus === 2) {\n    ElMessage.warning('请勿重复提交申请')\n    return\n  }\n  if (certStatus === 3) {\n    ElMessage.warning('您已获得班级证书')\n    return\n  }\n  gradeCertApply({ classroomId: route.query.id }).then((res) => {\n    if (res) {\n      ElMessage.success('申请提交成功')\n      getInfo()\n      applyCertModel.visible = false\n    }\n  })\n}\nconst gradeShareModel = reactive({\n  visible: false,\n  info: {},\n})\nconst handleShare = () => {\n  // 分享\n  gradeShareModel.info = map.info\n  gradeShareModel.visible = true\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.show-content {\n  display: none;\n  height: 480px;\n  overflow: hidden;\n}\n.grade_cover_bg {\n  position: absolute;\n  top: 68px;\n  left: 0;\n  right: 0;\n  z-index: 1;\n  overflow: hidden;\n  height: 400px;\n  .cover_bg {\n    filter: blur(35px);\n    transform: scale(1.7);\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n  }\n}\n.grade_detail_main {\n  padding-bottom: 20px;\n  position: relative;\n  z-index: 2;\n  .navigation {\n    display: flex;\n    justify-content: space-between;\n    margin: 17px 0;\n    :deep(.el-breadcrumb__inner) {\n      color: rgba(255, 255, 255, 0.6);\n    }\n    :deep(.el-breadcrumb__separator) {\n      color: rgba(255, 255, 255, 0.6);\n    }\n    :deep(.el-breadcrumb__inner.is-link) {\n      font-weight: normal;\n    }\n    .now_title {\n      width: 113px;\n      text-overflow: ellipsis;\n      overflow: hidden;\n      white-space: nowrap;\n      cursor: pointer;\n    }\n  }\n}\n.learn_item {\n  position: relative;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 14px;\n  color: rgba(255, 255, 255, 0.6);\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.course_message {\n  padding-top: 68px;\n  padding-bottom: 45px;\n  display: flex;\n  position: relative;\n  color: #fff;\n  .course_cover {\n    min-width: 306px;\n    height: 170px;\n  }\n  .course_cover_img {\n    min-width: 306px;\n    height: 170px;\n    object-fit: cover;\n    border-radius: 5px;\n  }\n  .course_msg_content {\n    display: flex;\n    flex-direction: column;\n    width: calc(1200px - 306px);\n    padding-left: 30px;\n    position: relative;\n    text-shadow: 0px 2px 3px rgba(0, 0, 0, 0.3);\n  }\n  .course_name {\n    font-size: 34px;\n    line-height: 45px;\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: #fff;\n  }\n}\n.flex_teacher {\n  display: flex;\n  align-items: center;\n  width: calc(100% - 70px);\n  justify-content: space-between;\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.cover_teacher {\n  width: 26px;\n  height: 26px;\n  border-radius: 50%;\n  cursor: pointer;\n\n  & + .cover_teacher {\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_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.course_cell {\n  margin-top: 10px;\n  height: 26px;\n  overflow: hidden;\n  width: 100%;\n  display: flex;\n  align-items: center;\n  .course_cell_item {\n    white-space: nowrap;\n    font-style: normal;\n    font-weight: normal;\n    font-size: 14px;\n    color: #fff;\n    display: flex;\n    align-items: center;\n    &.cu {\n      cursor: pointer;\n      &:hover {\n        color: #2256f6;\n      }\n    }\n  }\n\n  .course_cell_item + .course_cell_item {\n    padding-left: 24px;\n    position: relative;\n  }\n}\n.teacher_warp_item {\n  display: flex;\n  align-items: center;\n  cursor: pointer;\n  margin-right: 10px;\n  & + .teacher_warp_item {\n    margin-right: 10px;\n  }\n\n  .teacher_name {\n    margin-left: 4px;\n  }\n\n  &:hover .teacher_name {\n    color: #3d7fff;\n  }\n}\n.teacher_wrap .teacher_name {\n  width: 45px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.course_cell_item {\n  display: flex;\n  flex-wrap: wrap;\n  word-break: break-all;\n  overflow: auto;\n}\n\n.course_cell_item.teacher_wrap {\n  width: 750px;\n  display: flex;\n  align-items: center;\n  flex-wrap: nowrap;\n  text-overflow: clip;\n  overflow: hidden;\n}\n.teacher_warp_item {\n  display: flex;\n  align-items: center;\n  cursor: pointer;\n  margin-right: 10px;\n  height: 40px;\n  min-width: 70px;\n  & + .teacher_warp_item {\n    margin-right: 10px;\n  }\n\n  .teacher_name {\n    margin-left: 4px;\n  }\n\n  &:hover .teacher_name {\n    color: #3d7fff;\n  }\n}\n.price_old {\n  text-align: center;\n  color: #999999;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 12px;\n  text-decoration-line: line-through;\n}\n\n.price_now {\n  text-align: center;\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.buy_btn_wrap {\n  display: flex;\n  align-items: center;\n}\n.buy_btn {\n  margin-left: 20px;\n  width: 154px;\n  height: 40px;\n  font-size: 16px;\n}\n.fixed_header {\n  position: fixed;\n  top: 0;\n  height: 66px;\n  background-color: #ffffff;\n  width: 100%;\n  z-index: 2000;\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_tabs_header {\n  background-color: #ffffff;\n  display: flex;\n  flex: 1;\n  padding-left: 40px;\n\n  .nav_tabs_item {\n    display: flex;\n    align-items: center;\n    margin-right: 60px;\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  margin-top: 20px;\n  padding: 20px 40px;\n  padding-bottom: 0px;\n  box-shadow: inset 0px -1px 0px #ebeef5;\n  background-color: #ffffff;\n  display: flex;\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,\n  .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.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  .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,\n  .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.all_txt {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 16px;\n  color: #333333;\n  margin-bottom: 20px;\n}\n\n.introduce {\n  padding: 30px 40px;\n  background: #ffffff;\n}\n.buy_message {\n  padding: 0 40px;\n  height: 120px;\n  background: #ffffff;\n  border-radius: 5px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  .buy_data {\n    display: flex;\n    align-items: center;\n    .buy_data_item {\n      position: relative;\n      margin-right: 46px;\n      text-align: center;\n      &::after {\n        content: '/';\n        position: absolute;\n        top: 50%;\n        right: -18px;\n        transform: translate(0, -50%);\n        color: #999999;\n        font-size: 16px;\n      }\n      &:last-child {\n        &::after {\n          content: '';\n        }\n      }\n      .count_data {\n        font-size: 30px;\n        line-height: 40px;\n      }\n      .unit {\n        font-size: 12px;\n        line-height: 20px;\n      }\n      .label {\n        font-size: 12px;\n        line-height: 20px;\n        color: #999999;\n      }\n    }\n  }\n}\n.course {\n  margin-top: 20px;\n  background: #ffffff;\n  border-radius: 5px;\n  padding: 30px;\n}\n.course_list_wrap {\n  margin-top: 36px;\n}\n.course_item {\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 20px;\n  background-color: #fff;\n  color: #333;\n  .course_type {\n    color: #999999;\n    border: 1px solid #999999;\n    border-radius: 2px;\n    font-size: 12px;\n    line-height: 20px;\n    padding: 2px 5px;\n  }\n  .finish_progress {\n    border: 1px solid #3d7fff !important;\n    color: #3d7fff !important;\n  }\n  .course_name {\n    margin-left: 10px;\n    font-size: 14px;\n    line-height: 18px;\n  }\n  .course_duration {\n    font-size: 14px;\n    line-height: 18px;\n    color: #999999;\n  }\n  .learn_btn {\n    position: absolute;\n    top: 20px;\n    right: 20px;\n  }\n}\n.course_item.active {\n  background: rgba(61, 127, 255, 0.1);\n  color: #3d7fff;\n  .course_type {\n    color: #3d7fff;\n    border: 1px solid #3d7fff;\n  }\n}\n.exam {\n  margin-top: 20px;\n  background: #ffffff;\n  border-radius: 5px;\n  padding: 30px;\n  .exam_list_wrap {\n    margin-top: 26px;\n  }\n  .exam_item {\n    margin-top: 20px;\n    overflow: hidden;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding-left: 50px;\n    padding-right: 30px;\n    position: relative;\n    height: 100px;\n    border: 1px solid #ebeef5;\n  }\n  .exam_name {\n    font-size: 16px;\n    line-height: 21px;\n    color: #333333;\n  }\n  .exam_timerange {\n    margin-top: 10px;\n    font-size: 14px;\n    line-height: 18px;\n    color: #999999;\n  }\n  .exam_status {\n    position: absolute;\n    top: 15px;\n    left: -36px;\n    width: 121px;\n    height: 24px;\n    transform: rotate(-45deg);\n    color: #ffffff;\n    font-size: 14px;\n    text-align: center;\n    &.danger {\n      background: rgba(242, 60, 60, 0.1);\n      color: #f23c3c;\n    }\n    &.warning {\n      background: rgba(242, 153, 74, 0.1);\n      color: #f2994a;\n    }\n    &.primary {\n      background: rgba(61, 127, 255, 0.1);\n      color: #3d7fff;\n    }\n    &.success {\n      background: rgba(39, 174, 96, 0.1);\n      color: #27ae60;\n    }\n    &.info {\n      background: #f2f3f5;\n      color: #666666;\n    }\n  }\n}\n.notice {\n  margin-top: 20px;\n  background: #ffffff;\n  border-radius: 5px;\n  padding: 30px;\n  .notice_list_wrap {\n    margin-top: 20px;\n  }\n  .notice_item {\n    cursor: pointer;\n    overflow: hidden;\n    padding-left: 20px;\n    padding-right: 20px;\n    position: relative;\n    height: 64px;\n    border-bottom: 1px solid #ebeef5;\n  }\n  .notice_name {\n    font-size: 14px;\n    line-height: 18px;\n    color: #333333;\n  }\n  .notice_handle {\n    font-size: 14px;\n    line-height: 18px;\n    color: #999999;\n  }\n}\n.comment {\n  margin-top: 20px;\n  background: #ffffff;\n  border-radius: 5px;\n  padding: 30px;\n}\n.placeholder {\n  position: relative;\n  top: -60px;\n}\n.apply_cert_title {\n  margin-top: -20px;\n  font-size: 22px;\n  line-height: 29px;\n  color: #333333;\n  text-align: center;\n}\n.apply_cert_time {\n  margin-top: 12px;\n  margin-bottom: 10px;\n  font-size: 12px;\n  line-height: 20px;\n  text-align: center;\n  color: #f2994a;\n  .label {\n    color: #333333;\n  }\n}\n.apply_cert_row {\n  margin-top: 24px;\n  display: flex;\n  align-items: center;\n  img {\n    width: 36px;\n    height: 36px;\n    border-radius: 50%;\n    margin-right: 10px;\n  }\n}\n.apply_cert_content {\n  position: relative;\n  padding: 14px;\n  width: 365px;\n  background: #ebf2ff;\n  border-radius: 5px;\n  font-size: 14px;\n  line-height: 22px;\n  color: #333333;\n  &::before {\n    position: absolute;\n    content: '';\n    top: 50%;\n    left: 0;\n    transform: translate(-50%, -50%) rotate(45deg);\n    width: 10px;\n    height: 10px;\n    background: #ebf2ff;\n  }\n}\n.course_cell_item_content {\n  flex: 1;\n  flex-wrap: wrap;\n  white-space: nowrap;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 14px;\n  color: #333;\n  display: flex;\n  align-items: center;\n  &.cu {\n    cursor: pointer;\n    &:hover {\n      color: #2256f6;\n    }\n  }\n}\n.block_title {\n  font-size: 18px;\n}\n</style>\n"],"names":["visible","ref","modelValue","toRefs","props","watch","value","handleRichTextClick","e","path","dataset","id","resourceId","bus","emit","handleClose","store","useUserStore","getEnumList","getToken","userView","route","useRoute","router","useRouter","token","computed","userInfo","shopData","cookieData","cookie","getShop","map","reactive","info","tabs","commentText","recordId","relevanceType","isExamination","tipText","show","Object","keys","length","head","isShowContent","durationFilter","val","unit","Math","ceil","handleScrollBody","app","document","querySelector","top","floor","scrollTop","window","pageYOffset","clientHeight","ctrl","fixed","tabEnum","reduce","prev","cur","offsetTop","command","share","isClick","showBeforeExam","showTip","data","pending","Promise","async","resolve","reject","allSettled","gradeView","query","then","gradeInfo","status","initialCache","d","useHead","title","classroomName","shopName","meta","hid","name","content","handleOpenTeacher","teacher","push","teacherId","beforeExamModel","examName","paperId","exam","tabType","bizType","handleOpenBeforeExamModel","row","handleBeforeValid","checkIsBuy","classroomStatus","ElMessage","warning","nowTime","Date","getTime","buyStatus","validityType","beginTime","endTime","days","classroomStudent","price","begin","end","closeBeforeExamModel","flag","paperRecordCheck","res","ElMessageBox","confirm","cancelButtonText","confirmButtonText","type","setStore","controlShow","examType","catch","err","courseModel","list","page","totalCount","pageCurrent","pageSize","totalPage","courseTypeEnum","handleCourseCurrentChange","v","getGradeCourseList","setTabOffsetTop","gradeCourseView","classroomId","homeworkModel","seekForm","taskName","frontClassroomTaskStatusEnum","classroomTaskTypeEnum","handleSearchHomework","getGradeHomeworkList","handleHomeworkCurrentChange","gradeHomeworkPage","handleStartHomework","checkLogin","validityStatus","taskStatus","checkHomeworkValid","taskType","examModel","examStatusEnum","handleSearchExam","getGradeExamList","handleExamCurrentChange","gradeExamView","noticeModel","handleNoticeCurrentChange","getGradeNoticeList","gradeNoticeView","richTextModel","handleFocus","key","handleBlur","handleShowComment","comment","showCommentChild","commentModel","handleCommentCurrentChange","getGradeCommentList","gradeCommentView","courseId","goodsType","handleSelectEmoji","emoji","obj","commentLoading","handleSaveComment","error","gradeCommentReplySave","commentContent","parentId","success","gradeCommentSave","setTimeout","tabEnumMap","details","course","homework","notice","item","onMounted","all","enableForbidContentCopy","forbidCopy","addEventListener","onUnmounted","removeEventListener","handleCollection","collectStatus","collectionUserDelete","collectionType","getInfo","collectionUserSave","handleJoinGrade","gradeJoin","loading","label","enableComment","handleChangeType","navigateEnum","redirect","encodeURIComponent","fullPath","handleBuy","publishStatus","config","enabledPay","disablePayTips","enabledAliPay","enabledWxPay","text","enableNotLoginWatch","href","courseType","open","applyCertModel","applyTime","applyCondition","start","validityText","teacherImg","teacherList","find","teacherType","headImg","handleOpenApplyCertModel","certIssueStandard","handleApplyCert","certStatus","gradeCertApply","gradeShareModel","handleShare","gradeNoticeDetail","noticeContent"],"mappings":"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"}