{"version":3,"file":"view.4703b94c.mjs","sources":["../../../../pages/practice/view.vue"],"sourcesContent":["<template>\n  <NuxtLayout>\n    <div class=\"app_container\">\n      <div class=\"paper_content\" v-if=\"map.info.id\">\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: '/paper/list' }\">试卷中心</el-breadcrumb-item>\n            <el-breadcrumb-item>\n              <div class=\"now_title\">{{ map.info.practiceName }}</div>\n            </el-breadcrumb-item>\n          </el-breadcrumb>\n        </div>\n        <div class=\"info_wrapper mgb20\">\n          <p class=\"font20 mgb20\">{{map.info.practiceName}}</p>\n          <div class=\"price_wrapper\">\n            <div class=\"flex_row\">\n              <div class=\"c_999\">价&nbsp;格&nbsp;：</div>\n              <div v-if=\"map.info.price > 0\" class=\"c_red1\">\n                <span class=\"font18\">¥</span>\n                <span class=\"current_price\">{{map.info.price}}</span>\n                <template v-if=\"map.info.price < map.info.linePrice\">\n                  <span class=\"c_999 font12\">¥</span>\n                  <span class=\"c_999 line_price\">{{map.info.linePrice}}</span>\n                </template>\n              </div>\n              <div v-else class=\"free\">免费</div>\n            </div>\n          </div>\n          <div class=\"count_wrapper\">\n            <paper-info-count v-if=\"map.info.id\" :info=\"map.info\"></paper-info-count>\n            <template v-if=\"checkValidate === 1\">\n              <div class=\"handle_btns\" v-if=\"map.info.price > 0 && !map.info.isPay\">\n                <div class=\"do_btn\" @click=\"handleBuy\">立即购买</div>\n              </div>\n              <template v-else>\n                <div class=\"handle_btns\" v-if=\"map.info.practiceType === 1\">\n                  <el-button type=\"text\" size=\"default\" v-if=\"map.info.userPracticeStatus === 3\" @click=\"handleViewAnalysis\">查看解析</el-button>\n                  <div class=\"do_btn\" @click=\"handlePracticeEveryday\">\n                    {{!map.info.userPracticeStatus ? '开始练习' : opts.UserPracticeStatusEnum[map.info.userPracticeStatus]}}\n                  </div>\n                </div>\n                <div class=\"handle_btns\" v-if=\"map.info.practiceType === 2\">\n                  <div class=\"do_btn\" :class=\"{default: chapterPracticeStatus === 3}\" @click=\"handlePracticeChapter\">\n                    {{!map.info.userPracticeStatus ? '开始练习' : opts.chapterPracticeStatusEnum[chapterPracticeStatus]}}\n                  </div>\n                </div>\n                <div class=\"handle_btns\" v-if=\"map.info.practiceType === 3\">\n                  <div class=\"do_btn\" :class=\"{default: emigratePracticeStatus === 3}\" @click=\"handlePracticeEmigrate\">\n                    {{!map.info.practiceTitleInfoList[0].practiceStatus ? '开始闯关' : opts.emigratePracticeStatusEnum[emigratePracticeStatus]}}\n                  </div>\n                </div>\n              </template>\n            </template>\n            <template v-else>\n              <div class=\"view_other_btn\" @click=\"handleViewOther\">查看其它练习</div>\n            </template>\n          </div>\n        </div>\n        <div class=\"list_wrapper\">\n          <el-tabs v-model=\"map.activeName\" @tab-click=\"changeTab\">\n            <el-tab-pane v-if=\"map.info.practiceType === 2\" label=\"小节列表\" name=\"period_list\"></el-tab-pane>\n            <el-tab-pane v-if=\"map.info.practiceType === 3\" label=\"关卡情况\" name=\"emigrate_list\"></el-tab-pane>\n            <el-tab-pane v-if=\"map.info.practiceType === 3\" label=\"排行榜\" name=\"rank_list\"></el-tab-pane>\n            <el-tab-pane label=\"用户学习\" name=\"user_study\"></el-tab-pane>\n          </el-tabs>\n          <div class=\"tab_content\">\n            <template v-if=\"map.activeName === 'period_list'\">\n              <div class=\"header_cell_list\">\n                <div class=\"header_cell_item long\">名称</div>\n                <div class=\"header_cell_item\">已做/总题</div>\n                <div class=\"header_cell_item\">已做题正确率</div>\n                <div class=\"header_cell_item small\">操作</div>\n              </div>\n              <div class=\"table_cell_list\" v-for=\"(item,index) in map.info.practiceTitleInfoList\" :key=\"index\">\n                <div class=\"table_cell_item\">\n                  <div class=\"table_cell_column long\">\n                    <div class=\"chapter_wrapper\">\n                      <div class=\"chapter_title\">{{item.titleName}}</div>\n                    </div>\n                  </div>\n                  <div class=\"table_cell_column\">{{item.practiceTitleCount || 0}}/{{item.questionCount}}</div>\n                  <div class=\"table_cell_column\">{{item.correctRate || '0%'}}</div>\n                  <div class=\"table_cell_column small\">\n                    <template v-if=\"(map.info.price === 0 || (map.info.price > 0 && map.info.isPay)) && checkValidate === 1\">\n                      <div class=\"btn\" v-if=\"item.userPracticeStatus === 1 || !item.userPracticeStatus\" @click=\"handlePracticePeriod(item)\">开始练习</div>\n                      <div class=\"btn continue\" v-else-if=\"item.userPracticeStatus === 2\" @click=\"handlePracticePeriod(item)\">继续练习</div>\n                      <div class=\"btn redo\" v-else @click=\"handleRePracticePeriod(item)\">再做一次</div>\n                    </template>\n                  </div>\n                </div>\n              </div>\n            </template>\n            <div class=\"emigrate_list\" v-if=\"map.activeName === 'emigrate_list'\">\n              <div class=\"emigrate_item\" @click=\"handleToEmigrate(item, index)\" v-for=\"(item,index) in map.info.practiceTitleInfoList\" :key=\"index\">\n                <div class=\"emigrate_item_top\" :class=\"getEmigrateStatuClass(index,item)\"></div>\n                <div class=\"emigrate_item_title\">{{item.titleName}}</div>\n                <div class=\"emigrate_item_msg\">{{item.passUserCount}}人已闯关成功</div>\n              </div>\n            </div>\n            <div class=\"rank_list\" v-if=\"map.activeName === 'rank_list'\" v-loading=\"ctrl.loading\">\n              <p class=\"c_999 mgb20\">提示：闯关关卡数最多，用时最短排在最前面</p>\n              <div class=\"user_rank mgb10\" v-if=\"map.user && map.user.userName && map.user.successLevelCount && map.user.ranking && map.user.passTime\">\n                <div class=\"mgl20\">\n                  <img v-if=\"map.user.ranking === 1\" src=\"@/assets/paper/rank1.svg\" alt=\"\">\n                  <img v-if=\"map.user.ranking === 2\" src=\"@/assets/paper/rank2.svg\" alt=\"\">\n                  <img v-if=\"map.user.ranking === 3\" src=\"@/assets/paper/rank3.svg\" alt=\"\">\n                  <span v-if=\"map.user.ranking > 3\" style=\"margin-left: 10px\">{{map.user.ranking}}</span>\n                </div>\n                <div>{{map.user.userName}}</div>\n                <div> {{formatDuring(map.user.passTime * 1000)}} </div>\n                <div>{{map.user.successLevelCount}}</div>\n              </div>\n              <div class=\"rank_table\" v-if=\"map.rankList && map.rankList.length > 0\">\n                <div class=\"header\">\n                  <span class=\"mgl20\">排名</span>\n                  <span>用户昵称</span>\n                  <span>闯关时长</span>\n                  <span>成功关卡数</span>\n                </div>\n                <div class=\"row\" v-for=\"(item, index) in map.rankList\" :key=\"index\">\n                  <div class=\"mgl20\">\n                    <img v-if=\"item.ranking === 1\" src=\"@/assets/paper/rank1.svg\" alt=\"\">\n                    <img v-if=\"item.ranking === 2\" src=\"@/assets/paper/rank2.svg\" alt=\"\">\n                    <img v-if=\"item.ranking === 3\" src=\"@/assets/paper/rank3.svg\" alt=\"\">\n                    <span v-if=\"item.ranking > 3\" style=\"margin-left: 10px\">{{item.ranking}}</span>\n                  </div>\n                  <div>{{item.userName}}</div>\n                  <div> {{formatDuring(item.passTime * 1000)}} </div>\n                  <div>{{item.successLevelCount}}</div>\n                </div>\n              </div>\n              <el-empty v-else></el-empty>\n            </div>\n            <div v-if=\"map.activeName === 'user_study'\">\n              <div v-if=\"map.info.userList && map.info.userList.length > 0\" class=\"user_study_list\">\n                <div v-for=\"(item, index) in map.info.userList\" :key=\"index\" class=\"user_item\">\n                  <img :src=\"item.headImg\" alt=\"\">\n                  <div class=\"c_666 user_name\" :title=\"item.nickname\">{{item.nickname}}</div>\n                </div>\n              </div>\n              <el-empty v-else></el-empty>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <paper-redo-tip v-model=\"ctrl.redoCtr.visible\" @callback=\"handleRedoCallback\" @close=\"ctrl.redoCtr.visible = false\"></paper-redo-tip>\n  </NuxtLayout>\n</template>\n<script setup>\nimport {ArrowRight} from '@element-plus/icons-vue'\nimport {practiceDataView, practiceDataAuthView, practiceRedo, practiceRemoveTitleRecord,practiceEnterList, userRankView} from '@/api/paper.js'\nimport {forbidCopy} from '@/utils'\nimport cookie from '@/utils/cookies'\nimport {useUserStore} from \"@/stores/user\";\nimport {setStore} from \"@/utils/storage\";\nimport { formatDuring } from \"@/utils/index\";\nimport {ElMessage} from 'element-plus'\n\nconst store = useUserStore()\nconst {getToken} = store\nconst route = useRoute()\nconst router = useRouter()\nlet cookieData = cookie.getShop()\nuseHead({\n  title: computed(() => `练习详情-${cookieData.shopName}`),\n  meta: [\n    {\n    hid: 'keywords',\n    name: 'keywords',\n    content: '练习详情'\n    },\n    {\n      hid: 'description',\n      name: 'description',\n      content: '练习详情'\n    }\n  ]\n})\nconst map = reactive({\n  info: {},\n  id: '',\n  activeName: 'user_study',\n  rankList: [],\n  user: {}\n})\nconst opts = reactive({\n  UserPracticeStatusEnum: {\n    1: '开始练习',\n    2: '继续练习',\n    3: '再做一次'\n  },\n  chapterPracticeStatusEnum: {\n    1: '开始练习',\n    2: '继续练习',\n    3: '已完成'\n  },\n  emigratePracticeStatusEnum: {\n    1: '开始闯关',\n    2: '继续闯关',\n    3: '已完成'\n  }\n})\nconst ctrl = reactive({\n  loading: false,\n  redoCtr: {\n    visible: false,\n    data: {}\n  }\n})\nconst page = reactive({\n  totalCount: 0,\n  pageCurrent: 1,\n  pageSize: 6,\n})\nconst token = computed(() => {\n  return getToken()\n})\nconst checkValidate = computed(() => {\n  if(map.info.paperPracticeStatus === 2) {\n    return 3 //已过期\n  } else if(map.info.paperPracticeStatus === 1){\n    if(map.info.validityType === 2) {\n      const now = new Date().getTime()\n      const begin = new Date(map.info.beginTime).getTime()\n      if(now < begin) {\n        return 2 //未生效\n      } else {\n        return 1 //处于有效期\n      }\n    } else {\n      return 1\n    }\n  } else {\n    return 1\n  }\n})\nconst chapterPracticeStatus = computed(() => {\n  const isNoPratcice = map.info.practiceTitleInfoList.every(i => {\n    return i.userPracticeStatus === 1\n  })\n  if(isNoPratcice) {\n    return 1\n  } else {\n    const isAllPracticed = map.info.practiceTitleInfoList.every(i => {\n      return i.userPracticeStatus === 3\n    })\n    if(isAllPracticed) {\n      return 3\n    } else {\n      return 2\n    }\n  }\n})\nconst emigratePracticeStatus = computed(() => {\n  const isNoPratcice = map.info.practiceTitleInfoList.every(i => {\n    return i.practiceStatus === 2 //未做\n  })\n  if(isNoPratcice) {\n    return 1\n  } else {\n    const isAllPracticed = map.info.practiceTitleInfoList.every(i => {\n      return i.practiceStatus === 1 //已做\n    })\n    if(isAllPracticed) {\n      return 3\n    } else {\n      return 2\n    }\n  }\n})\n\nconst {data, pending} = await useAsyncData('practiceView', () => {\n  return new Promise(async (resolve) => {\n    let method = practiceDataView\n    if(token.value) {\n      method = practiceDataAuthView\n    }\n    Promise.allSettled([\n      method(route.query.id),\n    ]).then(([info]) => {\n      let data = {};\n      if (info.status === 'fulfilled') {\n        data.info = info\n      } else {\n        data.info = {}\n      }\n      resolve(data)\n    })\n  })\n}, {initialCache: false})\nif (!pending.value && data.value) {\n  map.info = data.value.info.value\n  if(map.info.practiceType === 2) {\n    map.activeName = 'period_list'\n  } else if(map.info.practiceType === 3) {\n    map.activeName = 'emigrate_list'\n  }\n}\nconst handleViewOther = () => {\n  router.push({\n    path: '/paper/list'\n  })\n}\nconst changeTab = (v) => {\n  if(v.paneName === 'rank_list') {\n    getUserRank()\n    getRankList()\n  }\n}\nconst getEmigrateStatuClass = (index, item) => {\n  const list = {...map.info.practiceTitleInfoList}\n  let cls = []\n  if(item.practiceStatus === 1){\n    cls.push('success')\n  }else if(list[index] !== 1 && index === 0 || (list[index - 1] && list[index - 1].practiceStatus === 1)){\n    cls.push('go')\n  } else if(item.practiceStatus === 2 && index !== 0 || (item.practiceStatus === 2 && list[index - 1] && list[index - 1].practiceStatus !== 2)){\n    cls.push('lock')\n  }\n  return cls\n}\nconst getRankList = () => {\n  const d = {\n    pageCurrent: page.pageCurrent,\n    pageSize: page.pageSize,\n    practiceId: map.info.id\n  }\n  ctrl.loading = true\n  practiceEnterList(d).then(res => {\n    if(res) {\n      page.pageCurrent = res.pageCurrent;\n      page.totalPage = res.totalPage;\n      page.totalCount = res.totalCount;\n      map.rankList = res.list || []\n      ctrl.loading = false;\n    }\n  }).catch((e) => {\n    ctrl.loading = false;\n  });\n}\nconst getUserRank = () => {\n  userRankView({practiceId: map.info.id}).then(res => {\n    if(res) {\n      map.user = res\n    }\n  })\n}\nconst handleBuy = () => {\n  if (token.value) {\n    const d = {\n      practiceType: +map.info.practiceType + 1,\n      courseId: map.info.id,\n      practiceId: map.info.id\n    }\n    router.push({\n      path: '/pay/buy',\n      query: {\n        id: map.info.id,\n        practiceType: d.practiceType\n      }\n    })\n  } else {\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath)\n      }\n    })\n  }\n}\nconst handlePracticeEmigrate = () => {\n  if(emigratePracticeStatus.value === 1) {\n    handleToEmigrate(map.info.practiceTitleInfoList[0], 0)\n  } else if(emigratePracticeStatus.value === 2) {\n    const index = map.info.practiceTitleInfoList.findIndex(i => {\n      return i.practiceStatus === 2\n    })\n    handleToEmigrate(map.info.practiceTitleInfoList[index], index)\n  }\n}\nconst handleToEmigrate = (data, index) => {\n  if(token.value){\n    if(!data){\n      data = null\n      map.info.practiceTitleInfoList.forEach((el,i)=>{\n        if(el.practiceStatus === 1){\n          if(!data && map.info.practiceTitleInfoList[i+1]){\n            data = map.info.practiceTitleInfoList[i+1]\n            index = i + 1\n          }\n        }\n      })\n      if(!data){\n        data = map.info.practiceTitleInfoList[0]\n        index = 0\n      }\n    }\n    const statuArr = getEmigrateStatuClass(index, data)\n    if(statuArr[statuArr.length - 1] === 'lock') {\n      return false\n    }\n    if(map.info.resurgenceNum > -1 && data.resurgenceNum === 0 && data.practiceStatus > 1) { //practiceStatus用户练习状态：1已做，2未做\n      ElMessage.error(data.titleName + '已无复活机会！')\n      return false\n    }\n    setStore('practiceInfo', map.info)\n    router.push({\n      path: '/practice/daily',\n      query: {\n        practiceType: +map.info.practiceType + 1,\n        courseId: map.info.id,\n        titleId: data.id,\n        titleName: data.titleName,\n      }\n    })\n  }else{\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath)\n      }\n    })\n  }\n}\nconst handleViewAnalysis = (titleId = '') => {\n  if(!token.value) {\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath)\n      }\n    })\n  } else {\n    const d = {\n      practiceId: map.info.id,\n      practiceRecordType: +map.info.practiceType + 1 //2,每日一练、3,章节练习 4,闯关练习\n    }\n    if(map.info.practiceType === 2) {\n      d.practiceTitleId = titleId\n    }\n    router.push({\n      path: '/practice/analysis',\n      query: d\n    })\n  }\n}\nconst handlePracticeChapter = () => {\n  if(chapterPracticeStatus.value === 1) {\n    handlePracticePeriod(map.info.practiceTitleInfoList[0])\n  } else if(chapterPracticeStatus.value === 2) {\n    const index = map.info.practiceTitleInfoList.findIndex(i => {\n      return i.userPracticeStatus < 3\n    })\n    handlePracticePeriod(map.info.practiceTitleInfoList[index])\n  }\n}\nconst handleRedoCallback = async(bool) => {\n  if(bool) { //小节重做\n    await practiceRemoveTitleRecord({questionTitleId: ctrl.redoCtr.data.id})\n    handlePracticePeriod(ctrl.redoCtr.data)\n  } else { //看小节解析\n    handleViewAnalysis(ctrl.redoCtr.data.id)\n  }\n}\nconst handleRePracticePeriod = (row) => {\n  ctrl.redoCtr.data = row\n  ctrl.redoCtr.visible = true\n}\nconst handlePracticePeriod = (row) => {\n  if(!token.value) {\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath)\n      }\n    })\n  } else {\n    setStore('practiceInfo', map.info)\n    router.push({\n      path: '/practice/daily',\n      query: {\n        practiceType: +map.info.practiceType + 1,\n        courseId: map.info.id,\n        titleId: row.id,\n        titleName: row.titleName\n      }\n    })\n  }\n}\nconst handlePracticeEveryday = async() => {\n  if(!token.value) {\n    router.push({\n      path: '/login',\n      query: {\n        redirect: encodeURIComponent(route.fullPath)\n      }\n    })\n  } else {\n    setStore('practiceInfo', map.info)\n    if(map.info.userPracticeStatus === 3) {\n      await practiceRedo({practiceId: map.info.id}) //重做每日一练前先清空练习记录\n    }\n    router.push({\n      path: '/practice/daily',\n      query: {\n        practiceType: +map.info.practiceType + 1,\n        courseId: map.info.id,\n      }\n    })\n  }\n}\nonMounted(() => {\n  if (map.info.enableForbidContentCopy) {\n    forbidCopy('.paper_content')\n  }\n})\n\n\n</script>\n\n<style scoped lang=\"scss\">\n.c_red1 {\n  color: #F01414;\n}\n.paper_content {\n  width: 1200px;\n  margin: auto;\n  background: #f6f8fb;\n}\n\n.navigation {\n  margin: 20px 0;\n\n  :deep(.el-breadcrumb__inner) {\n    color: #999;\n  }\n\n  :deep(.el-breadcrumb__inner.is-link) {\n    font-weight: normal;\n  }\n\n  .now_title {\n    width: 113px;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    white-space: nowrap;\n    cursor: pointer;\n  }\n}\n.info_wrapper {\n  padding: 30px;\n  background: #FFFFFF;\n}\n.price_wrapper {\n  padding: 13px 10px;\n  background: #F6F6F6;\n  .flex_row {\n    display: flex;\n    align-items: baseline;\n  }\n  .current_price {\n    font-size: 26px;\n  }\n  .line_price{\n    text-decoration: line-through;\n  }\n  .free {\n    color: #58B85C;\n    font-size: 26px;\n  }\n}\n.count_wrapper {\n  position: relative;\n}\n.handle_btns {\n  position: absolute;\n  right: 0px;\n  top: 0;\n  bottom: 0;\n  margin: auto;\n  display: flex;\n  align-items: center;\n  column-gap: 16px;\n  .do_btn {\n    width: 154px;\n    padding: 10px 0;\n    text-align: center;\n    background: #3D7FFF;\n    border-radius: 5px;\n    color: #fff;\n    font-size: 16px;\n    cursor: pointer;\n  }\n  .default {\n    cursor: default;\n  }\n}\n.view_other_btn {\n  position: absolute;\n  right: 30px;\n  top: 0;\n  bottom: 0;\n  margin: auto;\n  width: 154px;\n  padding: 10px 0;\n  text-align: center;\n  background: #3D7FFF;\n  border-radius: 5px;\n  color: #fff;\n  font-size: 16px;\n  height: fit-content;\n  cursor: pointer;\n}\n.list_wrapper {\n  padding-top: 10px;\n  background: #fff;\n  min-height: 300px;\n  :deep(.el-tabs__nav-scroll) {\n    padding-left: 30px;\n  }\n}\n.tab_content {\n  padding: 8px 30px 30px 30px;\n}\n.header_cell_list{\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  background: rgba(242, 243, 245, 0.5);\n  box-shadow: inset 0px -1px 0px #EBEEF5;\n  padding-left: 20px;\n  padding-right: 20px;\n  .header_cell_item{\n    width: 100px;\n    height: 42px;\n    font-size: 14px;\n    display: flex;\n    align-items: center;\n    color: #999999;\n  }\n  .header_cell_item.long{\n    font-size: 16px;\n    width: calc(100% - 400px);\n  }\n  .header_cell_item.small{\n    min-width: 100px;\n  }\n}\n.table_cell_list{\n  display: flex;\n  align-items: center;\n  flex-direction: column;\n}\n.table_cell_item{\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-direction: row;\n  border-bottom: 1px solid #EBEEF5;\n  background-color: #FFFFFF;\n  width: 100%;\n  padding: 14px 20px;\n  .table_cell_column{\n    width: 100px;\n    font-size: 14px;\n    display: flex;\n    align-items: center;\n    color: #999999;\n  }\n  .btn {\n    padding: 9px 19px;\n    background: #3D7FFF;\n    border-radius: 5px;\n    color: #fff;\n    cursor: pointer;\n  }\n  .redo {\n    background: rgba(61, 127, 255, 0.1);\n    color: #3D7FFF;\n  }\n  .continue {\n    background: #27AE60;\n  }\n  .chapter_wrapper {\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n  }\n  .chapter_title {\n    max-width: 500px;\n  }\n  .table_cell_column.long{\n    font-size: 16px;\n    width: calc(100% - 400px);\n    color: #333333;\n  }\n  .table_cell_column.small{\n    min-width: 100px;\n  }\n}\n.emigrate_list{\n  padding: 10px;\n  background-color: #FFFFFF;\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  .emigrate_item{\n    display: flex;\n    align-items: center;\n    flex-direction: column;\n    margin-bottom: 32px;\n    cursor: pointer;\n  }\n  .emigrate_item:has(.lock){\n    cursor: none;\n  }\n  .emigrate_item+.emigrate_item{\n    margin-left: 70px;\n  }\n  .emigrate_item:nth-child(7n+1){\n    margin-left: 0;\n  }\n  .emigrate_item_top{\n    width: 100px;\n    height: 100px;\n    background-image: url(\"~/assets/paper/emigrated_bg.png\");\n    background-size: contain;\n    position: relative;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n  .lock {\n    cursor: not-allowed;\n  }\n  .emigrate_item_top.lock:before{\n    content: '';\n    position: absolute;\n    width: 44px;\n    height: 44px;\n    background-image: url(\"~/assets/paper/lock.png\");\n    background-size: 100% 100%;\n  }\n  .emigrate_item_top.go:before{\n    content: '';\n    position: absolute;\n    width: 44px;\n    height: 44px;\n    background-image: url(\"~/assets/paper/go.png\");\n    background-size: 100% 100%;\n  }\n  .emigrate_item_top.success:before{\n    content: '';\n    position: absolute;\n    width: 100px;\n    height: 100px;\n    left: 0;\n    top: 0;\n    background: #FFFFFF;\n    opacity: 0.7;\n    z-index: 1;\n  }\n  .emigrate_item_top.success:after{\n    content: '';\n    position: absolute;\n    width: 44px;\n    height: 44px;\n    background-image: url(\"../../assets/paper/success.png\");\n    background-size: 100% 100%;\n    z-index: 2;\n  }\n  .emigrate_item_title{\n    margin-top: 16px;\n    font-style: normal;\n    font-weight: 400;\n    font-size: 16px;\n    color: #333333;\n  }\n  .emigrate_item_msg{\n    font-style: normal;\n    font-weight: 400;\n    font-size: 14px;\n    color: #999999;\n    margin-top: 4px;\n  }\n}\n.user_rank {\n  display: flex;\n  height: 54px;\n  align-items: center;\n  background: #3D7FFF;\n  border-radius: 6px;\n  div {\n    flex: 1;\n    color: #fff;\n  }\n}\n.rank_table {\n  border-radius: 6px;\n  .header {\n    display: flex;\n    align-items: center;\n    height: 54px;\n    background: rgba(242, 243, 245, 0.5);\n    border: 1px solid #EBEEF5;\n    span {\n      flex: 1;\n    }\n  }\n  .row {\n    display: flex;\n    align-items: center;\n    height: 54px;\n    border: 1px solid #EBEEF5;\n    border-top: 0;\n    div {\n      flex: 1;\n    }\n  }\n}\n.user_study_list {\n  display: flex;\n  flex-wrap: wrap;\n  column-gap: 30px;\n  .user_item {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    row-gap: 9px;\n    margin-bottom: 30px;\n    img {\n      width: 48px;\n      height: 48px;\n      border-radius: 50%;\n    }\n    .user_name {\n      width: 55px;\n      text-overflow: ellipsis;\n      overflow: hidden;\n      white-space: nowrap;\n    }\n  }\n}\n</style>\n"],"names":["store","useUserStore","getToken","route","useRoute","router","useRouter","cookieData","cookie","getShop","useHead","title","computed","shopName","meta","hid","name","content","map","reactive","info","id","activeName","rankList","user","opts","UserPracticeStatusEnum","chapterPracticeStatusEnum","emigratePracticeStatusEnum","ctrl","loading","redoCtr","visible","data","page","totalCount","pageCurrent","pageSize","token","checkValidate","paperPracticeStatus","validityType","Date","getTime","beginTime","chapterPracticeStatus","practiceTitleInfoList","every","i","userPracticeStatus","emigratePracticeStatus","practiceStatus","pending","__temp","__restore","_withAsyncContext","useAsyncData","Promise","async","resolve","method","practiceDataView","value","practiceDataAuthView","allSettled","query","then","status","initialCache","practiceType","handleViewOther","push","path","changeTab","v","paneName","getUserRank","getRankList","getEmigrateStatuClass","index","item","list","cls","d","practiceId","practiceEnterList","res","totalPage","catch","e","userRankView","handleBuy","courseId","redirect","encodeURIComponent","fullPath","handlePracticeEmigrate","handleToEmigrate","findIndex","forEach","el","statuArr","length","resurgenceNum","ElMessage","error","titleName","setStore","titleId","handleViewAnalysis","practiceRecordType","practiceTitleId","handlePracticeChapter","handlePracticePeriod","handleRedoCallback","bool","practiceRemoveTitleRecord","questionTitleId","row","handlePracticeEveryday","practiceRedo","onMounted","enableForbidContentCopy","forbidCopy"],"mappings":"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"}