index.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <!-- src/pages/RegisterIframePage.vue -->
  2. <template>
  3. <div class="register-page">
  4. <van-nav-bar
  5. fixed
  6. safe-area-inset-top
  7. placeholder
  8. :title="title"
  9. left-arrow
  10. @click-left="onBack"
  11. />
  12. <div class="iframe-wrap">
  13. <div v-if="loading" class="loading">
  14. <van-loading size="24px" type="spinner" />
  15. <span class="loading-text">加载中…</span>
  16. </div>
  17. <iframe
  18. v-if="realSrc"
  19. class="iframe"
  20. :src="realSrc"
  21. frameborder="0"
  22. @load="onLoad"
  23. scrolling="none"
  24. allow="fullscreen; geolocation; microphone; camera; clipboard-read; clipboard-write"
  25. referrerpolicy="strict-origin-when-cross-origin"
  26. ></iframe>
  27. </div>
  28. </div>
  29. </template>
  30. <script setup lang="ts">
  31. import { ref, onMounted } from 'vue'
  32. import { useRouter } from 'vue-router'
  33. import { showFailToast } from 'vant'
  34. import { REGISTER_URL_KEY } from '@/constants/storage'
  35. interface Props {
  36. title?: string
  37. src?: string
  38. }
  39. const props = defineProps<Props>()
  40. const title = props.title ?? '注册'
  41. const router = useRouter()
  42. const loading = ref(true)
  43. const realSrc = ref('')
  44. const onBack = () => {
  45. if (history.length > 1) router.back()
  46. else router.replace({ name: 'Login' })
  47. }
  48. const onLoad = () => {
  49. loading.value = false
  50. }
  51. onMounted(() => {
  52. if (props.src) {
  53. realSrc.value = props.src
  54. return
  55. }
  56. const cached = sessionStorage.getItem(REGISTER_URL_KEY)
  57. if (cached) {
  58. realSrc.value = cached
  59. sessionStorage.removeItem(REGISTER_URL_KEY) // 一次性
  60. } else {
  61. showFailToast('未检测到注册链接,已返回登录页')
  62. router.back()
  63. }
  64. })
  65. </script>
  66. <style lang="scss" scoped>
  67. /* 固定导航高度(若你的 NavBar 不是 46px,这里改数值即可) */
  68. .register-page {
  69. --nav-height: 46px;
  70. height: 100dvh; /* 占满视口高度 */
  71. overflow: hidden; /* 外层不出现滚动条 */
  72. background: #fff;
  73. }
  74. /* 从 NavBar 底部贴到屏幕底部,永远填满剩余空间 */
  75. .iframe-wrap {
  76. position: fixed;
  77. top: var(--nav-height);
  78. left: 0;
  79. right: 0;
  80. bottom: 0;
  81. overflow: hidden; /* 禁止外层滚动 */
  82. }
  83. /* iframe 充满容器;用 100%,避免 100vw 引入横向滚动条 */
  84. .iframe {
  85. display: block;
  86. width: 100%;
  87. height: 100%;
  88. border: 0;
  89. }
  90. /* 简易加载遮罩 */
  91. .loading {
  92. position: absolute;
  93. inset: 0;
  94. z-index: 1;
  95. display: grid;
  96. place-items: center;
  97. background: rgba(255, 255, 255, 0.85);
  98. .loading-text {
  99. margin-top: 8px;
  100. font-size: 12px;
  101. color: #999;
  102. }
  103. }
  104. </style>