index.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <template>
  2. <div class="resume-box" style="position: relative; height: 100%;">
  3. <div class="resume-header">
  4. <div class="resume-title">简历模板下载</div>
  5. </div>
  6. <div style="height: calc(100% - 58px); width: 100%;" class="mt-3">
  7. <div v-if="vip" class="mt-5">
  8. <CtTable
  9. :items="list"
  10. :headers="headers"
  11. :loading="false"
  12. :elevation="0"
  13. :isTools="false"
  14. :showPage="false"
  15. >
  16. <template #actions="{ item }">
  17. <v-btn variant="text" color="primary" prepend-icon="mdi-eye-outline" @click="previewFile(item.url)">预览</v-btn>
  18. <v-btn variant="text" color="primary" prepend-icon="mdi-square-edit-outline" @click="handleDownload(item)">下载</v-btn>
  19. </template>
  20. </CtTable>
  21. </div>
  22. <div
  23. v-else
  24. style="height: 100%;"
  25. :class="{
  26. 'disable1': userStore.userInfo?.vipExpireDate > Date.now() && !userStore.userInfo?.entitlement?.resumeTemplate,
  27. 'disable2': !userStore.userInfo?.vipExpireDate || (userStore.userInfo?.vipExpireDate && userStore.userInfo?.vipExpireDate < Date.now())
  28. }"
  29. ></div>
  30. </div>
  31. </div>
  32. </template>
  33. <script setup>
  34. defineOptions({name: 'resume-template'})
  35. import { ref, computed } from 'vue'
  36. import { previewFile, getBlob, saveAs } from '@/utils'
  37. import { useUserStore } from '@/store/user'
  38. const userStore = useUserStore()
  39. // 简历模板列表
  40. const list = ref([
  41. { active: false, title: '创新精英简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E5%88%9B%E6%96%B0%E7%B2%BE%E8%8B%B1%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
  42. { active: false, title: '顶尖人才简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E9%A1%B6%E5%B0%96%E4%BA%BA%E6%89%8D%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
  43. { active: false, title: '高级职业经理人简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E9%AB%98%E7%BA%A7%E8%81%8C%E4%B8%9A%E7%BB%8F%E7%90%86%E4%BA%BA%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
  44. { active: false, title: '高效职场精英简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E9%AB%98%E6%95%88%E8%81%8C%E5%9C%BA%E7%B2%BE%E8%8B%B1%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.doc' },
  45. { active: false, title: '领导力简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E9%A2%86%E5%AF%BC%E5%8A%9B%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
  46. { active: false, title: '行业精英专属简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E8%A1%8C%E4%B8%9A%E7%B2%BE%E8%8B%B1%E4%B8%93%E5%B1%9E%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
  47. { active: false, title: '行业领袖简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E8%A1%8C%E4%B8%9A%E9%A2%86%E8%A2%96%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
  48. { active: false, title: '专业卓越简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E4%B8%93%E4%B8%9A%E5%8D%93%E8%B6%8A%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.doc' },
  49. { active: false, title: '卓越成就简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E5%8D%93%E8%B6%8A%E6%88%90%E5%B0%B1%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
  50. { active: false, title: '卓越职业轨迹简历模板', url: 'https://minio.menduner.com/dev/menduner/resumeTemplate/%E5%8D%93%E8%B6%8A%E8%81%8C%E4%B8%9A%E8%BD%A8%E8%BF%B9%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF.docx' },
  51. ])
  52. const headers = [
  53. { title: '简历模板名称', key: 'title', sortable: false },
  54. { title: '操作', key: 'actions', sortable: false, align: 'center' }
  55. ]
  56. const vip = computed(() => {
  57. return userStore.userInfo?.entitlement?.vipFlag && (userStore.userInfo?.vipExpireDate > Date.now()) && userStore.userInfo?.entitlement?.resumeTemplate
  58. })
  59. // 下载附件
  60. const handleDownload = (k) => {
  61. getBlob(k.url).then(blob => {
  62. saveAs(blob, k.title)
  63. })
  64. }
  65. </script>
  66. <style lang="scss" scoped>
  67. .tips {
  68. position: absolute;
  69. top: 50%;
  70. left: 50%;
  71. transform: translate(-50%, -50%);
  72. }
  73. .disable1 {
  74. position: relative;
  75. overflow: hidden;
  76. &::after {
  77. content: '当前会员套餐的福利不包含简历模板';
  78. position: absolute;
  79. display: flex;
  80. align-items: center;
  81. justify-content: center;
  82. font-size: 1.5em;
  83. font-family: 'MiSans-Bold';
  84. color: #fff;
  85. top: 0;
  86. border-radius: 12px;
  87. left: 0;
  88. width: 100%;
  89. height: 100%;
  90. background-color: rgba(0, 0, 0, 0.35);
  91. }
  92. }
  93. .disable2 {
  94. position: relative;
  95. overflow: hidden;
  96. &::after {
  97. content: '简历模板为会员福利内容';
  98. position: absolute;
  99. display: flex;
  100. align-items: center;
  101. justify-content: center;
  102. font-size: 1.5em;
  103. font-family: 'MiSans-Bold';
  104. color: #fff;
  105. top: 0;
  106. border-radius: 12px;
  107. left: 0;
  108. width: 100%;
  109. height: 100%;
  110. background-color: rgba(0, 0, 0, 0.35);
  111. }
  112. }
  113. </style>