congming_huose-apk/pages/launch/launch.vue

166 lines
3.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="launch-root">
<app-top-push-notice />
<view class="launch-brand">
<image
class="launch-logo"
:src="logoSrc"
mode="aspectFit"
:lazy-load="false"
@error="onLogoError"
/>
<view class="launch-spinner" aria-hidden="true"></view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
done: false,
navScheduled: false,
splashStartedAt: 0,
/** 最短白屏展示时间,避免接口太快时页面被立刻关掉、本地图还没画出来 */
splashMinMs: 650,
logoSrc: '/static/newlogo.png'
}
},
onLoad() {
this.splashStartedAt = Date.now()
// this.ensureDefaultLanguage()
this.preloadLogo()
this.bootstrap()
},
methods: {
/** 本地未保存语言时,默认写入英文(与 common/i18n 的 storage key `language` 一致) */
ensureDefaultLanguage() {
try {
const lang = uni.getStorageSync('language')
if (lang === '' || lang === null || lang === undefined) {
uni.setStorageSync('language', 'en')
if (this.$i18n && typeof this.$i18n.setLanguage === 'function') {
this.$i18n.setLanguage('en')
}
}
} catch (e) {}
},
preloadLogo() {
try {
uni.getImageInfo({
src: this.logoSrc,
fail: () => {
console.warn('[launch] logo 路径无效或文件缺失:', this.logoSrc)
}
})
} catch (e) {}
},
onLogoError() {
console.warn('[launch] newlogo 加载失败,请确认 static/newlogo.png 已放入项目并重新编译')
},
relaunch(url) {
if (this.done || this.navScheduled) return
this.navScheduled = true
const go = () => {
if (this.done) return
this.done = true
uni.reLaunch({ url })
}
const elapsed = Date.now() - this.splashStartedAt
const wait = Math.max(0, this.splashMinMs - elapsed)
setTimeout(go, wait)
},
// 跳转到登录页
goLogin() {
this.relaunch('/pages/login/index')
},
// 跳转到首页
goHome() {
this.relaunch('/pages/index/index')
},
bootstrap() {
const timeoutMs = 15000
const timer = setTimeout(() => {
if (!this.done) {
console.warn('[launch] 校验超时,进入登录页')
this.goLogin()
}
}, timeoutMs)
const token = uni.getStorageSync('token')
if (!token) {
clearTimeout(timer)
this.goLogin()
return
}
this.$http
.get('/getInfo')
.then((res) => {
clearTimeout(timer)
if (this.done) return
if (res && res.code == 200 && res.user) {
try {
uni.setStorageSync('user', res.user)
} catch (e) {}
// 与登录页 getInfo 判断一致enablePin 可能为非布尔)
if (res.user.enablePin == true) {
this.relaunch('/pages/login/index')
} else {
this.goHome()
}
} else {
this.goLogin()
}
})
.catch(() => {
clearTimeout(timer)
if (!this.done) {
this.goLogin()
}
})
}
}
}
</script>
<style scoped>
.launch-root {
min-height: 100vh;
width: 100%;
background-color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
}
.launch-brand {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.launch-logo {
width: 280rpx;
height: 280rpx;
margin-bottom: 48rpx;
}
.launch-spinner {
width: 48rpx;
height: 48rpx;
border: 4rpx solid #e8e8e8;
border-top-color: #c8c8c8;
border-radius: 50%;
animation: launch-spin 0.75s linear infinite;
}
@keyframes launch-spin {
to {
transform: rotate(360deg);
}
}
</style>