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.
215 lines
4.3 KiB
215 lines
4.3 KiB
|
1 week ago
|
<template>
|
||
|
|
<view class="edit-profile-page">
|
||
|
|
<!-- 头像编辑区域 -->
|
||
|
|
<view class="profile-section">
|
||
|
|
<view class="profile-item" @click="changeAvatar">
|
||
|
|
<text class="item-label">头像</text>
|
||
|
|
<view class="item-value avatar-container">
|
||
|
|
<button class="avatar-btn" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
|
||
|
|
<image class="avatar" :src="userInfo.avatarUrl || '/static/default-avatar.png'" mode="aspectFill"></image>
|
||
|
|
</button>
|
||
|
|
<!-- <text class="arrow">></text> -->
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
|
||
|
|
<view class="profile-item" @click="editNickname">
|
||
|
|
<text class="item-label">昵称</text>
|
||
|
|
<view class="item-value">
|
||
|
|
<text class="nickname">{{ userInfo.nickname || '未设置' }}</text>
|
||
|
|
<!-- <text class="arrow">></text> -->
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
|
||
|
|
<!-- <view class="profile-item">
|
||
|
|
<text class="item-label">性别</text>
|
||
|
|
<view class="item-value">
|
||
|
|
<text>{{ userInfo.gender === 1 ? '男' : userInfo.gender === 2 ? '女' : '未设置' }}</text>
|
||
|
|
</view>
|
||
|
|
</view> -->
|
||
|
|
</view>
|
||
|
|
|
||
|
|
<!-- 保存按钮 -->
|
||
|
|
<!-- <view class="save-section">
|
||
|
|
<button class="save-btn" @click="saveProfile">保存</button>
|
||
|
|
</view> -->
|
||
|
|
</view>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<script setup>
|
||
|
|
import { ref, computed } from 'vue';
|
||
|
|
import { useUserStore } from '../../stores/user.js';
|
||
|
|
import { appUserEditAvatar, appserEditUser } from '../../api/index.js';
|
||
|
|
|
||
|
|
const userStore = useUserStore();
|
||
|
|
const userInfo = computed(() => userStore.userInfo || {});
|
||
|
|
|
||
|
|
// 更换头像
|
||
|
|
const onChooseAvatar = async (e) => {
|
||
|
|
const { avatarUrl } = e.detail
|
||
|
|
console.log(avatarUrl)
|
||
|
|
try {
|
||
|
|
await appUserEditAvatar(avatarUrl)
|
||
|
|
// 更新用户 store 中的头像信息
|
||
|
|
if (avatarUrl) {
|
||
|
|
userStore.updateUserInfoField('avatarUrl', avatarUrl);
|
||
|
|
}
|
||
|
|
} catch(err) {
|
||
|
|
console.log(err)
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
// 更换头像(通过按钮点击触发)
|
||
|
|
const changeAvatar = () => {
|
||
|
|
// 这里可以添加其他更换头像的逻辑
|
||
|
|
console.log('点击更换头像');
|
||
|
|
};
|
||
|
|
|
||
|
|
// 编辑昵称
|
||
|
|
const editNickname = () => {
|
||
|
|
uni.showModal({
|
||
|
|
title: '编辑昵称',
|
||
|
|
editable: true,
|
||
|
|
placeholderText: '请输入昵称',
|
||
|
|
success: async (res) => {
|
||
|
|
if (res.confirm) {
|
||
|
|
const nickname = res.content;
|
||
|
|
if (nickname) {
|
||
|
|
/* userStore.updateUserInfoField('nickName', nickname);
|
||
|
|
uni.showToast({
|
||
|
|
title: '昵称已更新',
|
||
|
|
icon: 'success'
|
||
|
|
}); */
|
||
|
|
try {
|
||
|
|
await appserEditUser({ nickname })
|
||
|
|
userStore.updateUserInfoField('nickname', nickname);
|
||
|
|
} catch(err) {
|
||
|
|
console.log(err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
};
|
||
|
|
|
||
|
|
// 保存资料
|
||
|
|
const saveProfile = () => {
|
||
|
|
uni.showToast({
|
||
|
|
title: '资料保存成功',
|
||
|
|
icon: 'success'
|
||
|
|
});
|
||
|
|
|
||
|
|
// 返回上一页
|
||
|
|
setTimeout(() => {
|
||
|
|
uni.navigateBack();
|
||
|
|
}, 1000);
|
||
|
|
};
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<style lang="scss">
|
||
|
|
.edit-profile-page {
|
||
|
|
background-color: #f5f5f5;
|
||
|
|
min-height: 100vh;
|
||
|
|
padding: 0;
|
||
|
|
margin: 0;
|
||
|
|
|
||
|
|
.page-header {
|
||
|
|
background-color: #fff;
|
||
|
|
padding: 16px;
|
||
|
|
text-align: center;
|
||
|
|
position: relative;
|
||
|
|
border-bottom: 1px solid #eee;
|
||
|
|
|
||
|
|
.page-title {
|
||
|
|
font-size: 18px;
|
||
|
|
font-weight: bold;
|
||
|
|
color: #333;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.profile-section {
|
||
|
|
background-color: #fff;
|
||
|
|
margin-top: 12px;
|
||
|
|
padding: 0 16px;
|
||
|
|
|
||
|
|
.profile-item {
|
||
|
|
display: flex;
|
||
|
|
justify-content: space-between;
|
||
|
|
align-items: center;
|
||
|
|
padding: 16px 0;
|
||
|
|
border-bottom: 1px solid #eee;
|
||
|
|
|
||
|
|
&:last-child {
|
||
|
|
border-bottom: none;
|
||
|
|
}
|
||
|
|
|
||
|
|
.item-label {
|
||
|
|
font-size: 16px;
|
||
|
|
color: #333;
|
||
|
|
}
|
||
|
|
|
||
|
|
.item-value {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
color: #999;
|
||
|
|
|
||
|
|
.nickname {
|
||
|
|
max-width: 200px;
|
||
|
|
overflow: hidden;
|
||
|
|
text-overflow: ellipsis;
|
||
|
|
white-space: nowrap;
|
||
|
|
}
|
||
|
|
|
||
|
|
.arrow {
|
||
|
|
margin-left: 8px;
|
||
|
|
font-size: 18px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.avatar-container {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
}
|
||
|
|
|
||
|
|
.avatar-btn {
|
||
|
|
background: none;
|
||
|
|
border: none;
|
||
|
|
padding: 0;
|
||
|
|
margin: 0;
|
||
|
|
width: 50px;
|
||
|
|
height: 50px;
|
||
|
|
border-radius: 25px;
|
||
|
|
overflow: hidden;
|
||
|
|
|
||
|
|
&::after {
|
||
|
|
border: none;
|
||
|
|
}
|
||
|
|
|
||
|
|
.avatar {
|
||
|
|
width: 50px;
|
||
|
|
height: 50px;
|
||
|
|
border-radius: 25px;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.save-section {
|
||
|
|
padding: 24px 16px;
|
||
|
|
|
||
|
|
.save-btn {
|
||
|
|
width: 100%;
|
||
|
|
height: 48px;
|
||
|
|
background-color: #07c160;
|
||
|
|
color: #fff;
|
||
|
|
font-size: 16px;
|
||
|
|
border-radius: 24px;
|
||
|
|
border: none;
|
||
|
|
|
||
|
|
&::after {
|
||
|
|
border: none;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
</style>
|