You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							258 lines
						
					
					
						
							6.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							258 lines
						
					
					
						
							6.0 KiB
						
					
					
				
								<template>
							 | 
						|
								  <view
							 | 
						|
								    class="page-app"
							 | 
						|
								    :class="['theme-' + sys?.mode, 'main-' + sys?.theme, 'font-' + sys?.fontSize]"
							 | 
						|
								  >
							 | 
						|
								    <view class="page-main" :style="[bgMain]">
							 | 
						|
								      <!-- 顶部导航栏-情况1:默认通用顶部导航栏 -->
							 | 
						|
								      <su-navbar
							 | 
						|
								        v-if="navbar === 'normal'"
							 | 
						|
								        :title="title"
							 | 
						|
								        statusBar
							 | 
						|
								        :color="color"
							 | 
						|
								        :tools="tools"
							 | 
						|
								        :opacityBgUi="opacityBgUi"
							 | 
						|
								        @search="(e) => emits('search', e)"
							 | 
						|
								        :defaultSearch="defaultSearch"
							 | 
						|
								      />
							 | 
						|
								
							 | 
						|
								      <!-- 顶部导航栏-情况2:装修组件导航栏-标准 -->
							 | 
						|
								      <s-custom-navbar
							 | 
						|
								        v-else-if="navbar === 'custom' && navbarMode === 'normal'"
							 | 
						|
								        :data="navbarStyle"
							 | 
						|
								        :showLeftButton="showLeftButton"
							 | 
						|
								      />
							 | 
						|
								      <view class="page-body" :style="[bgBody]">
							 | 
						|
								        <!-- 顶部导航栏-情况3:沉浸式头部 -->
							 | 
						|
								        <su-inner-navbar v-if="navbar === 'inner'" :title="title" />
							 | 
						|
								        <view
							 | 
						|
								          v-if="navbar === 'inner'"
							 | 
						|
								          :style="[{ paddingTop: sheep?.$platform?.navbar + 'px' }]"
							 | 
						|
								        ></view>
							 | 
						|
								
							 | 
						|
								        <!-- 顶部导航栏-情况4:装修组件导航栏-沉浸式 -->
							 | 
						|
								        <s-custom-navbar
							 | 
						|
								          v-if="navbar === 'custom' && navbarMode === 'inner'"
							 | 
						|
								          :data="navbarStyle"
							 | 
						|
								          :showLeftButton="showLeftButton"
							 | 
						|
								        />
							 | 
						|
								
							 | 
						|
								        <!-- 页面内容插槽 -->
							 | 
						|
								        <slot />
							 | 
						|
								
							 | 
						|
								        <!-- 底部导航 -->
							 | 
						|
								        <s-tabbar v-if="tabbar !== ''" :path="tabbar" />
							 | 
						|
								      </view>
							 | 
						|
								    </view>
							 | 
						|
								
							 | 
						|
								    <view class="page-modal">
							 | 
						|
								      <!-- 全局授权弹窗 -->
							 | 
						|
								      <s-auth-modal />
							 | 
						|
								      <!-- 全局分享弹窗 -->
							 | 
						|
								      <s-share-modal :shareInfo="shareInfo" />
							 | 
						|
								      <!-- 全局快捷入口 -->
							 | 
						|
								      <s-menu-tools />
							 | 
						|
								    </view>
							 | 
						|
								  </view>
							 | 
						|
								</template>
							 | 
						|
								
							 | 
						|
								<script setup>
							 | 
						|
								  /**
							 | 
						|
								   * 模板组件 - 提供页面公共组件,属性,方法
							 | 
						|
								   */
							 | 
						|
								  import { computed, onMounted } from 'vue';
							 | 
						|
								  import sheep from '@/sheep';
							 | 
						|
								  import { isEmpty } from 'lodash-es';
							 | 
						|
								  // #ifdef MP-WEIXIN
							 | 
						|
								  import { onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app';
							 | 
						|
								  // #endif
							 | 
						|
								
							 | 
						|
								  const props = defineProps({
							 | 
						|
								    title: {
							 | 
						|
								      type: String,
							 | 
						|
								      default: '',
							 | 
						|
								    },
							 | 
						|
								    navbar: {
							 | 
						|
								      type: String,
							 | 
						|
								      default: 'normal',
							 | 
						|
								    },
							 | 
						|
								    opacityBgUi: {
							 | 
						|
								      type: String,
							 | 
						|
								      default: 'bg-white',
							 | 
						|
								    },
							 | 
						|
								    color: {
							 | 
						|
								      type: String,
							 | 
						|
								      default: '',
							 | 
						|
								    },
							 | 
						|
								    tools: {
							 | 
						|
								      type: String,
							 | 
						|
								      default: 'title',
							 | 
						|
								    },
							 | 
						|
								    keyword: {
							 | 
						|
								      type: String,
							 | 
						|
								      default: '',
							 | 
						|
								    },
							 | 
						|
								    navbarStyle: {
							 | 
						|
								      type: Object,
							 | 
						|
								      default: () => ({
							 | 
						|
								        styleType: '',
							 | 
						|
								        type: '',
							 | 
						|
								        color: '',
							 | 
						|
								        src: '',
							 | 
						|
								        list: [],
							 | 
						|
								        alwaysShow: 0,
							 | 
						|
								      }),
							 | 
						|
								    },
							 | 
						|
								    bgStyle: {
							 | 
						|
								      type: Object,
							 | 
						|
								      default: () => ({
							 | 
						|
								        src: '',
							 | 
						|
								        color: 'var(--ui-BG-1)',
							 | 
						|
								      }),
							 | 
						|
								    },
							 | 
						|
								    tabbar: {
							 | 
						|
								      type: [String, Boolean],
							 | 
						|
								      default: '',
							 | 
						|
								    },
							 | 
						|
								    onShareAppMessage: {
							 | 
						|
								      type: [Boolean, Object],
							 | 
						|
								      default: true,
							 | 
						|
								    },
							 | 
						|
								    leftWidth: {
							 | 
						|
								      type: [Number, String],
							 | 
						|
								      default: 100,
							 | 
						|
								    },
							 | 
						|
								    rightWidth: {
							 | 
						|
								      type: [Number, String],
							 | 
						|
								      default: 100,
							 | 
						|
								    },
							 | 
						|
								    defaultSearch: {
							 | 
						|
								      type: String,
							 | 
						|
								      default: '',
							 | 
						|
								    },
							 | 
						|
								    //展示返回按钮
							 | 
						|
								    showLeftButton: {
							 | 
						|
								      type: Boolean,
							 | 
						|
								      default: false,
							 | 
						|
								    },
							 | 
						|
								  });
							 | 
						|
								  const emits = defineEmits(['search']);
							 | 
						|
								
							 | 
						|
								  const sysStore = sheep.$store('sys');
							 | 
						|
								  const userStore = sheep.$store('user');
							 | 
						|
								  const appStore = sheep.$store('app');
							 | 
						|
								  const modalStore = sheep.$store('modal');
							 | 
						|
								  const sys = computed(() => sysStore);
							 | 
						|
								
							 | 
						|
								  // 导航栏模式(因为有自定义导航栏 需要计算)
							 | 
						|
								  const navbarMode = computed(() => {
							 | 
						|
								    if (props.navbar === 'normal' || props.navbarStyle.styleType === 'normal') {
							 | 
						|
								      return 'normal';
							 | 
						|
								    }
							 | 
						|
								    return 'inner';
							 | 
						|
								  });
							 | 
						|
								
							 | 
						|
								  // 背景1
							 | 
						|
								  const bgMain = computed(() => {
							 | 
						|
								    if (navbarMode.value === 'inner') {
							 | 
						|
								      return {
							 | 
						|
								        background: `${props.bgStyle.backgroundColor || props.bgStyle.color} url(${sheep.$url.cdn(
							 | 
						|
								          props.bgStyle.backgroundImage,
							 | 
						|
								        )}) no-repeat top center / 100% auto`,
							 | 
						|
								      };
							 | 
						|
								    }
							 | 
						|
								    return {};
							 | 
						|
								  });
							 | 
						|
								
							 | 
						|
								  // 背景2
							 | 
						|
								  const bgBody = computed(() => {
							 | 
						|
								    if (navbarMode.value === 'normal') {
							 | 
						|
								      return {
							 | 
						|
								        background: `${props.bgStyle.backgroundColor || props.bgStyle.color} url(${sheep.$url.cdn(
							 | 
						|
								          props.bgStyle.backgroundImage,
							 | 
						|
								        )}) no-repeat top center / 100% auto`,
							 | 
						|
								      };
							 | 
						|
								    }
							 | 
						|
								    return {};
							 | 
						|
								  });
							 | 
						|
								
							 | 
						|
								  // 分享信息
							 | 
						|
								  const shareInfo = computed(() => {
							 | 
						|
								    if (props.onShareAppMessage === true) {
							 | 
						|
								      return sheep.$platform.share.getShareInfo();
							 | 
						|
								    } else {
							 | 
						|
								      if (!isEmpty(props.onShareAppMessage)) {
							 | 
						|
								        sheep.$platform.share.updateShareInfo(props.onShareAppMessage);
							 | 
						|
								        return props.onShareAppMessage;
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								    return {};
							 | 
						|
								  });
							 | 
						|
								
							 | 
						|
								  // #ifdef MP-WEIXIN
							 | 
						|
								  uni.showShareMenu({
							 | 
						|
								    withShareTicket: true,
							 | 
						|
								    menus: ['shareAppMessage', 'shareTimeline'],
							 | 
						|
								  });
							 | 
						|
								  // 微信小程序分享好友
							 | 
						|
								  onShareAppMessage(() => {
							 | 
						|
								    return {
							 | 
						|
								      title: shareInfo.value.title,
							 | 
						|
								      path: shareInfo.value.forward.path,
							 | 
						|
								      imageUrl: shareInfo.value.image,
							 | 
						|
								    };
							 | 
						|
								  });
							 | 
						|
								  // 微信小程序分享朋友圈
							 | 
						|
								  onShareTimeline(() => {
							 | 
						|
								    return {
							 | 
						|
								      title: shareInfo.value.title,
							 | 
						|
								      query: shareInfo.value.forward.path,
							 | 
						|
								      imageUrl: shareInfo.value.image,
							 | 
						|
								    };
							 | 
						|
								  });
							 | 
						|
								  // #endif
							 | 
						|
								
							 | 
						|
								  // 组件中使用 onMounted 监听页面加载,不是页面组件不使用 onShow
							 | 
						|
								  onMounted(()=>{
							 | 
						|
								    if (!isEmpty(shareInfo.value)) {
							 | 
						|
								      sheep.$platform.share.updateShareInfo(shareInfo.value);
							 | 
						|
								    }
							 | 
						|
								  })
							 | 
						|
								</script>
							 | 
						|
								
							 | 
						|
								<style lang="scss" scoped>
							 | 
						|
								  .page-app {
							 | 
						|
								    position: relative;
							 | 
						|
								    color: var(--ui-TC);
							 | 
						|
								    background-color: var(--ui-BG-1) !important;
							 | 
						|
								    z-index: 2;
							 | 
						|
								    display: flex;
							 | 
						|
								    width: 100%;
							 | 
						|
								    height: 100vh;
							 | 
						|
								
							 | 
						|
								    .page-main {
							 | 
						|
								      position: absolute;
							 | 
						|
								      z-index: 1;
							 | 
						|
								      width: 100%;
							 | 
						|
								      min-height: 100%;
							 | 
						|
								      display: flex;
							 | 
						|
								      flex-direction: column;
							 | 
						|
								
							 | 
						|
								      .page-body {
							 | 
						|
								        width: 100%;
							 | 
						|
								        position: relative;
							 | 
						|
								        z-index: 1;
							 | 
						|
								        flex: 1;
							 | 
						|
								      }
							 | 
						|
								
							 | 
						|
								      .page-img {
							 | 
						|
								        width: 100vw;
							 | 
						|
								        height: 100vh;
							 | 
						|
								        position: absolute;
							 | 
						|
								        top: 0;
							 | 
						|
								        left: 0;
							 | 
						|
								        z-index: 0;
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								</style>
							 |