hejianhao
2026-08-24 fd68a2574b62674f8a0679446b2eb3eb53969a78
Merge branch 'dev-0806-wql'
3个文件已添加
4个文件已修改
246 ■■■■■ 已修改文件
traditionalApp/App.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traditionalApp/manifest.json 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traditionalApp/nativeplugins/business-module/android/mylibrary-release.aar 补丁 | 查看 | 原始文档 | blame | 历史
traditionalApp/nativeplugins/business-module/package.json 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traditionalApp/package.json 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traditionalApp/pages/home/home.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traditionalApp/utils/visitorDevice.js 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traditionalApp/App.vue
@@ -19,6 +19,7 @@
        initOpeninstall,
        registerOpeninstallWakeUp
    } from '@/utils/openinstall.js'
    import { HardwareAPI } from '@/utils/visitorDevice.js'
    let lastHandledInvitePayload = ''
@@ -27,6 +28,15 @@
     */
    onLaunch(() => {
        // #ifdef APP-PLUS
        HardwareAPI.init().then(() => {
            console.log('[App] 硬件插件全局初始化完成')
            HardwareAPI.startScan((result) => {
                console.log('[App] startScan 回调参数:', result)
                uni.$emit('Hardware-Scan', result)
            })
        }).catch((error) => {
            console.error('[App] 硬件插件全局初始化失败:', error)
        })
        initJPushLifecycle()
        initOpeninstall()
        registerOpeninstallWakeUp(handleOpeninstallPayload)
traditionalApp/manifest.json
@@ -320,6 +320,20 @@
                        }
                    }
                }
            },
            "business-module" : {
                "__plugin_info__" : {
                    "name" : "business-module",
                    "description" : "业务模块插件",
                    "platforms" : "Android,iOS",
                    "url" : "",
                    "android_package_name" : "",
                    "ios_bundle_id" : "",
                    "isCloud" : false,
                    "bought" : -1,
                    "pid" : "",
                    "parameters" : {}
                }
            }
        }
    },
traditionalApp/nativeplugins/business-module/android/mylibrary-release.aar
Binary files differ
traditionalApp/nativeplugins/business-module/package.json
New file
@@ -0,0 +1,23 @@
{
  "_dp_type": "nativeplugin",
  "name": "business-module",
  "id": "business-module",
  "version": "1.0.0",
  "_dp_nativeplugin": {
    "android": {
      "plugins": [
        {
          "type": "module",
          "name": "business-module",
          "class": "com.example.mylibrary.BusinessModule"
        }
      ],
      "integrateType": "aar",
      "useAndroidX": true,
      "minSdkVersion": 24,
      "permissions": [
        "android.permission.INTERNET"
      ]
    }
  }
}
traditionalApp/package.json
@@ -1,28 +1,28 @@
{
    "id": "wlp-progress-new",
    "name": "超级好用的最基础的半、全、渐变圆环进度条组件,可二次开发或者联系我二次开发哟",
    "displayName": "超级好用的最基础的半、全、渐变圆环进度条组件,可二次开发或者联系我二次开发哟",
    "version": "1.0.0",
    "description": "超级好用的最基础的圆环进度条组件,可二次开发,半圆,全圆,渐变等等,利用canvas实现",
    "keywords": [
        "进度条",
        "半圆环",
        "全圆环",
        "渐变"
    ],
    "dcloudext": {
        "type": "component-vue",
        "sale": {
            "regular": {
                "price": "0.00"
            },
            "sourcecode": {
                "price": "0.00"
            }
        }
    },
    "uni_modules": {
        "dependencies": [],
        "encrypt": []
  "id": "wlp-progress-new",
  "name": "超级好用的最基础的半、全、渐变圆环进度条组件,可二次开发或者联系我二次开发哟",
  "displayName": "超级好用的最基础的半、全、渐变圆环进度条组件,可二次开发或者联系我二次开发哟",
  "version": "1.0.0",
  "description": "超级好用的最基础的圆环进度条组件,可二次开发,半圆,全圆,渐变等等,利用canvas实现",
  "keywords": [
    "进度条",
    "半圆环",
    "全圆环",
    "渐变"
  ],
  "dcloudext": {
    "type": "component-vue",
    "sale": {
      "regular": {
        "price": "0.00"
      },
      "sourcecode": {
        "price": "0.00"
      }
    }
  },
  "uni_modules": {
    "dependencies": [],
    "encrypt": []
  }
}
traditionalApp/pages/home/home.vue
@@ -139,10 +139,12 @@
</template>
<script setup lang="ts">
    import { computed, ref, onMounted } from "vue";
    import { computed, ref, onMounted, onUnmounted } from "vue";
    import { onPullDownRefresh, onShow } from "@dcloudio/uni-app";
    import { createLiveRoomEntry, getBannerList, getHomeFeaturedContent, getHomeLiveCourseList, getLiveRoomSetting } from "./service";
    import { HardwareAPI } from '@/utils/visitorDevice.js';
    import { resolveCurrentAppUserId } from "@/utils/app-user.js";
    import { jumpToMiniProgramPay } from '@/utils/weizan-pay-bridge.js';
    interface HomeBannerItem {
        id : number | string;
@@ -222,10 +224,27 @@
        return liveCourseList.value.filter((item) => String(item.courseId) !== String(selectedCourseId));
    });
    const handleHardwareScan = (result : unknown) => {
        console.log('[home] Hardware-Scan 参数:', result);
        let content = '';
        try {
            content = typeof result === 'string' ? result : JSON.stringify(result);
        } catch (error) {
            content = String(result);
        }
        uni.showModal({
            title: 'startScan 回调参数',
            content: content || '空参数',
            showCancel: false
        });
        jumpToMiniProgramPay(result);
    };
    /**
     * 初始化导航栏所需系统信息。
     */
    onMounted(() => {
        uni.$on('Hardware-Scan', handleHardwareScan);
        uni.getSystemInfo({
            success: (res) => {
                statusBarHeight.value = res.statusBarHeight || 0;
@@ -234,6 +253,10 @@
        setTimeout(() => {
            refreshHomeData();
        }, 0);
    });
    onUnmounted(() => {
        uni.$off('Hardware-Scan', handleHardwareScan);
    });
    /**
@@ -379,13 +402,19 @@
                return;
            }
            const webviewUrl = `/pages/weizanLive/weizanLive?url=${encodeURIComponent(targetUrl)}&title=${encodeURIComponent('微赞直播')}`;
            console.log('[goWeiZanLive] 准备跳转 WebView:', webviewUrl);
            uni.navigateTo({
                url: webviewUrl
            const webPayOptions = {
                ua: 'webchatPay/wx074c1f0cf5a0ecf4 InAppPay',
                url: targetUrl,
                title: '微赞直播'
            };
            // #ifdef APP-PLUS
            HardwareAPI.openWebPay(webPayOptions).catch((error) => {
                console.error('[goWeiZanLive] openWebPay 调用失败:', error);
            });
            console.log('[goWeiZanLive] navigateTo 调用完成');
            return;
            // #endif
            return;
        } catch (error) {
            console.error('[goWeiZanLive] 异常捕获:', error);
            uni.showToast({ title: '获取直播间地址失败', icon: 'none' });
traditionalApp/utils/visitorDevice.js
New file
@@ -0,0 +1,106 @@
// 安卓业务插件桥接,保持与设备初始化页相同的插件入口。
let HardwarePlugin = null;
if (typeof uni !== 'undefined' && typeof uni.requireNativePlugin === 'function') {
  HardwarePlugin = uni.requireNativePlugin('business-module');
}
let initPromise = null;
let initResult = null;
const getPluginMethod = (methodNames = []) => {
  if (!HardwarePlugin) {
    return null;
  }
  return methodNames.find((methodName) => typeof HardwarePlugin[methodName] === 'function') || null;
};
export const HardwareAPI = {
  init(options = {}) {
    if (initResult) {
      return Promise.resolve(initResult);
    }
    if (initPromise) {
      return initPromise;
    }
    initPromise = new Promise((resolve, reject) => {
      // #ifdef APP-PLUS
      const methodName = getPluginMethod(['init']);
      if (!methodName) {
        initPromise = null;
        reject(new Error('当前插件未提供初始化能力'));
        return;
      }
      let isSettled = false;
      let fallbackTimer = null;
      const finishInit = (result) => {
        if (isSettled) {
          return;
        }
        isSettled = true;
        if (fallbackTimer) {
          clearTimeout(fallbackTimer);
        }
        initResult = result;
        resolve(result);
      };
      try {
        HardwarePlugin[methodName](options, (result) => {
          if (result) {
            finishInit(result);
          }
        });
        fallbackTimer = setTimeout(() => {
          finishInit({ code: 200, msg: 'init_called_without_callback' });
        }, 300);
      } catch (error) {
        initPromise = null;
        reject(error);
      }
      // #endif
      // #ifndef APP-PLUS
      initResult = { code: 200, msg: 'success' };
      resolve(initResult);
      // #endif
    });
    return initPromise;
  },
  startScan(callback) {
    // #ifdef APP-PLUS
    const methodName = getPluginMethod(['startScan']);
    if (!methodName) {
      throw new Error('当前插件未提供 startScan 能力');
    }
    HardwarePlugin[methodName]({ duration: 2000 }, (result) => callback?.(result));
    return;
    // #endif
    // #ifndef APP-PLUS
    throw new Error('当前平台不支持 startScan');
    // #endif
  },
  openWebPay(options = {}) {
    return new Promise((resolve, reject) => {
      // #ifdef APP-PLUS
      const methodName = getPluginMethod(['openWebPay']);
      if (!methodName) {
        reject(new Error('当前插件未提供网页支付能力'));
        return;
      }
      try {
        HardwarePlugin[methodName](options, resolve);
      } catch (error) {
        reject(error);
      }
      // #endif
      // #ifndef APP-PLUS
      reject(new Error('当前平台不支持网页支付'));
      // #endif
    });
  },
};