修改个人信息和主页展示个人信息

newzwz
335942189@qq.com 2 months ago
parent 8a59195eb6
commit 40c534c079

@ -216,7 +216,7 @@ async function login() {
userStore.login({
avatar:require ('@/assets/default-avatar/boy_1.png'),
userName: '珈人一号',
userName: loginForm.value.userFlag,
userid:1
});

@ -7,6 +7,7 @@ export const useUserStore = defineStore('user', {
avatar: '', // 用户头像 URL
username: '', // 用户名
userid: 0, // 用户 ID
moto:''// 用户简介
},
}),
actions: {

@ -37,27 +37,39 @@
<!-- 表单 -->
<form @submit.prevent="handleSubmit" class="form">
<!-- 昵称 -->
<div class="form-item">
<label class="label">昵称</label>
<div class="form-item">
<label class="label">昵称</label>
<input
type="text"
v-model.trim="formData.nickname"
v-model.trim="formData.username "
class="input"
:class="{ 'input-error': errors.nickname }"
:class="{ 'input-error': errors.username }"
>
<p v-if="errors.nickname" class="error-tip">{{ errors.nickname }}</p>
<p v-if="errors.username " class="error-tip">{{ errors.username }}</p>
</div>
<!-- 个人简介 -->
<div class="form-item">
<label class="label">个人简介</label>
<textarea
v-model.trim="formData.bio"
v-model.trim="formData.moto"
rows="4"
class="textarea"
:class="{ 'input-error': errors.bio }"
:class="{ 'input-error': errors.moto }"
></textarea>
<p v-if="errors.bio" class="error-tip">{{ errors.bio }}</p>
<p v-if="errors.moto" class="error-tip">{{ errors.moto }}</p>
</div>
<!-- 密码 -->
<div class="form-item">
<label class="label">新密码</label>
<input
type="password"
v-model.trim="formData.password"
class="input"
:class="{ 'input-error': errors.password }"
>
<p v-if="errors.password" class="error-tip">{{ errors.password }}</p>
</div>
<!-- 提交按钮 -->
@ -66,54 +78,30 @@
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { useUserStore } from '@/stores/user.js'; // Pinia
<script setup>
import { ref,computed } from 'vue';
import { useUserStore } from '@/stores/user'; // Pinia
import request from '@/utils/request'; //
import { ElMessage } from 'element-plus'; // 使Element Plus
const router = useRouter();
const userStore = useUserStore();
const userInfo = computed(() => userStore.userInfo);
// ID
const userId = ref(userStore.userInfo.userid);
const isLoggedIn = userStore.isLoggedIn;
//
const formData = ref({
nickname: '',
bio: ''
username: userInfo.value.username || '',
moto: userInfo.value.moto || '暂无个性签名',
password: ''
});
//
const avatarFile = ref(null); //
const previewAvatar = ref(''); // URL
const currentAvatar = ref(''); //
const currentAvatar = ref(userInfo.value.avatar); //
const errors = ref({}); //
//
onMounted(async () => {
if (!isLoggedIn) {
ElMessage.error('请先登录');
router.push({ name: 'Login' });
return;
}
try {
// 使request
const res = await request.get(`/user/info/${userId.value}`);
if (res.code === 200) {
formData.value.nickname = res.data.nickname;
formData.value.bio = res.data.bio;
currentAvatar.value = res.data.avatar;
} else {
throw new Error(res.msg || '接口返回异常');
}
} catch (error) {
ElMessage.error(`获取用户信息失败:${error.message}`);
}
});
//
const handleAvatarChange = (e) => {
@ -145,55 +133,76 @@ const validateForm = () => {
const newErrors = {};
// 20
if (!formData.value.nickname) {
newErrors.nickname = '昵称不能为空';
} else if (formData.value.nickname.length > 20) {
newErrors.nickname = '昵称最多20字符';
if (!formData.value.username) {
newErrors.username = '昵称不能为空';
} else if (formData.value.username .length > 20) {
newErrors.username = '昵称最多20字符';
}
// 100
if (formData.value.bio.length > 100) {
newErrors.bio = '简介最多100字符';
if (formData.value.moto.length > 100) {
newErrors.moto = '简介最多100字符';
}
//
if (formData.value.password && formData.value.password.length < 6) {
newErrors.password = '密码长度不能少于6位';
}
errors.value = newErrors;
return Object.keys(newErrors).length === 0;
};
// /user/info
const handleSubmit = async () => {
//
const handleSubmit = async () => {
if (!validateForm()) return;
try {
// FormData
const formDataToSubmit = new FormData();
//
if (avatarFile.value) {
formDataToSubmit.append('avatar', avatarFile.value);
// application/json
const updateInfoData = {
username: formData.value.username,
moto: formData.value.moto
};
const updateInfoRes = await request.post('/user/info/update', updateInfoData);
if (updateInfoRes.code !== 200) {
throw new Error(updateInfoRes.msg || '修改用户信息失败');
}
// UserUpdateDTO
formDataToSubmit.append('nickname', formData.value.nickname);
formDataToSubmit.append('bio', formData.value.bio);
// PUT /user/info 使request
const res = await request.put(`/user/info/${userId.value}`, formDataToSubmit, {
headers: { 'Content-Type': 'multipart/form-data' } //
});
// code=200
if (res.code === 200) {
// URL
if (avatarFile.value) {
currentAvatar.value = res.data.avatar; // URL
userInfo.value.username = updateInfoData.username;
userInfo.value.moto = updateInfoData.moto;
// 使 params
if (formData.value.password) {
const updatePasswordRes = await request.post('/user/info/password', null, {
params: { password: formData.value.password } //
});
if (updatePasswordRes.code !== 200) {
throw new Error(updatePasswordRes.msg || '修改密码失败');
}
ElMessage.success('修改成功!');
} else {
throw new Error(res.msg || '接口返回异常');
}
// application/json
if (avatarFile.value) {
// JSON file binary string Base64 File
// avatarFile.value File
const formDataForAvatar = {
file: avatarFile.value // Base64
};
const uploadAvatarRes = await request.post('/user/info/avatar', formDataForAvatar);
if (uploadAvatarRes.code !== 200) {
throw new Error(uploadAvatarRes.msg || '上传头像失败');
}
currentAvatar.value = uploadAvatarRes.data.data;
userInfo.value.avatar = currentAvatar.value;
}
ElMessage.success('修改成功!');
} catch (error) {
ElMessage.error(`修改失败:${error.message}`);
}
};
</script>
<style scoped>

Loading…
Cancel
Save