Files
daohangye/src/components/apps/UserInfo/index.vue
T

241 lines
7.6 KiB
Vue

<script setup lang="ts">
import type { FormInst, FormRules } from 'naive-ui'
import { NButton, NCard, NDivider, NForm, NFormItem, NInput, NSelect, useDialog, useMessage } from 'naive-ui'
import { ref } from 'vue'
import { useAppStore, useAuthStore, usePanelState, useUserStore } from '@/store'
import { languageOptions } from '@/utils/defaultData'
import type { Language } from '@/store/modules/app/helper'
import { logout } from '@/api'
import { RoundCardModal, SvgIcon } from '@/components/common/'
import { updateInfo, updatePassword } from '@/api/system/user'
import { updateLocalUserInfo } from '@/utils/cmn'
import { t } from '@/locales'
const userStore = useUserStore()
const authStore = useAuthStore()
const appStore = useAppStore()
const panelState = usePanelState()
const ms = useMessage()
const dialog = useDialog()
const languageValue = ref(appStore.language)
// const themeValue = ref(appStore.theme)
const nickName = ref(authStore.userInfo?.name || '')
const isEditNickNameStatus = ref(false)
const formRef = ref<FormInst | null>(null)
// const themeOptions: { label: string; key: string; value: Theme }[] = [
// { label: t('apps.userInfo.themeStyle.dark'), key: 'dark', value: 'dark' },
// { label: t('apps.userInfo.themeStyle.light'), key: 'light', value: 'light' },
// { label: t('apps.userInfo.themeStyle.auto'), key: 'Auto', value: 'auto' },
// ]
const updatePasswordModalState = ref({
show: false,
loading: false,
form: {
password: '',
oldPassword: '',
confirmPassword: '',
},
})
const updatePasswordModalFormRules: FormRules = {
oldPassword: {
required: true,
trigger: 'blur',
min: 6,
max: 20,
message: t('adminSettingUsers.formRules.passwordLimit'),
},
password: {
required: true,
trigger: 'blur',
min: 6,
max: 20,
message: t('adminSettingUsers.formRules.passwordLimit'),
},
confirmPassword: {
required: true,
trigger: 'blur',
min: 6,
max: 20,
message: t('adminSettingUsers.formRules.passwordLimit'),
},
}
async function logoutApi() {
await logout()
userStore.resetUserInfo()
authStore.removeToken()
panelState.removeState()
appStore.removeToken()
ms.success(t('settingUserInfo.logoutSuccess'))
// router.push({ path: '/login' })
location.reload()// 强制刷新一下页面
}
function handleSaveInfo() {
updateInfo(nickName.value).then(({ code, msg }) => {
if (code === 0) {
updateLocalUserInfo()
isEditNickNameStatus.value = false
}
else {
ms.error(`${t('common.editFail')}:${msg}`)
}
})
}
function handleUpdatePassword(e: MouseEvent) {
e.preventDefault()
formRef.value?.validate((errors) => {
if (errors) {
console.log(errors)
return
}
if (updatePasswordModalState.value.form.password !== updatePasswordModalState.value.form.confirmPassword) {
ms.error(t('settingUserInfo.confirmPasswordInconsistentMsg'))
return
}
updatePasswordModalState.value.loading = true
updatePassword(updatePasswordModalState.value.form.oldPassword, updatePasswordModalState.value.form.password).then(({ code, msg }) => {
if (code === 0) {
// 成功
updatePasswordModalState.value.show = false
ms.success(t('common.success'))
}
else if (code === 0) {
// 旧密码错误
}
else {
// 其他错误
ms.error(`${t('common.failed')}:${msg}`)
}
}).finally(() => {
updatePasswordModalState.value.loading = false
}).catch(() => {
ms.error(t('common.serverError'))
})
})
}
function handleLogout() {
dialog.warning({
title: t('common.warning'),
content: t('settingUserInfo.confirmLogoutText'),
positiveText: t('common.confirm'),
negativeText: t('common.cancel'),
onPositiveClick: () => {
logoutApi()
},
})
}
function handleChangeLanuage(value: Language) {
languageValue.value = value
appStore.setLanguage(value)
location.reload()
}
// function handleChangeTheme(value: Theme) {
// themeValue.value = value
// appStore.setTheme(value)
// // location.reload()
// }
</script>
<template>
<div class="bg-slate-200 p-2 h-full">
<NCard style="border-radius:10px" size="small">
<div>
<div class="text-slate-500 font-bold">
{{ $t('common.username') }}
</div>
{{ authStore.userInfo?.username }}
</div>
<div class="mt-[10px]">
<div class="text-slate-500 font-bold">
{{ $t('common.nikeName') }}
</div>
<div v-if="!isEditNickNameStatus">
{{ authStore.userInfo?.name }}
<NButton size="small" text type="info" @click="isEditNickNameStatus = !isEditNickNameStatus">
{{ $t('common.edit') }}
</NButton>
</div>
<div v-else class="flex items-center">
<div class="max-w-[150px]">
<NInput v-model:value="nickName" type="text" :placeholder="$t('common.inputPlaceholder')" />
</div>
<NButton size="small" quaternary type="info" @click="handleSaveInfo">
{{ $t('common.save') }}
</NButton>
</div>
</div>
<div class="mt-[10px]">
<div class="text-slate-500 font-bold">
{{ $t('common.language') }}
</div>
<div class="max-w-[200px]">
<NSelect v-model:value="languageValue" :options="languageOptions" @update-value="handleChangeLanuage" />
</div>
</div>
<!-- <div class="mt-[10px]">
<div class="text-slate-500 font-bold">
{{ $t('apps.userInfo.theme') }}
</div>
<div class="max-w-[200px]">
<NSelect v-model:value="themeValue" :options="themeOptions" @update-value="handleChangeTheme" />
</div>
</div> -->
<NDivider style="margin: 10px 0;" dashed />
<div>
<NButton size="small" text type="info" @click="updatePasswordModalState.show = !updatePasswordModalState.show">
{{ $t('settingUserInfo.updatePassword') }}
</NButton>
</div>
</NCard>
<NCard style="border-radius:10px" class="mt-[10px]" size="small">
<NButton size="small" text type="error" @click="handleLogout">
<template #icon>
<SvgIcon icon="tabler:logout" />
</template>
{{ $t('settingUserInfo.logout') }}
</NButton>
</NCard>
<RoundCardModal v-model:show="updatePasswordModalState.show" size="small" preset="card" style="width: 400px" :title="$t('settingUserInfo.updatePassword')">
<NForm ref="formRef" :model="updatePasswordModalState.form" :rules="updatePasswordModalFormRules">
<NFormItem path="oldPassword" :label="$t('settingUserInfo.oldPassword')">
<NInput v-model:value="updatePasswordModalState.form.oldPassword" :maxlength="20" type="password" :placeholder="$t('settingUserInfo.oldPassword')" />
</NFormItem>
<NFormItem path="password" :label="$t('settingUserInfo.newPassword')">
<NInput v-model:value="updatePasswordModalState.form.password" :maxlength="20" type="password" :placeholder="$t('settingUserInfo.newPassword')" />
</NFormItem>
<NFormItem path="confirmPassword" :label="$t('settingUserInfo.confirmPassword')">
<NInput v-model:value="updatePasswordModalState.form.confirmPassword" :maxlength="20" type="password" :placeholder="$t('settingUserInfo.confirmPassword')" />
</NFormItem>
</NForm>
<template #footer>
<div class="float-right">
<NButton type="success" size="small" :loading="updatePasswordModalState.loading" @click="handleUpdatePassword">
{{ $t('common.save') }}
</NButton>
</div>
</template>
</RoundCardModal>
</div>
</template>