From fb47da80958693c99ab33bd86126f8f9fb99c005 Mon Sep 17 00:00:00 2001 From: ZF sun <34314687@qq.com> Date: Sat, 9 May 2026 08:58:48 +0800 Subject: [PATCH] =?UTF-8?q?refactor(privacy-popup):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=9A=90=E7=A7=81=E5=BC=B9=E7=AA=97=E9=80=BB=E8=BE=91=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .local.config.js | 2 +- components/privacy-popup/privacy-popup.vue | 216 ++++++++------------- 2 files changed, 83 insertions(+), 135 deletions(-) diff --git a/.local.config.js b/.local.config.js index 4c1ab40..caf8437 100644 --- a/.local.config.js +++ b/.local.config.js @@ -54,6 +54,6 @@ const localDevConfig = ({ uniacid: 115, domain: 'https://5g.aigc-quickapp.com/', }, -})['1']; // 选择要使用的环境配置 +})['2811']; // 选择要使用的环境配置 export default localDevConfig; \ No newline at end of file diff --git a/components/privacy-popup/privacy-popup.vue b/components/privacy-popup/privacy-popup.vue index 35fb347..f34767f 100644 --- a/components/privacy-popup/privacy-popup.vue +++ b/components/privacy-popup/privacy-popup.vue @@ -55,31 +55,27 @@ export default { mounted() { this.listenPrivacySettingChange() this.curPageShow() + this.proactive() }, created() { try { // #ifdef MP-WEIXIN - //查询微信侧记录的用户是否有待同意的隐私政策信息 wx.getPrivacySetting({ success: (res) => { - // console.log('隐私政策信息', res); - // console.log(res.privacyContractName); this.privacyContractName = res.privacyContractName } }); // #endif // #ifdef QUICKAPP-WEBVIEW || H5 - if (this.$util.isQuickApp()) { - if (typeof has != 'undefined' && has?.getPrivacySetting) { - has.getPrivacySetting({ - success: (res) => { - if (res.privacyContractName) { - this.privacyContractName = res.privacyContractName - } - }, - }) - } + if (this.$util.isQuickApp() && typeof has != 'undefined' && has?.getPrivacySetting) { + has.getPrivacySetting({ + success: (res) => { + if (res.privacyContractName) { + this.privacyContractName = res.privacyContractName + } + }, + }) } // #endif } catch (e) { @@ -87,39 +83,50 @@ export default { } }, methods: { + /** + * 统一弹窗 + 关闭其他页面的弹窗 + */ + showPrivacyPopup() { + this.popUp() + this.closeOtherPagePopUp(this.disPopUp) + }, + + /** + * 根据是否需要授权决定弹窗或 emit agree + */ + checkAndShow(needAuthorization) { + if (needAuthorization) { + const privacyAgreed = uni.getStorageSync('privacyAgreed'); + if (privacyAgreed) { + this.$emit('agree') + } else { + this.showPrivacyPopup() + } + } else { + this.$emit('agree') + } + }, + getPrivacySettingByQuickApp() { // #ifdef QUICKAPP-WEBVIEW || H5 || WEB - if (this.$util.isQuickApp()) { - if (typeof has != 'undefined' && has?.getPrivacySetting) { - has.getPrivacySetting({ - success: (res) => { - // console.log(res) - if (res.needAuthorization) { - this.popUp() - // 额外逻辑:当前页面的隐私弹窗弹起的时候,关掉其他页面的隐私弹窗 - this.closeOtherPagePopUp(this.disPopUp) - } else { - this.$emit('agree') - } - }, - }) - } else { - // 属于嵌入到快应用Webview组件中的情况,按照H5的方式来处理,判断是否已经授权 - if (uni.getStorageSync('privacyAgreed')) { - this.$emit('agree') - } else { - this.popUp() - // 额外逻辑:当前页面的隐私弹窗弹起的时候,关掉其他页面的隐私弹窗 - this.closeOtherPagePopUp(this.disPopUp) - } - } + if (!this.$util.isQuickApp()) return; + if (typeof has != 'undefined' && has?.getPrivacySetting) { + has.getPrivacySetting({ + success: (res) => { + this.checkAndShow(res.needAuthorization) + }, + }) + } else { + this.checkAndShow(!uni.getStorageSync('privacyAgreed')) } // #endif }, + /** + * 监听平台侧的隐私授权事件 + */ listenPrivacySettingChange() { // #ifdef MP-WEIXIN - // 监听微信侧隐私政策授权变化事件 if (wx.onNeedPrivacyAuthorization) { wx.onNeedPrivacyAuthorization((resolve) => { if (typeof this.privacyAuthorization === 'function') { @@ -130,58 +137,28 @@ export default { // #endif // #ifdef QUICKAPP-WEBVIEW || H5 || WEB - if (this.$util.isQuickApp()) { - // 监听快速应用侧隐私政策授权变化事件 - if (typeof has != 'undefined' && has?.onPrivacySettingChange) { - has.onPrivacySettingChange((res) => { - // console.log(res) - if (res.needAuthorization) { - this.popUp() - // 额外逻辑:当前页面的隐私弹窗弹起的时候,关掉其他页面的隐私弹窗 - this.closeOtherPagePopUp(this.disPopUp) - } else { - this.$emit('agree') - } - }) - } + if (this.$util.isQuickApp() && typeof has != 'undefined' && has?.onPrivacySettingChange) { + has.onPrivacySettingChange((res) => { + this.checkAndShow(res.needAuthorization) + }) } // #endif - - // 主动查询用户隐私政策授权状态,针对快速应用 - this.getPrivacySettingByQuickApp(); }, - // 主动查询用户隐私政策授权状态 + + /** + * 主动查询隐私授权状态并弹窗 + */ proactive() { // #ifdef MP-WEIXIN if (wx.getPrivacySetting) { wx.getPrivacySetting({ success: (res) => { - // console.log(res) - if (res.needAuthorization) { - // 检查本地存储中是否已经同意过隐私政策 - const privacyAgreed = uni.getStorageSync('privacyAgreed'); - if (!privacyAgreed) { - this.popUp() - // 额外逻辑:当前页面的隐私弹窗弹起的时候,关掉其他页面的隐私弹窗 - this.closeOtherPagePopUp(this.disPopUp) - } else { - this.$emit('agree') - } - } else { - this.$emit('agree') - } + this.checkAndShow(res.needAuthorization) }, }); } else { - // 检查本地存储中是否已经同意过隐私政策 - const privacyAgreed = uni.getStorageSync('privacyAgreed'); - if (privacyAgreed) { - this.$emit('agree'); - } else { - this.popUp() - // 额外逻辑:当前页面的隐私弹窗弹起的时候,关掉其他页面的隐私弹窗 - this.closeOtherPagePopUp(this.disPopUp) - } + // 低版本基础库直接检查本地存储 + this.checkAndShow(!uni.getStorageSync('privacyAgreed')) } // #endif @@ -190,29 +167,24 @@ export default { // #endif // #ifdef H5 || WEB - // 检查本地存储中是否已经同意过隐私政策 - const privacyAgreed = uni.getStorageSync('privacyAgreed'); - if (privacyAgreed) { - this.$emit('agree'); - } else { - this.popUp() - // 额外逻辑:当前页面的隐私弹窗弹起的时候,关掉其他页面的隐私弹窗 - this.closeOtherPagePopUp(this.disPopUp) - } + this.checkAndShow(!uni.getStorageSync('privacyAgreed')) // #endif }, - //初始化监听程序 + + /** + * 初始化监听程序(页面级) + */ curPageShow() { closeOtherPagePopUpHooks.add(this.disPopUp) this.privacyAuthorization = resolve => { this.privacyResolves.add(resolve) - //打开弹窗 - this.popUp() - // 额外逻辑:当前页面的隐私弹窗弹起的时候,关掉其他页面的隐私弹窗 - this.closeOtherPagePopUp(this.disPopUp) + this.showPrivacyPopup() } }, - // 额外逻辑:当前页面的隐私弹窗弹起的时候,关掉其他页面的隐私弹窗 + + /** + * 弹窗时关掉其他页面的隐私弹窗,避免重叠 + */ closeOtherPagePopUp(closePopUp) { closeOtherPagePopUpHooks.forEach(hook => { if (closePopUp !== hook) { @@ -220,16 +192,12 @@ export default { } }) }, - //打开隐私协议 + openPrivacyContract() { // #ifdef MP-WEIXIN wx.openPrivacyContract({ - success(res) { - // console.log('打开隐私协议', res); - }, - fail(err) { - // console.error('打开隐私协议失败', err) - } + success(res) {}, + fail(err) {} }); // #endif @@ -237,59 +205,44 @@ export default { if (this.$util.isQuickApp()) { if (typeof has != 'undefined' && has?.openPrivacySetting) { has.openPrivacySetting({ - success: (res) => { - // console.log('打开隐私协议', res); - }, - fail: (err) => { - // console.error('打开隐私协议失败', err) - } + success: (res) => {}, + fail: (err) => {} }); } else { - // 属于嵌入到快应用Webview组件中的情况,按照H5的方式来处理 this.$util.redirectTo(privacyContractPage); } } else { - // H5 环境下的处理逻辑 this.$util.redirectTo(privacyContractPage); } // #endif }, - //打开用户服务协议 + openPrivacyService() { // #ifdef QUICKAPP-WEBVIEW || H5 || WEB if (this.$util.isQuickApp()) { if (typeof has != 'undefined' && has?.openPrivacySetting) { has.openPrivacySetting({ - success: (res) => { - // console.log('打开用户服务协议', res); - }, - fail: (err) => { - // console.error('打开用户服务协议失败', err) - } + success: (res) => {}, + fail: (err) => {} }); } else { - // 属于嵌入到快应用Webview组件中的情况,按照H5的方式来处理 this.$util.redirectTo(privacyServicePage); } } else { - // H5 环境下的处理逻辑 this.$util.redirectTo(privacyServicePage); } // #endif }, - // 不同意 + handleDisagree() { this.privacyResolves.forEach(resolve => { - resolve({ - event: 'disagree', - }) + resolve({ event: 'disagree' }) }) this.privacyResolves.clear() - //关闭弹窗 this.disPopUp() - // 保存用户授权状态到本地存储,无论同意还是不同意,都不再重复弹出 + uni.setStorageSync('privacyAgreed', true); - //退出小程序 + uni.showModal({ content: '未同意隐私协议,无法使用相关功能', success: () => { @@ -297,7 +250,7 @@ export default { } }) }, - // 同意并继续 + handleAgree() { this.privacyResolves.forEach(resolve => { resolve({ @@ -306,28 +259,23 @@ export default { }) }) this.privacyResolves.clear() - //关闭弹窗 this.disPopUp() - // 保存用户授权状态到本地存储,用于所有环境 - uni.setStorageSync('privacyAgreed', true); + uni.setStorageSync('privacyAgreed', true); this.$emit('agree') }, - //打开弹窗 + popUp() { this.showPop = true; }, - //关闭弹窗 + disPopUp() { this.showPop = false; }, }, beforeDestroy() { - // 清理事件监听器和集合 this.privacyResolves.clear() closeOtherPagePopUpHooks.delete(this.disPopUp) - // 注意:这里需要根据实际情况清理微信和快速应用的事件监听器 - // 由于微信的 wx.onNeedPrivacyAuthorization 没有对应的 off 方法,这里可能需要其他方式处理 }, }