mrr.sj.front/components/upload-app/upload-app.vue

438 lines
12 KiB
Vue
Raw Permalink Normal View History

2026-03-24 11:45:13 +08:00
<template>
<uni-popup
ref="popup"
type="bottom"
border-radius="20rpx"
style="z-index: 99999"
:is-mask-click="false"
>
<view class="upload-app">
<image
src="/static/images/upload/bj.png"
class="upload-app__bj"
mode="aspectFit"
></image>
<view class="upload-app__main">
<view class="upload-app__main__title">发现新版本</view>
<view class="upload-app__main__version">
<text class="upload-app__main__version__text"
>v{{ newVersion }}已发布推荐更新</text
>
</view>
<view
class="upload-app__main__content__title"
v-if="this.apkUpdateContent"
>更新内容</view
>
<view class="upload-app__main__contents">
<rich-text
:nodes="this.apkUpdateContent"
v-if="this.apkUpdateContent"
></rich-text>
<!-- <view class="upload-app__main__contents__content"
>1.修复多处稳定性问题提升了应用的流程</view
>
<view class="upload-app__main__contents__content"
>2.修复多处稳定性问题提升了应用的流程</view
> -->
</view>
<view
class="upload-app__main__buttons"
v-if="this.is_force == 0 && !this.startUpload"
>
<view class="upload-app__main__buttons__Later">
<text
class="upload-app__main__buttons__Later__text"
@click="Updatelater"
>稍后更新</text
>
</view>
<view class="upload-app__main__buttons__immediately">
<text
class="upload-app__main__buttons__immediately__text"
@click="UpdateNow"
>立即更新</text
>
</view>
</view>
<view
class="upload-app__main__buttons"
v-else-if="this.is_force == 1 && !this.startUpload"
>
<view
class="upload-app__main__buttons__immediately Mandatory"
@click="UpdateNow"
>
<text class="upload-app__main__buttons__immediately__text"
>立即更新</text
>
</view>
</view>
<view class="upload-app__main__Progress" v-if="this.startUpload">
<view class="upload-app__main__Progress__bar">
<view
class="upload-app__main__Progress__bar__active"
:style="{ width: 495 * (updateProgress / 100) + 'rpx' }"
>
</view>
<view class="upload-app__main__Progress__bar__text">
{{ updateProgress }}%
</view>
</view>
<view class="upload-app__main__Progress__hint">
新版本正在努力更新中请耐心等待
</view>
</view>
</view>
</view>
</uni-popup>
</template>
<script>
2026-03-25 13:29:04 +08:00
import request from "@/utils/request";
2026-03-24 11:45:13 +08:00
import uniPopup from "@/uni_modules/uni-popup/components/uni-popup/uni-popup.vue";
export default {
name: "uploadAppVue",
data() {
return {
version: null, //现在版本
updateProgress: 0, //下载进度
newVersion: null, //最新版本
updateAPKPath: "", //更新地址
is_force: 0, //是否强更0为否1为是
startUpload: false, //是否开启跟新
down_type: null, //1是跳转2是下载
apkUpdateContent: "", //更新内容说明
updateType: "", //1资源包更新2版本更新
versionsFlag: 1, //1需要更新弹窗2已是最新版本弹窗3正在下载
latestVersionInfo: "", //已是最新版本弹窗内容
restartFlag: false, // 是否需要重启APP
show: true,
};
},
props: {
isHome: {
type: Boolean,
default: true,
},
},
created() {},
mounted() {
if (this.isHome) {
this.uploadApp();
}
// this.$refs.popup.open("center");
},
methods: {
Updatelater() {
let timestamp = Date.now();
uni.setStorageSync("updatelaterTime", timestamp);
this.$refs.popup.close();
// uni.showTabBar();
},
UpdateNow() {
if (this.down_type == 1) {
plus.runtime.openURL(this.updateAPKPath);
} else if (this.down_type == 2) {
this.startUpload = true;
this.uploadAppDowlond();
}
},
// app内跟新下载
uploadAppDowlond() {
const downloadTask = uni.downloadFile({
url: this.updateAPKPath,
success: (downloadResult) => {
if (downloadResult.statusCode === 200) {
plus.runtime.install(
downloadResult.tempFilePath,
{
force: false,
},
function () {
// 下载资源成功,重启应用
plus.runtime.restart();
},
function (e) {
// 下载资源失败
}
);
}
},
});
downloadTask.onProgressUpdate((res) => {
this.updateProgress = res.progress;
console.log("下载进度" + res.progress);
console.log("已经下载的数据长度" + res.totalBytesWritten);
console.log("预期需要下载的数据总长度" + res.totalBytesExpectedToWrite);
// 满足测试条件,取消下载任务。
// if (res.progress > 50) {
// downloadTask.abort();
// }
});
},
async uploadApp(type) {
// uploadAppDowlond()
try {
await this.getVersionNum();
if (!this.version) return;
// #ifdef APP-PLUS
await this.getUpdateInfo();
let timestamp = Date.now();
let updatelaterTime = uni.getStorageSync("updatelaterTime") || 0;
if (
Math.abs(timestamp - updatelaterTime) < 86400000 &&
this.is_force != 1 &&
type != "setting"
) {
return;
}
if (!this.newVersion) {
if (type == "setting") {
uni.showToast({
title: "当前已是最新版本",
icon: "none",
});
}
} else {
uni.hideTabBar();
this.$refs.popup.open("center");
}
// if (this.compareVersion(this.version, this.newVersion)) {
// uni.hideTabBar();
// this.$refs.popup.open("center");
// } else {
// uni.showToast({
// title: "当前已是最新版本",
// icon: "none",
// });
// }
// #endif
} catch (error) {
console.error("检查更新失败:", error);
}
},
getVersionNum() {
// 获取当前app的版本
const systemInfo = uni.getSystemInfoSync();
// 应用程序版本号
// 条件编译只在APP渲染
// #ifdef APP
this.version = systemInfo.appWgtVersion;
// #endif
// #ifdef H5
this.version = systemInfo.appVersion;
console.log(systemInfo.appVersion, "版本号");
// #endif
// #ifdef MP-WEIXIN
const accountInfo = uni.getAccountInfoSync();
this.version = accountInfo.miniProgram.version; // 小程序 版本号
console.log(accountInfo.miniProgram.version, "小程序版本号");
// #endif
return this.version;
},
async getUpdateInfo() {
2026-03-25 13:29:04 +08:00
const response = await request.post("/sj/getAppVersion");
2026-03-24 11:45:13 +08:00
this.newVersion = response.data?.version;
this.updateAPKPath = response.data?.url;
this.is_force = response.data?.is_force;
this.down_type = response.data?.down_type;
this.apkUpdateContent = response.data?.explain;
},
compareVersion(current, latest) {
const curParts = current.split(".").map(Number);
const latParts = latest.split(".").map(Number);
for (let i = 0; i < Math.max(curParts.length, latParts.length); i++) {
const cur = curParts[i] || 0;
const lat = latParts[i] || 0;
if (cur < lat) return true;
if (cur > lat) return false;
}
return false;
},
},
};
</script>
<style scoped lang="less">
.popupShow {
overflow: hidden;
position: fixed;
}
.upload-app {
width: 568rpx;
background-color: #ffff;
position: relative;
border-radius: 20rpx;
&__bj {
width: 568rpx;
height: 317rpx;
position: absolute;
left: 0;
top: -23rpx;
z-index: 0;
}
&__main {
z-index: 1;
position: relative;
&__title {
font-weight: 600;
font-size: 46rpx;
color: #333333;
line-height: 65rpx;
text-align: left;
font-style: normal;
padding: 40rpx 38rpx 14rpx 38rpx;
}
&__version {
margin-left: 38rpx;
width: auto;
display: inline;
// height: 33rpx;
padding: 4rpx 10rpx;
background: linear-gradient(136deg, #fed7f5 0%, #fbdce5 100%);
border-radius: 0rpx 10rpx 0rpx 10rpx;
&__text {
font-weight: 400;
font-size: 18rpx;
2026-06-02 11:39:23 +08:00
color: #FF4767;
2026-03-24 11:45:13 +08:00
line-height: 25rpx;
text-align: left;
font-style: normal;
}
}
&__content__title {
padding-left: 39rpx;
padding-top: 38rpx;
font-weight: 500;
font-size: 30rpx;
color: #333333;
line-height: 42rpx;
text-align: left;
font-style: normal;
}
&__contents {
padding: 20rpx 40rpx 40rpx 40rpx;
display: flex;
flex-wrap: wrap;
row-gap: 14rpx;
::v-deep p {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 26rpx;
color: #5e5e60;
line-height: 37rpx;
text-align: left;
font-style: normal;
}
}
&__buttons {
padding: 0rpx 40rpx 50rpx 40rpx;
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
align-items: center;
&__Later {
width: 236rpx;
height: 78rpx;
background: #f6f6f6;
border-radius: 39rpx;
display: flex;
align-items: center;
justify-content: center;
&__text {
font-weight: 500;
font-size: 30rpx;
color: #333333;
line-height: 42rpx;
text-align: left;
font-style: normal;
}
}
&__immediately {
width: 236rpx;
height: 78rpx;
2026-06-02 11:39:23 +08:00
background: #FF4767;
2026-03-24 11:45:13 +08:00
border-radius: 39rpx;
display: flex;
align-items: center;
justify-content: center;
&__text {
font-weight: 500;
font-size: 30rpx;
color: #ffffff;
line-height: 42rpx;
text-align: left;
font-style: normal;
}
}
&__immediately.Mandatory {
width: 100%;
}
}
&__Progress {
padding: 10rpx 40rpx 40rpx 40rpx;
&__bar {
margin-bottom: 20rpx;
width: 495rpx;
height: 28rpx;
background: #f0f1f3;
border-radius: 39rpx;
position: relative;
&__active {
height: 28rpx;
2026-06-02 11:39:23 +08:00
background: linear-gradient(270deg, #fe78b3 0%, #FF4767 100%);
2026-03-24 11:45:13 +08:00
border-radius: 39rpx;
}
&__text {
font-weight: 400;
font-size: 24rpx;
color: #333333;
text-align: left;
font-style: normal;
position: absolute;
left: 50%;
top: 50%;
transform: translate3d(-50%, -50%, 0);
}
}
&__hint {
font-weight: 400;
font-size: 20rpx;
color: #a5a6ad;
line-height: 28rpx;
text-align: left;
font-style: normal;
text-align: center;
}
}
}
}
</style>