aabbcc/src/views/login.vue
2024-06-15 16:53:22 +08:00

290 lines
7.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- 登录页 -->
<div class="login">
<div class="time">{{ postDate }}</div>
<div class="logindata">
<div class="logintext">
<h2>{{ create ? "注册" : "登陆" }}</h2>
</div>
<div class="formdata">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item prop="username" label="账号">
<el-input
v-model="form.username"
clearable
placeholder="请输入账号"
></el-input>
</el-form-item>
<el-form-item prop="password" label="密码">
<el-input
v-model="form.password"
clearable
placeholder="请输入密码"
show-password
></el-input>
</el-form-item>
<el-form-item prop="repassword" label="确认密码" v-if="create">
<el-input
v-model="form.repassword"
clearable
placeholder="请重复密码"
show-password
></el-input>
</el-form-item>
</el-form>
</div>
<div class="tool">
<div>
<el-checkbox v-model="checked" @change="remember" v-if="!create"
>记住密码</el-checkbox
>
</div>
<div>
<span class="shou" @click="forgetpas" v-if="!create">忘记密码</span>
</div>
</div>
<div class="butt">
<el-button type="primary" @click="login">{{
create ? "注册" : "登陆"
}}</el-button>
<el-button class="shou" @click="register">{{
create ? "返回" : "注册"
}}</el-button>
</div>
</div>
</div>
</template>
<script>
import { login, autoLogin } from '@/api/login'
import dayjs from 'dayjs'
export default {
name: 'LoginIndex',
data () {
return {
create: false,
form: {
password: '',
username: '',
repassword: ''
},
checked: false,
rules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ max: 10, message: '不能大于10个字符', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ max: 10, message: '不能大于10个字符', trigger: 'blur' }
],
repassword: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ max: 10, message: '不能大于10个字符', trigger: 'blur' }
]
},
postDate: dayjs().format('HH : mm : ss')
}
},
created () {
setInterval(() => {
this.postDate = dayjs().format('HH : mm : ss')
}, 1000)
this.loadRememberedCredentials()
// 尝试自动登录
const token = localStorage.getItem('token')
if (token) {
this.autoLogin(token)
}
},
methods: {
loadRememberedCredentials () {
const rememberedUsername = localStorage.getItem('rememberedUsername')
const rememberedPassword = localStorage.getItem('rememberedPassword')
const rememberMeChecked = localStorage.getItem('rememberMeChecked')
if (rememberedUsername && rememberedPassword && rememberMeChecked) {
this.form.username = rememberedUsername
this.form.password = rememberedPassword
this.checked = JSON.parse(rememberMeChecked)
}
},
autoLogin (token) {
autoLogin(token).then(response => {
console.log(response)
if (this.$route.path !== '/') {
this.$router.push('/')
}
this.$message({
message: '自动登录成功',
type: 'success'
})
}).catch(error => {
console.error('自动登录失败:', error)
localStorage.removeItem('token')
this.$message({
message: '自动登录失败,请重新登录',
type: 'error'
})
})
},
login () {
if (this.form.username === '' || this.form.password === '') {
this.$message({
message: '账号或密码不能为空',
type: 'error'
})
return
}
// 登录验证
if (!this.create) {
login({ ...this.form }).then(response => {
console.log(response)
localStorage.setItem('token', response.data.token)
if (this.checked) {
localStorage.setItem('rememberedUsername', this.form.username)
localStorage.setItem('rememberedPassword', this.form.password)
localStorage.setItem('rememberMeChecked', true)
} else {
localStorage.removeItem('rememberedUsername')
localStorage.removeItem('rememberedPassword')
localStorage.removeItem('rememberMeChecked')
}
if (this.$route.path !== '/') {
this.$router.push('/')
}
this.$message({
message: '登陆成功',
type: 'success'
})
}).catch(error => {
console.error('登录失败:', error)
if (error.response && error.response.status === 401) {
this.$message({
message: '账号或密码错误',
type: 'error'
})
} else {
this.$message({
message: '服务器错误,请稍后再试',
type: 'error'
})
}
})
} else {
this.$message({
message: '暂未开放注册,请联系管理员',
type: 'warning'
})
}
},
remember () {
if (this.checked) {
this.$message({
message: '将会记住您的登录信息',
type: 'info'
})
} else {
localStorage.removeItem('rememberedUsername')
localStorage.removeItem('rememberedPassword')
localStorage.removeItem('rememberMeChecked')
this.$message({
message: '已取消记住密码',
type: 'info'
})
}
},
forgetpas () {
this.$message({
message: '请联系管理员更改密码',
type: 'warning'
})
},
register () {
if (this.create) {
// 从注册页面返回登录页面时保留内容
this.create = false
this.loadRememberedCredentials()
} else {
// 从登录页面进入注册页面时清空内容
this.create = true
this.form.username = ''
this.form.password = ''
this.form.repassword = ''
this.$refs.form.clearValidate('username')
this.$refs.form.clearValidate('password')
this.$refs.form.clearValidate('repassword')
}
}
}
}
</script>
<style lang="less" scoped>
.login {
width: 100%;
height: 100%;
overflow: auto;
position: fixed;
line-height: 100%;
padding-top: 150px;
background: url("../assets/images/sub.jpg");
background-repeat: no-repeat;
background-size: cover;
background-position: center center;
.time {
font-size: 30px;
font-weight: bolder;
color: white;
text-shadow: 2px 2px 4px #000000;
position: absolute;
top: 20px;
right: 20px;
z-index: 999;
}
.logindata {
background-color: rgba(214, 214, 214, 0.1);
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.1),
/* 右侧阴影 */ -5px 5px 10px rgba(0, 0, 0, 0.1),
/* 左侧阴影 */ 5px -5px 10px rgba(0, 0, 0, 0.1),
/* 下部阴影 */ -5px -5px 10px rgba(0, 0, 0, 0.1); /* 上部阴影 */
width: 400px;
height: 350px;
padding: 30px;
border-radius: 10px;
transform: translate(-50%);
margin-left: 70%;
.logintext {
margin-bottom: 20px;
line-height: 50px;
text-align: center;
font-size: 30px;
font-weight: bolder;
color: white;
text-shadow: 2px 2px 4px #000000;
}
.tool {
display: flex;
justify-content: space-between;
color: #606266;
.shou {
cursor: pointer;
color: #606266;
}
}
}
.butt {
margin-top: 10px;
text-align: center;
}
}
</style>