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({