congming_huose-apk/pages/launch/launch.vue

166 lines
3.6 KiB
Vue
Raw Normal View History

<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>