Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 

128 рядки
3.6 KiB

  1. <template>
  2. <view class="wrap">
  3. <!-- 关于 -->
  4. <text class="group-title">关于</text>
  5. <view class="st-card">
  6. <view v-for="item in aboutRows" :key="item.key" class="row" @click="onRow(item)">
  7. <text class="row-name">{{ item.name }}</text>
  8. <text v-if="item.value" class="row-value">{{ item.value }}</text>
  9. <up-icon v-else name="arrow-right" color="#c3cddb" size="14" />
  10. </view>
  11. </view>
  12. <!-- 账号 -->
  13. <template v-if="userStore.isLogin">
  14. <text class="group-title">账号</text>
  15. <view class="st-card">
  16. <view class="row" @click="logout">
  17. <text class="row-name danger">退出登录</text>
  18. </view>
  19. </view>
  20. </template>
  21. </view>
  22. </template>
  23. <script setup>
  24. import { computed } from 'vue'
  25. import { useUserStore } from '@/store/user.js'
  26. import { useApp } from '@/utils/useApp.js'
  27. import appConfig from '@/utils/config.js'
  28. const userStore = useUserStore()
  29. const { toast } = useApp()
  30. // 微信端非正式版的环境名,展示给用户看更直观
  31. const ENV_TEXT = {
  32. develop: '开发版',
  33. trial: '体验版'
  34. }
  35. // 协议正文由后台「内容管理」维护,key 与旧项目一致:service / privacy
  36. const aboutRows = computed(() => [
  37. { key: 'service', name: '服务条款' },
  38. { key: 'privacy', name: '隐私政策' },
  39. { key: 'version', name: '当前版本', value: version.value }
  40. ])
  41. /**
  42. * 版本号展示规则:
  43. * - 正式版:只显示一个版本号,优先用微信侧的线上版本号(即上传代码包时填的版本),
  44. * 取不到再回落到 APP_VERSION。不并排显示两个版本号,避免出现「2.0.0(2.0.0)」。
  45. * - 开发版 / 体验版:微信的 version 字段为空字符串,显示 APP_VERSION 并在括号里标注环境,
  46. * 方便一眼看出当前不是线上包。
  47. * APP_VERSION 在 utils/config.js 维护,与 manifest.json 的 versionName 保持一致。
  48. */
  49. const version = computed(() => {
  50. const appVersion = appConfig.APP_VERSION || '1.0.0'
  51. // #ifdef MP-WEIXIN
  52. try {
  53. const mp = (uni.getAccountInfoSync() || {}).miniProgram || {}
  54. const envVersion = mp.envVersion
  55. if (envVersion && envVersion !== 'release') {
  56. return `${appVersion}(${ENV_TEXT[envVersion] || envVersion})`
  57. }
  58. return mp.version || appVersion
  59. } catch (e) {
  60. // 取不到就只显示应用版本
  61. }
  62. // #endif
  63. return appVersion
  64. })
  65. function onRow(item) {
  66. if (item.key === 'version') return
  67. uni.navigateTo({ url: `/pages/agreement/agreement?key=${item.key}` })
  68. }
  69. function logout() {
  70. uni.showModal({
  71. title: '提示',
  72. content: '确定退出登录?',
  73. confirmText: '退出登录',
  74. confirmColor: '#ef4444',
  75. success: (res) => {
  76. if (!res.confirm) return
  77. userStore.clear()
  78. toast('已退出登录')
  79. setTimeout(() => uni.navigateBack(), 800)
  80. }
  81. })
  82. }
  83. </script>
  84. <style lang="scss" scoped>
  85. .wrap {
  86. min-height: 100vh;
  87. padding: 12rpx 28rpx 60rpx;
  88. background: #f3f7fb;
  89. box-sizing: border-box;
  90. }
  91. .group-title {
  92. display: block;
  93. margin: 24rpx 8rpx 14rpx;
  94. color: #8a95a6;
  95. font-size: 23rpx;
  96. font-weight: 800;
  97. }
  98. /* 类名带 st- 前缀,避开全局 .card 的 margin / box-shadow */
  99. .st-card {
  100. border-radius: 24rpx;
  101. background: #fff;
  102. overflow: hidden;
  103. }
  104. .row {
  105. min-height: 100rpx;
  106. padding: 26rpx 28rpx;
  107. display: flex;
  108. align-items: center;
  109. box-sizing: border-box;
  110. }
  111. .row + .row { border-top: 2rpx solid #f4f7fb; }
  112. .row-name { flex: 1; min-width: 0; color: #172033; font-size: 29rpx; }
  113. .row-name.danger { color: #ef4444; text-align: center; }
  114. .row-value { color: #8a95a6; font-size: 26rpx; }
  115. </style>