spring
昨天 6afb492942b17ebdb80f8e57af1b0df7ba5ee821
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" });
    },
  });
  // 下载进度:部分端(APP/小程序)支持 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 };