| | |
| | | <template> |
| | | <div class="login-container"> |
| | | <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left"> |
| | | <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" |
| | | label-position="left"> |
| | | |
| | | <div class="title-container"> |
| | | <h3 class="title">学之思管理系统</h3> |
| | | <h3 class="title">江西语音视频培训系统</h3> |
| | | </div> |
| | | |
| | | <el-form-item prop="userName"> |
| | | <span class="svg-container"> |
| | | <svg-icon icon-class="user" /> |
| | | <svg-icon icon-class="user"/> |
| | | </span> |
| | | <el-input |
| | | ref="userName" |
| | |
| | | <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual> |
| | | <el-form-item prop="password"> |
| | | <span class="svg-container"> |
| | | <svg-icon icon-class="password" /> |
| | | <svg-icon icon-class="password"/> |
| | | </span> |
| | | <el-input |
| | | :key="passwordType" |
| | |
| | | @keyup.enter.native="handleLogin" |
| | | /> |
| | | <span class="show-pwd" @click="showPwd"> |
| | | <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" /> |
| | | <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'"/> |
| | | </span> |
| | | </el-form-item> |
| | | </el-tooltip> |
| | | |
| | | <el-checkbox v-model="loginForm.remember" style="margin-bottom: 20px;margin-left: 5px;">记住密码</el-checkbox> |
| | | |
| | | <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">登录</el-button> |
| | | <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" |
| | | @click.native.prevent="handleLogin">登录 |
| | | </el-button> |
| | | |
| | | </el-form> |
| | | |
| | | <div class="account-foot-copyright"> |
| | | <span>Copyright ©2019-2024 武汉思维跳跃科技有限公司 版权所有</span> |
| | | </div> |
| | | <el-dialog |
| | | title="修改密码" |
| | | :visible.sync="forceUpdateShow" |
| | | :close-on-click-modal="false" |
| | | :close-on-press-escape="false" |
| | | width="400px" |
| | | :show-close="false" |
| | | > |
| | | <div style="margin-bottom: 10px; color: #aa1111">您的密码已经过期,请重新设置~</div> |
| | | <el-form ref="updatePasswordForm" :model="updatePasswordForm" :rules="updatePasswordRules"> |
| | | <el-form-item label="新密码" prop="newPassword"> |
| | | <el-input v-model="updatePasswordForm.newPassword" placeholder="应包含大小写、数字" show-password></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="确认密码"> |
| | | <el-input v-model="updatePasswordForm.confirmPassword" placeholder="确认密码" show-password></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="forceUpdateShow = false">关 闭</el-button> |
| | | <el-button type="primary" @click="updatePassword">修 改</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { mapMutations } from 'vuex' |
| | | import loginApi from '@/api/login' |
| | | import UserApi from '@/api/user' |
| | | |
| | | export default { |
| | | name: 'Login', |
| | | data () { |
| | | const validateUsername = (rule, value, callback) => { |
| | | if (value.length < 5) { |
| | | callback(new Error('用户名不能少于5个字符')) |
| | | } else { |
| | | callback() |
| | | } |
| | | } |
| | | const validatePassword = (rule, value, callback) => { |
| | | if (value.length < 5) { |
| | | callback(new Error('密码不能少于5个字符')) |
| | | if (value === '') { |
| | | callback(new Error('请输入密码')) |
| | | } else if (!/[A-Z]/.test(value)) { |
| | | callback(new Error('密码必须包含至少一个大写字母')) |
| | | } else if (!/[a-z]/.test(value)) { |
| | | callback(new Error('密码必须包含至少一个小写字母')) |
| | | } else if (!/[0-9]/.test(value)) { |
| | | callback(new Error('密码必须包含至少一个数字')) |
| | | } else { |
| | | callback() |
| | | } |
| | | } |
| | | return { |
| | | forceUpdateShow: false, |
| | | updatePasswordForm: { |
| | | userId: null, |
| | | newPassword: '', |
| | | confirmPassword: '' |
| | | }, |
| | | updatePasswordRules: { |
| | | newPassword: [ |
| | | { validator: validatePassword, trigger: 'blur' } |
| | | ] |
| | | }, |
| | | loginForm: { |
| | | userName: '', |
| | | password: '', |
| | | remember: false |
| | | }, |
| | | loginRules: { |
| | | userName: [{ required: true, trigger: 'blur', validator: validateUsername }], |
| | | password: [{ required: true, trigger: 'blur', validator: validatePassword }] |
| | | userName: [{ required: true, trigger: 'blur' }], |
| | | password: [{ required: true, trigger: 'blur' }] |
| | | }, |
| | | passwordType: 'password', |
| | | capsTooltip: false, |
| | |
| | | // window.removeEventListener('storage', this.afterQRScan) |
| | | }, |
| | | methods: { |
| | | updatePassword () { |
| | | let _this = this |
| | | _this.$refs.updatePasswordForm.validate(valid => { |
| | | if (valid) { |
| | | if (this.updatePasswordForm.newPassword !== this.updatePasswordForm.confirmPassword) { |
| | | _this.$message.error('两次输入的密码不一致') |
| | | return |
| | | } |
| | | UserApi.updatePassword(this.updatePasswordForm).then(res => { |
| | | if (res.code === 1) { |
| | | _this.$message.success('密码修改成功。请重新登录') |
| | | _this.loginForm.password = '' |
| | | _this.forceUpdateShow = false |
| | | } |
| | | }) |
| | | } else { |
| | | return false |
| | | } |
| | | }) |
| | | }, |
| | | checkCapslock ({ shiftKey, key } = {}) { |
| | | if (key && key.length === 1) { |
| | | // eslint-disable-next-line no-mixed-operators |
| | |
| | | this.$refs.loginForm.validate(valid => { |
| | | if (valid) { |
| | | this.loading = true |
| | | loginApi.login(this.loginForm).then(function (result) { |
| | | loginApi.login(this.loginForm).then(result => { |
| | | // 如果code为205,则强制修改密码 |
| | | if (result && result.code === 205) { |
| | | this.updatePasswordForm.userId = result.data |
| | | this.forceUpdateShow = true |
| | | this.loading = false |
| | | return |
| | | } |
| | | if (result && result.code === 1) { |
| | | _this.setUserName(_this.loginForm.userName) |
| | | _this.$router.push({ path: '/' }) |
| | | _this.setUserInfo(result.data) |
| | | _this.$router.push({ path: '/dashboard' }) |
| | | } else { |
| | | _this.loading = false |
| | | _this.$message({ |
| | |
| | | } |
| | | }) |
| | | }, |
| | | ...mapMutations('user', ['setUserName']) |
| | | ...mapMutations('user', ['setUserName', 'setUserInfo']) |
| | | } |
| | | } |
| | | </script> |
| | |
| | | /* 修复input 背景不协调 和光标变色 */ |
| | | /* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */ |
| | | |
| | | $bg:#283443; |
| | | $light_gray:#fff; |
| | | $bg: #283443; |
| | | $light_gray: #fff; |
| | | $cursor: #fff; |
| | | |
| | | @supports (-webkit-mask: none) and (not (cater-color: $cursor)) { |
| | | .login-container .el-input input { |
| | | color: $cursor; |
| | | } |
| | | } |
| | | |
| | |
| | | width: 85%; |
| | | |
| | | input { |
| | | background: transparent; |
| | | background: white; |
| | | border: 0px; |
| | | -webkit-appearance: none; |
| | | border-radius: 0px; |
| | | padding: 12px 5px 12px 15px; |
| | | color: $light_gray; |
| | | color: black; |
| | | height: 47px; |
| | | caret-color: $cursor; |
| | | caret-color: black; |
| | | |
| | | &:-webkit-autofill { |
| | | box-shadow: 0 0 0px 1000px $bg inset !important; |
| | | -webkit-text-fill-color: $cursor !important; |
| | | box-shadow: 0 0 0px 1000px white inset !important; |
| | | -webkit-text-fill-color: black !important; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .el-form-item { |
| | | border: 1px solid rgba(255, 255, 255, 0.1); |
| | | background: rgba(0, 0, 0, 0.1); |
| | | border: 1px solid darkgrey; |
| | | border-radius: 5px; |
| | | color: #454545; |
| | | color: white; |
| | | } |
| | | } |
| | | </style> |
| | | |
| | | <style lang="scss" scoped> |
| | | $bg:#2d3a4b; |
| | | $dark_gray:#889aa4; |
| | | $light_gray:#eee; |
| | | $bg: #2d3a4b; |
| | | $dark_gray: #889aa4; |
| | | $light_gray: #eee; |
| | | |
| | | .login-container { |
| | | background-image: url('../../assets/loginBackground.png'); |
| | | background-size: cover; |
| | | background-attachment: fixed; |
| | | min-height: 100%; |
| | | width: 100%; |
| | | background-color: $bg; |
| | | background-color: white; |
| | | overflow: hidden; |
| | | |
| | | .login-form { |
| | | position: relative; |
| | | width: 520px; |
| | | max-width: 100%; |
| | | padding:30px 50px 10px 50px; |
| | | margin:120px auto auto auto; |
| | | padding: 30px 50px 10px 50px; |
| | | margin: 200px auto auto auto; |
| | | overflow: hidden; |
| | | background: rgba(252, 254, 255, 0.11) |
| | | background: white; |
| | | } |
| | | |
| | | .tips { |
| | |
| | | |
| | | .title { |
| | | font-size: 26px; |
| | | color: $light_gray; |
| | | margin: 0px auto 40px auto; |
| | | text-align: center; |
| | | font-weight: bold; |