zwpanel/src/views/login/index.vue
2024-04-08 17:41:05 +08:00

160 lines
4.4 KiB
Vue

<script setup lang="ts">
import { NButton, NCard, NForm, NFormItem, NGradientText, NInput, NSelect, useMessage } from 'naive-ui'
import { ref } from 'vue'
import { login } from '@/api'
import { useAppStore, useAuthStore } from '@/store'
import { SvgIcon } from '@/components/common'
import { router } from '@/router'
import { t } from '@/locales'
import { languageOptions } from '@/utils/defaultData'
import type { Language } from '@/store/modules/app/helper'
// const userStore = useUserStore()
const authStore = useAuthStore()
const appStore = useAppStore()
const ms = useMessage()
const loading = ref(false)
const languageValue = ref<Language>(appStore.language)
// const isShowCaptcha = ref<boolean>(false)
// const isShowRegister = ref<boolean>(false)
const form = ref<Login.LoginReqest>({
username: '',
password: '',
})
const loginPost = async () => {
loading.value = true
try {
const res = await login<Login.LoginResponse>(form.value)
if (res.code === 0) {
authStore.setToken(res.data.token)
authStore.setUserInfo(res.data)
setTimeout(() => {
ms.success(`Hi ${res.data.name},${t('login.welcomeMessage')}`)
loading.value = false
router.push({ path: '/' })
}, 500)
}
else {
loading.value = false
// captchaRef.value.refresh()
}
}
catch (error) {
loading.value = false
// 请检查网络或者服务器错误
console.log(error)
}
}
function handleSubmit() {
// 点击登录按钮触发
loginPost()
}
function handleChangeLanuage(value: Language) {
languageValue.value = value
appStore.setLanguage(value)
}
</script>
<template>
<div class="login-container">
<NCard class="login-card" style="border-radius: 20px;">
<div class="mb-5 flex items-center justify-end">
<div class="mr-2">
<SvgIcon icon="ion-language" style="width: 20;height: 20;" />
</div>
<div class="min-w-[100px]">
<NSelect v-model:value="languageValue" size="small" :options="languageOptions" @update-value="handleChangeLanuage" />
</div>
</div>
<div class="login-title ">
<NGradientText :size="30" type="success" class="!font-bold">
{{ $t('common.appName') }}
</NGradientText>
</div>
<NForm :model="form" label-width="100px" @keydown.enter="handleSubmit">
<NFormItem>
<NInput v-model:value="form.username" :placeholder="$t('login.usernamePlaceholder')">
<template #prefix>
<SvgIcon icon="ph:user-bold" />
</template>
</NInput>
</NFormItem>
<NFormItem>
<NInput v-model:value="form.password" type="password" :placeholder="$t('login.passwordPlaceholder')">
<template #prefix>
<SvgIcon icon="mdi:password-outline" />
</template>
</NInput>
</NFormItem>
<!-- <NFormItem v-if="isShowCaptcha">
<div class="w-[120px] h-[34px] mr-[20px] rounded border flex cursor-pointer">
<Captcha ref="captchaRef" src="/api/captcha/getImage" />
</div>
<NInput v-model:value="form.vcode" type="text" placeholder="请输入图像验证码" />
</NFormItem> -->
<NFormItem style="margin-top: 10px">
<NButton type="primary" block :loading="loading" @click="handleSubmit">
{{ $t('login.loginButton') }}
</NButton>
</NFormItem>
<!-- <div class="flex justify-end">
<NButton v-if="isShowRegister" quaternary type="info" class="flex" @click="$router.push({ path: '/register' })">
注册
</NButton>
<NButton quaternary type="info" class="flex" @click="$router.push({ path: '/resetPassword' })">
忘记密码?
</NButton>
</div> -->
</NForm>
</NCard>
</div>
</template>
<style>
.login-container {
padding: 20px;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f2f6ff;
}
/* 夜间模式 */
.dark .login-container{
background-color: rgb(43, 43, 43);
}
@media (min-width: 600px) {
.login-card {
width: auto;
margin: 0px 10px;
}
.login-button {
width: 100%;
}
}
.login-card {
margin: 20px;
min-width:400px;
}
.login-title{
text-align: center;
margin: 20px;
}
</style>