me.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <script lang="ts" setup>
  2. import type { IUploadSuccessInfo } from '@/api/types/login'
  3. import { storeToRefs } from 'pinia'
  4. import { LOGIN_PAGE } from '@/router/config'
  5. import { useUserStore } from '@/store'
  6. import { useTokenStore } from '@/store/token'
  7. import { useUpload } from '@/utils/uploadFile'
  8. definePage({
  9. style: {
  10. navigationBarTitleText: '我的',
  11. },
  12. })
  13. const userStore = useUserStore()
  14. const tokenStore = useTokenStore()
  15. // 使用storeToRefs解构userInfo
  16. const { userInfo } = storeToRefs(userStore)
  17. // #ifndef MP-WEIXIN
  18. // 上传头像
  19. const { run: uploadAvatar } = useUpload<IUploadSuccessInfo>(
  20. import.meta.env.VITE_UPLOAD_BASEURL,
  21. {},
  22. {
  23. onSuccess: (res) => {
  24. console.log('h5头像上传成功', res)
  25. useUserStore().setUserAvatar(res.url)
  26. },
  27. },
  28. )
  29. // #endif
  30. // 微信小程序下登录
  31. async function handleLogin() {
  32. // #ifdef MP-WEIXIN
  33. // 微信登录
  34. await tokenStore.wxLogin()
  35. // #endif
  36. // #ifndef MP-WEIXIN
  37. uni.navigateTo({
  38. url: `${LOGIN_PAGE}?redirect=${encodeURIComponent('/pages/me/me')}`,
  39. })
  40. // #endif
  41. }
  42. // #ifdef MP-WEIXIN
  43. // 微信小程序下选择头像事件
  44. function onChooseAvatar(e: any) {
  45. console.log('选择头像', e.detail)
  46. const { avatarUrl } = e.detail
  47. const { run } = useUpload<IUploadSuccessInfo>(
  48. import.meta.env.VITE_UPLOAD_BASEURL,
  49. {},
  50. {
  51. onSuccess: (res) => {
  52. console.log('wx头像上传成功', res)
  53. useUserStore().setUserAvatar(res.url)
  54. },
  55. },
  56. avatarUrl,
  57. )
  58. run()
  59. }
  60. // #endif
  61. // #ifdef MP-WEIXIN
  62. // 微信小程序下设置用户名
  63. function getUserInfo(e: any) {
  64. console.log(e.detail)
  65. }
  66. // #endif
  67. // 退出登录
  68. function handleLogout() {
  69. uni.showModal({
  70. title: '提示',
  71. content: '确定要退出登录吗?',
  72. success: (res) => {
  73. if (res.confirm) {
  74. // 清空用户信息
  75. useTokenStore().logout()
  76. // 执行退出登录逻辑
  77. uni.showToast({
  78. title: '退出登录成功',
  79. icon: 'success',
  80. })
  81. // #ifdef MP-WEIXIN
  82. // 微信小程序,去首页
  83. // uni.reLaunch({ url: '/pages/index/index' })
  84. // #endif
  85. // #ifndef MP-WEIXIN
  86. // 非微信小程序,去登录页
  87. // uni.navigateTo({ url: LOGIN_PAGE })
  88. // #endif
  89. }
  90. },
  91. })
  92. }
  93. </script>
  94. <template>
  95. <view class="profile-container">
  96. <!-- 用户信息区域 -->
  97. <view class="user-info-section">
  98. <!-- #ifdef MP-WEIXIN -->
  99. <button class="avatar-button" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
  100. <image :src="userInfo.avatar" mode="scaleToFill" class="h-full w-full" />
  101. </button>
  102. <!-- #endif -->
  103. <!-- #ifndef MP-WEIXIN -->
  104. <view class="avatar-wrapper" @click="uploadAvatar">
  105. <image :src="userInfo.avatar" mode="scaleToFill" class="h-full w-full" />
  106. </view>
  107. <!-- #endif -->
  108. <view class="user-details">
  109. <!-- #ifdef MP-WEIXIN -->
  110. <input
  111. v-model="userInfo.username"
  112. type="nickname"
  113. class="weui-input"
  114. placeholder="请输入昵称"
  115. >
  116. <!-- #endif -->
  117. <!-- #ifndef MP-WEIXIN -->
  118. <view class="username">
  119. {{ userInfo.username }}
  120. </view>
  121. <!-- #endif -->
  122. <view class="user-id">
  123. ID: {{ userInfo.userId }}
  124. </view>
  125. </view>
  126. </view>
  127. <view class="mt-3 break-all px-3">
  128. {{ JSON.stringify(userInfo, null, 2) }}
  129. </view>
  130. <view class="mt-20 px-3">
  131. <view class="m-auto w-160px text-center">
  132. <button v-if="tokenStore.hasLogin" type="warn" class="w-full" @click="handleLogout">
  133. 退出登录
  134. </button>
  135. <button v-else type="primary" class="w-full" @click="handleLogin">
  136. 登录
  137. </button>
  138. </view>
  139. </view>
  140. </view>
  141. </template>
  142. <style lang="scss" scoped>
  143. /* 基础样式 */
  144. .profile-container {
  145. overflow: hidden;
  146. font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', sans-serif;
  147. // background-color: #f7f8fa;
  148. }
  149. /* 用户信息区域 */
  150. .user-info-section {
  151. display: flex;
  152. align-items: center;
  153. padding: 40rpx;
  154. margin: 30rpx 30rpx 20rpx;
  155. background-color: #fff;
  156. border-radius: 24rpx;
  157. box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.08);
  158. transition: all 0.3s ease;
  159. }
  160. .avatar-wrapper {
  161. width: 160rpx;
  162. height: 160rpx;
  163. margin-right: 40rpx;
  164. overflow: hidden;
  165. border: 4rpx solid #f5f5f5;
  166. border-radius: 50%;
  167. box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
  168. }
  169. .avatar-button {
  170. height: 160rpx;
  171. width: 160rpx;
  172. padding: 0;
  173. margin-right: 40rpx;
  174. overflow: hidden;
  175. border: 4rpx solid #f5f5f5;
  176. border-radius: 50%;
  177. box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
  178. }
  179. .user-details {
  180. flex: 1;
  181. }
  182. .username {
  183. margin-bottom: 12rpx;
  184. font-size: 38rpx;
  185. font-weight: 600;
  186. color: #333;
  187. letter-spacing: 0.5rpx;
  188. }
  189. .user-id {
  190. font-size: 28rpx;
  191. color: #666;
  192. }
  193. .user-created {
  194. margin-top: 8rpx;
  195. font-size: 24rpx;
  196. color: #999;
  197. }
  198. </style>