Files
gamegroup2/frontend/src/views/Profile.vue
T

137 lines
2.9 KiB
Vue
Raw Normal View History

<!-- src/views/Profile.vue -->
<script setup lang="ts">
import { ref } from 'vue'
import { useUserStore } from '@/stores/user'
import { ElCard, ElInput, ElButton, ElMessage } from 'element-plus'
const userStore = useUserStore()
const username = ref(userStore.user?.username || '')
const email = ref(userStore.user?.email || '')
const avatar = ref(userStore.user?.avatar || '')
const loading = ref(false)
async function saveProfile() {
try {
loading.value = true
// await updateProfile({ username: username.value, avatar: avatar.value })
ElMessage.success('保存成功')
} catch (error: any) {
ElMessage.error(error.message || '保存失败')
} finally {
loading.value = false
}
}
function handleAvatarUpload() {
// TODO: 实现头像上传
ElMessage.info('头像上传功能待实现')
}
</script>
<template>
<div class="profile-page">
<h1>个人中心</h1>
<el-card class="profile-card">
<div class="profile-form">
<div class="avatar-section">
<img :src="avatar || '/default-avatar.png'" class="avatar" />
<el-button @click="handleAvatarUpload">更换头像</el-button>
</div>
<div class="form-group">
<label>用户名</label>
<el-input v-model="username" placeholder="请输入用户名" />
</div>
<div class="form-group">
<label>邮箱</label>
<el-input v-model="email" disabled />
</div>
<div class="form-group">
<label>状态</label>
<div class="status-display">
<span>{{ userStore.userStatus }}</span>
</div>
</div>
<div class="form-actions">
<el-button type="primary" :loading="loading" @click="saveProfile">
保存
</el-button>
</div>
</div>
</el-card>
</div>
</template>
<style scoped>
.profile-page {
max-width: 600px;
margin: 0 auto;
}
.profile-page h1 {
font-size: 28px;
font-weight: 700;
margin: 0 0 24px;
background: var(--gg-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.profile-card {
border-radius: var(--gg-radius-md);
}
.profile-form {
display: flex;
flex-direction: column;
gap: 24px;
}
.avatar-section {
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
}
.avatar {
width: 100px;
height: 100px;
border-radius: 50%;
object-fit: cover;
border: 3px solid var(--gg-primary);
box-shadow: 0 0 16px rgba(99, 102, 241, 0.25);
}
.form-group {
display: flex;
flex-direction: column;
gap: 8px;
}
.form-group label {
font-size: 14px;
font-weight: 600;
color: var(--gg-text);
}
.status-display {
padding: 8px 16px;
background: var(--gg-bg);
border: 1px solid var(--gg-border);
border-radius: var(--gg-radius-sm);
color: var(--gg-text);
}
.form-actions {
display: flex;
gap: 12px;
}
</style>