# 头像上传功能实现说明 ## 完成时间 2026-01-27 ## 功能概述 将Profile页面的头像上传功能从Base64编码改为调用后端文件上传接口,获取云存储URL。 ## 实现细节 ### 1. API接口配置 在 `lottery-app/src/api/index.js` 中已添加文件上传接口: ```javascript // 上传文件 uploadFile(file) { const formData = new FormData() formData.append('file', file) return api.post('/file/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) } ``` **接口地址**: `POST /api/file/upload` **请求格式**: `multipart/form-data` **响应格式**: ```json { "code": 0, "data": { "fileName": "a1b2c3d4-e5f6-7890-abcd-ef1234567890.jpg", "fileUrl": "https://yicaishuzhi-1326058838.cos.ap-beijing.myqcloud.com/a1b2c3d4-e5f6-7890-abcd-ef1234567890.jpg", "originalFilename": "avatar.jpg" }, "message": "ok" } ``` ### 2. 数据状态管理 在 `lottery-app/src/views/Profile.vue` 的 data 中添加了上传状态标志: ```javascript data() { return { // ... 其他属性 uploadingAvatar: false, // 新增:头像上传状态 // ... } } ``` ### 3. 头像上传方法实现 修改了 `handleAvatarChange` 方法: **主要改动**: - 从读取文件为Base64改为调用 `lotteryApi.uploadFile(file)` 接口 - 添加上传状态管理 (`uploadingAvatar`) - 从响应中获取 `fileUrl` 并设置到 `editForm.userAvatar` - 添加完整的错误处理和用户提示 - 清空文件输入框,允许重新选择同一文件 **代码实现**: ```javascript async handleAvatarChange(event) { const file = event.target.files[0] if (!file) return // 验证文件类型 if (!file.type.startsWith('image/')) { this.$toast.error('请选择图片文件') return } // 验证文件大小(限制2MB) if (file.size > 2 * 1024 * 1024) { this.$toast.error('图片大小不能超过2MB') return } this.uploadingAvatar = true try { // 显示上传提示 this.$toast.info('正在上传头像...') // 调用上传接口 const response = await lotteryApi.uploadFile(file) if (response.code === 0 && response.data && response.data.fileUrl) { // 上传成功,设置头像URL this.editForm.userAvatar = response.data.fileUrl this.$toast.success('头像上传成功!') } else { this.$toast.error(response.message || '头像上传失败') } } catch (error) { console.error('头像上传失败:', error) this.$toast.error('头像上传失败,请稍后重试') } finally { this.uploadingAvatar = false // 清空文件输入框,允许重新选择同一文件 event.target.value = '' } } ``` ### 4. UI交互优化 #### 4.1 头像预览区域 添加了上传中的遮罩层和加载动画: ```vue