ai-clone/frontend-ai/pages/profile/edit-profile.vue
2026-03-05 14:29:21 +08:00

208 lines
3.8 KiB
Vue

<template>
<view class="profile-container">
<!-- 编辑表单 -->
<view class="profile-content">
<!-- 昵称 -->
<view class="profile-item">
<text class="item-label">昵称</text>
<input
class="item-input"
v-model="nickname"
placeholder="请输入昵称"
maxlength="20"
/>
</view>
<view class="tip-text">
<text>💡 昵称将显示在个人中心和作品列表中</text>
</view>
<!-- 保存按钮 -->
<button class="save-btn" @click="saveProfile">保存</button>
</view>
</view>
</template>
<script>
import { API_BASE } from '@/config/api.js';
export default {
data() {
return {
nickname: ''
};
},
onLoad() {
this.loadProfile();
},
methods: {
loadProfile() {
const userInfo = uni.getStorageSync('userInfo');
if (userInfo) {
this.nickname = userInfo.nickname || '';
}
},
async saveProfile() {
if (!this.nickname.trim()) {
uni.showToast({
title: '请输入昵称',
icon: 'none'
});
return;
}
const userInfo = uni.getStorageSync('userInfo') || {};
const userId = userInfo.id || uni.getStorageSync('userId');
if (!userId) {
uni.showToast({
title: '请先登录',
icon: 'none'
});
return;
}
// 调用API更新昵称
uni.showLoading({
title: '保存中...'
});
const token = uni.getStorageSync('token');
uni.request({
url: `${API_BASE}/api/users/profile/${userId}`,
method: 'PUT',
header: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
data: {
nickname: this.nickname.trim()
},
success: (res) => {
console.log('[EditProfile] API响应:', res.data);
if (res.statusCode === 200 && res.data.success) {
// 更新本地存储
userInfo.nickname = this.nickname;
uni.setStorageSync('userInfo', userInfo);
uni.setStorageSync('nickname', this.nickname);
uni.setStorageSync('userNickname', this.nickname);
uni.showToast({
title: '保存成功',
icon: 'success'
});
setTimeout(() => {
uni.navigateBack();
}, 1500);
} else {
uni.showToast({
title: res.data.message || '保存失败',
icon: 'none'
});
}
},
fail: (err) => {
console.error('[EditProfile] 请求失败:', err);
uni.showToast({
title: '网络错误,请重试',
icon: 'none'
});
},
complete: () => {
uni.hideLoading();
}
});
}
}
};
</script>
<style lang="scss" scoped>
.profile-container {
min-height: 100vh;
background: #FDF8F2;
}
/* 编辑内容 */
.profile-content {
padding: 30upx;
}
.profile-item {
background: white;
border-radius: 30upx;
padding: 30upx;
margin-bottom: 20upx;
display: flex;
align-items: center;
justify-content: space-between;
box-shadow: 0 8upx 30upx rgba(0, 0, 0, 0.08);
.item-label {
font-size: 28upx;
color: #333;
font-weight: 600;
min-width: 120upx;
}
.item-value {
flex: 1;
display: flex;
align-items: center;
justify-content: flex-end;
.value-text {
font-size: 28upx;
color: #666;
margin-right: 10upx;
}
}
.item-arrow {
font-size: 32upx;
color: #999;
}
.item-input {
flex: 1;
text-align: right;
font-size: 28upx;
color: #333;
}
}
/* 提示文本 */
.tip-text {
padding: 0 30upx;
margin-top: 10upx;
margin-bottom: 40upx;
font-size: 24upx;
color: #999;
line-height: 1.6;
}
/* 保存按钮 */
.save-btn {
width: 100%;
padding: 36upx;
background: linear-gradient(135deg, #8B7355 0%, #6D8B8B 100%);
color: white;
border: none;
border-radius: 32upx;
font-size: 32upx;
font-weight: bold;
box-shadow: 0 12upx 32upx rgba(139, 115, 85, 0.3);
transition: all 0.3s;
margin-top: 20upx;
&:active {
transform: translateY(-2upx);
box-shadow: 0 16upx 40upx rgba(139, 115, 85, 0.4);
}
}
</style>