App.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <script>
  2. import { fetchPermissionList } from './util/QueryPermission.js';
  3. export default {
  4. onLaunch: function () {
  5. console.log(' APP onLaunch');
  6. // 全局隐私协议检查:首次启动时通过原生 uni.showModal 弹出
  7. if (!uni.getStorageSync('privacy_agreed')) {
  8. this.showPrivacyModal();
  9. } else {
  10. // 已同意过,直接执行初始化
  11. this.doAfterPrivacy();
  12. }
  13. },
  14. methods: {
  15. // 独立的隐私协议弹窗方法(避免递归调用 onLaunch)
  16. showPrivacyModal() {
  17. uni.showModal({
  18. title: '用户服务与隐私协议',
  19. content:
  20. '欢迎使用本应用!在您首次使用前,请认真阅读《用户服务与隐私协议》。我们将遵循"最小必要"原则,仅收集实现服务所必需的信息(微信昵称、头像、手机号、位置信息、设备信息等),不会主动向第三方共享您的个人信息。',
  21. confirmText: '同意并继续',
  22. cancelText: '不同意',
  23. success: (res) => {
  24. if (res.confirm) {
  25. // 用户同意,记录状态并执行初始化
  26. uni.setStorageSync('privacy_agreed', true);
  27. this.doAfterPrivacy();
  28. } else {
  29. // 用户不同意,二次确认
  30. uni.showModal({
  31. title: '提示',
  32. content: '您需要同意隐私协议才能使用本应用',
  33. confirmText: '再次查看完整协议',
  34. cancelText: '退出应用',
  35. success: (res2) => {
  36. if (res2.confirm) {
  37. // 跳转到完整协议页面
  38. uni.navigateTo({
  39. url: '/pages/login/agreement',
  40. });
  41. // 同时重新弹出摘要弹窗让用户做最终决定
  42. setTimeout(() => {
  43. this.showPrivacyModal();
  44. }, 500);
  45. } else {
  46. // 退出应用
  47. // #ifdef APP-PLUS
  48. plus.runtime.quit();
  49. // #endif
  50. }
  51. },
  52. });
  53. }
  54. },
  55. fail: () => {
  56. // 弹窗失败(如 App 启动早期),延迟重试
  57. setTimeout(() => {
  58. this.showPrivacyModal();
  59. }, 300);
  60. },
  61. });
  62. },
  63. // 隐私协议同意后才执行的初始化逻辑
  64. doAfterPrivacy() {
  65. // 已登录时提前拉取权限列表,保证"未经过首页"等特殊入口也能拿到权限数据(非阻塞)
  66. if (uni.getStorageSync('session_key')) {
  67. fetchPermissionList();
  68. }
  69. },
  70. },
  71. onShow: function () {
  72. console.log('App Show');
  73. },
  74. onHide: function () {
  75. console.log('App Hide');
  76. },
  77. };
  78. </script>
  79. <style lang="scss">
  80. @import './static/font/iconfont.css';
  81. @import './static/iconfont/iconfont.css';
  82. html {
  83. box-sizing: border-box;
  84. font-size: 28rpx !important;
  85. }
  86. .status_bar {
  87. height: 44px;
  88. width: 100%;
  89. background-color: #ffffff;
  90. position: fixed;
  91. top: 0;
  92. z-index: 99999;
  93. }
  94. </style>