123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- <template>
- <view class="hc-update-app-box" v-if="isShow">
- <view class="update-head-bar">
- <view class="head-bar">
- <image class="head-img" src="/static/update/1.png"/>
- <view class="relative flex">
- <view class="flex-1 text-white hc-p">
- <view class="text-34">发现新版本</view>
- <view class="mt-2">v{{versionData.versionNumber}}</view>
- </view>
- <view class="relative top--60 right-40">
- <c-lottie src='/static/update/2.json' width="240rpx" height='240rpx' :loop="true"/>
- </view>
- </view>
- </view>
- <view class="update-content-bar hc-p">
- <scroll-view scroll-y>
- <view class="text-gray-5 text-26">{{versionData.updateDate}}</view>
- <view class="mt-1">本次更新升级内容:</view>
- <view class="mt-3 text-gray-6" style="white-space: pre;">{{versionData.updateContent}}</view>
- </scroll-view>
- </view>
- <view class="update-action-bar">
- <view class="relative hc-p" v-if="isDownload">
- <view class="hc-flex justify-between mb-1">
- <view class="text-24 text-gray-5">已下载:{{downloaded}}</view>
- <view class="text-24 text-gray-5">总大小:{{totalFileSize}}</view>
- </view>
- <uv-line-progress :percentage="downloadNum"/>
- </view>
- <template v-else>
- <view class="hc-flex hc-p" v-if="versionData.constraintUpdate !== 1">
- <button class="cu-btn bg-blue-5 text-white flex-1 mr-2" @click="updateClick">立即更新</button>
- <button class="cu-btn bg-gray-4 text-white flex-1 ml-2" @click="nextTap">下次再说</button>
- </view>
- <view class="hc-flex hc-p" v-else>
- <button class="cu-btn bg-blue-5 text-white flex-1" @click="updateClick">立即更新</button>
- </view>
- </template>
- </view>
- </view>
- </view>
- </template>
- <script setup>
- import {onMounted, ref, watch} from "vue";
- import {getVersionData} from "~api/other";
- import website from '@/config/index';
- import {getObjValue} from "js-fast-way";
- import {filterSize} from "@/utils/utils";
- import {errorToast} from "@/utils/tools";
- import {useAppStore} from "@/store";
- //初始变量
- const store = useAppStore()
- const isShow = ref(false)
- const onUpdate = ref(store.onUpdate)
- const appUpdate = ref(store.appUpdate)
- const appInfo = ref({osName: '', version: ''})
- //渲染完成
- onMounted(() => {
- const {appVersion, appWgtVersion, osName} = uni.getSystemInfoSync();
- let version = appVersion
- if (appVersion === appWgtVersion) {
- version = appVersion
- } else if (!appVersion && appWgtVersion) {
- version = appWgtVersion
- } else if (appVersion && !appWgtVersion) {
- version = appVersion
- } else if (appVersion > appWgtVersion) {
- version = appVersion
- } else if (appVersion < appWgtVersion) {
- version = appWgtVersion
- }
- appInfo.value = {osName: osName, version: version}
- appUpdate.value.appVersion = version
- getVersionDataApi()
- })
- //监听
- watch(() => [
- store.onUpdate
- ], ([val]) => {
- if (val) {
- getVersionDataApi()
- }
- })
- //获取新版本信息
- const versionData = ref({})
- const getVersionDataApi = async () => {
- const {code, data} = await getUpdateDataApi()
- versionData.value = data
- appUpdate.value.version = data.versionNumber
- const toUpdate = appUpdate.value.toUpdate
- if (code === 200) {
- appUpdate.value.isUpdate = true
- isShow.value = toUpdate
- } else {
- appUpdate.value.isUpdate = false
- appUpdate.value.toUpdate = false
- }
- store.setAppUpdate(appUpdate.value)
- }
- const getUpdateDataApi = async () => {
- //获取完整包的版本信息
- const {code: ICode, data: IData} = await getVersionUpdateApi(0)
- if (ICode === 200) {
- return {code: 200, data: IData}
- }
- //获取热更新包
- const {code: YCode, data: YData} = await getVersionUpdateApi(1)
- if (YCode === 200) {
- return {code: 200, data: YData}
- }
- return {code: 300, data: YData}
- }
- //获取版本信息
- const getVersionUpdateApi = async (fileType) => {
- const { osName, version } = appInfo.value
- const type = osName === 'ios' ? 2 : 1
- const { data } = await getVersionData({
- softwareType: type,
- fileType: fileType,
- platform: website.platform
- })
- const res = getObjValue(data)
- if (res.versionNumber > version) {
- return {code: 200, data: res}
- } else {
- return {code: 300, data: res}
- }
- }
- //立即强制更新
- const isDownload = ref(false)
- const updateClick = async () => {
- const {osName} = appInfo.value
- const {fileType, fileUrl} = versionData.value
- //ios的完整安装包
- if (osName === 'ios' && fileType === 0) {
- plus.runtime.openURL(fileUrl)
- return false
- }
- //其他类型,安卓、ios的热更新包
- downloadFile(fileUrl)
- }
- //下载相关文件资料
- const downloadNum = ref(0)
- const totalFileSize = ref('')
- const downloaded = ref('')
- const downloadFile = (fileUrl) => {
- isDownload.value = true
- const downloadTask = uni.downloadFile({
- url: fileUrl,
- success: ({statusCode, tempFilePath}) => {
- if (statusCode === 200) {
- installAppFile(tempFilePath)
- } else {
- errorToast('下载失败,请联系管理员')
- nextTap()
- }
- },
- fail: () => {
- errorToast('下载失败,请联系管理员')
- nextTap()
- }
- });
- downloadTask.onProgressUpdate((res) => {
- const {totalBytesExpectedToWrite, totalBytesWritten, progress} = getObjValue(res)
- totalFileSize.value = filterSize(totalBytesExpectedToWrite)
- downloadNum.value = progress
- downloaded.value = filterSize(totalBytesWritten)
- });
- }
- //安装相关资源文件
- const installAppFile = (file) => {
- plus.runtime.install(file, {
- force: false
- }, function() {
- plus.runtime.restart();
- }, function(e) {
- console.log(e)
- errorToast('本次升级失败,请联系管理员')
- nextTap()
- });
- }
- //下次再说
- const nextTap = () => {
- appUpdate.value.toUpdate = false
- store.setAppUpdate(appUpdate.value)
- isShow.value = false
- isDownload.value = false
- }
- </script>
- <style scoped lang="scss">
- @import "./style.scss";
- </style>
|