图书馆小程序
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.
 
 
 
 
 

232 lines
5.0 KiB

<template>
<view class="user-info-page">
<view class="user-info-section">
<!-- 点击获取头像 -->
<button open-type="chooseAvatar" @chooseavatar="onChooseAvatar" class="avatar-btn">
<image v-if="avatarUrl" :src="avatarUrl" class="avatar-img"></image>
<image v-else src="@/static/images/avatar.png" class="avatar-img"></image>
<text class="tip-text">点击更换头像</text>
</button>
</view>
<!-- 昵称 -->
<view class="form-item">
<text class="label">昵称</text>
<input
class="input"
type="nickname"
v-model="nickName"
placeholder="请输入昵称"
/>
<uni-icons type="right" size="18" color="#ccc"></uni-icons>
</view>
<!-- 保存按钮 -->
<view class="save-box">
<button class="save-btn" @click="saveUserInfo">保存修改</button>
</view>
</view>
</template>
<script>
import config from '@/utils/config'
import { FetchBindRead } from '@/api/user';
// 缓存 key 与个人中心保持一致
const USER_KEY = 'user-info';
export default {
data() {
return {
nickName: '',
avatarUrl: ''
};
},
onLoad() {
// 页面加载时获取本地缓存的用户信息
this.loadUserInfo();
},
methods: {
// 加载缓存中的用户信息
loadUserInfo() {
const userInfo = uni.getStorageSync(USER_KEY) || {};
this.nickName = userInfo.nickName || '';
this.avatarUrl = userInfo.avatarUrl || '';
},
// 选择微信头像
async onChooseAvatar(e) {
const tempFilePath = e.detail.avatarUrl;
uni.showLoading({ title: '上传中...' });
try {
// 1. 上传头像到服务器
const uploadRes = await new Promise((resolve, reject) => {
uni.uploadFile({
url: config.baseUrl + '/api/fileRelevant/uploadWxAvatarImg',
filePath: tempFilePath,
name: 'file',
success: resolve,
fail: reject
})
});
const resData = JSON.parse(uploadRes.data);
const imgId = resData.data;
if (!imgId) {
uni.showToast({ title: '头像上传失败', icon: 'none' });
return;
}
// 拼接头像地址
const avatarUrl = config.baseUrl + '/api/fileRelevant/getImg?imgType=5&imgId=' + imgId;
this.avatarUrl = avatarUrl;
uni.showToast({ title: '头像选择成功,点击保存生效', icon: 'success' });
} catch (err) {
console.error('头像上传失败:', err);
uni.showToast({ title: '头像更新失败', icon: 'none' });
} finally {
uni.hideLoading();
}
},
// 保存用户信息(头像 + 昵称)
async saveUserInfo() {
// 校验昵称
if (!this.nickName.trim()) {
uni.showToast({ title: '请输入昵称', icon: 'none' });
return;
}
uni.showLoading({ title: '保存中...' });
try {
const openId = uni.getStorageSync('wx_login_code') || '';
const params = {
avatar: this.avatarUrl,
libcode: "1201",
nickname: this.nickName,
openid: openId
};
// 调用保存接口
await FetchBindRead(params);
// 更新缓存
const userInfo = {
nickName: this.nickName,
avatarUrl: this.avatarUrl
};
uni.setStorageSync(USER_KEY, userInfo);
uni.showToast({
title: '保存成功',
icon: 'success'
});
// 返回上一页
setTimeout(() => {
uni.navigateBack();
}, 1500);
} catch (error) {
console.error('保存失败:', error);
uni.showToast({
title: '保存失败,请重试',
icon: 'none'
});
} finally {
uni.hideLoading();
}
}
}
};
</script>
<style lang="scss" scoped>
.user-info-page {
background-color: #f5f5f5;
min-height: 100vh;
padding: 20rpx;
box-sizing: border-box;
}
/* 头像区域 */
.user-info-section {
background: #fff;
padding: 40rpx 0;
border-radius: 12rpx;
margin-bottom: 20rpx;
display: flex;
flex-direction: column;
align-items: center;
}
.avatar-btn {
background: transparent;
display: flex;
flex-direction: column;
align-items: center;
&::after {
border: none;
}
}
.avatar-img {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
object-fit: cover;
margin-bottom: 10rpx;
}
.tip-text {
font-size: 26rpx;
color: #999;
}
/* 表单项 */
.form-item {
background-color: #fff;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 30rpx;
height: 88rpx;
border-radius: 12rpx;
margin-bottom: 20rpx;
}
.label {
font-size: 30rpx;
color: #333;
width: 120rpx;
}
.input {
flex: 1;
font-size: 30rpx;
color: #333;
text-align: right;
}
/* 保存按钮 */
.save-box {
margin-top: 60rpx;
padding: 0 20rpx;
}
.save-btn {
height: 88rpx;
line-height: 88rpx;
background-color: #007aff;
color: #fff;
border-radius: 44rpx;
font-size: 32rpx;
}
</style>