| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="login-container"> |
| | | <div class="login-container-center"> |
| | | <el-carousel |
| | | :autoplay="true" |
| | | indicator-position="outside" |
| | | height="580px" |
| | | :interval="3000" |
| | | style="width: 500px;margin-left: 20px" |
| | | > |
| | | <el-carousel-item> |
| | | <img src="@/assets/images/img1.png" style="margin-top: -30px"> |
| | | <div class="itemLabel"> |
| | | <p class="title" :style="{color:$store.state.settings.theme}">æºæ
§ç©è</p> |
| | | <p class="content">ç产ç°åºæ°æ®å®æ¶ééã ä¼ éãå¤ç»´åº¦å¯è§ååç°</p> |
| | | </div> |
| | | </el-carousel-item> |
| | | <el-carousel-item> |
| | | <img src="@/assets/images/img2.png" style="margin-top: -30px"> |
| | | <div class="itemLabel"> |
| | | <p class="title" :style="{color:$store.state.settings.theme}">ç²¾çæç»´</p> |
| | | <p class="content">è¿ç¨ç²¾çææ³åITç³»ç»æ æ¯æé å·¥åå¶é ååå¹³å°</p> |
| | | </div> |
| | | </el-carousel-item> |
| | | <el-carousel-item> |
| | | <img src="@/assets/images/img3.png" style="margin-top: -30px"> |
| | | <div class="itemLabel"> |
| | | <p class="title" :style="{color:$store.state.settings.theme}">è¡ä¸ç»ä»¶</p> |
| | | <p class="content">åºäºå¶é 模åå¿«éçµæ´»å° é
置客æ·ä¸å±çåºç¨åºæ¯</p> |
| | | </div> |
| | | </el-carousel-item> |
| | | <!-- <el-carousel-item v-for="item in carouselArr" :key="item.title">--> |
| | | <!-- <div :style="{ width:'200px',height:'300px' ,margin:'95px 0px 35px 155px'}">--> |
| | | <!-- <img :src="item.url" alt="" style="width: 200px;height: 300px">--> |
| | | <!-- </div>--> |
| | | <!-- <div class="itemLabel">--> |
| | | <!-- <div class="title">{{ item.title }}</div>--> |
| | | <!-- <div class="content">{{ item.content }}</div>--> |
| | | <!-- </div>--> |
| | | <!-- </el-carousel-item>--> |
| | | </el-carousel> |
| | | |
| | | <el-form |
| | | ref="loginForm" |
| | | :model="loginForm" |
| | | :rules="loginRules" |
| | | class="login-form" |
| | | auto-complete="on" |
| | | label-position="left" |
| | | > |
| | | |
| | | <div class="title-container"> |
| | | <div class="title_img" /> |
| | | <!-- <h3 class="title">æ°å¯è¿ªå¶é äºå¹³å°</h3>--> |
| | | </div> |
| | | |
| | | <el-form-item prop="username"> |
| | | <!-- <span class="svg-container">--> |
| | | <!-- <svg-icon icon-class="user" />--> |
| | | <!-- </span>--> |
| | | <el-input |
| | | ref="username" |
| | | v-model="loginForm.username" |
| | | placeholder="请è¾å
¥ç¨æ·ç¼ç " |
| | | name="username" |
| | | type="text" |
| | | tabindex="1" |
| | | class="username" |
| | | style="width: 100%;" |
| | | auto-complete="on" |
| | | @blur="focus1=false" |
| | | @focus="focus1=true" |
| | | > |
| | | <i slot="prefix" :style="{color:focus1?'lightseagreen':'#C0C4CC'}" class="el-input__icon el-icon-user" /> |
| | | </el-input> |
| | | </el-form-item> |
| | | |
| | | <el-form-item prop="password" class="password"> |
| | | <!-- <span class="svg-container">--> |
| | | <!-- <svg-icon icon-class="password" />--> |
| | | <!-- </span>--> |
| | | <el-input |
| | | :key="passwordType" |
| | | ref="password" |
| | | v-model="loginForm.password" |
| | | :type="passwordType" |
| | | placeholder="请è¾å
¥ç¨æ·å¯ç " |
| | | name="password" |
| | | tabindex="2" |
| | | style="width: 100%;" |
| | | auto-complete="on" |
| | | @keyup.enter.native="handleLogin" |
| | | @blur="focus2=false" |
| | | @focus="focus2=true" |
| | | > |
| | | <i slot="prefix" :style="{color:focus2?'lightseagreen':'#C0C4CC'}" class="el-input__icon el-icon-lock" /> |
| | | </el-input> |
| | | <span class="show-pwd" @click="showPwd"> |
| | | <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" /> |
| | | </span> |
| | | </el-form-item> |
| | | |
| | | <el-checkbox v-model="checkedPassword">è®°ä½å¯ç </el-checkbox> |
| | | |
| | | <el-button |
| | | :loading="loading" |
| | | type="primary" |
| | | style="width:100%;margin-top:30px;letter-spacing: 10px;height: 40px;" |
| | | @click.native.prevent="handleLogin" |
| | | >ç»å½ |
| | | </el-button> |
| | | |
| | | <!-- <div class="tips">--> |
| | | <!-- <span style="margin-right:20px;">username: admin</span>--> |
| | | <!-- <span> password: any</span>--> |
| | | <!-- </div>--> |
| | | |
| | | </el-form> |
| | | </div> |
| | | |
| | | <el-dialog |
| | | title="æç¤º" |
| | | :visible.sync="dialogVisible" |
| | | width="500px" |
| | | :close-on-click-modal="false" |
| | | :show-close="false" |
| | | top="5vh" |
| | | class="dialogVisible" |
| | | > |
| | | <div style="font-size:18px;"> |
| | | <!-- <i class="el-icon-warning-outline" style="color: #ffef00" />--> |
| | | å½åè´¦å·å·²ç»å½ï¼æ¯å¦å¼ºå¶ä¸çº¿! |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | |
| | | <div class="footerButton"> |
| | | <el-button @click="dialogVisibleCancel">å¦</el-button> |
| | | <el-button type="primary" @click="dialogVisibleConfirm">æ¯</el-button> |
| | | </div> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { validUsername } from '@/utils/validate' |
| | | import { getCookie, removeCookie, setCookie } from '@/utils/auth' |
| | | import { ForcedOffline, UserTorgData } from '@/api/user' |
| | | import { ButtonData } from '@/api/basicSettings' |
| | | import Vue from 'vue' |
| | | |
| | | export default { |
| | | name: 'Login', |
| | | data() { |
| | | const validateUsername = (rule, value, callback) => { |
| | | // if (!validUsername(value)) { |
| | | // callback(new Error('请è¾å
¥æ£ç¡®çç¨æ·åï¼')) |
| | | // } else { |
| | | // callback() |
| | | // } |
| | | // const mPattern = /^\w+$/ // æ£å çä»·äº[A-Za-z0-9_] |
| | | |
| | | if (value.length < 1) { |
| | | callback(new Error('ç¨æ·ç¼ç ä¸è½ä¸ºç©ºï¼')) |
| | | } else { |
| | | callback() |
| | | } |
| | | // if (value.length < 1) { |
| | | // callback(new Error('è´¦å·ä¸è½ä¸ºç©ºï¼')) |
| | | // } else if (!mPattern.test(value)) { |
| | | // callback(new Error('è´¦å·ä¸ç¬¦åè§åï¼å¯è¾å
¥åæ¯ãæ°ååä¸å线')) |
| | | // } else { |
| | | // callback() |
| | | // } |
| | | } |
| | | const validatePassword = (rule, value, callback) => { |
| | | if (value.length < 1) { |
| | | callback(new Error('ç¨æ·å¯ç ä¸è½ä¸ºç©ºï¼')) |
| | | } else { |
| | | callback() |
| | | } |
| | | } |
| | | return { |
| | | loginForm: { |
| | | username: '', |
| | | password: '' |
| | | }, |
| | | loginRules: { |
| | | username: [{ required: true, trigger: ['blur', 'change'], validator: validateUsername }], |
| | | password: [{ required: true, trigger: ['blur', 'change'], validator: validatePassword }] |
| | | }, |
| | | loading: false, |
| | | passwordType: 'password', |
| | | checkedPassword: false, |
| | | redirect: undefined, |
| | | focus1: false, |
| | | focus2: false, |
| | | dialogVisible: false |
| | | } |
| | | }, |
| | | watch: { |
| | | $route: { |
| | | handler: function(route) { |
| | | this.redirect = route.query && route.query.redirect |
| | | }, |
| | | immediate: true |
| | | } |
| | | }, |
| | | mounted() { |
| | | const account = localStorage.getItem('account') |
| | | if (account) { |
| | | this.loginForm.username = localStorage.getItem('account') |
| | | this.loginForm.password = localStorage.getItem('password') |
| | | this.checkedPassword = true |
| | | } |
| | | }, |
| | | methods: { |
| | | showPwd() { |
| | | if (this.passwordType === 'password') { |
| | | this.passwordType = '' |
| | | } else { |
| | | this.passwordType = 'password' |
| | | } |
| | | this.$nextTick(() => { |
| | | this.$refs.password.focus() |
| | | }) |
| | | }, |
| | | handleLogin() { |
| | | this.$refs.loginForm.validate(valid => { |
| | | if (valid) { |
| | | this.loading = true |
| | | this.$store.dispatch('user/login', this.loginForm).then(() => { |
| | | if (getCookie('code') === '302') { |
| | | this.dialogVisible = true |
| | | } else { |
| | | if (this.checkedPassword) { |
| | | localStorage.setItem('account', this.loginForm.username) |
| | | localStorage.setItem('password', this.loginForm.password) |
| | | } else { |
| | | localStorage.removeItem('account') |
| | | localStorage.removeItem('password') |
| | | } |
| | | |
| | | this.$router.push({ path: this.redirect || '/' }) |
| | | // ButtonData().then(res => { |
| | | // localStorage.setItem('ButtonData', JSON.stringify(res.data)) |
| | | // }) |
| | | // UserTorgData({ usercode: getCookie('usercode') }).then(res => { |
| | | // setCookie('username', res.data.user) |
| | | // // sessionStorage.setItem('username', res.data.user) |
| | | // sessionStorage.setItem('torg', JSON.stringify(res.data.torg)) |
| | | // }) |
| | | } |
| | | this.loading = false |
| | | }).catch(() => { |
| | | this.loading = false |
| | | }) |
| | | } else { |
| | | console.log('error submit!!') |
| | | return false |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | dialogVisibleCancel() { |
| | | // localStorage.removeItem('token') |
| | | this.dialogVisible = false |
| | | }, |
| | | async dialogVisibleConfirm() { |
| | | const data = { |
| | | token: localStorage.getItem('token'), |
| | | rid: '' |
| | | } |
| | | const res = await ForcedOffline(data) |
| | | if (res.code === '200') { |
| | | this.$notify.success('强å¶ä¸çº¿æåï¼') |
| | | this.dialogVisible = false |
| | | this.$router.push({ path: this.redirect || '/' }) |
| | | // await this.handleLogin() |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | /* ä¿®å¤input èæ¯ä¸åè° åå
æ åè² */ |
| | | /* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */ |
| | | |
| | | $bg: #283443; |
| | | $light_gray: #000; |
| | | $cursor: #000; |
| | | |
| | | @supports (-webkit-mask: none) and (not (cater-color: $cursor)) { |
| | | .login-container .el-input input { |
| | | color: $cursor; |
| | | } |
| | | } |
| | | |
| | | /* reset element-ui css */ |
| | | .login-container { |
| | | .el-input { |
| | | display: inline-block; |
| | | height: 47px; |
| | | width: 85%; |
| | | |
| | | input { |
| | | background: transparent; |
| | | border: 0px; |
| | | -webkit-appearance: none; |
| | | border-radius: 0px; |
| | | //padding: 12px 5px 12px 15px; |
| | | color: #000;; |
| | | height: 47px; |
| | | caret-color: $cursor; //æ¹åå
æ é¢è² |
| | | |
| | | &:-webkit-autofill { |
| | | box-shadow: 0 0 0px 1000px $bg inset !important; |
| | | -webkit-text-fill-color: $cursor !important; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | .el-form-item { |
| | | border: 1px solid rgba(255, 255, 255, 0.1); |
| | | background: rgba(0, 0, 0, 0.1); |
| | | border-radius: 5px; |
| | | color: #454545; |
| | | } |
| | | } |
| | | </style> |
| | | |
| | | <style lang="scss" scoped> |
| | | $bg: #2d3a4b; |
| | | $dark_gray: #889aa4; |
| | | $light_gray: #eee; |
| | | $main_color: #42b983; |
| | | |
| | | .login-container { |
| | | min-height: 100%; |
| | | width: 100%; |
| | | //background-color: $bg; |
| | | overflow: hidden; |
| | | background: url("../../assets/images/login_bg.png") no-repeat; |
| | | background-size: 100% 100%; |
| | | opacity: 1; |
| | | |
| | | .login-container-center { |
| | | width: 1000px; |
| | | height: 600px; |
| | | background-color: #fff; |
| | | border-radius: 10px; |
| | | z-index: 0.5; |
| | | //使çåå±
ä¸ |
| | | position: absolute; |
| | | left: 50%; |
| | | top: 50%; |
| | | transform: translate(-50%, -50%); |
| | | |
| | | .itemLabel { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .title { |
| | | font-size: 20px; |
| | | color: lightseagreen; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .content { |
| | | width: 180px; |
| | | } |
| | | |
| | | .login-form { |
| | | position: absolute; |
| | | width: 400px; |
| | | top: 134px; |
| | | right: 72px; |
| | | } |
| | | |
| | | } |
| | | |
| | | .tips { |
| | | font-size: 14px; |
| | | color: #000; |
| | | margin-bottom: 10px; |
| | | |
| | | span { |
| | | &:first-of-type { |
| | | margin-right: 16px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .svg-container { |
| | | padding: 6px 5px 6px 15px; |
| | | color: $dark_gray; |
| | | vertical-align: middle; |
| | | width: 30px; |
| | | display: inline-block; |
| | | } |
| | | |
| | | .title-container { |
| | | position: relative; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | |
| | | .title_img { |
| | | background: url("../../assets/images/xkd_newlogo.png") no-repeat; |
| | | width: 300px; |
| | | height: 200px; |
| | | margin: -50px 0 20px; |
| | | background-size: 100% 100%; |
| | | } |
| | | |
| | | .title { |
| | | font-size: 26px; |
| | | color: #000000; |
| | | margin: 0px auto 40px auto; |
| | | text-align: center; |
| | | //font-weight: lighter; |
| | | |
| | | } |
| | | } |
| | | |
| | | .show-pwd { |
| | | position: absolute; |
| | | right: 10px; |
| | | top: 7px; |
| | | font-size: 16px; |
| | | color: $dark_gray; |
| | | cursor: pointer; |
| | | user-select: none; |
| | | } |
| | | |
| | | //.username{ |
| | | // border: 1px solid red; |
| | | //} |
| | | |
| | | ::v-deep .el-input__inner { |
| | | border-radius: 5px; |
| | | background: #ffffff; |
| | | padding-left: 35px; |
| | | line-height: 40px; |
| | | border: 1px solid #eee; |
| | | } |
| | | |
| | | ::v-deep .el-input__icon { |
| | | color: #000; |
| | | } |
| | | |
| | | ::v-deep .el-input__inner:focus { |
| | | border: 1px solid $main_color; |
| | | } |
| | | |
| | | ::v-deep .el-input__icon:focus { |
| | | color: $main_color; |
| | | } |
| | | |
| | | ::v-deep .el-input input:-webkit-autofill { |
| | | -webkit-box-shadow: 0 0 0px 1000px #fff inset !important; |
| | | box-shadow: 0 0 0px 1000px #fff inset !important; |
| | | -webkit-text-fill-color: #000 !important; |
| | | } |
| | | } |
| | | |
| | | ::v-deep .el-dialog__title { |
| | | color: red; |
| | | } |
| | | |
| | | ::v-deep .el-dialog__body { |
| | | padding: 20px 20px !important; |
| | | } |
| | | |
| | | ::v-deep .el-dialog__footer { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | } |
| | | |
| | | .footerButton { |
| | | display: flex; |
| | | justify-content: end; |
| | | } |
| | | |
| | | ::v-deep .dialogVisible .el-button--primary { |
| | | background-color: #42b983 !important; |
| | | height: 30px; |
| | | display: flex; |
| | | align-items: center; |
| | | //border: 1px solid $main_color; |
| | | border: none; |
| | | padding: 0 20px; |
| | | } |
| | | |
| | | ::v-deep .dialogVisible .el-button--default { |
| | | height: 30px; |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 0 20px; |
| | | } |
| | | |
| | | </style> |