Initial commit

This commit is contained in:
2026-04-23 16:58:11 +08:00
commit 267eba1eca
2582 changed files with 273338 additions and 0 deletions

View File

@@ -0,0 +1,148 @@
<script setup lang="ts">
import { ContentWrap } from '@/components/ContentWrap'
import { ref, unref } from 'vue'
import { ElDivider, ElImage, ElTag, ElTabPane, ElTabs, ElButton, ElMessage } from 'element-plus'
import defaultAvatar from '@/assets/imgs/avatar.jpg'
import UploadAvatar from './components/UploadAvatar.vue'
import { Dialog } from '@/components/Dialog'
import EditInfo from './components/EditInfo.vue'
import EditPassword from './components/EditPassword.vue'
const userInfo = ref()
const fetchDetailUserApi = async () => {
// 这里可以调用接口获取用户信息
const data = {
id: 1,
username: 'admin',
realName: 'admin',
phoneNumber: '18888888888',
email: '502431556@qq.com',
avatarUrl: '',
roleList: ['超级管理员']
}
userInfo.value = data
}
fetchDetailUserApi()
const activeName = ref('first')
const dialogVisible = ref(false)
const uploadAvatarRef = ref<ComponentRef<typeof UploadAvatar>>()
const avatarLoading = ref(false)
const saveAvatar = async () => {
try {
avatarLoading.value = true
const base64 = unref(uploadAvatarRef)?.getBase64()
console.log(base64)
// 这里可以调用修改头像接口
fetchDetailUserApi()
ElMessage.success('修改成功')
dialogVisible.value = false
} catch (error) {
console.log(error)
} finally {
avatarLoading.value = false
}
}
</script>
<template>
<div class="flex w-100% h-100%">
<ContentWrap title="个人信息" class="w-400px">
<div class="flex justify-center items-center">
<div
class="avatar w-[150px] h-[150px] relative cursor-pointer"
@click="dialogVisible = true"
>
<ElImage
class="w-[150px] h-[150px] rounded-full"
:src="userInfo?.avatarUrl || defaultAvatar"
fit="fill"
/>
</div>
</div>
<ElDivider />
<div class="flex justify-between items-center">
<div>账号</div>
<div>{{ userInfo?.username }}</div>
</div>
<ElDivider />
<div class="flex justify-between items-center">
<div>昵称</div>
<div>{{ userInfo?.realName }}</div>
</div>
<ElDivider />
<div class="flex justify-between items-center">
<div>手机号码</div>
<div>{{ userInfo?.phoneNumber ?? '-' }}</div>
</div>
<ElDivider />
<div class="flex justify-between items-center">
<div>用户邮箱</div>
<div>{{ userInfo?.email ?? '-' }}</div>
</div>
<ElDivider />
<div class="flex justify-between items-center">
<div>所属角色</div>
<div>
<template v-if="userInfo?.roleList?.length">
<ElTag v-for="item in userInfo?.roleList || []" :key="item" class="ml-2 mb-w"
>{{ item }}
</ElTag>
</template>
<template v-else>-</template>
</div>
</div>
<ElDivider />
</ContentWrap>
<ContentWrap title="基本资料" class="flex-[3] ml-20px">
<ElTabs v-model="activeName">
<ElTabPane label="基本信息" name="first">
<EditInfo :user-info="userInfo" />
</ElTabPane>
<ElTabPane label="修改密码" name="second">
<EditPassword />
</ElTabPane>
</ElTabs>
</ContentWrap>
</div>
<Dialog v-model="dialogVisible" title="修改头像" width="800px">
<UploadAvatar ref="uploadAvatarRef" :url="userInfo?.avatarUrl || defaultAvatar" />
<template #footer>
<ElButton type="primary" :loading="avatarLoading" @click="saveAvatar"> 保存 </ElButton>
<ElButton @click="dialogVisible = false">关闭</ElButton>
</template>
</Dialog>
</template>
<style lang="less" scoped>
.avatar {
position: relative;
&::after {
position: absolute;
top: 0;
left: 0;
display: flex;
width: 100%;
height: 100%;
font-size: 50px;
color: #fff;
background-color: rgb(0 0 0 / 40%);
border-radius: 50%;
content: '+';
opacity: 0;
justify-content: center;
align-items: center;
}
&:hover {
&::after {
opacity: 1;
}
}
}
</style>