From 6afb492942b17ebdb80f8e57af1b0df7ba5ee821 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期四, 09 四月 2026 15:29:50 +0800
Subject: [PATCH] fix: 版本更新修改
---
src/pages/index.vue | 2
src/pages/login.vue | 23 +++
src/pages/works.vue | 3
src/components/el-progress.vue | 56 +++++++++
src/components/DownloadProgressMask.vue | 83 +++++++++++++
src/pages/message.vue | 3
src/pages/mine.vue | 20 +++
src/utils/versionUpgrade.js | 95 ++++++++++++---
src/config.js | 47 ++++---
src/App.vue | 1
10 files changed, 288 insertions(+), 45 deletions(-)
diff --git a/src/App.vue b/src/App.vue
index 124164b..a238560 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -10,6 +10,7 @@
import { confirmMessage } from "@/api/login.js";
const showSplash = ref(true);
+
onMounted(() => {
setTimeout(() => {
showSplash.value = false;
diff --git a/src/components/DownloadProgressMask.vue b/src/components/DownloadProgressMask.vue
new file mode 100644
index 0000000..05a5874
--- /dev/null
+++ b/src/components/DownloadProgressMask.vue
@@ -0,0 +1,83 @@
+<template>
+ <view v-if="state.show" class="dpm-mask" @touchmove.stop.prevent @tap.stop>
+ <view class="dpm-card" @tap.stop>
+ <view class="dpm-title">{{ state.title }}</view>
+ <ElProgress :percentage="state.progress" :stroke-width="12" :show-text="true" color="#0D867F" />
+ </view>
+ </view>
+</template>
+
+<script setup>
+import { reactive, onUnmounted } from "vue";
+import bus from "@/plugins/bus";
+import ElProgress from "@/components/el-progress.vue";
+
+const state = reactive({
+ show: false,
+ progress: 0,
+ title: "鏇存柊鍖呬笅杞戒腑...",
+});
+
+const handle = (payload = {}) => {
+ if (!payload || typeof payload !== "object") return;
+ if (payload.show === false) {
+ state.show = false;
+ state.progress = 0;
+ state.title = "鏇存柊鍖呬笅杞戒腑...";
+ // 涓嬭浇缁撴潫锛氭仮澶� tabBar锛岄伩鍏嶅簳閮ㄤ笉鍙偣
+ try { uni.showTabBar({ animation: false }); } catch (e) {}
+ return;
+ }
+ if (payload.show === true) state.show = true;
+ if (typeof payload.progress === "number" && Number.isFinite(payload.progress)) {
+ state.progress = Math.max(0, Math.min(100, Math.floor(payload.progress)));
+ }
+ if (payload.title) state.title = String(payload.title);
+
+ // 涓嬭浇杩涜涓細闅愯棌鍘熺敓 tabBar锛堝師鐢熷眰绾ч珮浜庨〉闈㈤伄缃╋紝鍚﹀垯浠嶅彲鐐瑰嚮锛�
+ if (state.show) {
+ try { uni.hideTabBar({ animation: false }); } catch (e) {}
+ }
+};
+
+// 浜嬩欢鐩戝惉蹇呴』灏芥棭娉ㄥ唽锛坰etup 闃舵灏辨敞鍐岋級锛岄伩鍏嶄笅杞藉紑濮嬫椂杩樻湭 mounted 瀵艰嚧閿欒繃棣栨 show 浜嬩欢
+// bus.ts 鍚屽悕浜嬩欢鍙兘缁戝畾涓�娆★細鍏� off 鍐� on锛岀‘淇濆缁堟湁鏁�
+try { bus.$off("versionUpgrade:downloadProgress"); } catch (e) {}
+try { bus.$on("versionUpgrade:downloadProgress", handle); } catch (e) {}
+
+onUnmounted(() => {
+ try { bus.$off("versionUpgrade:downloadProgress"); } catch (e) {}
+});
+</script>
+
+<style scoped lang="scss">
+.dpm-mask {
+ position: fixed;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 9999;
+ background: rgba(0, 0, 0, 0.45);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.dpm-card {
+ width: 620rpx;
+ padding: 28rpx 28rpx 22rpx;
+ background: #ffffff;
+ border-radius: 20rpx;
+ box-shadow: 0 12rpx 36rpx rgba(0, 0, 0, 0.18);
+}
+
+.dpm-title {
+ text-align: center;
+ font-size: 32rpx;
+ font-weight: 600;
+ color: rgba(0, 0, 0, 0.85);
+ margin-bottom: 18rpx;
+}
+</style>
+
diff --git a/src/components/el-progress.vue b/src/components/el-progress.vue
new file mode 100644
index 0000000..efab143
--- /dev/null
+++ b/src/components/el-progress.vue
@@ -0,0 +1,56 @@
+<template>
+ <view class="el-progress">
+ <view class="el-progress-bar">
+ <view class="el-progress-bar__outer" :style="{ height: `${strokeWidth}px` }">
+ <view class="el-progress-bar__inner" :style="innerStyle" />
+ </view>
+ </view>
+ <view v-if="showText" class="el-progress__text">{{ text }}</view>
+ </view>
+</template>
+
+<script setup>
+import { computed } from "vue";
+
+const props = defineProps({
+ percentage: { type: Number, default: 0 },
+ strokeWidth: { type: Number, default: 10 },
+ showText: { type: Boolean, default: true },
+ color: { type: String, default: "#409EFF" },
+});
+
+const safePercent = computed(() => {
+ const n = Number(props.percentage);
+ if (!Number.isFinite(n)) return 0;
+ return Math.max(0, Math.min(100, Math.floor(n)));
+});
+
+const innerStyle = computed(() => ({
+ width: `${safePercent.value}%`,
+ backgroundColor: props.color,
+}));
+
+const text = computed(() => `${safePercent.value}%`);
+</script>
+
+<style scoped>
+.el-progress {
+ width: 100%;
+}
+.el-progress-bar__outer {
+ background-color: rgba(0, 0, 0, 0.08);
+ border-radius: 100px;
+ overflow: hidden;
+}
+.el-progress-bar__inner {
+ height: 100%;
+ border-radius: 100px;
+ transition: width 0.15s ease;
+}
+.el-progress__text {
+ margin-top: 10rpx;
+ text-align: center;
+ font-size: 26rpx;
+ color: rgba(0, 0, 0, 0.55);
+}
+</style>
diff --git a/src/config.js b/src/config.js
index 37aa278..6fb4717 100644
--- a/src/config.js
+++ b/src/config.js
@@ -1,28 +1,29 @@
// 搴旂敤鍏ㄥ眬閰嶇疆
const config = {
- baseUrl: 'http://1.15.17.182:9003',
- fileUrl: 'http://1.15.17.182:9003',
- // 搴旂敤淇℃伅
- appInfo: {
- // 搴旂敤鍚嶇О
- name: "ruoyi-app-vue3",
+ baseUrl: "http://1.15.17.182:9003",
+ fileUrl: "http://1.15.17.182:9002",
+ // 搴旂敤淇℃伅
+ appInfo: {
+ // 搴旂敤鍚嶇О
+ name: "ruoyi-app-vue3",
// 搴旂敤鐗堟湰锛堜笌 manifest.json 鐨� versionName 淇濇寔涓�鑷达級
version: "1.0.0",
- // 搴旂敤logo
- logo: "/static/app-logo.png",
- // 瀹樻柟缃戠珯
- site_url: "http://ruoyi.vip",
- // 鏀跨瓥鍗忚
- agreements: [{
- title: "闅愮鏀跨瓥",
- url: "https://ruoyi.vip/protocol.html"
- },
- {
- title: "鐢ㄦ埛鏈嶅姟鍗忚",
- url: "https://ruoyi.vip/protocol.html"
- }
- ]
- }
- }
+ // 搴旂敤logo
+ logo: "/static/app-logo.png",
+ // 瀹樻柟缃戠珯
+ site_url: "http://ruoyi.vip",
+ // 鏀跨瓥鍗忚
+ agreements: [
+ {
+ title: "闅愮鏀跨瓥",
+ url: "https://ruoyi.vip/protocol.html",
+ },
+ {
+ title: "鐢ㄦ埛鏈嶅姟鍗忚",
+ url: "https://ruoyi.vip/protocol.html",
+ },
+ ],
+ },
+};
- export default config
\ No newline at end of file
+export default config;
diff --git a/src/pages/index.vue b/src/pages/index.vue
index 9ad0a65..3998a68 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -197,6 +197,7 @@
<view class="bottom-space" />
</scroll-view>
+ <DownloadProgressMask />
</view>
</template>
@@ -205,6 +206,7 @@
import { onShow } from "@dcloudio/uni-app";
import { analysisCustomerContractAmounts, getBusiness } from "@/api/viewIndex";
import { createVersionUpgradeChecker } from "@/utils/versionUpgrade";
+import DownloadProgressMask from "@/components/DownloadProgressMask.vue";
const imgNum1 = "/static/images/index/num1.png";
const imgNum2 = "/static/images/index/num2.png";
diff --git a/src/pages/login.vue b/src/pages/login.vue
index 29bc9bb..ee49113 100644
--- a/src/pages/login.vue
+++ b/src/pages/login.vue
@@ -264,18 +264,33 @@
// #ifdef APP-PLUS
try {
+ // #ifdef APP-PLUS
// @ts-ignore
- if (plus?.runtime?.version) {
+ if (plus?.runtime?.getProperty) {
// @ts-ignore
- versionName.value = plus.runtime.version;
- console.log("[login-version] 褰撳墠鐜=APP-PLUS锛岀増鏈�=", versionName.value);
+ const appid = plus.runtime.appid;
+ // @ts-ignore
+ plus.runtime.getProperty(appid, (info) => {
+ const v = info?.version || info?.versionName || "";
+ if (v) {
+ versionName.value = String(v);
+ console.log("[login-version] 褰撳墠鐜=APP-PLUS锛岀増鏈�=", versionName.value);
+ } else {
+ console.log("[login-version] APP-PLUS 鑾峰彇鍒扮殑鐗堟湰瀛楁涓虹┖锛屼娇鐢ㄩ粯璁ゅ��:", versionName.value);
+ }
+ console.log("[login-version] 鏈�缁堢増鏈彿:", versionName.value);
+ });
+ } else {
+ console.log("[login-version] APP-PLUS 鐜涓嬬己灏� getProperty锛屼娇鐢ㄩ粯璁ゅ��:", versionName.value);
+ console.log("[login-version] 鏈�缁堢増鏈彿:", versionName.value);
}
+ // #endif
} catch (e) {
// 鑾峰彇澶辫触鏃朵娇鐢ㄩ粯璁ゅ��
console.log("[login-version] APP-PLUS 鑾峰彇鐗堟湰澶辫触:", e);
+ console.log("[login-version] 鏈�缁堢増鏈彿:", versionName.value);
}
// #endif
- console.log("[login-version] 鏈�缁堢増鏈彿:", versionName.value);
loadPassword();
getUserLoginFacotryList();
diff --git a/src/pages/message.vue b/src/pages/message.vue
index 22947bc..d035392 100644
--- a/src/pages/message.vue
+++ b/src/pages/message.vue
@@ -60,6 +60,8 @@
<text class="loading-more-text">鍔犺浇鏇村...</text>
</view>
</scroll-view>
+
+ <DownloadProgressMask />
</view>
</template>
@@ -68,6 +70,7 @@
import { onShow } from "@dcloudio/uni-app";
import { listNotice, confirmMessage, getNoticeCount } from "@/api/login.js";
import useUserStore from "@/store/modules/user";
+ import DownloadProgressMask from "@/components/DownloadProgressMask.vue";
// 鏍囩椤垫暟鎹�
const tabList = [
diff --git a/src/pages/mine.vue b/src/pages/mine.vue
index 0961130..9be7b96 100644
--- a/src/pages/mine.vue
+++ b/src/pages/mine.vue
@@ -73,6 +73,12 @@
<view class="card-illu faq"></view>
</view>
</view> -->
+
+ <view class="version-wrap">
+ <text class="version-text">鐗堟湰鍙凤細{{ version }}</text>
+ </view>
+
+ <DownloadProgressMask />
</view>
</template>
@@ -81,6 +87,7 @@
import config from '@/config.js'
import { getUserProfile } from "@/api/system/user";
import useUserStore from '@/store/modules/user'
+import DownloadProgressMask from "@/components/DownloadProgressMask.vue";
const userStore = useUserStore()
const name = userStore.name;
const roleName = userStore.roleName;
@@ -169,6 +176,19 @@
/* #endif */
}
+/* 鐗堟湰鍙� */
+.version-wrap {
+ width: 100%;
+ text-align: center;
+ margin-top: 18px;
+ padding-bottom: 14px;
+}
+
+.version-text {
+ font-size: 12px;
+ color: #999;
+}
+
/* 椤堕儴涓汉淇℃伅鍗� */
.profile-card {
display: flex;
diff --git a/src/pages/works.vue b/src/pages/works.vue
index be29a24..8d37e74 100644
--- a/src/pages/works.vue
+++ b/src/pages/works.vue
@@ -264,6 +264,8 @@
</up-grid>
</view>
</view>
+
+ <DownloadProgressMask />
</view>
</template>
@@ -273,6 +275,7 @@
import { userLoginFacotryList } from "@/api/login";
import { getProductWorkOrderById } from "@/api/productionManagement/productionReporting";
import { createVersionUpgradeChecker } from "@/utils/versionUpgrade";
+ import DownloadProgressMask from "@/components/DownloadProgressMask.vue";
import modal from "@/plugins/modal";
import useUserStore from "@/store/modules/user";
diff --git a/src/utils/versionUpgrade.js b/src/utils/versionUpgrade.js
index f39a40f..e0c818a 100644
--- a/src/utils/versionUpgrade.js
+++ b/src/utils/versionUpgrade.js
@@ -1,5 +1,6 @@
import config from "@/config";
import { getAllVersion } from "@/api/viewIndex";
+import bus from "@/plugins/bus";
function compareVersion(v1, v2) {
const s1 = String(v1 || "").replace(/[^\d.]/g, "").split(".").map((n) => Number(n) || 0);
@@ -23,7 +24,7 @@
return `${size}B`;
}
-function getCurrentVersion(logPrefix) {
+async function getCurrentVersion(logPrefix) {
let currentVersion = config?.appInfo?.version || "1.0.0";
console.log(`${logPrefix} 寮�濮嬭幏鍙栧綋鍓嶇増鏈紝榛樿鍊�:`, currentVersion);
// #ifdef MP-WEIXIN
@@ -40,12 +41,23 @@
// #endif
// #ifdef APP-PLUS
try {
+ // APP-PLUS 涓嬶紝plus.runtime.version 涓嶆槸涓氬姟鐗堟湰鍙凤紙缁忓父鏄繍琛屾椂/SDK鐗堟湰锛夛紝
+ // 杩欓噷鏀圭敤 getProperty 鍙栫郴缁熷眰闈㈢殑 app version銆�
// @ts-ignore
- if (plus?.runtime?.version) {
+ if (plus?.runtime?.getProperty) {
// @ts-ignore
- currentVersion = plus.runtime.version;
- console.log(`${logPrefix} 褰撳墠鐜=APP-PLUS锛岀増鏈�=`, currentVersion);
- return currentVersion;
+ const appid = plus.runtime.appid;
+ const appInfo = await new Promise((resolve) => {
+ // @ts-ignore
+ plus.runtime.getProperty(appid, (info) => resolve(info || {}));
+ });
+ const v = appInfo?.version || appInfo?.versionName || appInfo?.appVersion || "";
+ if (v) {
+ currentVersion = String(v);
+ console.log(`${logPrefix} 褰撳墠鐜=APP-PLUS锛岀増鏈�=`, currentVersion);
+ return currentVersion;
+ }
+ console.log(`${logPrefix} APP-PLUS 鑾峰彇鍒扮殑鐗堟湰瀛楁涓虹┖锛屽皢浣跨敤閰嶇疆鐗堟湰:`, currentVersion);
}
} catch (e) {
console.log(`${logPrefix} APP-PLUS 鑾峰彇鐗堟湰澶辫触:`, e);
@@ -83,20 +95,46 @@
// #endif
}
-function downloadVersionPackage(url, logPrefix) {
- console.log(`${logPrefix} 寮�濮嬩笅杞芥洿鏂板寘:`, url);
- uni.showLoading({ title: "鏇存柊鍖呬笅杞戒腑..." });
- uni.downloadFile({
- url,
+function buildFullDownloadUrl(rawUrl) {
+ const u = String(rawUrl || "").trim();
+ if (!u) return "";
+ // 宸茬粡鏄粷瀵瑰湴鍧�锛岀洿鎺ヨ繑鍥�
+ if (/^https?:\/\//i.test(u)) return u;
+ const base = String(config?.fileUrl || config?.baseUrl || "").replace(/\/+$/, "");
+ const path = u.startsWith("/") ? u : `/${u}`;
+ return `${base}${path}`;
+}
+
+function emitDownloadProgress(payload, logPrefix) {
+ try {
+ bus.$emit("versionUpgrade:downloadProgress", payload);
+ } catch (e) {
+ console.log(`${logPrefix} downloadProgress 浜嬩欢娲惧彂澶辫触:`, e);
+ }
+}
+
+function downloadVersionPackage(url, logPrefix, fileSize) {
+ const fullUrl = buildFullDownloadUrl(url);
+ console.log(`${logPrefix} 寮�濮嬩笅杞芥洿鏂板寘:`, { rawUrl: url, fullUrl });
+ if (!fullUrl) {
+ uni.showToast({ title: "鏇存柊闄勪欢鍦板潃鏃犳晥", icon: "none" });
+ return;
+ }
+ const totalSize = Number(fileSize);
+ const hasTotalSize = Number.isFinite(totalSize) && totalSize > 0;
+ console.log(`${logPrefix} 涓嬭浇澶у皬淇℃伅:`, { fileSize, totalSize, hasTotalSize });
+ emitDownloadProgress({ show: true, progress: 0, title: "鏇存柊鍖呬笅杞戒腑..." }, logPrefix);
+ const task = uni.downloadFile({
+ url: fullUrl,
success: (res) => {
console.log(`${logPrefix} 涓嬭浇缁撴灉:`, res);
- uni.hideLoading();
+ emitDownloadProgress({ show: false }, logPrefix);
if (res.statusCode !== 200 || !res.tempFilePath) {
console.log(`${logPrefix} 涓嬭浇澶辫触锛岀姸鎬佺爜鎴栦复鏃惰矾寰勫紓甯竊);
uni.showToast({ title: "涓嬭浇澶辫触锛岃绋嶅悗閲嶈瘯", icon: "none" });
return;
}
- const lowerUrl = String(url || "").toLowerCase();
+ const lowerUrl = String(fullUrl || "").toLowerCase();
const isInstallPkg = lowerUrl.endsWith(".wgt") || lowerUrl.endsWith(".wgtu") || lowerUrl.endsWith(".apk");
console.log(`${logPrefix} 鏂囦欢绫诲瀷鍒ゆ柇:`, { lowerUrl, isInstallPkg });
if (isInstallPkg) {
@@ -114,10 +152,31 @@
},
fail: (err) => {
console.log(`${logPrefix} 涓嬭浇璇锋眰澶辫触:`, err);
- uni.hideLoading();
+ emitDownloadProgress({ show: false }, logPrefix);
uni.showToast({ title: "涓嬭浇澶辫触锛岃妫�鏌ョ綉缁�", icon: "none" });
},
});
+
+ // 涓嬭浇杩涘害锛氶儴鍒嗙锛圓PP/灏忕▼搴忥級鏀寔 onProgressUpdate
+ try {
+ if (task && typeof task.onProgressUpdate === "function") {
+ task.onProgressUpdate((p) => {
+ const downloadedSize = Number(p?.totalBytesWritten ?? p?.writtenBytes ?? p?.downloadedSize);
+ const expectedSize = Number(p?.totalBytesExpectedToWrite ?? p?.totalBytesExpected ?? p?.totalSize);
+ const denom = hasTotalSize ? totalSize : (Number.isFinite(expectedSize) && expectedSize > 0 ? expectedSize : 0);
+
+ let progress = Number(p?.progress);
+ if (!(Number.isFinite(progress) && progress >= 0 && progress <= 100) && denom > 0 && Number.isFinite(downloadedSize) && downloadedSize >= 0) {
+ progress = (downloadedSize / denom) * 100;
+ }
+ if (!Number.isFinite(progress)) return;
+
+ emitDownloadProgress({ show: true, progress, title: "鏇存柊鍖呬笅杞戒腑..." }, logPrefix);
+ });
+ }
+ } catch (e) {
+ console.log(`${logPrefix} onProgressUpdate 缁戝畾澶辫触:`, e);
+ }
}
async function checkAppVersionUpgrade(logPrefix, currentVersion) {
@@ -170,7 +229,7 @@
return;
}
const firstFile = Array.isArray(first?.commonFileList) ? first.commonFileList[0] : null;
- const downloadUrl = firstFile?.url || "";
+ const downloadUrl = firstFile?.url || firstFile?.downloadUrl || "";
const fileSizeText = formatFileSize(firstFile?.fileSize);
console.log(`${logPrefix} 鏇存柊闄勪欢淇℃伅:`, {
downloadUrl,
@@ -191,7 +250,7 @@
uni.showToast({ title: "鏈壘鍒版洿鏂伴檮浠跺湴鍧�", icon: "none" });
return;
}
- downloadVersionPackage(downloadUrl, logPrefix);
+ downloadVersionPackage(downloadUrl, logPrefix, firstFile?.fileSize);
},
});
} catch (e) {
@@ -204,7 +263,7 @@
const logPrefix = options.logPrefix || "[version]";
let lastVersionCheckAt = 0;
- const triggerVersionCheck = (from = "unknown") => {
+ const triggerVersionCheck = async (from = "unknown") => {
const now = Date.now();
if (now - lastVersionCheckAt < throttleMs) {
console.log(`${logPrefix} 璺宠繃閲嶅妫�鏌ワ紝鏉ユ簮=${from}`);
@@ -212,8 +271,8 @@
}
lastVersionCheckAt = now;
console.log(`${logPrefix} 瑙﹀彂鐗堟湰妫�鏌ワ紝鏉ユ簮=${from}`);
- const currentVersion = getCurrentVersion(logPrefix);
- checkAppVersionUpgrade(logPrefix, currentVersion);
+ const currentVersion = await getCurrentVersion(logPrefix);
+ await checkAppVersionUpgrade(logPrefix, currentVersion);
};
return { triggerVersionCheck };
--
Gitblit v1.9.3