!385 fix: 用户头像、昵称修改,同步更新Layout/UserInfo

Merge pull request !385 from dhb52/hotfix/dhb52/avatarupdate
This commit is contained in:
芋道源码 2024-02-17 12:37:34 +00:00 committed by Gitee
commit 1549a57c4b
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
6 changed files with 42 additions and 24 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -18,7 +18,7 @@ import { useDesign } from '@/hooks/web/useDesign'
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import CopperModal from './CopperModal.vue' import CopperModal from './CopperModal.vue'
import avatar from '@/assets/imgs/avatar.jpg' import avatar from '@/assets/imgs/avatar.gif'
defineOptions({ name: 'CropperAvatar' }) defineOptions({ name: 'CropperAvatar' })

View File

@ -1,18 +1,15 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ElMessageBox } from 'element-plus' import { ElMessageBox } from 'element-plus'
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
import { useDesign } from '@/hooks/web/useDesign'
import avatarImg from '@/assets/imgs/avatar.gif' import avatarImg from '@/assets/imgs/avatar.gif'
import { useUserStore } from '@/store/modules/user' import { useDesign } from '@/hooks/web/useDesign'
import { useTagsViewStore } from '@/store/modules/tagsView' import { useTagsViewStore } from '@/store/modules/tagsView'
import { useUserStore } from '@/store/modules/user'
defineOptions({ name: 'UserInfo' }) defineOptions({ name: 'UserInfo' })
const { t } = useI18n() const { t } = useI18n()
const { wsCache } = useCache()
const { push, replace } = useRouter() const { push, replace } = useRouter()
const userStore = useUserStore() const userStore = useUserStore()
@ -23,24 +20,21 @@ const { getPrefixCls } = useDesign()
const prefixCls = getPrefixCls('user-info') const prefixCls = getPrefixCls('user-info')
const user = wsCache.get(CACHE_KEY.USER) const avatar = computed(() => userStore.user.avatar ?? avatarImg)
const userName = computed(() => userStore.user.nickname ?? 'Admin')
const avatar = user.user.avatar ? user.user.avatar : avatarImg const loginOut = async () => {
try {
const userName = user.user.nickname ? user.user.nickname : 'Admin' await ElMessageBox.confirm(t('common.loginOutMessage'), t('common.reminder'), {
const loginOut = () => {
ElMessageBox.confirm(t('common.loginOutMessage'), t('common.reminder'), {
confirmButtonText: t('common.ok'), confirmButtonText: t('common.ok'),
cancelButtonText: t('common.cancel'), cancelButtonText: t('common.cancel'),
type: 'warning' type: 'warning'
}) })
.then(async () => {
await userStore.loginOut() await userStore.loginOut()
tagsViewStore.delAllViews() tagsViewStore.delAllViews()
replace('/login?redirect=/index') replace('/login?redirect=/index')
}) }
.catch(() => {}) catch { }
} }
const toProfile = async () => { const toProfile = async () => {
push('/user/profile') push('/user/profile')

View File

@ -63,6 +63,20 @@ export const useUserStore = defineStore('admin-user', {
wsCache.set(CACHE_KEY.USER, userInfo) wsCache.set(CACHE_KEY.USER, userInfo)
wsCache.set(CACHE_KEY.ROLE_ROUTERS, userInfo.menus) wsCache.set(CACHE_KEY.ROLE_ROUTERS, userInfo.menus)
}, },
async setUserAvatarAction(avatar: string) {
const userInfo = wsCache.get(CACHE_KEY.USER)
// NOTE: 是否需要像`setUserInfoAction`一样判断`userInfo != null`
this.user.avatar = avatar
userInfo.user.avatar = avatar
wsCache.set(CACHE_KEY.USER, userInfo)
},
async setUserNicknameAction(nickname: string) {
const userInfo = wsCache.get(CACHE_KEY.USER)
// NOTE: 是否需要像`setUserInfoAction`一样判断`userInfo != null`
this.user.nickname = nickname
userInfo.user.nickname = nickname
wsCache.set(CACHE_KEY.USER, userInfo)
},
async loginOut() { async loginOut() {
await loginOut() await loginOut()
removeToken() removeToken()

View File

@ -21,11 +21,13 @@ import {
updateUserProfile, updateUserProfile,
UserProfileUpdateReqVO UserProfileUpdateReqVO
} from '@/api/system/user/profile' } from '@/api/system/user/profile'
import { useUserStore } from '@/store/modules/user'
defineOptions({ name: 'BasicInfo' }) defineOptions({ name: 'BasicInfo' })
const { t } = useI18n() const { t } = useI18n()
const message = useMessage() // const message = useMessage() //
const userStore = useUserStore()
// //
const rules = reactive<FormRules>({ const rules = reactive<FormRules>({
nickname: [{ required: true, message: t('profile.rules.nickname'), trigger: 'blur' }], nickname: [{ required: true, message: t('profile.rules.nickname'), trigger: 'blur' }],
@ -78,13 +80,15 @@ const submit = () => {
const data = unref(formRef)?.formModel as UserProfileUpdateReqVO const data = unref(formRef)?.formModel as UserProfileUpdateReqVO
await updateUserProfile(data) await updateUserProfile(data)
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
await init() const profile = await init()
userStore.setUserNicknameAction(profile.nickname)
} }
}) })
} }
const init = async () => { const init = async () => {
const res = await getUserProfile() const res = await getUserProfile()
unref(formRef)?.setValues(res) unref(formRef)?.setValues(res)
return res
} }
onMounted(async () => { onMounted(async () => {
await init() await init()

View File

@ -14,6 +14,8 @@
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
import { uploadAvatar } from '@/api/system/user/profile' import { uploadAvatar } from '@/api/system/user/profile'
import { CropperAvatar } from '@/components/Cropper' import { CropperAvatar } from '@/components/Cropper'
import { useUserStore } from '@/store/modules/user'
defineOptions({ name: 'UserAvatar' }) defineOptions({ name: 'UserAvatar' })
@ -21,10 +23,14 @@ defineProps({
img: propTypes.string.def('') img: propTypes.string.def('')
}) })
const userStore = useUserStore()
const cropperRef = ref() const cropperRef = ref()
const handelUpload = async ({ data }) => { const handelUpload = async ({ data }) => {
await uploadAvatar({ avatarFile: data }) const res = await uploadAvatar({ avatarFile: data })
cropperRef.value.close() cropperRef.value.close()
userStore.setUserAvatarAction(res.data)
} }
</script> </script>