my.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <template>
  2. <view class="my-wrapper pr">
  3. <view class="w-full pa tw-top-0 tw-left-0 tw-z-1">
  4. <image class="w-full" :src="config.ossPathPerfixs + '/my-bg.png'" mode="widthFix"></image>
  5. </view>
  6. <view class="pr tw-z-10">
  7. <view class="my-top">
  8. <view class="radius-lg top-box" @click="toRegister">
  9. <view class="user-info" v-if="openId">
  10. <fs-avatar size="120rpx" :src="userInfo.photo || config.defaultAvatarUrl"></fs-avatar>
  11. <view class="top-box-content">
  12. <view class="top-box-title">{{ userInfo.name || getMobileLast }}</view>
  13. <view class="tw-flex tw-items-center">
  14. <fs-avatar size="32rpx" src="/static/images/icon/phone.png"
  15. class="pr tw-top-[-2rpx]"></fs-avatar>
  16. <text class="tw-ml-[4rpx]">{{ userInfo.mobile || '-' }}</text>
  17. </view>
  18. </view>
  19. </view>
  20. <view v-else class="text-center">
  21. <fs-avatar size=" 140rpx" border>去登录</fs-avatar>
  22. </view>
  23. </view>
  24. </view>
  25. <view class="my-bottom">
  26. <fs-cell-group arrow border radius bgColor="transparent">
  27. <fs-cell arrowColor="#CACBCB"
  28. :link="userInfo?.mobile ? '/pages/my/update-phone' : '/pages/index/register'" v-if="openId">
  29. <template #title>
  30. <view class="pr tw-w-[40rpx]">
  31. <fs-avatar src="/static/images/menu/menu1.png" size="80rpx"
  32. class="pa tw-top-[10rpx] tw-left-[-22rpx]"></fs-avatar>
  33. </view>
  34. </template>
  35. <template #value>
  36. <view class="tw-flex tw-items-center tw-justify-between">
  37. <view class="tw-text-[28rpx] tw-text-[#666]">手机号</view>
  38. <view class="tw-text-[#4479FF] tw-text-[28rpx]">
  39. {{ userInfo?.mobile ? '更换' : '绑定' }}
  40. </view>
  41. </view>
  42. </template>
  43. </fs-cell>
  44. <fs-cell arrowColor="#CACBCB" link="/modules/class/study-record" v-if="openId">
  45. <template #title>
  46. <view class="pr tw-w-[40rpx]">
  47. <fs-avatar src="/static/images/menu/menu6.png" size="80rpx"
  48. class="pa tw-top-[10rpx] tw-left-[-22rpx]"></fs-avatar>
  49. </view>
  50. </template>
  51. <template #value>
  52. <view class="tw-flex tw-items-center tw-justify-between">
  53. <view class="tw-text-[28rpx] tw-text-[#666]">学习记录</view>
  54. <view></view>
  55. </view>
  56. </template>
  57. </fs-cell>
  58. <fs-cell arrowColor="#CACBCB" link="/modules/activity/reservation-record-list" v-if="openId">
  59. <template #title>
  60. <view class="pr tw-w-[40rpx]">
  61. <fs-avatar src="/static/images/menu/menu6.png" size="80rpx"
  62. class="pa tw-top-[10rpx] tw-left-[-22rpx]"></fs-avatar>
  63. </view>
  64. </template>
  65. <template #value>
  66. <view class="tw-flex tw-items-center tw-justify-between">
  67. <view class="tw-text-[28rpx] tw-text-[#666]">我的预约</view>
  68. <view></view>
  69. </view>
  70. </template>
  71. </fs-cell>
  72. <fs-cell arrowColor="#CACBCB"
  73. :link="`/modules/my/student/student-feedback?data=${encodeURIComponent(JSON.stringify({ type: 'student' }))}`"
  74. v-if="openId">
  75. <template #title>
  76. <view class="pr tw-w-[40rpx]">
  77. <fs-avatar src="/static/images/menu/menu2.png" size="80rpx"
  78. class="pa tw-top-[10rpx] tw-left-[-22rpx]"></fs-avatar>
  79. </view>
  80. </template>
  81. <template #value>
  82. <view class="tw-flex tw-items-center tw-justify-between">
  83. <view class="tw-text-[28rpx] tw-text-[#666]">问题反馈</view>
  84. <view></view>
  85. </view>
  86. </template>
  87. </fs-cell>
  88. <fs-cell arrowColor="#CACBCB" link="/modules/my/version">
  89. <template #title>
  90. <view class="pr tw-w-[40rpx]">
  91. <fs-avatar src="/static/images/menu/menu3.png" size="80rpx"
  92. class="pa tw-top-[10rpx] tw-left-[-22rpx]"></fs-avatar>
  93. </view>
  94. </template>
  95. <template #value>
  96. <view class="tw-flex tw-items-center tw-justify-between">
  97. <view class="tw-text-[28rpx] tw-text-[#666]">版本信息</view>
  98. <view></view>
  99. </view>
  100. </template>
  101. </fs-cell>
  102. <fs-cell arrowColor="#CACBCB" link="/modules/my/aboutus">
  103. <template #title>
  104. <view class="pr tw-w-[40rpx]">
  105. <fs-avatar src="/static/images/menu/menu4.png" size="80rpx"
  106. class="pa tw-top-[10rpx] tw-left-[-22rpx]"></fs-avatar>
  107. </view>
  108. </template>
  109. <template #value>
  110. <view class="tw-flex tw-items-center tw-justify-between">
  111. <view class="tw-text-[28rpx] tw-text-[#666]">关于我们</view>
  112. <view></view>
  113. </view>
  114. </template>
  115. </fs-cell>
  116. <fs-cell arrowColor="#CACBCB" v-if="openId" @click="handleLogout">
  117. <template #title>
  118. <view class="pr tw-w-[40rpx]">
  119. <fs-avatar src="/static/images/menu/menu5.png" size="80rpx"
  120. class="pa tw-top-[10rpx] tw-left-[-22rpx]"></fs-avatar>
  121. </view>
  122. </template>
  123. <template #value>
  124. <view class="tw-flex tw-items-center tw-justify-between">
  125. <view class="tw-text-[28rpx] tw-text-[#666]">退出登录</view>
  126. <view></view>
  127. </view>
  128. </template>
  129. </fs-cell>
  130. </fs-cell-group>
  131. </view>
  132. </view>
  133. </view>
  134. </template>
  135. <script setup>
  136. import config from '@/utils/config'
  137. import { useUserStore } from '@/stores/user'
  138. const user = useUserStore()
  139. const userInfo = computed(() => user.userInfo)
  140. const openId = computed(() => user.openId)
  141. const getMobileLast = computed(() => {
  142. if (userInfo.value.mobile) return '用户' + userInfo.value.mobile.slice(-4)
  143. else return openId.value || '游客'
  144. })
  145. const toRegister = () => {
  146. if (!openId.value) return uni.navigateTo({ url: '/pages/index/welcome' })
  147. else {
  148. if (userInfo.value.mobile) uni.navigateTo({ url: '/pages/my/update-phone' })
  149. else uni.navigateTo({ url: '/pages/index/register' })
  150. }
  151. }
  152. const handleLogout = () => {
  153. uni.showModal({
  154. title: '提示',
  155. content: '确定要退出登录吗?',
  156. success: (res) => {
  157. if (res.confirm) {
  158. user.logout().then(() => {
  159. uni.reLaunch({ url: '/pages/index/index' })
  160. })
  161. }
  162. }
  163. })
  164. }
  165. </script>
  166. <style lang="scss" scoped>
  167. .my-wrapper {
  168. background-color: #fff;
  169. .my-top {
  170. padding: 40rpx var(--gutter) 0;
  171. margin-bottom: var(--gutter);
  172. .top-box {
  173. position: relative;
  174. padding: 60rpx 0;
  175. color: #fff;
  176. &-title {
  177. font-size: 30rpx;
  178. font-weight: 700;
  179. margin-left: 4rpx;
  180. }
  181. &-content {
  182. padding: 10rpx 0;
  183. margin-left: 20rpx;
  184. }
  185. .user-info {
  186. display: flex;
  187. }
  188. }
  189. }
  190. .my-bottom {
  191. background: linear-gradient(180deg, rgba(255, 255, 255, 0.5) 0%, #fff 100%);
  192. border-top-left-radius: 25rpx;
  193. border-top-right-radius: 25rpx;
  194. padding-top: 20rpx;
  195. :deep(.fs-cell) {
  196. padding: 12rpx var(--gutter);
  197. }
  198. }
  199. }
  200. </style>