Files
2025-04-30 14:04:34 +08:00

200 lines
5.8 KiB
Vue

<template>
<fu-popup v-model="isShow" mode="center" border-radius="16" :mask-close-able="false">
<view class="update-box">
<view class="title">{{ $t('发现新版本') }}</view>
<textarea class="content" disabled :value="content"></textarea>
<view class="cu-progress sm striped active" v-if="loading > 0">
<view class="bg-theme" :style="[{ width: loading + '%' }]"></view>
</view>
<view class="foot solid-top">
<view class="flex-sub text-gray solid-right" @click="handleCancel">{{ $t('下次再说') }}</view>
<view class="flex-sub text-green" @click="handleConfirm">{{ $t('马上更新') }}</view>
</view>
</view>
</fu-popup>
</template>
<script>
/**
* author: 刘欢
* @description app检测升级组件
* @param {boolean} auto 是否自动检测更新
* **/
import { API_BASE_URL, SYSTEM_CONFIG } from '@/common/config.js'
export default {
name: 'app-update',
props: {
auto: {
type: Boolean,
default: false,
}, // 是否自动检测更新
},
data() {
return {
isShow: false,
content: '',
apkUrl: '',
loading: 0,
isLoad: false,
downloadTask: null,
}
},
methods: {
checkAppUpdate() {
console.log('检查更新')
const self = this
plus.runtime.getProperty(plus.runtime.appid, async function (widgetInfo) {
console.log('本地版本信息', widgetInfo)
// 请求版本检查接口
const [error, result] = await uni.request({
url: API_BASE_URL + global.apiUrls.publicUpdateAPP,
header: {
'content-type': 'application/x-www-form-urlencoded',
},
data: {
app_ident: 'user',
client: SYSTEM_CONFIG.platform === 'Android' ? 3 : 2,
},
method: 'POST',
})
console.log('result.data', result.data)
if (result.data.code == 1) {
const data = result.data.data
console.log('接口信息', data)
if (data.is_take == 1) {
console.log('是有效的版本')
if (data.type == 2) {
console.log('是整包更新')
if (data.version > widgetInfo.versionCode) {
console.log('有新版本')
self.content = data.readme
self.apkUrl = data.url
self.isShow = true
} else {
console.log('是否是自动检测', self.auto)
if (!self.auto) {
console.log('??????')
self.$message.info(global.i18n.t('已是最新版本~'))
}
}
} else {
console.log('是热更新')
if (data.version > widgetInfo.versionCode) {
uni.downloadFile({
url: data.url,
success: (downloadResult) => {
if (downloadResult.statusCode === 200) {
plus.runtime.install(downloadResult.tempFilePath, {
force: true,
})
self.$util.showModal({
title: global.i18n.t('提示'),
content: global.i18n.t('已准备好新版本,是否重启体验新版?'),
confirmText: global.i18n.t('重启'),
success: (res) => {
if (res.confirm) {
plus.runtime.restart()
}
},
})
}
},
})
} else {
console.log('是否是自动检测', self.auto)
if (!self.auto) {
self.$message.info(global.i18n.t('已是最新版本~'))
}
}
}
}
}
})
},
// 取消
handleCancel() {
this.downloadTask && this.downloadTask.abort()
this.isShow = false
},
// 确定
handleConfirm() {
/* #ifdef APP-PLUS */
if (plus.os.name.toLowerCase() === 'android') {
console.log('是安卓系统')
if (this.isLoad) return
this.isLoad = true
this.downloadTask = uni.downloadFile({
url: this.apkUrl,
success: (downloadResult) => {
console.log('downloadResult 下载成功', downloadResult)
if (downloadResult.statusCode === 200) {
this.isShow = false
plus.runtime.install(downloadResult.tempFilePath, {
force: true,
})
plus.runtime.restart()
}
},
fail: (err) => {
console.log('ERROR', err)
if (err.errMsg == 'downloadFile:fail abort') {
this.$message.info(global.i18n.t('取消下载'))
} else {
this.$message.info(global.i18n.t('下载失败'))
}
},
complete: () => {
this.isLoad = false
},
})
this.downloadTask.onProgressUpdate((res) => {
this.loading = res.progress
})
} else {
console.log('是苹果系统,跳转到苹果应用商店')
plus.runtime.openURL(this.apkUrl)
}
/* #endif */
},
},
created() {
// #ifdef APP-PLUS
if (this.auto) {
setTimeout(() => {
this.checkAppUpdate()
}, 2500)
}
// #endif
},
}
</script>
<style lang="scss" scoped>
.update-box {
width: 500rpx;
background-color: #ffffff;
.title {
height: 100rpx;
line-height: 100rpx;
text-align: center;
font-size: 32rpx;
color: #333333;
}
.content {
width: 100%;
height: 500rpx;
padding: 0 32rpx 32rpx 32rpx;
box-sizing: border-box;
}
.foot {
height: 80rpx;
display: flex;
line-height: 80rpx;
text-align: center;
}
}
</style>