login.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <template>
  2. <div class="login" :style="'background-image:url('+ Background +');'">
  3. <el-form ref="loginForm" :model="loginForm" :rules="loginRules" label-position="left" label-width="0px" class="login-form">
  4. <h3 class="title">
  5. <span class="CN">用户登录</span>
  6. <span class="EN">LOGIN</span>
  7. </h3>
  8. <el-form-item prop="username">
  9. <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="请输入用户名">
  10. <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
  11. </el-input>
  12. </el-form-item>
  13. <el-form-item prop="password">
  14. <el-input v-model="loginForm.password" show-password type="password" auto-complete="off" placeholder="请输入密码" @keyup.enter.native="handleLogin">
  15. <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
  16. </el-input>
  17. </el-form-item>
  18. <el-form-item prop="code">
  19. <el-input v-model="loginForm.code" auto-complete="off" placeholder="请输入验证码" style="width: 63%" @keyup.enter.native="handleLogin">
  20. <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
  21. </el-input>
  22. <div class="login-code">
  23. <img :src="codeUrl">
  24. <i class="el-icon-refresh" @click="getCode" />
  25. </div>
  26. </el-form-item>
  27. <el-checkbox v-model="loginForm.rememberMe" style="margin:0 0 25px 0;">
  28. 记住我
  29. </el-checkbox>
  30. <el-form-item style="width:100%;">
  31. <el-button :loading="loading" size="medium" type="primary" style="width:100%;" @click.native.prevent="handleLogin">
  32. <span v-if="!loading">登 录</span>
  33. <span v-else>登 录 中...</span>
  34. </el-button>
  35. </el-form-item>
  36. </el-form>
  37. <!-- 底部 -->
  38. <div v-if="$store.state.settings.showFooter" id="el-login-footer">
  39. <span v-html="$store.state.settings.footerTxt" />
  40. <span> ⋅ </span>
  41. <a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank">{{ $store.state.settings.caseNumber }}</a>
  42. </div>
  43. </div>
  44. </template>
  45. <script>
  46. import { encrypt } from '@/utils/rsaEncrypt'
  47. import Config from '@/settings'
  48. import { getCodeImg } from '@/api/login'
  49. import Cookies from 'js-cookie'
  50. import Background from '@/assets/images/login_bg.png'
  51. export default {
  52. name: 'Login',
  53. data() {
  54. return {
  55. Background: Background,
  56. codeUrl: '',
  57. cookiePass: '',
  58. loginForm: {
  59. username: 'admin',
  60. password: '123456',
  61. rememberMe: false,
  62. code: '',
  63. uuid: ''
  64. },
  65. loginRules: {
  66. username: [{ required: true, trigger: 'blur', message: '用户名不能为空' }],
  67. password: [{ required: true, trigger: 'blur', message: '密码不能为空' }],
  68. code: [{ required: true, trigger: 'change', message: '验证码不能为空' }]
  69. },
  70. loading: false,
  71. redirect: undefined
  72. }
  73. },
  74. watch: {
  75. $route: {
  76. handler: function(route) {
  77. this.redirect = route.query && route.query.redirect
  78. },
  79. immediate: true
  80. }
  81. },
  82. created() {
  83. // 获取验证码
  84. this.getCode()
  85. // 获取用户名密码等Cookie
  86. this.getCookie()
  87. // token 过期提示
  88. this.point()
  89. },
  90. methods: {
  91. getCode() {
  92. getCodeImg().then(res => {
  93. this.codeUrl = res.img
  94. this.loginForm.uuid = res.uuid
  95. })
  96. },
  97. getCookie() {
  98. const username = Cookies.get('username')
  99. let password = Cookies.get('password')
  100. const rememberMe = Cookies.get('rememberMe')
  101. // 保存cookie里面的加密后的密码
  102. this.cookiePass = password === undefined ? '' : password
  103. password = password === undefined ? this.loginForm.password : password
  104. this.loginForm = {
  105. username: username === undefined ? this.loginForm.username : username,
  106. password: password,
  107. rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
  108. code: ''
  109. }
  110. },
  111. handleLogin() {
  112. this.$refs.loginForm.validate(valid => {
  113. const user = {
  114. username: this.loginForm.username,
  115. password: this.loginForm.password,
  116. rememberMe: this.loginForm.rememberMe,
  117. code: this.loginForm.code,
  118. uuid: this.loginForm.uuid
  119. }
  120. if (user.password !== this.cookiePass) {
  121. user.password = encrypt(user.password)
  122. }
  123. if (valid) {
  124. this.loading = true
  125. if (user.rememberMe) {
  126. Cookies.set('username', user.username, { expires: Config.passCookieExpires })
  127. Cookies.set('password', user.password, { expires: Config.passCookieExpires })
  128. Cookies.set('rememberMe', user.rememberMe, { expires: Config.passCookieExpires })
  129. } else {
  130. Cookies.remove('username')
  131. Cookies.remove('password')
  132. Cookies.remove('rememberMe')
  133. }
  134. this.$store.dispatch('Login', user).then(() => {
  135. this.loading = false
  136. this.$router.push({ path: this.redirect || '/' })
  137. }).catch(() => {
  138. this.loading = false
  139. this.getCode()
  140. })
  141. } else {
  142. console.log('error submit!!')
  143. return false
  144. }
  145. })
  146. },
  147. point() {
  148. const point = Cookies.get('point') !== undefined
  149. if (point) {
  150. this.$notify({
  151. title: '提示',
  152. message: '当前登录状态已过期,请重新登录!',
  153. type: 'warning',
  154. duration: 5000
  155. })
  156. Cookies.remove('point')
  157. }
  158. }
  159. }
  160. }
  161. </script>
  162. <style rel="stylesheet/scss" lang="scss">
  163. .login {
  164. display: flex;
  165. justify-content: center;
  166. align-items: center;
  167. height: 100%;
  168. background-size: cover;
  169. }
  170. .title {
  171. margin: 0 auto 30px auto;
  172. text-align: left;
  173. color: #707070;
  174. .CN {
  175. color: #474747;
  176. }
  177. .EN {
  178. color: #d4d4d4;
  179. margin-left: 10px;
  180. }
  181. }
  182. .login-form {
  183. border-radius: 6px;
  184. background: #ffffff;
  185. width: 335px;
  186. padding: 25px 25px 5px 25px;
  187. .el-input {
  188. height: 38px;
  189. input {
  190. height: 38px;
  191. }
  192. }
  193. .input-icon{
  194. height: 39px;width: 14px;margin-left: 2px;
  195. }
  196. }
  197. .login-tip {
  198. font-size: 13px;
  199. text-align: center;
  200. color: #bfbfbf;
  201. }
  202. .login-code {
  203. width: 33%;
  204. height: 38px;
  205. float: right;
  206. display: inline-flex;
  207. justify-content: center;
  208. align-items: center;
  209. img{
  210. vertical-align:middle;
  211. width: 80%;
  212. height: 38px;
  213. padding: 5px;
  214. border: 1px solid rgb(217,217,217);
  215. border-radius: 3px;
  216. }
  217. i {
  218. color: rgb(135,135,135);
  219. margin-left: 5px;
  220. cursor: pointer;
  221. }
  222. }
  223. </style>