You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

324 lines
6.4 KiB

<template>
<view class="user-info-container container">
<view class="user-avatar-section">
<view class="user-info-title">
用户头像
</view>
<view class="avatar-container">
<button class="choose-avatar-btn" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
<view class="avatar-wrapper">
<image
:src="avatarUrl"
class="avatar-image"
mode="aspectFill"
></image>
</view>
</button>
</view>
</view>
<view class="user-info-section">
<view class="user-info-title">
基本信息
</view>
<view class="user-info-form">
<view class="user-info-item">
<view class="user-info-label">昵称</view>
<view class="user-info-input">
<u-input v-model="nickname" placeholder="请输入昵称" :border="false" />
</view>
</view>
<!-- <view class="user-info-item">
<view class="user-info-label">会员等级</view>
<view class="user-info-value">
<text>{{userLevel}}</text>
</view>
</view> -->
</view>
</view>
<view class="user-info-btns">
<view class="user-info-btn" @click="save">
<u-button color="#FFBF60" :loading="loading">
<view style="color: #fff;">
保存
</view>
</u-button>
</view>
</view>
</view>
</template>
<script>
import { updateInfo } from '@/api/system/user'
import {getPersonalInfo} from "@/api/system/personal.js"
export default {
data() {
return {
loading: false,
fileList: [],
avatarUrl: 'https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/personal/index/avatar_1.png',
nickname: '',
userLevel: '',
userInfoForm: {
headImage: ''
}
}
},
onLoad() {
this.getUserInfo()
},
methods: {
// 获取用户信息
getUserInfo() {
getPersonalInfo().then(res => {
if (res && (res.id || res.id === 0)) {
this.nickname = res.nickname || ''
this.userLevel = res.level || ''
if (res.avatar) {
this.avatarUrl = res.avatar
this.userInfoForm.headImage = res.avatar
this.fileList = [{url: res.avatar}]
}
}
})
},
// 微信小程序头像选择
async onChooseAvatar(e) {
const { avatarUrl } = e.detail
try {
// 上传头像到服务器
const result = await this.uploadFilePromise(avatarUrl)
this.avatarUrl = result
this.userInfoForm.headImage = result
uni.showToast({
title: '头像更新成功',
icon: 'success'
})
} catch (error) {
uni.showToast({
title: '头像上传失败',
icon: 'none'
})
}
},
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
let a = uni.uploadFile({
url: 'https://store-test.catmdogd.com/test-api/h5/oss/upload',
filePath: url,
name: 'file',
formData: {
user: 'test'
},
success: (res) => {
setTimeout(() => {
if(res && res.data){
let resData = JSON.parse(res.data);
resolve(resData.url);
}
reject("上传失败");
}, 1000)
}
});
})
},
// 保存用户信息
save() {
if (!this.nickname) {
this.$modal.showToast('请输入昵称!')
return
}
this.loading = true
let params = {
nickname: this.nickname,
avatar: this.avatarUrl
}
updateInfo(params).then(res => {
if (res && res.code == 200) {
uni.showToast({
title: '保存成功',
duration: 3000,
icon: "none"
})
setTimeout(() => {
this.loading = false
let len = getCurrentPages().length
if (len >= 2) {
uni.navigateBack()
} else {
uni.redirectTo({url: '/pages/personalCenter/index'})
}
}, 1000)
} else {
this.loading = false
uni.showToast({
title: '更新用户信息失败',
duration: 3000,
icon: "none"
})
}
}).catch(() => {
this.loading = false
uni.showToast({
title: '更新用户信息失败',
duration: 3000,
icon: "none"
})
})
}
}
}
</script>
<style lang="scss">
.user-info-container {
position: relative;
height: 100%;
padding-bottom: 90px;
.user-avatar-section {
width: 100%;
background-color: #fff;
padding: 15px 20px;
margin-bottom: 10px;
}
.user-info-section {
width: 100%;
background-color: #fff;
padding: 15px 20px;
}
.user-info-title {
font-size: 14px;
color: #333;
font-weight: bold;
padding-bottom: 15px;
}
.user-info-form {
width: 100%;
}
.user-info-item {
display: flex;
align-items: center;
padding: 12px 0;
border-bottom: 1px solid #efefef;
&:last-child {
border-bottom: none;
}
}
.user-info-label {
width: 80px;
color: #333;
font-size: 14px;
}
.user-info-input {
flex: 1;
}
.user-info-value {
flex: 1;
color: #666;
font-size: 14px;
}
.user-info-btns {
background-color: #FFFFFF;
padding: 10px 20px 40px;
width: 100%;
height: 90px;
position: fixed;
bottom: 0;
z-index: 100;
text-align: center;
.user-info-btn {
width: 80%;
margin: 0 auto;
}
}
}
.user-avatar-circle-edit {
width: 80px !important;
height: 80px !important;
border-radius: 50% !important;
object-fit: cover !important;
display: block !important;
}
// 头像选择相关样式
.avatar-container {
display: flex;
justify-content: center;
align-items: center;
padding: 20px 0;
}
.choose-avatar-btn {
background: none;
border: none;
padding: 0;
margin: 0;
position: relative;
border-radius: 50%;
overflow: visible;
&::after {
border: none;
}
}
.avatar-wrapper {
position: relative;
width: 100px;
height: 100px;
border-radius: 50%;
overflow: hidden;
border: 3px solid #f0f0f0;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
&:active {
transform: scale(0.95);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
}
}
.avatar-image {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.avatar-edit-icon {
position: absolute;
bottom: -5px;
right: -5px;
width: 30px;
height: 30px;
background: #FFBF60;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
border: 2px solid #fff;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
}
.edit-text {
font-size: 10px;
color: #fff;
font-weight: bold;
}
</style>