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.
 
 
 
 
 

175 lines
4.3 KiB

<template>
<div id="app" :class="{ 'screen-route-app': isScreenRoute }">
<div v-if="isScreenRoute" class="screen-route-shell">
<div class="screen-route-scale" :style="screenScaleStyle">
<transition name="fade" mode="out-in">
<router-view></router-view>
</transition>
</div>
</div>
<transition v-else name="fade" mode="out-in">
<router-view></router-view>
</transition>
<!-- 全局审批通知管理器 -->
<approval-notification-manager v-if="!isScreenRoute" ref="approvalNotificationManager"></approval-notification-manager>
</div>
</template>
<script>
import ApprovalNotificationManager from '@/components/ApprovalNotificationManager.vue'
import { SCREEN_DESIGN_HEIGHT, SCREEN_DESIGN_WIDTH, setScreenScale } from '@/utils/screenAdapt'
export default {
name: 'App',
components: {
ApprovalNotificationManager
},
data() {
return {
query: {},
version: '1.3.3',
isScreenRoute: false,
screenScale: 1
}
},
computed: {
screenScaleStyle() {
const scale = this.screenScale > 0 ? this.screenScale : 1
const percent = `${100 / scale}%`
return {
width: percent,
height: percent,
transform: `scale(${scale})`,
transformOrigin: 'left top'
}
}
},
watch: {
'$route.path': {
immediate: true,
handler() {
this.syncScreenRouteMode()
}
}
},
created () {
this.versionReload()
},
mounted() {
window.addEventListener('resize', this.handleWindowResize)
this.syncScreenRouteMode()
},
beforeDestroy() {
window.removeEventListener('resize', this.handleWindowResize)
document.body.classList.remove('screen-route-body')
setScreenScale(1)
},
methods: {
/**
* 版本检查及自动刷新
*/
versionReload(){
let version = this.version //版本号(每次上线前需要更新下版本号)
console.log('最新系统版本: ',version)
console.log('当前系统版本: ',this.version)
let versionLocal = localStorage.getItem('_version_');
if(version!=versionLocal){
localStorage.setItem('_version_',version);
this.version=versionLocal;
location.reload();
}
},
isScreenPath(path) {
return /^\/screen-/.test(String(path || ''))
},
syncScreenRouteMode() {
this.isScreenRoute = this.isScreenPath(this.$route && this.$route.path)
this.updateScreenBodyClass()
this.updateScreenScale()
},
updateScreenBodyClass() {
if (this.isScreenRoute) {
document.body.classList.add('screen-route-body')
} else {
document.body.classList.remove('screen-route-body')
}
},
handleWindowResize() {
this.updateScreenScale()
},
updateScreenScale() {
if (!this.isScreenRoute) {
this.screenScale = 1
setScreenScale(1)
return
}
const width = window.innerWidth || document.documentElement.clientWidth || SCREEN_DESIGN_WIDTH
const height = window.innerHeight || document.documentElement.clientHeight || SCREEN_DESIGN_HEIGHT
const scaleX = width / SCREEN_DESIGN_WIDTH
const scaleY = height / SCREEN_DESIGN_HEIGHT
const scale = Math.min(scaleX, scaleY)
this.screenScale = scale > 0 ? Number(scale.toFixed(6)) : 1
setScreenScale(this.screenScale)
},
/**
* 手动触发审批通知检查(供外部调用)
*/
checkApprovalNotifications() {
if (this.$refs.approvalNotificationManager) {
this.$refs.approvalNotificationManager.manualCheck()
}
},
/**
* 清除指定申请单的通知记录(审批完成后调用)
* @param {string} applyNo - 申请单号
*/
clearApprovalNotification(applyNo) {
if (this.$refs.approvalNotificationManager) {
this.$refs.approvalNotificationManager.clearNotification(applyNo)
}
}
}
}
</script>
<style>
body.screen-route-body {
overflow: hidden;
background: #000;
}
#app.screen-route-app {
width: 100vw;
height: 100vh;
overflow: hidden;
}
.screen-route-shell {
width: 100%;
height: 100%;
overflow: hidden;
}
.screen-route-scale {
width: 100%;
height: 100%;
overflow: hidden;
will-change: transform;
}
.screen-route-scale > * {
width: 100% !important;
height: 100% !important;
}
</style>