247 lines
5.6 KiB
Vue
247 lines
5.6 KiB
Vue
<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, reactive, ref } from 'vue';
|
||
import sheep from '@/sheep';
|
||
import { isEmpty } from 'lodash-es';
|
||
import { onShow } from '@dcloudio/uni-app';
|
||
// #ifdef MP-WEIXIN
|
||
import { onShareAppMessage } 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} 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} 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
|
||
// 微信小程序分享
|
||
onShareAppMessage(() => {
|
||
return {
|
||
title: shareInfo.value.title,
|
||
path: shareInfo.value.path,
|
||
imageUrl: shareInfo.value.image,
|
||
};
|
||
});
|
||
// #endif
|
||
|
||
onShow(() => {
|
||
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>
|