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

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

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

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

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

Loading…
Cancel
Save