hookehuyr

fix: 修复用户头像 API 集成问题

### 修复内容

1. **修复获取个人信息接口字段访问错误**
   - mine/index.vue: 头像显示从 `userInfo.avatar_url` 改为 `userInfo.avatar.src`
   - API 返回 avatar 对象(包含 name, hash, src, height, width, size)
   - 之前错误访问不存在的 avatar_url 字段导致头像无法显示

2. **修复更新个人资料接口参数结构错误**
   - avatar/index.vue: 传递完整 avatar 对象而非 avatar_meta_id
   - API 规范要求 `{ avatar: { name, hash, src, height, width, size } }`
   - 之前只传 `{ avatar_meta_id: xxx }` 不符合接口规范

3. **修复头像上传接口数据映射错误**
   - 根据实际上传接口返回结构正确映射字段
   - name: 从 data.data.file.name 获取
   - hash: 从 data.data.res.hash 获取
   - src: 从 data.data.src 获取
   - height/width: 从 data.data.height/width 获取
   - size: 从 data.data.file.size 获取

### 新增功能

4. **头像设置页面加载时获取用户当前头像**
   - 进入页面时调用 getProfileAPI() 获取用户信息
   - 如果用户已有头像则显示当前头像,否则显示默认头像
   - 提升用户体验,避免每次看到默认头像

### 文档更新

5. **更新 API 文档**
   - src/api/user.js: 更新 updateProfileAPI 的 JSDoc 注释
   - docs/api-specs/user/get_profile.md: 重写为清晰 Markdown 格式
   - docs/api-specs/user/update_profile.md: 重写并添加完整流程说明
   - docs/api-integration-log.md: 更新接口联调明细到 v1.8
   - docs/CHANGELOG.md: 添加详细的变更记录

### 影响文件

- src/pages/mine/index.vue(头像显示字段修复)
- src/pages/avatar/index.vue(接口参数修复 + 获取当前头像)
- src/api/user.js(API 注释更新)
- docs/api-specs/user/get_profile.md(API 文档重写)
- docs/api-specs/user/update_profile.md(API 文档重写)
- docs/api-integration-log.md(联调日志更新)
- docs/CHANGELOG.md(变更日志更新)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
...@@ -5,6 +5,75 @@ ...@@ -5,6 +5,75 @@
5 5
6 --- 6 ---
7 7
8 +## [2026-02-03] - 修复用户头像接口集成
9 +
10 +### 修复
11 +- 修复获取个人信息接口字段访问错误
12 + - `mine/index.vue`: 头像显示从 `userInfo.avatar_url` 改为 `userInfo.avatar.src`
13 + - API 返回 `avatar` 对象(包含 name, hash, src, height, width, size)
14 + - 之前错误访问不存在的 `avatar_url` 字段导致头像无法显示
15 +- 修复更新个人资料接口参数结构错误
16 + - `avatar/index.vue`: 传递完整 `avatar` 对象而非 `avatar_meta_id`
17 + - API 规范要求 `{ avatar: { name, hash, src, height, width, size } }`
18 + - 之前只传 `{ avatar_meta_id: xxx }` 不符合接口规范
19 +- 修复头像上传接口数据映射错误
20 + - 根据实际上传接口返回结构正确映射字段
21 + - `name`: 从 `data.data.file.name` 获取
22 + - `hash`: 从 `data.data.res.hash` 获取
23 + - `src`: 从 `data.data.src` 获取
24 + - `height/width`: 从 `data.data.height/width` 获取
25 + - `size`: 从 `data.data.file.size` 获取
26 +
27 +### 新增
28 +- 头像设置页面加载时获取用户当前头像
29 + - 进入页面时调用 `getProfileAPI()` 获取用户信息
30 + - 如果用户已有头像则显示当前头像,否则显示默认头像
31 + - 提升用户体验,避免每次看到默认头像
32 +
33 +### 文档
34 +- 更新 `src/api/user.js``updateProfileAPI` 的 JSDoc 注释
35 + - 明确参数结构:`avatar` 对象包含完整字段
36 + - 添加所有字段的类型和说明
37 +
38 +---
39 +
40 +**详细信息**
41 +- **影响文件**:
42 + - `src/pages/mine/index.vue`(头像显示字段修复)
43 + - `src/pages/avatar/index.vue`(接口参数修复 + 获取当前头像)
44 + - `src/api/user.js`(API 注释更新)
45 +- **技术栈**: Vue 3, Taro 4, Composition API
46 +- **测试状态**: ✅ 已通过
47 +- **备注**:
48 + - 上传接口返回示例:
49 + ```json
50 + {
51 + "code": 0,
52 + "data": {
53 + "src": "https://cdn...",
54 + "file": { "name": "...", "size": 3806359 },
55 + "res": { "hash": "...", "image_info": { "width": 1766, "height": 1770 } },
56 + "width": 1766,
57 + "height": 1770
58 + }
59 + }
60 + ```
61 + - 更新头像接口请求格式:
62 + ```javascript
63 + updateProfileAPI({
64 + avatar: {
65 + name: "文件名",
66 + hash: "文件hash",
67 + src: "https://cdn...",
68 + height: "1770",
69 + width: "1766",
70 + size: 3806359
71 + }
72 + })
73 + ```
74 +
75 +---
76 +
8 ## [2026-02-03] - 产品模块接口集成完成 77 ## [2026-02-03] - 产品模块接口集成完成
9 78
10 ### 新增 79 ### 新增
......
...@@ -13,6 +13,15 @@ ...@@ -13,6 +13,15 @@
13 13
14 --- 14 ---
15 15
16 +**📝 最近更新** (2026-02-03):
17 +-**修复获取个人信息接口字段访问错误**:修正 avatar 字段结构(对象而非字符串)
18 +-**修复更新个人资料接口参数结构错误**:传递完整 avatar 对象而非 avatar_meta_id
19 +-**修复头像上传接口数据映射错误**:根据实际返回结构正确映射字段
20 +-**新增头像设置页面加载时获取用户当前头像功能**:提升用户体验
21 +-**更新 API 文档**:完善 get_profile 和 update_profile 接口文档
22 +
23 +---
24 +
16 ## 📝 接口联调明细 25 ## 📝 接口联调明细
17 26
18 ### 用户中心模块 27 ### 用户中心模块
...@@ -84,13 +93,14 @@ ...@@ -84,13 +93,14 @@
84 - **接口名称**: `getProfileAPI` 93 - **接口名称**: `getProfileAPI`
85 - **接口路径**: `/srv/?a=user&t=get_profile` 94 - **接口路径**: `/srv/?a=user&t=get_profile`
86 - **请求方法**: GET 95 - **请求方法**: GET
87 -- **负责页面**: `src/pages/mine/index.vue` 96 +- **负责页面**: `src/pages/mine/index.vue`, `src/pages/avatar/index.vue`, `src/stores/user.js`
88 - **负责人**: 后端团队 97 - **负责人**: 后端团队
89 98
90 **接口文档更新记录** 99 **接口文档更新记录**
91 100
92 | 日期 | 版本 | 变更内容 | 变更原因 | 文档链接 | 101 | 日期 | 版本 | 变更内容 | 变更原因 | 文档链接 |
93 |------|------|---------|---------|---------| 102 |------|------|---------|---------|---------|
103 +| 2026-02-03 | v1.2 | 修正 avatar 字段结构 | 修复头像显示问题 | [查看](docs/api-specs/user/get_profile.md) |
94 | 2026-02-03 | v1.1 | 新增 `employee_no` 字段(工号) | 业务需求变更 | [查看](#) | 104 | 2026-02-03 | v1.1 | 新增 `employee_no` 字段(工号) | 业务需求变更 | [查看](#) |
95 | 2026-02-03 | v1.0 | 初始版本 | - | [查看](#) | 105 | 2026-02-03 | v1.0 | 初始版本 | - | [查看](#) |
96 106
...@@ -99,20 +109,44 @@ ...@@ -99,20 +109,44 @@
99 | 日期 | 调试页面 | 问题记录 | 解决方案 | 状态 | 109 | 日期 | 调试页面 | 问题记录 | 解决方案 | 状态 |
100 |------|---------|---------|---------|------| 110 |------|---------|---------|---------|------|
101 | 2026-02-03 | `src/pages/mine/index.vue` | 页面显示 ID 字段,应显示工号 | 将 `userInfo?.id` 改为 `userInfo?.employee_no` | ✅ 已完成 | 111 | 2026-02-03 | `src/pages/mine/index.vue` | 页面显示 ID 字段,应显示工号 | 将 `userInfo?.id` 改为 `userInfo?.employee_no` | ✅ 已完成 |
112 +| 2026-02-03 | `src/pages/mine/index.vue` | 头像显示不正确 | `userInfo?.avatar_url` 改为 `userInfo?.avatar.src` | ✅ 已完成 |
113 +| 2026-02-03 | `src/pages/avatar/index.vue` | 新增获取当前头像功能 | 页面加载时调用 `getProfileAPI()` | ✅ 已完成 |
102 114
103 **接口状态**: ✅ 已完成 115 **接口状态**: ✅ 已完成
104 116
105 **备注**: 117 **备注**:
106 -- **返回用户信息** 118 +- **返回用户信息结构**
107 - - `id` - 用户ID(内部标识) 119 + ```json
108 - - `employee_no` - 工号(对外展示)⭐ 新增 120 + {
109 - - `avatar_url` - 头像URL 121 + "user": {
110 - - `name` - 姓名 122 + "id": 123,
111 - - `avatar_meta_id` - 头像附件ID 123 + "name": "张三",
112 -- **重要变更**:页面展示工号使用 `employee_no` 字段,而非 `id` 字段 124 + "employee_no": "EMP001",
125 + "avatar": {
126 + "name": "avatar.png",
127 + "hash": "abc123",
128 + "src": "https://cdn.ipadbiz.cn/manulife/avatar.png", // 头像URL
129 + "height": "200",
130 + "width": "200",
131 + "size": 10240
132 + }
133 + }
134 + }
135 + ```
136 +- **重要修复**:v1.2 版本修正了 avatar 字段结构
137 + - 之前文档错误描述为 `avatar_url`(字符串)
138 + - 实际返回 `avatar` 对象(包含完整信息)
139 +- **访问方式**:
140 + - 头像URL: `user.avatar.src`
141 + - 文件名: `user.avatar.name`
142 + - 文件hash: `user.avatar.hash`
113 - "我的"页面加载时调用 143 - "我的"页面加载时调用
144 +- "修改头像"页面加载时调用(获取当前头像)
114 - 401 自动跳转登录页(由 request.js 拦截器处理) 145 - 401 自动跳转登录页(由 request.js 拦截器处理)
115 -- 实现位置:`src/pages/mine/index.vue:fetchUserProfile()` 146 +- 实现位置:
147 + - `src/pages/mine/index.vue:fetchUserProfile()`
148 + - `src/pages/avatar/index.vue:fetchCurrentAvatar()`
149 + - `src/stores/user.js:fetchUserInfo()`
116 150
117 --- 151 ---
118 152
...@@ -191,22 +225,50 @@ ...@@ -191,22 +225,50 @@
191 225
192 | 日期 | 版本 | 变更内容 | 变更原因 | 文档链接 | 226 | 日期 | 版本 | 变更内容 | 变更原因 | 文档链接 |
193 |------|------|---------|---------|---------| 227 |------|------|---------|---------|---------|
228 +| 2026-02-03 | v1.2 | 修正请求参数结构 | 修复接口调用错误 | [查看](docs/api-specs/user/update_profile.md) |
194 | 2026-02-03 | v1.0 | 初始版本 | - | [查看](#) | 229 | 2026-02-03 | v1.0 | 初始版本 | - | [查看](#) |
195 230
196 **页面调试情况** 231 **页面调试情况**
197 232
198 | 日期 | 调试页面 | 问题记录 | 解决方案 | 状态 | 233 | 日期 | 调试页面 | 问题记录 | 解决方案 | 状态 |
199 |------|---------|---------|---------|------| 234 |------|---------|---------|---------|------|
200 -| 2026-02-03 | `src/pages/avatar/index.vue` | 后端开发中 | - | ⏳ 后端开发中 | 235 +| 2026-02-03 | `src/pages/avatar/index.vue` | 参数结构不正确 | 改为传递完整 `avatar` 对象 | 已完成 |
201 -| 2026-02-03 | `src/pages/avatar/index.vue` | 联调完成 | 改用直接上传方式 | ✅ 已完成 | 236 +| 2026-02-03 | `src/pages/avatar/index.vue` | 字段映射错误 | 根据实际上传接口返回结构映射字段 | 已完成 |
237 +| 2026-02-03 | `src/pages/avatar/index.vue` | 联调完成 | 接口正常工作,头像更新成功 | 已完成 |
202 238
203 **接口状态**: 已完成 239 **接口状态**: 已完成
204 240
205 **备注**: 241 **备注**:
206 -- 参数:avatar_url(头像URL) 242 +- **请求参数结构**(v1.2 修正):
207 -- 用于用户修改头像 243 + ```javascript
208 -- 联调完成,接口正常工作 244 + {
209 -- 实现位置:`src/pages/avatar/index.vue:121-163` 245 + avatar: {
246 + name: "文件名",
247 + hash: "文件hash",
248 + src: "https://cdn...", // 头像CDN URL
249 + height: "1770", // 字符串格式
250 + width: "1766", // 字符串格式
251 + size: 3806359 // 整数(字节)
252 + }
253 + }
254 + ```
255 +- **重要修复**:v1.2 版本修正了请求参数结构
256 + - 之前文档错误描述参数为 `avatar_meta_id`
257 + - 实际参数为完整的 `avatar` 对象
258 +- **完整流程**:
259 + 1. 选择图片 `Taro.chooseImage`
260 + 2. 上传到服务器 `Taro.uploadFile` (`/admin/?m=srv&a=upload&image_audit=1`)
261 + 3. 映射字段 根据实际上传接口返回结构
262 + 4. 保存到服务器 `updateProfileAPI({ avatar: {...} })`
263 +- **字段映射关系**:
264 + - `name`: `data.data.file.name`
265 + - `hash`: `data.data.res.hash`
266 + - `src`: `data.data.src`
267 + - `height`: `data.data.height` `data.data.res.image_info.height`
268 + - `width`: `data.data.width` `data.data.res.image_info.width`
269 + - `size`: `data.data.file.size` `data.data.res.filesize`
270 +- 实现位置:`src/pages/avatar/index.vue:75-186`
271 +- API 文档:[docs/api-specs/user/update_profile.md](docs/api-specs/user/update_profile.md)
210 272
211 --- 273 ---
212 274
...@@ -680,17 +742,19 @@ ...@@ -680,17 +742,19 @@
680 742
681 --- 743 ---
682 744
683 -**最后更新时间**: 2026-02-03 23:30 745 +**最后更新时间**: 2026-02-03 20:00
684 -**文档版本**: v1.7 746 +**文档版本**: v1.8
685 **更新内容**: 747 **更新内容**:
686 -- 产品模块联调完成:2个接口 748 +- 用户中心模块 v1.2 修复:2个接口
687 - - 产品列表(listAPI):✅ 已完成 749 + - 获取个人信息(getProfileAPI):✅ 已修复
688 - - 首页热卖产品模块,使用 recommend=hot 参数 750 + - 修复头像字段结构从 avatar_url 字符串改为 avatar 对象
689 - - 动态标签渲染(使用 API 返回的 bg_color 和 text_color) 751 + - 修复 mine 页面头像显示问题(userInfo.avatar?.src)
690 - - 产品详情(detailAPI):✅ 已完成 752 + - 更新个人资料(updateProfileAPI):✅ 已修复
691 - - 产品详情页,使用富文本渲染 product_description 753 + - 修复参数结构从 avatar_meta_id 改为完整 avatar 对象
692 - - 附件列表显示(使用 file_size_formatted 字段) 754 + - 修复上传接口响应数据映射(正确提取 name、hash、src、height、width、size 字段)
693 - - 移除收藏功能 755 + - 添加页面加载时获取当前头像功能
694 -- 修复问题:
695 - - 产品详情页 nut-loading 组件报错(改用纯 CSS 加载动画)
696 - 更新总体进度:16个接口(11个已完成,3个已废弃,2个后端开发中) 756 - 更新总体进度:16个接口(11个已完成,3个已废弃,2个后端开发中)
757 +
758 +**历史版本**:
759 +- v1.7 (2026-02-03 23:30): 产品模块联调完成
760 +- v1.6 (2026-02-02): 意见反馈模块联调完成
......
...@@ -58,30 +58,58 @@ paths: ...@@ -58,30 +58,58 @@ paths:
58 id: 58 id:
59 type: integer 59 type: integer
60 title: 用户ID 60 title: 用户ID
61 - avatar_url:
62 - type: string
63 - title: 头像
64 name: 61 name:
65 type: string 62 type: string
66 title: 姓名 63 title: 姓名
67 - avatar_meta_id:
68 - type: integer
69 - title: 头像的附件ID
70 employee_no: 64 employee_no:
71 type: string 65 type: string
72 title: 工号 66 title: 工号
67 + avatar:
68 + type: object
69 + properties:
70 + name:
71 + type: string
72 + title: 文件名
73 + hash:
74 + type: string
75 + title: 文件hash
76 + src:
77 + type: string
78 + title: 文件地址
79 + height:
80 + type: string
81 + title: 文件高度
82 + width:
83 + type: string
84 + title: 文件宽度
85 + size:
86 + type: integer
87 + title: 文件大小
88 + x-apifox-orders:
89 + - name
90 + - hash
91 + - src
92 + - height
93 + - width
94 + - size
95 + title: 头像
96 + required:
97 + - name
98 + - hash
99 + - src
100 + - height
101 + - width
102 + - size
73 x-apifox-orders: 103 x-apifox-orders:
74 - id 104 - id
75 - name 105 - name
76 - - avatar_url 106 + - avatar
77 - - avatar_meta_id
78 - employee_no 107 - employee_no
79 title: 用户信息 108 title: 用户信息
80 required: 109 required:
81 - id 110 - id
82 - - avatar_url 111 + - avatar
83 - name 112 - name
84 - - avatar_meta_id
85 - employee_no 113 - employee_no
86 x-apifox-orders: 114 x-apifox-orders:
87 - user 115 - user
...@@ -100,7 +128,7 @@ paths: ...@@ -100,7 +128,7 @@ paths:
100 x-apifox-ordering: 0 128 x-apifox-ordering: 0
101 security: [] 129 security: []
102 x-apifox-folder: 用户 130 x-apifox-folder: 用户
103 - x-apifox-status: testing 131 + x-apifox-status: released
104 x-run-in-apifox: https://app.apifox.com/web/project/7792797/apis/api-413906668-run 132 x-run-in-apifox: https://app.apifox.com/web/project/7792797/apis/api-413906668-run
105 components: 133 components:
106 schemas: {} 134 schemas: {}
......
...@@ -43,15 +43,56 @@ paths: ...@@ -43,15 +43,56 @@ paths:
43 schema: 43 schema:
44 type: object 44 type: object
45 properties: 45 properties:
46 - avatar_meta_id: 46 + avatar:
47 + type: object
48 + properties:
49 + name:
50 + type: string
51 + title: 文件名
52 + hash:
53 + type: string
54 + title: 文件hash
55 + src:
56 + type: string
57 + title: 文件地址
58 + height:
59 + type: string
60 + title: 文件高度
61 + width:
62 + type: string
63 + title: 文件宽度
64 + size:
47 type: integer 65 type: integer
48 - title: 头像的附件ID 66 + title: 文件大小
67 + x-apifox-orders:
68 + - name
69 + - hash
70 + - src
71 + - height
72 + - width
73 + - size
74 + title: 头像
49 required: 75 required:
50 - - avatar_meta_id 76 + - name
77 + - hash
78 + - src
79 + - height
80 + - width
81 + - size
51 x-apifox-orders: 82 x-apifox-orders:
52 - - avatar_meta_id 83 + - avatar
84 + title: 头像
85 + required:
86 + - avatar
53 example: 87 example:
54 - avatar_meta_id: 834933 88 + avatar:
89 + name: 77777-test.png
90 + hash: FiKJlV6Sq6oQ4HgLIdqCfye6qKOr
91 + src: >-
92 + https://cdn.ipadbiz.cn/space_816560/77777_FiKJlV6Sq6oQ4HgLIdqCfye6qKOr.png
93 + height: '45'
94 + width: '74'
95 + size: 4497
55 responses: 96 responses:
56 '200': 97 '200':
57 description: '' 98 description: ''
...@@ -76,7 +117,7 @@ paths: ...@@ -76,7 +117,7 @@ paths:
76 x-apifox-ordering: 0 117 x-apifox-ordering: 0
77 security: [] 118 security: []
78 x-apifox-folder: 用户 119 x-apifox-folder: 用户
79 - x-apifox-status: testing 120 + x-apifox-status: released
80 x-run-in-apifox: https://app.apifox.com/web/project/7792797/apis/api-413906669-run 121 x-run-in-apifox: https://app.apifox.com/web/project/7792797/apis/api-413906669-run
81 components: 122 components:
82 schemas: {} 123 schemas: {}
......
...@@ -18,10 +18,9 @@ const Api = { ...@@ -18,10 +18,9 @@ const Api = {
18 * data: { 18 * data: {
19 * user: { 19 * user: {
20 * id: integer; // 用户ID 20 * id: integer; // 用户ID
21 - * avatar_url: string; // 头像
22 * name: string; // 姓名 21 * name: string; // 姓名
23 - * avatar_meta_id: integer; // 头像的附件ID
24 * employee_no: string; // 工号 22 * employee_no: string; // 工号
23 + * avatar: object; // 头像
25 * }; 24 * };
26 * }; 25 * };
27 * }>} 26 * }>}
...@@ -73,7 +72,13 @@ export const logoutAPI = (params) => fn(fetch.post(Api.Logout, params)); ...@@ -73,7 +72,13 @@ export const logoutAPI = (params) => fn(fetch.post(Api.Logout, params));
73 * @description 更新个人资料 72 * @description 更新个人资料
74 * @remark 73 * @remark
75 * @param {Object} params 请求参数 74 * @param {Object} params 请求参数
76 - * @param {integer} params.avatar_meta_id 75 + * @param {Object} params.avatar - 头像对象(完整结构)
76 + * @param {string} params.avatar.name - 文件名
77 + * @param {string} params.avatar.hash - 文件hash
78 + * @param {string} params.avatar.src - 文件地址
79 + * @param {string} params.avatar.height - 文件高度
80 + * @param {string} params.avatar.width - 文件宽度
81 + * @param {number} params.avatar.size - 文件大小
77 * @returns {Promise<{ 82 * @returns {Promise<{
78 * code: number; // 状态码 83 * code: number; // 状态码
79 * msg: string; // 消息 84 * msg: string; // 消息
......
...@@ -35,18 +35,39 @@ ...@@ -35,18 +35,39 @@
35 35
36 <script setup> 36 <script setup>
37 import { ref } from 'vue' 37 import { ref } from 'vue'
38 -import { useGo } from '@/hooks/useGo'
39 import IconFont from '@/components/IconFont.vue' 38 import IconFont from '@/components/IconFont.vue'
40 import NavHeader from '@/components/NavHeader.vue' 39 import NavHeader from '@/components/NavHeader.vue'
41 -import Taro from '@tarojs/taro' 40 +import Taro, { useLoad } from '@tarojs/taro'
42 import defaultAvatar from '@/assets/images/icon/avatar.svg' 41 import defaultAvatar from '@/assets/images/icon/avatar.svg'
43 -import { updateProfileAPI } from '@/api/user' 42 +import { updateProfileAPI, getProfileAPI } from '@/api/user'
44 import BASE_URL from '@/utils/config' 43 import BASE_URL from '@/utils/config'
45 44
46 -const go = useGo()
47 const avatarUrl = ref(defaultAvatar) 45 const avatarUrl = ref(defaultAvatar)
48 -const tempAvatarUrl = ref('') // 临时存储上传后的头像URL 46 +const tempAvatarData = ref(null) // 临时存储上传后的完整 avatar 对象
49 -const tempAvatarMetaId = ref(null) // 临时存储上传后的头像 meta_id 47 +
48 +/**
49 + * @description 获取用户当前头像
50 + * @description 页面加载时调用,如果用户已有头像则显示
51 + */
52 +const fetchCurrentAvatar = async () => {
53 + try {
54 + const res = await getProfileAPI()
55 + if (res.code === 1 && res.data?.user?.avatar?.src) {
56 + // 用户已有头像,显示当前头像
57 + avatarUrl.value = res.data.user.avatar.src
58 + }
59 + } catch (err) {
60 + console.error('获取用户头像失败:', err)
61 + // 失败时使用默认头像,不显示错误提示
62 + }
63 +}
64 +
65 +/**
66 + * @description 页面加载时获取用户当前头像
67 + */
68 +useLoad(() => {
69 + fetchCurrentAvatar()
70 +})
50 71
51 /** 72 /**
52 * @description 更换头像(参考老来赛项目,直接上传到服务器) 73 * @description 更换头像(参考老来赛项目,直接上传到服务器)
...@@ -93,10 +114,17 @@ const onChangeAvatar = () => { ...@@ -93,10 +114,17 @@ const onChangeAvatar = () => {
93 114
94 if (data.code === 0) { // 注意:老来赛后端 code=0 表示成功 115 if (data.code === 0) { // 注意:老来赛后端 code=0 表示成功
95 avatarUrl.value = data.data.src 116 avatarUrl.value = data.data.src
96 - tempAvatarUrl.value = data.data.src 117 + // 保存完整的 avatar 对象,用于后续更新
97 - // 保存 meta_id,用于后续更新头像 118 + // 根据实际接口返回结构映射字段
98 - tempAvatarMetaId.value = data.data.meta_id || data.data.id || null 119 + tempAvatarData.value = {
99 - console.log('上传成功,meta_id:', tempAvatarMetaId.value) 120 + name: data.data.file?.name || data.data.title || '',
121 + hash: data.data.res?.hash || '',
122 + src: data.data.src || '',
123 + height: String(data.data.height || data.data.res?.image_info?.height || '0'),
124 + width: String(data.data.width || data.data.res?.image_info?.width || '0'),
125 + size: data.data.file?.size || data.data.res?.filesize || 0
126 + }
127 + console.log('上传成功,avatar 对象:', tempAvatarData.value)
100 Taro.showToast({ 128 Taro.showToast({
101 title: '上传成功', 129 title: '上传成功',
102 icon: 'success' 130 icon: 'success'
...@@ -132,7 +160,7 @@ const onCancel = () => { ...@@ -132,7 +160,7 @@ const onCancel = () => {
132 */ 160 */
133 const onSave = async () => { 161 const onSave = async () => {
134 // 如果没有上传新头像,直接返回 162 // 如果没有上传新头像,直接返回
135 - if (!tempAvatarUrl.value) { 163 + if (!tempAvatarData.value) {
136 Taro.showToast({ 164 Taro.showToast({
137 title: '请先选择头像', 165 title: '请先选择头像',
138 icon: 'none' 166 icon: 'none'
...@@ -140,9 +168,9 @@ const onSave = async () => { ...@@ -140,9 +168,9 @@ const onSave = async () => {
140 return 168 return
141 } 169 }
142 170
143 - // 检查是否有 meta_id 171 + // 检查 avatar 对象完整性
144 - if (!tempAvatarMetaId.value) { 172 + if (!tempAvatarData.value.src) {
145 - console.error('缺少 avatar_meta_id,上传响应可能不包含 meta_id 字段') 173 + console.error('avatar 对象缺少 src 字段')
146 Taro.showToast({ 174 Taro.showToast({
147 title: '上传数据异常,请重试', 175 title: '上传数据异常,请重试',
148 icon: 'none' 176 icon: 'none'
...@@ -154,9 +182,9 @@ const onSave = async () => { ...@@ -154,9 +182,9 @@ const onSave = async () => {
154 Taro.showLoading({ title: '保存中...', mask: true }) 182 Taro.showLoading({ title: '保存中...', mask: true })
155 183
156 try { 184 try {
157 - // ✅ 修复:传递正确的参数 avatar_meta_id 185 + // ✅ 修复:传递完整的 avatar 对象(符合 API 规范)
158 const res = await updateProfileAPI({ 186 const res = await updateProfileAPI({
159 - avatar_meta_id: tempAvatarMetaId.value 187 + avatar: tempAvatarData.value
160 }) 188 })
161 189
162 Taro.hideLoading() 190 Taro.hideLoading()
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
12 > 12 >
13 <!-- Avatar --> 13 <!-- Avatar -->
14 <view class="w-[160rpx] h-[160rpx] rounded-full overflow-hidden border-2 border-white shadow-sm shrink-0"> 14 <view class="w-[160rpx] h-[160rpx] rounded-full overflow-hidden border-2 border-white shadow-sm shrink-0">
15 - <img class="w-full h-full object-cover" :src="userInfo?.avatar_url || defaultAvatar" /> 15 + <img class="w-full h-full object-cover" :src="userInfo?.avatar?.src || defaultAvatar" />
16 </view> 16 </view>
17 17
18 <!-- Info --> 18 <!-- Info -->
......