fix(admin-user): refresh avatar preview after remove and re-upload
This commit is contained in:
@@ -1,8 +1,9 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onMounted, reactive } from 'vue'
|
import { ref, onMounted, reactive, computed } from 'vue'
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
import { Search, Edit, Plus } from '@element-plus/icons-vue'
|
import { Search, Edit, Plus } from '@element-plus/icons-vue'
|
||||||
import { getUserList, deleteUser, updateUserStatus, getUserById, adminUpdateUser, adminUploadUserAvatar } from '../../api/admin/user'
|
import { getUserList, deleteUser, updateUserStatus, getUserById, adminUpdateUser, adminUploadUserAvatar } from '../../api/admin/user'
|
||||||
|
import { processImageUrl } from '../../utils/imageUtils'
|
||||||
|
|
||||||
// 用户列表
|
// 用户列表
|
||||||
const userList = ref([])
|
const userList = ref([])
|
||||||
@@ -41,6 +42,23 @@ const editFormRules = {
|
|||||||
const editFormRef = ref(null)
|
const editFormRef = ref(null)
|
||||||
const editLoading = ref(false)
|
const editLoading = ref(false)
|
||||||
const avatarUploading = ref(false)
|
const avatarUploading = ref(false)
|
||||||
|
const avatarPreviewVersion = ref(Date.now())
|
||||||
|
|
||||||
|
const avatarPreviewUrl = computed(() => {
|
||||||
|
if (!editForm.avatar) return ''
|
||||||
|
const avatarUrl = processImageUrl(editForm.avatar)
|
||||||
|
const separator = avatarUrl.includes('?') ? '&' : '?'
|
||||||
|
return `${avatarUrl}${separator}t=${avatarPreviewVersion.value}`
|
||||||
|
})
|
||||||
|
|
||||||
|
const resolveAvatarPath = (avatarData) => {
|
||||||
|
if (!avatarData) return ''
|
||||||
|
if (typeof avatarData === 'string') return avatarData
|
||||||
|
if (typeof avatarData === 'object') {
|
||||||
|
return avatarData.avatar || avatarData.url || avatarData.path || avatarData.filePath || ''
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
const handleAvatarBeforeUpload = (file) => {
|
const handleAvatarBeforeUpload = (file) => {
|
||||||
const isAllowedType = ['image/jpeg', 'image/png', 'image/webp'].includes(file.type)
|
const isAllowedType = ['image/jpeg', 'image/png', 'image/webp'].includes(file.type)
|
||||||
@@ -69,7 +87,8 @@ const handleAvatarUpload = async ({ file }) => {
|
|||||||
try {
|
try {
|
||||||
const res = await adminUploadUserAvatar(editForm.id, file)
|
const res = await adminUploadUserAvatar(editForm.id, file)
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
editForm.avatar = res.data
|
editForm.avatar = resolveAvatarPath(res.data)
|
||||||
|
avatarPreviewVersion.value = Date.now()
|
||||||
ElMessage.success('头像上传成功')
|
ElMessage.success('头像上传成功')
|
||||||
} else {
|
} else {
|
||||||
ElMessage.error(res.message || '头像上传失败')
|
ElMessage.error(res.message || '头像上传失败')
|
||||||
@@ -84,6 +103,7 @@ const handleAvatarUpload = async ({ file }) => {
|
|||||||
|
|
||||||
const handleAvatarRemove = () => {
|
const handleAvatarRemove = () => {
|
||||||
editForm.avatar = ''
|
editForm.avatar = ''
|
||||||
|
avatarPreviewVersion.value = Date.now()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取用户列表
|
// 获取用户列表
|
||||||
@@ -186,6 +206,7 @@ const handleEdit = async (id) => {
|
|||||||
editForm.avatar = user.avatar || ''
|
editForm.avatar = user.avatar || ''
|
||||||
editForm.gender = user.gender || 0
|
editForm.gender = user.gender || 0
|
||||||
editForm.introduction = user.introduction || ''
|
editForm.introduction = user.introduction || ''
|
||||||
|
avatarPreviewVersion.value = Date.now()
|
||||||
|
|
||||||
// 显示对话框
|
// 显示对话框
|
||||||
editDialogVisible.value = true
|
editDialogVisible.value = true
|
||||||
@@ -412,7 +433,7 @@ onMounted(() => {
|
|||||||
:disabled="avatarUploading || editLoading"
|
:disabled="avatarUploading || editLoading"
|
||||||
>
|
>
|
||||||
<div class="avatar-uploader-content" v-loading="avatarUploading">
|
<div class="avatar-uploader-content" v-loading="avatarUploading">
|
||||||
<el-avatar v-if="editForm.avatar" :size="60" :src="editForm.avatar"></el-avatar>
|
<el-avatar v-if="editForm.avatar" :size="60" :src="avatarPreviewUrl"></el-avatar>
|
||||||
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
||||||
</div>
|
</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
|
|||||||
Reference in New Issue
Block a user