166 lines
3.6 KiB
Vue
166 lines
3.6 KiB
Vue
|
|
<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>
|