|
|
@@ -0,0 +1,196 @@
|
|
|
+<template>
|
|
|
+ <div class="personal-center">
|
|
|
+ <el-card class="box-card">
|
|
|
+ <div slot="header" class="clearfix">
|
|
|
+ <span style="font-size: 25px; font-weight: bold">个人中心</span>
|
|
|
+ </div>
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12" class="main-info">
|
|
|
+ <el-avatar :size="100" :src="user.userAvatar" />
|
|
|
+ <div>{{ user.name }}</div>
|
|
|
+ <div>{{ user.officialNumber }}</div>
|
|
|
+ <div>{{ user.officialEmail }}</div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-descriptions title="账户信息" :column="1">
|
|
|
+ <template #extra>
|
|
|
+ <el-button type="primary" @click="visible=true">修改信息</el-button>
|
|
|
+ </template>
|
|
|
+ <el-descriptions-item label="用户名">{{ user.englishName }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="性别">{{ user.gender }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="注册时间">{{ user.createTime }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="手机号">{{ user.phone }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="生日">{{ user.birthday }}</el-descriptions-item>
|
|
|
+ </el-descriptions>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-card>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-dialog v-model="visible" title="编辑">
|
|
|
+ <el-form-item label="头像">
|
|
|
+ <el-upload
|
|
|
+ ref="uploadRef"
|
|
|
+ drag
|
|
|
+ action="/api/file"
|
|
|
+ multiple
|
|
|
+ v-model:file-list="fileList"
|
|
|
+ :limit="1"
|
|
|
+ :on-success="handleSuccess"
|
|
|
+ :on-error="handleError"
|
|
|
+ :on-exceed="handleExceed"
|
|
|
+ :on-change="handleChange"
|
|
|
+ list-type="picture-card"
|
|
|
+ accept=".png, .jpg"
|
|
|
+ :auto-upload="false"
|
|
|
+ >
|
|
|
+<!-- <el-icon class="el-icon--upload"><upload-filled /></el-icon>-->
|
|
|
+ <div class="el-upload__text">
|
|
|
+ 拖拽上传或<em>点击此处上传</em>
|
|
|
+ </div>
|
|
|
+<!-- <el-icon><Plus /></el-icon>-->
|
|
|
+ <template #tip>
|
|
|
+ <div class="el-upload__tip">
|
|
|
+ jpg/png 文件不大于 500kb
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-upload>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form :model="user" label-width="auto">
|
|
|
+ <el-form-item label="姓名" prop="courseName">
|
|
|
+ <el-input v-model="user.name" placeholder="请输入名称"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="学号" prop="courseName">
|
|
|
+ <el-input v-model="user.officialNumber" placeholder="请输入名称" disabled></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="邮箱" prop="courseName">
|
|
|
+ <el-input v-model="user.officialEmail" placeholder="请输入名称" disabled></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="用户名" prop="courseName">
|
|
|
+ <el-input v-model="user.englishName" placeholder="请输入名称"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="性别" prop="courseName">
|
|
|
+ <el-input v-model="user.gender" placeholder="请输入名称"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="手机号" prop="courseName">
|
|
|
+ <el-input v-model="user.phone" placeholder="请输入名称"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="生日" prop="courseName">
|
|
|
+ <el-input v-model="user.birthday" placeholder="请输入名称"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="visible = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="submit">确定</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup lang="ts">
|
|
|
+ import {onMounted, reactive, ref} from 'vue';
|
|
|
+ import {
|
|
|
+ ElCard,
|
|
|
+ ElRow,
|
|
|
+ ElCol,
|
|
|
+ ElAvatar,
|
|
|
+ ElButton,
|
|
|
+ ElDescriptions,
|
|
|
+ ElDescriptionsItem,
|
|
|
+ ElTable,
|
|
|
+ ElTableColumn,
|
|
|
+ ElMessage, type UploadUserFile, type UploadProps, type UploadFile, type UploadFiles
|
|
|
+ } from 'element-plus';
|
|
|
+ import useApis from "@/apis";
|
|
|
+ import {useStore} from "@/store";
|
|
|
+ import type {IUser} from "@/types/user";
|
|
|
+ import {Plus} from "@element-plus/icons-vue";
|
|
|
+
|
|
|
+ const apis = useApis()
|
|
|
+ const store = useStore()
|
|
|
+
|
|
|
+ const user = reactive<IUser>({} as IUser)
|
|
|
+ let visible = ref(false)
|
|
|
+ const uploadRef = ref()
|
|
|
+ // 用于编辑头像展示预览图片
|
|
|
+ const fileList = ref<UploadUserFile[]>([])
|
|
|
+
|
|
|
+ const fetchUserData = () => {
|
|
|
+ apis.findUserById(store.user.id)
|
|
|
+ .then((res:any) => {
|
|
|
+ Object.assign(user, res.data.data.records[0])
|
|
|
+ })
|
|
|
+ .catch((err:any) => {
|
|
|
+ ElMessage({
|
|
|
+ message: "获取用户信息失败:"+err,
|
|
|
+ type: "error"
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ const submit = () => {
|
|
|
+ alert("TODO")
|
|
|
+ }
|
|
|
+
|
|
|
+const handleSuccess: UploadProps['onSuccess'] = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
|
|
|
+ console.log("上传成功", response.data)
|
|
|
+ user.userAvatar = response.data
|
|
|
+}
|
|
|
+
|
|
|
+const handleError: UploadProps['onError'] = (error: Error, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
|
|
|
+ console.log("上传失败", error)
|
|
|
+ console.log(error, uploadFile, uploadFiles)
|
|
|
+}
|
|
|
+
|
|
|
+const handleExceed = (files, fileList) => {
|
|
|
+ // console.log(files)
|
|
|
+ uploadRef.value.clearFiles() //清空上传文件(限制一个,所以直接清空即可)
|
|
|
+ const file = files[0]
|
|
|
+ uploadRef.value.handleStart(file) //重新上传
|
|
|
+}
|
|
|
+
|
|
|
+//选择文件
|
|
|
+const handleChange = (file,fileList) => {
|
|
|
+ // console.log(file)
|
|
|
+ const fileImgType = file.name.match(/\.([^\.]+)$/)[1]; //匹配文件格式(最后一个'.'后的格式)或者匹配file.raw.type
|
|
|
+ const isImageType = ['png','jpg'];
|
|
|
+ const isLt5KB = file.size / 1024 < 500; //判断图片格式与大小
|
|
|
+ if (isImageType.indexOf(fileImgType)==-1) {
|
|
|
+ ElMessage.error('文件仅支持png、jpg格式') //限制文件类型
|
|
|
+ uploadRef.value.clearFiles() //清空上传文件
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!isLt5KB) {
|
|
|
+ ElMessage.error('文件不能超过500kb!') //限制文件大小
|
|
|
+ uploadRef.value.clearFiles() //清空上传文件
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ apis.uploadFile(file.raw)
|
|
|
+ .then((res) => {
|
|
|
+ user.userAvatar = res.data.data
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ console.log(err)
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ fetchUserData()
|
|
|
+ })
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.personal-center {
|
|
|
+ padding: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.box-card {
|
|
|
+ width: 1000px;
|
|
|
+ margin: 0 auto;
|
|
|
+}
|
|
|
+
|
|
|
+.main-info div {
|
|
|
+ margin: 20px 0
|
|
|
+}
|
|
|
+</style>
|