<script>
|
import config from './config'
|
import store from '@/store'
|
import { getToken } from '@/utils/auth'
|
import { getUnreadCount } from '@/api/message'
|
import storage from '@/utils/storage'
|
|
export default {
|
data() {
|
return {
|
messagePollingTimer: null,
|
lastToken: null // 用于检测 token 变化
|
}
|
},
|
onLaunch: function(options) {
|
this.lastToken = getToken()
|
this.initApp(options)
|
|
// 检查并清理存储空间
|
this.checkStorage()
|
|
// 监听用户登录事件
|
uni.$on('user-login', () => {
|
console.log('接收到用户登录事件,启动消息轮询')
|
const token = getToken()
|
if (token) {
|
this.lastToken = token
|
this.updateUnreadMessageBadge()
|
this.startMessagePolling()
|
}
|
})
|
|
// 监听用户登出事件
|
uni.$on('user-logout', () => {
|
console.log('接收到用户登出事件,停止消息轮询')
|
this.stopMessagePolling()
|
this.lastToken = null
|
// 清除消息徽标
|
uni.removeTabBarBadge({ index: 3 })
|
})
|
},
|
onShow: function() {
|
const currentToken = getToken()
|
|
// 检测 token 变化:从有到无(登出)
|
if (this.lastToken && !currentToken) {
|
console.log('检测到用户已登出,停止消息轮询')
|
this.stopMessagePolling()
|
this.lastToken = currentToken
|
return
|
}
|
|
// 检测 token 变化:从无到有(登录)
|
if (!this.lastToken && currentToken) {
|
console.log('检测到用户已登录,启动消息轮询')
|
this.lastToken = currentToken
|
}
|
|
// 应用显示时刷新未读消息数量
|
// 注意:只有已登录且不在登录页面时才调用
|
if (currentToken && !this.isLoginPage()) {
|
this.updateUnreadMessageBadge()
|
// 重新启动轮询(如果之前已停止)
|
if (!this.messagePollingTimer) {
|
this.startMessagePolling()
|
}
|
}
|
},
|
onHide: function() {
|
// 应用隐藏时停止轮询,节省资源
|
this.stopMessagePolling()
|
},
|
methods: {
|
// 初始化应用
|
initApp(options) {
|
// 初始化应用配置
|
this.initConfig()
|
// 检查用户登录状态并自动跳转到合适的登录页面
|
this.checkLoginAndRedirect(options)
|
|
// 注意:不在应用启动时自动启动轮询
|
// 只有在用户主动登录成功后才启动(通过 user-login 事件触发)
|
},
|
initConfig() {
|
this.globalData.config = config
|
},
|
// 检查登录状态并自动跳转到合适的登录页面
|
checkLoginAndRedirect(options) {
|
if (!getToken()) {
|
// 检查运行环境并跳转到对应的登录页面
|
// #ifdef MP-WEIXIN
|
// 在微信小程序环境中
|
try {
|
// 获取系统信息
|
const systemInfo = uni.getSystemInfoSync()
|
console.log('系统信息:', systemInfo)
|
|
// 检查environment字段是否为wxwork
|
if (systemInfo.environment === 'wxwork') {
|
console.log('检测到企业微信环境,跳转到企业微信免登页面')
|
// 构造带参数的URL
|
let url = '/pages/qylogin'
|
if (options && options.query) {
|
const queryParams = Object.keys(options.query).map(key => `${key}=${encodeURIComponent(options.query[key])}`).join('&')
|
if (queryParams) {
|
url += '?' + queryParams
|
}
|
}
|
this.$tab.reLaunch(url)
|
return
|
} else {
|
console.log('检测到普通微信环境,跳转到微信登录页面')
|
// 构造带参数的URL
|
let url = '/pages/login'
|
if (options && options.query) {
|
const queryParams = Object.keys(options.query).map(key => `${key}=${encodeURIComponent(options.query[key])}`).join('&')
|
if (queryParams) {
|
url += '?' + queryParams
|
}
|
}
|
this.$tab.reLaunch(url)
|
return
|
}
|
} catch (e) {
|
console.error('获取系统信息失败:', e)
|
// 默认跳转到普通登录页面
|
this.$tab.reLaunch('/pages/login')
|
}
|
// #endif
|
|
// #ifndef MP-WEIXIN
|
// 非微信小程序环境,跳转到普通登录页面
|
console.log('非微信小程序环境,跳转到普通登录页面')
|
let url = '/pages/login'
|
if (options && options.query) {
|
const queryParams = Object.keys(options.query).map(key => `${key}=${encodeURIComponent(options.query[key])}`).join('&')
|
if (queryParams) {
|
url += '?' + queryParams
|
}
|
}
|
this.$tab.reLaunch(url)
|
// #endif
|
}
|
},
|
|
// 判断当前是否在登录页面
|
isLoginPage() {
|
const pages = getCurrentPages()
|
if (pages.length === 0) {
|
return false
|
}
|
const currentPage = pages[pages.length - 1]
|
const route = currentPage.route || ''
|
// 判断是否为登录相关页面
|
return route.includes('login') || route.includes('register')
|
},
|
|
// 更新未读消息徽标
|
updateUnreadMessageBadge() {
|
// 检查是否已登录,未登录则不请求
|
if (!getToken()) {
|
console.log('用户未登录,跳过获取未读消息数量')
|
return
|
}
|
|
getUnreadCount().then(response => {
|
const count = response.data || 0
|
console.log('未读消息数量:', count)
|
|
if (count > 0) {
|
// 设置徽标
|
uni.setTabBarBadge({
|
index: 3, // 消息页面在tabBar中的索引位置(0开始)
|
text: count > 99 ? '99+' : count.toString()
|
})
|
} else {
|
// 移除徽标
|
uni.removeTabBarBadge({
|
index: 3
|
})
|
}
|
}).catch(error => {
|
console.error('获取未读消息数量失败:', error)
|
})
|
},
|
|
// 启动消息轮询
|
startMessagePolling() {
|
// 每30秒轮询一次
|
this.messagePollingTimer = setInterval(() => {
|
if (getToken()) {
|
this.updateUnreadMessageBadge()
|
} else {
|
// 如果用户已登出,停止轮询
|
this.stopMessagePolling()
|
}
|
}, 30000) // 30秒
|
},
|
|
// 停止消息轮询
|
stopMessagePolling() {
|
if (this.messagePollingTimer) {
|
clearInterval(this.messagePollingTimer)
|
this.messagePollingTimer = null
|
}
|
},
|
|
// 检查存储空间
|
checkStorage() {
|
try {
|
// 获取存储信息
|
const info = storage.getStorageInfo()
|
|
if (info) {
|
const usagePercent = (info.currentSize / info.limitSize) * 100
|
console.log(`💾 存储使用情况: ${usagePercent.toFixed(2)}% (${info.currentSize}KB / ${info.limitSize}KB)`)
|
|
// 如果使用超过 80%,自动清理
|
if (usagePercent > 80) {
|
console.warn('⚠️ 存储空间使用超过 80%,开始自动清理...')
|
storage.checkAndClean()
|
|
// 再次检查
|
const newInfo = storage.getStorageInfo()
|
if (newInfo) {
|
const newUsagePercent = (newInfo.currentSize / newInfo.limitSize) * 100
|
console.log(`✅ 清理后使用情况: ${newUsagePercent.toFixed(2)}%`)
|
}
|
}
|
}
|
} catch (e) {
|
console.error('检查存储失败:', e)
|
}
|
}
|
}
|
}
|
</script>
|
|
<style lang="scss">
|
@import '@/static/scss/index.scss'
|
</style>
|