<template>
							 | 
						|
								  <view class="profile-container">
							 | 
						|
								    <!-- 个人信息表单 -->
							 | 
						|
								    <view class="form-container">
							 | 
						|
								      <view class="form-title">个人信息</view>
							 | 
						|
								      
							 | 
						|
								      <!-- 昵称 -->
							 | 
						|
								      <view class="form-item">
							 | 
						|
								        <view class="label">
							 | 
						|
								          <text class="required">*</text>
							 | 
						|
								          <text>昵称</text>
							 | 
						|
								        </view>
							 | 
						|
								        <uv-input 
							 | 
						|
								          v-model="userInfo.name" 
							 | 
						|
								          placeholder="请输入昵称"
							 | 
						|
								          type="nickname"
							 | 
						|
								          :customStyle="inputStyle"
							 | 
						|
								          border="bottom"
							 | 
						|
								        ></uv-input>
							 | 
						|
								      </view>
							 | 
						|
								      
							 | 
						|
								      <!-- 电话 -->
							 | 
						|
								      <view class="form-item">
							 | 
						|
								        <view class="label">
							 | 
						|
								          <text class="required">*</text>
							 | 
						|
								          <text>电话</text>
							 | 
						|
								        </view>
							 | 
						|
								        <uv-input 
							 | 
						|
								          v-model="userInfo.phone" 
							 | 
						|
								          placeholder="请输入手机号"
							 | 
						|
								          :customStyle="inputStyle"
							 | 
						|
								          border="bottom"
							 | 
						|
								          type="number"
							 | 
						|
								        ></uv-input>
							 | 
						|
								      </view>
							 | 
						|
								      
							 | 
						|
								      <!-- 头像 -->
							 | 
						|
								      <view class="form-item">
							 | 
						|
								        <view class="label">
							 | 
						|
								          <text class="required">*</text>
							 | 
						|
								          <text>头像</text>
							 | 
						|
								        </view>
							 | 
						|
								        <!-- #ifdef MP-WEIXIN -->
							 | 
						|
								        <button class="avatar-container" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
							 | 
						|
								          <view 
							 | 
						|
								            v-if="userInfo.avatar === 'undefined'"
							 | 
						|
								            class="avatar-image"
							 | 
						|
								          >
							 | 
						|
								              <uv-icon name="camera" size="40" color="white"></uv-icon>
							 | 
						|
								          </view>
							 | 
						|
								          <image 
							 | 
						|
								            v-else
							 | 
						|
								            :src="userInfo.avatar || '/static/default-avatar.png'" 
							 | 
						|
								            class="avatar-image"
							 | 
						|
								            mode="aspectFill"
							 | 
						|
								          ></image>
							 | 
						|
								
							 | 
						|
								        </button>
							 | 
						|
								        <!-- #endif -->
							 | 
						|
								
							 | 
						|
								        <!-- #ifndef MP-WEIXIN -->
							 | 
						|
								        <button class="avatar-container" @click="chooseImageH5">
							 | 
						|
								          <view 
							 | 
						|
								            v-if="userInfo.avatar === 'undefined'"
							 | 
						|
								            class="avatar-image"
							 | 
						|
								          >
							 | 
						|
								              <uv-icon name="camera" size="40" color="white"></uv-icon>
							 | 
						|
								          </view>
							 | 
						|
								          <image 
							 | 
						|
								            v-else
							 | 
						|
								            :src="userInfo.avatar || '/static/default-avatar.png'" 
							 | 
						|
								            class="avatar-image"
							 | 
						|
								            mode="aspectFill"
							 | 
						|
								          ></image>
							 | 
						|
								
							 | 
						|
								        </button>
							 | 
						|
								        <!-- #endif -->
							 | 
						|
								      </view>
							 | 
						|
								    </view>
							 | 
						|
								    
							 | 
						|
								    <!-- 固定底部保存按钮 -->
							 | 
						|
								    <view class="save-button-container">
							 | 
						|
								      <uv-button 
							 | 
						|
								        @click="saveProfile"
							 | 
						|
								        :customStyle="saveButtonStyle"
							 | 
						|
								        shape="circle"
							 | 
						|
								      >
							 | 
						|
								        保存
							 | 
						|
								      </uv-button>
							 | 
						|
								    </view>
							 | 
						|
								  </view>
							 | 
						|
								</template>
							 | 
						|
								
							 | 
						|
								<script>
							 | 
						|
								export default {
							 | 
						|
								  data() {
							 | 
						|
								    return {
							 | 
						|
								      userInfo: {
							 | 
						|
								        avatar: 'undefined',
							 | 
						|
								        name: '', 
							 | 
						|
								        phone: ''
							 | 
						|
								      },
							 | 
						|
								      saveButtonStyle: {
							 | 
						|
								        backgroundColor: '#06DADC',
							 | 
						|
								        borderRadius: '41rpx',
							 | 
						|
								        height: '94rpx',
							 | 
						|
								        width: '594rpx',
							 | 
						|
								        border: 'none',
							 | 
						|
								        color: '#fff',
							 | 
						|
								        fontSize: '32rpx',
							 | 
						|
								        fontWeight: '500'
							 | 
						|
								      },
							 | 
						|
								      inputStyle: {
							 | 
						|
								        backgroundColor: '#fff',
							 | 
						|
								        borderRadius: '12rpx',
							 | 
						|
								        padding: '0 -20rpx',
							 | 
						|
								        fontSize: '28rpx'
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								  },
							 | 
						|
								  methods: {
							 | 
						|
								
							 | 
						|
								    
							 | 
						|
								    
							 | 
						|
								    // 选择头像并上传到OSS
							 | 
						|
								    async onChooseAvatar(e) {
							 | 
						|
								      console.log('选择头像回调', e);
							 | 
						|
								      if (e.detail.avatarUrl) {
							 | 
						|
								        try {
							 | 
						|
								          // 显示上传中提示
							 | 
						|
								          uni.showLoading({ title: '上传头像中...' });
							 | 
						|
								          
							 | 
						|
								          // 构造文件对象
							 | 
						|
								          const file = {
							 | 
						|
								            path: e.detail.avatarUrl,
							 | 
						|
								            tempFilePath: e.detail.avatarUrl
							 | 
						|
								          };
							 | 
						|
								          
							 | 
						|
								          // 上传到OSS
							 | 
						|
								          const uploadResult = await this.$utils.uploadImage(file);
							 | 
						|
								          
							 | 
						|
								          uni.hideLoading();
							 | 
						|
								          
							 | 
						|
								          if (uploadResult.success) {
							 | 
						|
								            // 上传成功,更新头像URL
							 | 
						|
								            this.userInfo.avatar = uploadResult.url;
							 | 
						|
								            console.log('头像上传成功', uploadResult.url);
							 | 
						|
								            uni.showToast({
							 | 
						|
								              title: '头像上传成功',
							 | 
						|
								              icon: 'success'
							 | 
						|
								            });
							 | 
						|
								          } else {
							 | 
						|
								
							 | 
						|
								          }
							 | 
						|
								        } catch (error) {
							 | 
						|
								          uni.hideLoading();
							 | 
						|
								          console.error('头像上传异常:', error);
							 | 
						|
								          // 异常情况下使用本地头像
							 | 
						|
								          // this.userInfo.avatar = e.detail.avatarUrl;
							 | 
						|
								          uni.showToast({
							 | 
						|
								            title: '头像处理异常,使用本地头像',
							 | 
						|
								            icon: 'none'
							 | 
						|
								          });
							 | 
						|
								        }
							 | 
						|
								      } else {
							 | 
						|
								        uni.showToast({
							 | 
						|
								          title: '头像选择失败',
							 | 
						|
								          icon: 'none'
							 | 
						|
								        });
							 | 
						|
								      }
							 | 
						|
								    },
							 | 
						|
								
							 | 
						|
								    // 公众号/H5 选择图片并上传头像
							 | 
						|
								    // #ifndef MP-WEIXIN
							 | 
						|
								    async chooseImageH5() {
							 | 
						|
								      try {
							 | 
						|
								        const res = await uni.chooseImage({
							 | 
						|
								          count: 1,
							 | 
						|
								          sizeType: ['compressed'],
							 | 
						|
								          sourceType: ['album', 'camera']
							 | 
						|
								        })
							 | 
						|
								
							 | 
						|
								        const filePath = (res.tempFilePaths && res.tempFilePaths[0])
							 | 
						|
								          || (res.tempFiles && res.tempFiles[0] && (res.tempFiles[0].path || res.tempFiles[0].tempFilePath))
							 | 
						|
								
							 | 
						|
								        if (!filePath) {
							 | 
						|
								          uni.showToast({ title: '未选择图片', icon: 'none' })
							 | 
						|
								          return
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        uni.showLoading({ title: '上传头像中...' })
							 | 
						|
								
							 | 
						|
								        const file = { path: filePath, tempFilePath: filePath }
							 | 
						|
								        const uploadResult = await this.$utils.uploadImage(file)
							 | 
						|
								
							 | 
						|
								        uni.hideLoading()
							 | 
						|
								
							 | 
						|
								        if (uploadResult && uploadResult.success) {
							 | 
						|
								          this.userInfo.avatar = uploadResult.url
							 | 
						|
								          uni.showToast({ title: '头像上传成功', icon: 'success' })
							 | 
						|
								        } else {
							 | 
						|
								          // 上传失败则先本地显示
							 | 
						|
								          this.userInfo.avatar = filePath
							 | 
						|
								          uni.showToast({ title: '头像已选择', icon: 'none' })
							 | 
						|
								        }
							 | 
						|
								      } catch (error) {
							 | 
						|
								        uni.hideLoading()
							 | 
						|
								        console.error('选择/上传头像异常:', error)
							 | 
						|
								        uni.showToast({ title: '头像处理异常', icon: 'none' })
							 | 
						|
								      }
							 | 
						|
								    },
							 | 
						|
								    // #endif
							 | 
						|
								    
							 | 
						|
								    // 保存资料
							 | 
						|
								    async saveProfile() {
							 | 
						|
								      if (!this.userInfo.name?.trim()) {
							 | 
						|
								        uni.showToast({
							 | 
						|
								          title: '请输入昵称',
							 | 
						|
								          icon: 'none'
							 | 
						|
								        })
							 | 
						|
								        return
							 | 
						|
								      }
							 | 
						|
								      
							 | 
						|
								      if (!this.userInfo.phone?.trim()) {
							 | 
						|
								        uni.showToast({
							 | 
						|
								          title: '请输入手机号',
							 | 
						|
								          icon: 'none'
							 | 
						|
								        })
							 | 
						|
								        return
							 | 
						|
								      }
							 | 
						|
								      
							 | 
						|
								      // 简单的手机号验证
							 | 
						|
								      const phoneReg = /^1[3-9]\d{9}$/
							 | 
						|
								      if (!phoneReg.test(this.userInfo.phone)) {
							 | 
						|
								        uni.showToast({
							 | 
						|
								          title: '请输入正确的手机号',
							 | 
						|
								          icon: 'none'
							 | 
						|
								        })
							 | 
						|
								        return
							 | 
						|
								      }
							 | 
						|
								      
							 | 
						|
								      // TODO: 调用API保存用户信息
							 | 
						|
								      const res = await this.$api.login.updateUserInfo({
							 | 
						|
								        avatar: this.userInfo.avatar,
							 | 
						|
								        name: this.userInfo.name,
							 | 
						|
								        phone: this.userInfo.phone
							 | 
						|
								      })
							 | 
						|
								      if (res.code === 200) {
							 | 
						|
								        uni.showToast({
							 | 
						|
								          title: '保存成功',
							 | 
						|
								          icon: 'success'
							 | 
						|
								        })
							 | 
						|
								        
							 | 
						|
								        // 延迟返回上一页
							 | 
						|
								        setTimeout(() => {
							 | 
						|
								          uni.navigateBack()
							 | 
						|
								        }, 1500)
							 | 
						|
								      } 
							 | 
						|
								    },
							 | 
						|
								
							 | 
						|
								    // 获取个人信息
							 | 
						|
								    async getProfile() {
							 | 
						|
								      const res = await this.$api.login.getUserInfo()
							 | 
						|
								      if (res.code === 200) {
							 | 
						|
								        this.userInfo = res.result
							 | 
						|
								        this.$store.dispatch('updateUserInfo', this.userInfo)
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								  },
							 | 
						|
								  onLoad() {
							 | 
						|
								    this.getProfile()
							 | 
						|
								    // 3秒后隐藏遮罩层
							 | 
						|
								
							 | 
						|
								  }
							 | 
						|
								}
							 | 
						|
								</script>
							 | 
						|
								
							 | 
						|
								<style lang="scss" scoped>
							 | 
						|
								.profile-container {
							 | 
						|
								  min-height: 100vh;
							 | 
						|
								  background-color: #f5f5f5;
							 | 
						|
								  padding: 40rpx 32rpx 200rpx;
							 | 
						|
								  
							 | 
						|
								  .form-container {
							 | 
						|
								    background: #fff;
							 | 
						|
								    border-radius: 20rpx;
							 | 
						|
								    padding: 40rpx 32rpx;
							 | 
						|
								    
							 | 
						|
								    .form-title {
							 | 
						|
								      font-size: 36rpx;
							 | 
						|
								      font-weight: 600;
							 | 
						|
								      color: #333;
							 | 
						|
								      margin-bottom: 60rpx;
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    .form-item {
							 | 
						|
								      margin-bottom: 60rpx;
							 | 
						|
								      
							 | 
						|
								      &:last-child {
							 | 
						|
								        margin-bottom: 0;
							 | 
						|
								      }
							 | 
						|
								      
							 | 
						|
								      .label {
							 | 
						|
								        display: flex;
							 | 
						|
								        align-items: center;
							 | 
						|
								        margin-bottom: 20rpx;
							 | 
						|
								        font-size: 28rpx;
							 | 
						|
								        color: #333;
							 | 
						|
								        
							 | 
						|
								        .required {
							 | 
						|
								          color: #ff4757;
							 | 
						|
								          margin-right: 8rpx;
							 | 
						|
								        }
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    .avatar-container {
							 | 
						|
								      position: relative;
							 | 
						|
								      width: 200rpx;
							 | 
						|
								      height: 200rpx;
							 | 
						|
								      border-radius: 16rpx;
							 | 
						|
								      overflow: hidden;
							 | 
						|
								      display: block;
							 | 
						|
								      text-align: left;
							 | 
						|
								      margin: 0;
							 | 
						|
								      padding: 0;
							 | 
						|
								      background: none;
							 | 
						|
								      border: none;
							 | 
						|
								      
							 | 
						|
								      .avatar-image {
							 | 
						|
								        width: 100%;
							 | 
						|
								        height: 100%;
							 | 
						|
								        background: #00000080;
							 | 
						|
								        display: flex;
							 | 
						|
								        align-items: center;
							 | 
						|
								        justify-content: center;
							 | 
						|
								      }
							 | 
						|
								      
							 | 
						|
								      .avatar-mask {
							 | 
						|
								        position: absolute;
							 | 
						|
								        top: 0;
							 | 
						|
								        left: 0;
							 | 
						|
								        right: 0;
							 | 
						|
								        bottom: 0;
							 | 
						|
								        background: rgba(0, 0, 0, 0.6);
							 | 
						|
								        display: flex;
							 | 
						|
								        align-items: center;
							 | 
						|
								        justify-content: center;
							 | 
						|
								        color: #fff;
							 | 
						|
								        font-size: 24rpx;
							 | 
						|
								        transition: opacity 1s ease-out;
							 | 
						|
								        
							 | 
						|
								        &.fade-out {
							 | 
						|
								          opacity: 0;
							 | 
						|
								        }
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								  
							 | 
						|
								  .save-button-container {
							 | 
						|
								    position: fixed;
							 | 
						|
								    bottom: 60rpx;
							 | 
						|
								    left: 50%;
							 | 
						|
								    transform: translateX(-50%);
							 | 
						|
								    z-index: 999;
							 | 
						|
								  }
							 | 
						|
								}
							 | 
						|
								</style>
							 |