|                                                                                                                                                                                                                                                   |  | <template>  <view v-if="showSplash" class="splash-screen">    <!-- 富文本內容 -->    <view class="splash-content">      <image        :src="splashContent"        mode="aspectFit"        class="splash-image"        @error="onImageError"        @load="onImageLoad"      />    </view>        <!-- 跳過按鈕 -->    <view class="skip-button" >      <text class="skip-text">跳过  ({{ countdown }}s)</text>    </view>    <!-- 定位英語文字和中文文字到左下角 -->    <view class="text-container">      <text class="english-text">        {{ configParamContent('creen_en') }}      </text>      <text class="chinese-text">        {{ configParamContent('creen_zh') }}      </text>    </view>  </view></template>
<script>// import config from '../../mixins/config.js'
export default {  name: 'SplashScreen',  // mixins: [config],
  props: {    // 顯示時長(秒)
    duration: {      type: Number,      default: 5    }  },  data() {    return {      showSplash: false,      countdown: 5,      timer: null,      splashContent: ''    }  },  computed: {    image() {      try {        // 優先從配置獲取
        const configImage = this.configParamContent && this.configParamContent('creen_image')        if (configImage && configImage !== 'undefined' && configImage !== '') {          return configImage        }                // 備用方案:從本地存儲獲取
        const storageImage = uni.getStorageSync('screen_image')        if (storageImage && storageImage !== 'undefined' && storageImage !== '') {          return storageImage        }                return ''      } catch (error) {        console.error('獲取開屏圖片失敗:', error)        return ''      }    }  },  mounted() {    this.initSplash()        uni.hideTabBar()  },  beforeDestroy() {    this.clearTimer()  },  methods: {    // 初始化開動頁面
    async initSplash() {      try {        // 等待一小段時間確保 store 數據加載完成
        await this.$nextTick()                // #ifdef H5
        // H5环境下检查sessionStorage,判断是否在当前会话中已经显示过开屏动画
        const hasShownSplash = sessionStorage.getItem('splash_shown')        if (hasShownSplash) {          console.log('当前会话已显示过开屏动画,跳过')          this.$emit('close')          return        }        // #endif
                // 獲取圖片URL,優先使用配置,然後使用本地存儲
        let imageUrl = ''                // 嘗試從配置獲取
        if (this.$store.state.configList && this.$store.state.configList['creen_image']) {          imageUrl = this.configParamContent('creen_image')        }                // 如果配置中沒有,嘗試從本地存儲獲取
        if (!imageUrl) {          imageUrl = uni.getStorageSync('screen_image')        }                console.log('開屏圖片URL:', imageUrl)                // 如果有圖片URL才顯示開屏
        if (imageUrl && imageUrl !== 'undefined' && imageUrl !== '') {          this.splashContent = imageUrl          this.countdown = this.duration          this.showSplash = true                    // #ifdef H5
          // H5环境下设置sessionStorage标记,表示当前会话已显示过开屏动画
          sessionStorage.setItem('splash_shown', 'true')          // #endif
                    this.startCountdown()        } else {          console.log('沒有開屏圖片,跳過開屏動畫')          this.$emit('close')        }      } catch (error) {        console.error('獲取開動頁面內容失敗:', error)        // 發生錯誤時直接關閉開屏
        this.$emit('close')      }    },        // 開始倒計時
    startCountdown() {      this.timer = setInterval(() => {        this.countdown--        if (this.countdown <= 0) {          this.closeSplash()        }      }, 1000)    },        // 關閉開動頁面
    closeSplash() {      this.showSplash = false      uni.showTabBar({        animation: true      })      this.clearTimer()      this.$emit('close')    },        // 清除計時器
    clearTimer() {      if (this.timer) {        clearInterval(this.timer)        this.timer = null      }    },        // 圖片加載成功
    onImageLoad() {      console.log('開屏圖片加載成功')    },        // 圖片加載失敗
    onImageError(e) {      console.error('開屏圖片加載失敗:', e)      // 圖片加載失敗時直接關閉開屏
      this.closeSplash()    }  }}</script>
<style lang="scss" scoped>.splash-screen {  position: fixed;  top: 0;  left: 0;  width: 100vw;  height: 100vh;  background-color: #fff;  z-index: 9999;  display: flex;  flex-direction: column;  .splash-image{    width: 100%;    height: 100%;  }}
.splash-content {  flex: 1;  width: 100%;  height: 80%;  overflow: hidden;    // 富文本樣式
  :deep(rich-text) {    width: 100%;    height: 100%;    display: block;    img{      width: 100%;    height: 100%;    }  }}
.skip-button {  position: absolute;  top: 40rpx;  left: 40rpx;  background-color: #0000004D;
  border-radius: 100rpx;  width: 148rpx ;  height: 60rpx;  text-align: center;  z-index: 10000;      .skip-text {    font-size: 24rpx;    line-height: 60rpx;    color: #fff;  }}
// 文字容器定位到左下角
.text-container {  // position: absolute;
  // bottom: 80rpx;
  // left: 40rpx;
  // z-index: 10001;
  height: 20%;  width: 100%;  padding: 20rpx;  display: flex;  flex-direction: column;  gap: 30rpx;}
// 英文文字样式
.english-text {  font-family: PingFang SC;  font-weight: 600;  font-size: 32rpx; // 16px转换为rpx
  line-height: 48rpx; // 24px转换为rpx
  letter-spacing: 0;  color: black;  background: transparent;}
// 中文文字样式
.chinese-text {  font-family: PingFang SC;  // font-weight: 600;
  font-size: 32rpx; // 16px转换为rpx
  line-height: 48rpx; // 24px转换为rpx
  letter-spacing: 0;  color: black;  background: transparent;}
// 確保覆蓋 tabbar
.splash-screen {  // 覆蓋所有內容,包括 tabbar
  position: fixed !important;  z-index: 9999 !important;}</style>
 |