privacyMixin.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /**
  2. * 全局隐私协议检查 mixin
  3. * 注入所有页面的 onShow 生命周期
  4. * 通过版本号对比判断是否需要重新弹窗,支持协议更新后自动重新同意
  5. * 作用于:App 端 + 小程序端(H5 不拦截)
  6. */
  7. import { needPrivacyPopup } from '@/util/privacyConfig.js';
  8. // 防止多次 reLaunch 冲突导致页面卡死
  9. let isReLaunching = false;
  10. export default {
  11. onShow() {
  12. // privacy 页面自身不拦截(避免死循环)
  13. // 协议详情页也不拦截(用户从弹窗点"查看完整协议"跳过去时不能被 reLaunch 回来,否则白屏)
  14. // 登录页也不拦截(登录本身不涉及隐私数据使用,用户应能自由访问;
  15. // 若未同意隐私协议,登录成功进入主页时仍会被拦截到 privacy)
  16. // 关于我们页也不拦截(纯静态信息展示,不涉及隐私数据使用)
  17. // 注意:不能用 this.$route,vue-router 只在 H5 端存在
  18. // 统一用 getCurrentPages() 获取当前页面路径(三端都支持)
  19. const pages = getCurrentPages();
  20. if (pages && pages.length > 0) {
  21. const current = pages[pages.length - 1];
  22. const route = '/' + (current.route || '');
  23. if (
  24. route.indexOf('/pages/privacy/') !== -1 ||
  25. route.indexOf('/pages/login/agreement') !== -1 ||
  26. route.indexOf('/pages/login/login') !== -1 ||
  27. route.indexOf('/pages/my/about/about') !== -1
  28. ) {
  29. return;
  30. }
  31. }
  32. // App 端 + 小程序端:都拦截隐私协议(版本号不匹配时)
  33. // #ifndef H5
  34. if (needPrivacyPopup()) {
  35. // 防抖锁:避免多个页面 onShow 同时触发 reLaunch 导致页面栈混乱
  36. if (isReLaunching) return;
  37. isReLaunching = true;
  38. uni.reLaunch({
  39. url: '/pages/privacy/privacy',
  40. complete: () => {
  41. isReLaunching = false;
  42. },
  43. });
  44. }
  45. // #endif
  46. },
  47. };