peixue-dev/Archive/[一次性]个人资料功能开发方案-2026-01-28.md

262 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 个人资料功能开发方案
## 📋 功能清单
### 1. 头像上传功能 ✅
- 点击头像选择图片
- 上传到服务器
- 更新用户头像
### 2. 生日选择 ✅
- 日期选择器
- 保存生日信息
### 3. 所在地区选择 ✅
- 省市区三级联动
- 保存地区信息
### 4. 实名认证 ⚠️
- 需要后端接口支持
- 暂时显示"功能开发中"
### 5. 保存修改 ✅
- 调用后端API保存所有修改
## 🔧 后端API状态
### 已有接口
**1. 获取个人资料**
```
GET /api/user/profile
Response: {
id, nickname, phone, gender, birthday,
region, avatar, createTime, role
}
```
**2. 更新个人资料**
```
PUT /api/user/profile
Body: {
nickname, gender, birthday, avatar, region
}
```
### 需要添加的接口
**1. 头像上传**
```java
@PostMapping("/upload-avatar")
public Result<String> uploadAvatar(@CurrentUser Long userId,
@RequestParam("file") MultipartFile file) {
// 1. 验证文件类型jpg, png, jpeg
// 2. 验证文件大小(< 5MB
// 3. 生成唯一文件名
// 4. 保存到服务器或OSS
// 5. 返回文件URL
return Result.success(fileUrl);
}
```
**2. 实名认证**
```java
@PostMapping("/real-name-auth")
public Result<?> realNameAuth(@CurrentUser Long userId,
@RequestBody RealNameDTO dto) {
// dto包含realName, idCard, idCardFront, idCardBack
// 1. 验证身份证号格式
// 2. 调用第三方实名认证API
// 3. 更新用户实名状态
return Result.success();
}
```
## 📱 前端实现
### 修改文件
`peidu/uniapp/src/user-package/pages/user/profile.vue`
### 关键功能实现
#### 1. 生日选择器
```javascript
selectBirthday() {
uni.showModal({
title: '选择生日',
editable: false,
content: '请使用日期选择器',
showCancel: false
})
// 使用uni-app的picker组件
// mode="date"
}
```
#### 2. 地区选择器
```javascript
selectRegion() {
uni.chooseLocation({
success: (res) => {
this.userInfo.region = res.address
}
})
// 或使用省市区三级联动组件
}
```
#### 3. 头像上传
```javascript
async changeAvatar() {
uni.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: async (res) => {
const tempFilePath = res.tempFilePaths[0]
await this.uploadAvatar(tempFilePath)
}
})
}
async uploadAvatar(filePath) {
uni.showLoading({ title: '上传中...' })
try {
// 方案1使用uni.uploadFile
const uploadRes = await uni.uploadFile({
url: 'http://your-server/api/user/upload-avatar',
filePath: filePath,
name: 'file',
header: {
'Authorization': 'Bearer ' + uni.getStorageSync('token')
}
})
const data = JSON.parse(uploadRes.data)
if (data.code === 200) {
this.userInfo.avatar = data.data
uni.showToast({ title: '上传成功', icon: 'success' })
}
} catch (error) {
uni.showToast({ title: '上传失败', icon: 'none' })
} finally {
uni.hideLoading()
}
}
```
#### 4. 保存修改
```javascript
async saveProfile() {
try {
uni.showLoading({ title: '保存中...' })
const res = await userApi.updateUserInfo({
nickname: this.userInfo.nickname,
gender: this.userInfo.gender,
birthday: this.userInfo.birthday,
region: this.userInfo.region,
avatar: this.userInfo.avatar
})
if (res && res.code === 200) {
uni.showToast({ title: '保存成功', icon: 'success' })
// 更新本地存储
uni.setStorageSync('userInfo', this.userInfo)
// 1秒后返回
setTimeout(() => {
uni.navigateBack()
}, 1000)
}
} catch (e) {
uni.showToast({ title: '保存失败', icon: 'none' })
} finally {
uni.hideLoading()
}
}
```
## 🚀 实施步骤
### 第1步添加后端头像上传接口
`UserController.java` 中添加:
```java
@Autowired
private FileService fileService; // 需要创建文件服务
@ApiOperation("上传头像")
@PostMapping("/upload-avatar")
public Result<String> uploadAvatar(@CurrentUser Long userId,
@RequestParam("file") MultipartFile file) {
try {
// 验证文件
if (file.isEmpty()) {
return Result.error("文件不能为空");
}
String contentType = file.getContentType();
if (!contentType.startsWith("image/")) {
return Result.error("只能上传图片文件");
}
if (file.getSize() > 5 * 1024 * 1024) {
return Result.error("文件大小不能超过5MB");
}
// 上传文件
String fileUrl = fileService.uploadFile(file, "avatar");
// 更新用户头像
User user = new User();
user.setId(userId);
user.setAvatar(fileUrl);
userService.updateById(user);
return Result.success(fileUrl);
} catch (Exception e) {
log.error("上传头像失败", e);
return Result.error("上传失败:" + e.getMessage());
}
}
```
### 第2步修改前端profile.vue
完整的修改内容较多,关键修改点:
1. **添加生日选择器**
2. **添加地区选择器**
3. **完善头像上传**
4. **完善保存功能**
### 第3步测试
1. 测试头像上传
2. 测试生日选择
3. 测试地区选择
4. 测试保存功能
## 📝 注意事项
1. **头像上传**需要后端支持文件上传和存储
2. **实名认证**需要对接第三方API如阿里云实人认证
3. **地区选择**可以使用uni-app的`uni.chooseLocation`或自定义省市区组件
4. **生日选择**使用`picker`组件,`mode="date"`
## 🎯 优先级
1. **高优先级**:生日选择、保存修改
2. **中优先级**:头像上传
3. **低优先级**:地区选择、实名认证
## 📅 创建时间
2026-01-28
## 👤 创建人员
Kiro AI Assistant