me.vue 4.9 KB

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