| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { isPassword } from '@/utils/validate' |
| | | import { isPassword } from "@/utils/validate"; |
| | | |
| | | export default { |
| | | name: 'Login', |
| | | directives: { |
| | | focus: { |
| | | inserted(el) { |
| | | el.querySelector('input').focus() |
| | | }, |
| | | export default { |
| | | name: "Login", |
| | | directives: { |
| | | focus: { |
| | | inserted(el) { |
| | | el.querySelector("input").focus(); |
| | | }, |
| | | }, |
| | | data() { |
| | | const validateusername = (rule, value, callback) => { |
| | | if ('' == value) { |
| | | callback(new Error('用户名不能为空')) |
| | | }, |
| | | data() { |
| | | const validateusername = (rule, value, callback) => { |
| | | if ("" == value) { |
| | | callback(new Error("用户名不能为空")); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }; |
| | | const validatePassword = (rule, value, callback) => { |
| | | if (!isPassword(value)) { |
| | | callback(new Error("密码不能少于6位")); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }; |
| | | return { |
| | | nodeEnv: process.env.NODE_ENV, |
| | | title: this.$baseTitle, |
| | | form: { |
| | | username: "", |
| | | password: "", |
| | | }, |
| | | rules: { |
| | | username: [ |
| | | { |
| | | required: true, |
| | | trigger: "blur", |
| | | validator: validateusername, |
| | | }, |
| | | ], |
| | | password: [ |
| | | { |
| | | required: true, |
| | | trigger: "blur", |
| | | validator: validatePassword, |
| | | }, |
| | | ], |
| | | }, |
| | | loading: false, |
| | | passwordType: "password", |
| | | redirect: undefined, |
| | | }; |
| | | }, |
| | | watch: { |
| | | $route: { |
| | | handler(route) { |
| | | this.redirect = (route.query && route.query.redirect) || "/"; |
| | | }, |
| | | immediate: true, |
| | | }, |
| | | }, |
| | | created() { |
| | | document.body.style.overflow = "hidden"; |
| | | }, |
| | | beforeDestroy() { |
| | | document.body.style.overflow = "auto"; |
| | | }, |
| | | mounted() { |
| | | this.form.username = "admin"; |
| | | this.form.password = "123456"; |
| | | setTimeout(() => { |
| | | this.handleLogin(); |
| | | }, 3000); |
| | | }, |
| | | methods: { |
| | | handlePassword() { |
| | | this.passwordType === "password" |
| | | ? (this.passwordType = "") |
| | | : (this.passwordType = "password"); |
| | | this.$nextTick(() => { |
| | | this.$refs.password.focus(); |
| | | }); |
| | | }, |
| | | handleLogin() { |
| | | this.$refs.form.validate((valid) => { |
| | | if (valid) { |
| | | this.loading = true; |
| | | this.$store |
| | | .dispatch("user/login", this.form) |
| | | .then(() => { |
| | | const routerPath = |
| | | this.redirect === "/404" || this.redirect === "/401" |
| | | ? "/" |
| | | : this.redirect; |
| | | this.$router.push(routerPath).catch(() => {}); |
| | | this.loading = false; |
| | | }) |
| | | .catch(() => { |
| | | this.loading = false; |
| | | }); |
| | | } else { |
| | | callback() |
| | | return false; |
| | | } |
| | | } |
| | | const validatePassword = (rule, value, callback) => { |
| | | if (!isPassword(value)) { |
| | | callback(new Error('密码不能少于6位')) |
| | | } else { |
| | | callback() |
| | | } |
| | | } |
| | | return { |
| | | nodeEnv: process.env.NODE_ENV, |
| | | title: this.$baseTitle, |
| | | form: { |
| | | username: '', |
| | | password: '', |
| | | }, |
| | | rules: { |
| | | username: [ |
| | | { |
| | | required: true, |
| | | trigger: 'blur', |
| | | validator: validateusername, |
| | | }, |
| | | ], |
| | | password: [ |
| | | { |
| | | required: true, |
| | | trigger: 'blur', |
| | | validator: validatePassword, |
| | | }, |
| | | ], |
| | | }, |
| | | loading: false, |
| | | passwordType: 'password', |
| | | redirect: undefined, |
| | | } |
| | | }); |
| | | }, |
| | | watch: { |
| | | $route: { |
| | | handler(route) { |
| | | this.redirect = (route.query && route.query.redirect) || '/' |
| | | }, |
| | | immediate: true, |
| | | }, |
| | | }, |
| | | created() { |
| | | document.body.style.overflow = 'hidden' |
| | | }, |
| | | beforeDestroy() { |
| | | document.body.style.overflow = 'auto' |
| | | }, |
| | | mounted() { |
| | | this.form.username = 'admin' |
| | | this.form.password = '123456' |
| | | setTimeout(() => { |
| | | this.handleLogin() |
| | | }, 3000) |
| | | }, |
| | | methods: { |
| | | handlePassword() { |
| | | this.passwordType === 'password' |
| | | ? (this.passwordType = '') |
| | | : (this.passwordType = 'password') |
| | | this.$nextTick(() => { |
| | | this.$refs.password.focus() |
| | | }) |
| | | }, |
| | | handleLogin() { |
| | | this.$refs.form.validate((valid) => { |
| | | if (valid) { |
| | | this.loading = true |
| | | this.$store |
| | | .dispatch('user/login', this.form) |
| | | .then(() => { |
| | | const routerPath = |
| | | this.redirect === '/404' || this.redirect === '/401' |
| | | ? '/' |
| | | : this.redirect |
| | | this.$router.push(routerPath).catch(() => {}) |
| | | this.loading = false |
| | | }) |
| | | .catch(() => { |
| | | this.loading = false |
| | | }) |
| | | } else { |
| | | return false |
| | | } |
| | | }) |
| | | }, |
| | | }, |
| | | } |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .login-container { |
| | | height: 100vh; |
| | | background: url('~@/assets/login_images/background.jpg') center center fixed |
| | | no-repeat; |
| | | background-size: cover; |
| | | .login-container { |
| | | height: 100vh; |
| | | background: url("~@/assets/login_images/background.jpg") center center fixed |
| | | no-repeat; |
| | | background-size: cover; |
| | | |
| | | .title { |
| | | font-size: 54px; |
| | | font-weight: 500; |
| | | color: rgba(14, 18, 26, 1); |
| | | .title { |
| | | font-size: 54px; |
| | | font-weight: 500; |
| | | color: rgba(14, 18, 26, 1); |
| | | } |
| | | |
| | | .title-tips { |
| | | margin-top: 29px; |
| | | font-size: 26px; |
| | | font-weight: 400; |
| | | color: rgba(14, 18, 26, 1); |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .login-btn { |
| | | display: inherit; |
| | | width: 220px; |
| | | height: 60px; |
| | | margin-top: 5px; |
| | | border: 0; |
| | | |
| | | &:hover { |
| | | opacity: 0.9; |
| | | } |
| | | } |
| | | |
| | | .title-tips { |
| | | margin-top: 29px; |
| | | font-size: 26px; |
| | | font-weight: 400; |
| | | color: rgba(14, 18, 26, 1); |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | .login-form { |
| | | position: relative; |
| | | max-width: 100%; |
| | | margin: calc((100vh - 425px) / 2) 10% 10%; |
| | | overflow: hidden; |
| | | |
| | | .login-btn { |
| | | display: inherit; |
| | | width: 220px; |
| | | height: 60px; |
| | | margin-top: 5px; |
| | | border: 0; |
| | | .forget-password { |
| | | width: 100%; |
| | | margin-top: 40px; |
| | | text-align: left; |
| | | |
| | | &:hover { |
| | | opacity: 0.9; |
| | | } |
| | | } |
| | | |
| | | .login-form { |
| | | position: relative; |
| | | max-width: 100%; |
| | | margin: calc((100vh - 425px) / 2) 10% 10%; |
| | | overflow: hidden; |
| | | |
| | | .forget-password { |
| | | width: 100%; |
| | | margin-top: 40px; |
| | | text-align: left; |
| | | |
| | | .forget-pass { |
| | | width: 129px; |
| | | height: 19px; |
| | | font-size: 20px; |
| | | font-weight: 400; |
| | | color: rgba(92, 102, 240, 1); |
| | | } |
| | | } |
| | | } |
| | | |
| | | .tips { |
| | | margin-bottom: 10px; |
| | | font-size: $base-font-size-default; |
| | | color: $base-color-white; |
| | | |
| | | span { |
| | | &:first-of-type { |
| | | margin-right: 16px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .title-container { |
| | | position: relative; |
| | | |
| | | .title { |
| | | margin: 0 auto 40px auto; |
| | | font-size: 34px; |
| | | font-weight: bold; |
| | | color: $base-color-blue; |
| | | text-align: center; |
| | | } |
| | | } |
| | | |
| | | .svg-container { |
| | | position: absolute; |
| | | top: 14px; |
| | | left: 15px; |
| | | z-index: $base-z-index; |
| | | font-size: 16px; |
| | | color: #d7dee3; |
| | | cursor: pointer; |
| | | user-select: none; |
| | | } |
| | | |
| | | .show-password { |
| | | position: absolute; |
| | | top: 14px; |
| | | right: 25px; |
| | | font-size: 16px; |
| | | color: #d7dee3; |
| | | cursor: pointer; |
| | | user-select: none; |
| | | } |
| | | |
| | | ::v-deep { |
| | | .el-form-item { |
| | | padding-right: 0; |
| | | margin: 20px 0; |
| | | color: #454545; |
| | | background: transparent; |
| | | border: 1px solid transparent; |
| | | border-radius: 2px; |
| | | |
| | | &__content { |
| | | min-height: $base-input-height; |
| | | line-height: $base-input-height; |
| | | } |
| | | |
| | | &__error { |
| | | position: absolute; |
| | | top: 100%; |
| | | left: 18px; |
| | | font-size: $base-font-size-small; |
| | | line-height: 18px; |
| | | color: $base-color-red; |
| | | } |
| | | } |
| | | |
| | | .el-input { |
| | | box-sizing: border-box; |
| | | |
| | | input { |
| | | height: 58px; |
| | | padding-left: 45px; |
| | | font-size: $base-font-size-default; |
| | | line-height: 58px; |
| | | color: $base-font-color; |
| | | background: #f6f4fc; |
| | | border: 0; |
| | | caret-color: $base-font-color; |
| | | } |
| | | .forget-pass { |
| | | width: 129px; |
| | | height: 19px; |
| | | font-size: 20px; |
| | | font-weight: 400; |
| | | color: rgba(92, 102, 240, 1); |
| | | } |
| | | } |
| | | } |
| | | |
| | | .tips { |
| | | margin-bottom: 10px; |
| | | font-size: $base-font-size-default; |
| | | color: $base-color-white; |
| | | |
| | | span { |
| | | &:first-of-type { |
| | | margin-right: 16px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .title-container { |
| | | position: relative; |
| | | |
| | | .title { |
| | | margin: 0 auto 40px auto; |
| | | font-size: 34px; |
| | | font-weight: bold; |
| | | color: $base-color-blue; |
| | | text-align: center; |
| | | } |
| | | } |
| | | |
| | | .svg-container { |
| | | position: absolute; |
| | | top: 14px; |
| | | left: 15px; |
| | | z-index: $base-z-index; |
| | | font-size: 16px; |
| | | color: #d7dee3; |
| | | cursor: pointer; |
| | | user-select: none; |
| | | } |
| | | |
| | | .show-password { |
| | | position: absolute; |
| | | top: 14px; |
| | | right: 25px; |
| | | font-size: 16px; |
| | | color: #d7dee3; |
| | | cursor: pointer; |
| | | user-select: none; |
| | | } |
| | | |
| | | ::v-deep { |
| | | .el-form-item { |
| | | padding-right: 0; |
| | | margin: 20px 0; |
| | | color: #454545; |
| | | background: transparent; |
| | | border: 1px solid transparent; |
| | | border-radius: 2px; |
| | | |
| | | &__content { |
| | | min-height: $base-input-height; |
| | | line-height: $base-input-height; |
| | | } |
| | | |
| | | &__error { |
| | | position: absolute; |
| | | top: 100%; |
| | | left: 18px; |
| | | font-size: $base-font-size-small; |
| | | line-height: 18px; |
| | | color: $base-color-red; |
| | | } |
| | | } |
| | | |
| | | .el-input { |
| | | box-sizing: border-box; |
| | | |
| | | input { |
| | | height: 58px; |
| | | padding-left: 45px; |
| | | font-size: $base-font-size-default; |
| | | line-height: 58px; |
| | | color: $base-font-color; |
| | | background: #f6f4fc; |
| | | border: 0; |
| | | caret-color: $base-font-color; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |