user.vue
3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<template>
<el-form
ref="loginRef"
:model="loginForm"
:rules="loginRules"
>
<el-form-item prop="username">
<el-input
v-model.trim="loginForm.username"
type="text"
size="large"
auto-complete="off"
placeholder="账号"
>
<template #prefix><svg-icon
icon-class="user"
class="el-input__icon input-icon"
/></template>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model.trim="loginForm.password"
type="password"
size="large"
auto-complete="off"
placeholder="密码"
@keyup.enter="handleLogin"
>
<template #prefix><svg-icon
icon-class="password"
class="el-input__icon input-icon"
/></template>
</el-input>
</el-form-item>
<el-form-item prop="code">
<captcha ref="codeRef" v-model="loginForm.code" v-model:uuid="loginForm.uuid" @keyup.enter="handleLogin" />
</el-form-item>
<el-form-item style="height: 20px;">
<el-checkbox v-model="loginForm.rememberMe">记住密码</el-checkbox>
<el-button style="margin-left: auto;" type="primary" link @click="forgetPassword">忘记密码</el-button>
</el-form-item>
<el-form-item style="width: 100%">
<el-button
:loading="loading"
size="large"
type="success"
style="width: 100%;border:0"
@click.prevent="handleLogin"
>
<span v-if="!loading">登 录</span>
<span v-else>登 录 中...</span>
</el-button>
</el-form-item>
</el-form>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import Cookies from 'js-cookie'
import { decrypt, encrypt } from '@/utils/jsencrypt'
import { getCurrentInstance } from '@vue/runtime-core'
import useUserStore from '@/store/modules/user'
import Captcha from './captcha'
const { proxy } = getCurrentInstance()
const userStore = useUserStore()
const emit = defineEmits(['submit', 'forgetPassword'])
const loading = ref(false)
onMounted(() => {
if (import.meta.env.DEV) {
loginForm.value.username = 'admin'
loginForm.value.password = '123456'
}
})
const loginForm = ref({
username: '',
password: '',
rememberMe: false,
code: '',
uuid: ''
})
const loginRules = {
username: [{ required: true, trigger: 'blur', message: '请输入您的账号' }],
password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }],
code: [{ required: true, trigger: 'change', message: '请输入验证码' }]
}
function handleLogin() {
proxy.$refs['loginRef'].validate((valid) => {
if (valid) {
loading.value = true
// 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
if (loginForm.value.rememberMe) {
Cookies.set('username', loginForm.value.username, { expires: 30 })
Cookies.set('password', encrypt(loginForm.value.password), { expires: 30 })
Cookies.set('rememberMe', loginForm.value.rememberMe, { expires: 30 })
} else {
// 否则移除
Cookies.remove('username')
Cookies.remove('password')
Cookies.remove('rememberMe')
}
// 调用action的登录方法
userStore
.login(loginForm.value)
.then(() => {
emit('submit')
})
.catch(() => {
loading.value = false
// 重新获取验证码
proxy.$refs['codeRef'].getCode()
})
}
})
}
function getCookie() {
const username = Cookies.get('username')
const password = Cookies.get('password')
const rememberMe = Cookies.get('rememberMe')
loginForm.value = {
username: username === undefined ? loginForm.value.username : username,
password: password === undefined ? loginForm.value.password : decrypt(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
}
}
function forgetPassword() {
emit('forgetPassword')
}
getCookie()
</script>
<style lang="scss" scoped>
</style>