webview.vue 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <template>
  2. <cwg-page-wrapper class="webview-page" :pageTitle="pageTitle" type="webview">
  3. <view class="page-container">
  4. <!-- WebView 内容区(自动占满剩余空间,不遮挡导航栏) -->
  5. <view class="web-view-container">
  6. <web-view :src="fileUrl" class="web-view" :webview-styles="webviewStyles" />
  7. </view>
  8. </view>
  9. </cwg-page-wrapper>
  10. </template>
  11. <script setup>
  12. import { ref, computed } from 'vue'
  13. import { onLoad } from '@dcloudio/uni-app'
  14. import Config from '@/config/index'
  15. const { Host80 } = Config
  16. import getWebBase from '@/utils/webBase'
  17. const webBase = getWebBase()
  18. import { useI18n } from 'vue-i18n'
  19. const { t } = useI18n()
  20. const fileUrl = ref('')
  21. const title = ref('')
  22. const pageTitle = computed(() => t(title.value || ''))
  23. const fileType = ref('')
  24. import useGlobalStore from '@/stores/use-global-store'
  25. const globalStore = useGlobalStore()
  26. const statusBarHeight = computed(() => globalStore.statusBarHeight || 0)
  27. // webview 样式(修复顶部安全区)
  28. const webviewStyles = computed(() => ({
  29. progress: {
  30. color: '#ea002a'
  31. },
  32. top: statusBarHeight.value + 56 + 'px',
  33. bounce: 'none',
  34. scrollIndicator: 'none'
  35. }))
  36. // 获取文件后缀
  37. const getFileExt = (name) => {
  38. if (!name) return ''
  39. return name.split('.').pop()?.toUpperCase()
  40. }
  41. onLoad((options) => {
  42. console.log('webview 接收参数:', options)
  43. title.value = options.title || '文件预览'
  44. const realUrl = decodeURIComponent(options.url || '')
  45. fileType.value = getFileExt(realUrl)
  46. // ✅ 核心修复:PDF 只编码一次,不再二次编码
  47. if (fileType.value === 'PDF') {
  48. fileUrl.value = `${Host80}${webBase}/iframe/pdf.html?pdf=${realUrl}&title=${title.value}`
  49. } else {
  50. fileUrl.value = realUrl
  51. }
  52. console.log('最终加载地址:', fileUrl.value)
  53. })
  54. </script>
  55. <style scoped lang="scss">
  56. @import "@/uni.scss";
  57. </style>