From 82495142625d3f0310a811ef68ac75ed6bd28882 Mon Sep 17 00:00:00 2001 From: H1d3rOne Date: Tue, 10 Mar 2026 07:25:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=A4=B4=E5=83=8F=E4=B8=8A=E4=BC=A0=E5=88=B0=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - auth-modal.vue: 登录前先上传微信临时头像到服务器 - uploadAvatar接口支持临时上传(temp参数) - 数据库avatar_url存储服务器路径而非临时路径 --- .../java/xuan/controller/UserController.java | 26 ++++++----- .../src/components/auth-modal/auth-modal.vue | 43 ++++++++++++++++++- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/main/java/xuan/controller/UserController.java b/src/main/java/xuan/controller/UserController.java index 43dc737..0b0a984 100644 --- a/src/main/java/xuan/controller/UserController.java +++ b/src/main/java/xuan/controller/UserController.java @@ -369,7 +369,8 @@ public class UserController { @PostMapping("/uploadAvatar") public Map uploadAvatar( @RequestParam("file") MultipartFile file, - @RequestParam("userId") String userId) { + @RequestParam(value = "userId", required = false) String userId, + @RequestParam(value = "temp", required = false) String temp) { Map result = new HashMap<>(); try { if (file.isEmpty()) { @@ -385,7 +386,7 @@ public class UserController { } String originalFilename = file.getOriginalFilename(); - String extension = ""; + String extension = ".jpg"; if (originalFilename != null && originalFilename.contains(".")) { extension = originalFilename.substring(originalFilename.lastIndexOf(".")); } @@ -396,16 +397,19 @@ public class UserController { String avatarUrl = "/uploads/avatars/" + filename; - UserInfo user = userInfoService.updateAvatarUrl(userId, avatarUrl); - if (user != null) { - Map data = new HashMap<>(); - data.put("avatarUrl", avatarUrl); - result.put("success", true); - result.put("data", data); - } else { - result.put("success", false); - result.put("error", "用户不存在"); + if (userId != null && !userId.isEmpty() && !"true".equals(temp)) { + UserInfo user = userInfoService.updateAvatarUrl(userId, avatarUrl); + if (user == null) { + result.put("success", false); + result.put("error", "用户不存在"); + return result; + } } + + Map data = new HashMap<>(); + data.put("avatarUrl", avatarUrl); + result.put("success", true); + result.put("data", data); } catch (IOException e) { result.put("success", false); result.put("error", "文件上传失败: " + e.getMessage()); diff --git a/xuan-deduct-uniapp/src/components/auth-modal/auth-modal.vue b/xuan-deduct-uniapp/src/components/auth-modal/auth-modal.vue index d81f875..0731840 100644 --- a/xuan-deduct-uniapp/src/components/auth-modal/auth-modal.vue +++ b/xuan-deduct-uniapp/src/components/auth-modal/auth-modal.vue @@ -210,10 +210,44 @@ export default { console.log('获取code成功:', loginRes.code) + let avatarUrlForServer = this.avatarUrl + if (this.avatarUrl && (this.avatarUrl.startsWith('http://tmp/') || this.avatarUrl.startsWith('wxfile://'))) { + uni.showLoading({ title: '上传头像...' }) + try { + const uploadRes = await new Promise((resolve, reject) => { + uni.uploadFile({ + url: api.getBaseUrl() + '/user/uploadAvatar', + filePath: this.avatarUrl, + name: 'file', + formData: { + temp: 'true' + }, + success: (res) => { + try { + const data = JSON.parse(res.data) + resolve(data) + } catch (e) { + reject(e) + } + }, + fail: reject + }) + }) + + if (uploadRes.success && uploadRes.data) { + avatarUrlForServer = uploadRes.data.avatarUrl || uploadRes.data + } + uni.hideLoading() + } catch (e) { + uni.hideLoading() + console.error('上传头像失败:', e) + } + } + const res = await api.userApi.loginOrRegister({ code: loginRes.code, nickname: this.nickname, - avatarUrl: this.avatarUrl + avatarUrl: avatarUrlForServer }) if (res.success) { @@ -224,7 +258,12 @@ export default { uni.setStorageSync('userCoins', res.data.coins || 0) uni.setStorageSync('vipLevel', res.data.vipLevel || 0) uni.setStorageSync('username', res.data.username || this.nickname) - uni.setStorageSync('userAvatar', res.data.avatarUrl || this.avatarUrl) + + let avatarUrl = res.data.avatarUrl || '' + if (avatarUrl && !avatarUrl.startsWith('http') && !avatarUrl.startsWith('wxfile://')) { + avatarUrl = api.getBaseUrl().replace('/api', '') + avatarUrl + } + uni.setStorageSync('userAvatar', avatarUrl) uni.setStorageSync('isLoggedIn', true) uni.showToast({