Login.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <template>
  2. <div class="x-container">
  3. <!-- background slider -->
  4. <div class="x-banner-wrap">
  5. <div class="x-banner">
  6. <ul class="list-unstyled">
  7. <li>
  8. <a>
  9. <div class="inner">
  10. <div class="x-title x-text-0"></div>
  11. <div class="x-subtitle x-text-0"></div>
  12. <div class="x-btn-group">
  13. </div>
  14. </div>
  15. </a>
  16. </li>
  17. </ul>
  18. </div>
  19. </div>
  20. <div class="x-login-wrap">
  21. <div class="x-login">
  22. <!-- user & pwd login wrap -->
  23. <div id="form-wrap" class="x-login-form">
  24. <div>
  25. <el-form :model="login" :rules="rules2" ref="login" class="demo-ruleForm login-form">
  26. <el-form-item prop="username">
  27. <el-input type="text" v-model="login.username" auto-complete="off" placeholder="手机号/邮箱/账号ID"></el-input>
  28. <i class="fa fa-user"></i>
  29. </el-form-item>
  30. <el-form-item prop="password">
  31. <el-input type="password" v-model="login.password" auto-complete="off" placeholder="密码"></el-input>
  32. <i class="fa fa-lock"></i>
  33. </el-form-item>
  34. <el-form-item prop="captcha" class="captcha" v-show="showCheckCode">
  35. <el-input type="text" v-model="login.captcha" auto-complete="off" class="code-input"></el-input>
  36. <img id="captchaImage" class="code-img" src="/sso/login/checkCode"/>
  37. <a class="code-click" @click="getCode">看不清换一张</a>
  38. </el-form-item>
  39. <el-form-item class="text-right">
  40. <a class="forget">忘记密码?</a>
  41. </el-form-item>
  42. <el-form-item>
  43. <a class="btn login" @click="isLogin" :disabled="isLoginDisabled">登录</a>
  44. </el-form-item>
  45. </el-form>
  46. </div>
  47. <div class="warn-text-area">
  48. 为确保您账户的安全及正常使用,依《网络安全法》相关要求,6月1日起会员账户需绑定手机、设置密码保护。感谢您的理解和支持!
  49. </div>
  50. <div style="text-align: right;">
  51. <a href="sso/register_mall?appId=home&amp;returnURL=https%3A%2F%2Fwww.ubtob.com%2F">
  52. <i class="fa fa-arrow-circle-o-right"></i>免费注册</a>
  53. </div>
  54. </div>
  55. <!-- qrcode login wrap -->
  56. <div id="qrcode-wrap" class="x-login-qrcode">
  57. <div class="x-qrcode-help">
  58. <span>打开手机客户端,扫描下面的二维码</span>
  59. </div>
  60. <div class="x-qrcode-img">
  61. <img src="/images/all/qrcode.jpg">
  62. </div>
  63. <div class="x-qrcode-ex">
  64. <ul class="list-unstyled list-inline">
  65. <li><i class="iconfont icon-left icon-input"></i><span>免输入</span></li>
  66. <li><i class="iconfont icon-left icon-fast"></i><span>更快捷</span></li>
  67. <li><i class="iconfont icon-left icon-safe"></i><span>更安全</span></li>
  68. </ul>
  69. </div>
  70. </div>
  71. </div>
  72. </div>
  73. </div>
  74. </template>
  75. <script>
  76. export default {
  77. name: 'login',
  78. data () {
  79. var validateUsername = (rule, value, callback) => {
  80. if (value === '') {
  81. this.checkUsername = false
  82. this.showCheckCode = false
  83. } else {
  84. if (this.login.username !== '') {
  85. // 获取密码输错次数
  86. this.$http.get(`/sso/login/getPwdErrorCount`, {params: {username: this.login.username}})
  87. .then(response => {
  88. if (response.data) {
  89. this.showCheckCode = false
  90. let getPasswordErrorCount = response.data.content || ''
  91. if (getPasswordErrorCount >= 5) {
  92. this.$message.error('密码错误次数已达上限,今日无法登陆')
  93. this.isLoginDisabled = true
  94. this.showCheckCode = false
  95. } else if (getPasswordErrorCount < 3) {
  96. this.isLoginDisabled = false
  97. this.checkUsername = true
  98. this.showCheckCode = false
  99. } else if (getPasswordErrorCount >= 3 && getPasswordErrorCount < 5) {
  100. if (getPasswordErrorCount === 3) {
  101. this.$message.error('当前已输错密码3次,若达到5次今日将无法登陆')
  102. }
  103. this.isLoginDisabled = false
  104. this.checkUsername = true
  105. this.showCheckCode = true
  106. } else {
  107. this.checkUsername = false
  108. this.showCheckCode = false
  109. }
  110. }
  111. }, err => {
  112. this.$message.error(err)
  113. console.log(err)
  114. })
  115. }
  116. callback()
  117. }
  118. }
  119. var validatePassword = (rule, value, callback) => {
  120. if (value === '') {
  121. this.checkPassword = false
  122. } else {
  123. if (this.login.password !== '') {
  124. this.checkPassword = true
  125. }
  126. callback()
  127. }
  128. }
  129. return {
  130. login: {
  131. username: '',
  132. password: '',
  133. captcha: ''
  134. },
  135. checkUsername: false,
  136. checkPassword: false,
  137. showCheckCode: false,
  138. isLoginDisabled: false,
  139. rules2: {
  140. username: [
  141. {validator: validateUsername, trigger: 'blur'}
  142. ],
  143. password: [
  144. {validator: validatePassword, trigger: 'blur'}
  145. ]
  146. }
  147. }
  148. },
  149. methods: {
  150. // 获取验证码
  151. getCode () {
  152. var imgSrc = document.getElementById('captchaImage')
  153. imgSrc.setAttribute('src', '/sso/login/checkCode?timestamp=' + (new Date()).valueOf())
  154. },
  155. // 登录
  156. isLogin () {
  157. if (!this.checkUsername) {
  158. this.$message.error('请填写账号')
  159. } else if (!this.checkPassword) {
  160. this.$message.error('请填写密码')
  161. } else {
  162. var url = window.location.search
  163. var request = {}
  164. if (url.indexOf('?' !== -1)) {
  165. var str = url.substr(1)
  166. var strs = str.split('&')
  167. for (var i = 0; i < strs.length; i++) {
  168. request[strs[i].split('=')[0]] = decodeURI(strs[i].split('=')[1])
  169. }
  170. }
  171. var appId = request['appId']
  172. var returnUrl = request['returnUrl']
  173. var baseUrl = request['baseUrl']
  174. let param = new FormData()
  175. param.append('username', this.login.username)
  176. param.append('password', this.login.password)
  177. param.append('captcha', this.login.captcha)
  178. param.append('appId', appId)
  179. param.append('returnUrl', returnUrl)
  180. param.append('baseUrl', baseUrl)
  181. param.append('spaceUU', '')
  182. let config = {
  183. headers: {'Content-Type': 'multipart/form-data'}
  184. }
  185. this.$http.post('/sso/login', param, config)
  186. .then(response => {
  187. if (response.data.success) {
  188. console.log(response.data)
  189. } else {
  190. this.$message.error(response.data)
  191. var count = response.data.errorCount
  192. if (count < 3) {
  193. this.showCheckCode = false
  194. this.isLoginDisabled = false
  195. } else if (count >= 5) {
  196. this.$message.error('密码错误次数已达上限,今日无法登陆')
  197. this.isLoginDisabled = true
  198. this.showCheckCode = false
  199. } else if (count >= 3 && count < 5) {
  200. this.getCode()
  201. if (count === 3) {
  202. this.$message.error('当前已输错密码3次,若达到5次今日将无法登陆')
  203. }
  204. this.showCheckCode = true
  205. this.isLoginDisabled = false
  206. }
  207. return Promise.reject(response.data)
  208. }
  209. }).catch(err => {
  210. console.log(err)
  211. this.$message.error(err.errMsg)
  212. })
  213. }
  214. }
  215. }
  216. }
  217. </script>
  218. <style lang="scss" scoped>
  219. .x-container{
  220. position: relative;
  221. height: 475px;
  222. .x-banner-wrap {
  223. position: absolute;
  224. left: 0;
  225. top: 0;
  226. width: 100%;
  227. height: 475px;
  228. .x-banner {
  229. position: relative;
  230. overflow: auto;
  231. height: 475px;
  232. text-align: center;
  233. li{
  234. width: 100%;
  235. height: 475px;
  236. background: url(/images/all/banner.jpg) center center / auto 100% no-repeat rgb(202, 202, 214);
  237. }
  238. }
  239. }
  240. .x-login-wrap{
  241. position: absolute;
  242. top: 10px;
  243. right: 50%;
  244. margin-right: -495px;
  245. height: 475px;
  246. z-index: 5;
  247. .x-login {
  248. position: relative;
  249. top: 40px;
  250. width: 346px;
  251. background: #fff;
  252. overflow: visible;
  253. z-index: 4;
  254. .x-login-form, .x-login-qrcode {
  255. padding: 20px;
  256. .btn{
  257. background: #5078cb;
  258. color: #fff;
  259. font-weight: 700;
  260. letter-spacing: 4px;
  261. border-radius: 0;
  262. }
  263. .x-has-feedback-right {
  264. float: right;
  265. display: inline-block;
  266. a{
  267. color: #5078cb;
  268. }
  269. }
  270. .x-has-feedback-left {
  271. position: relative;
  272. .x-input {
  273. padding-left: 30px;
  274. line-height: 18px;
  275. color: #555;
  276. border-color: #ccc;
  277. border-radius: 0;
  278. box-shadow: none;
  279. }
  280. i.fa{
  281. position: absolute;
  282. top: 2px;
  283. left: 0;
  284. z-index: 2;
  285. display: block;
  286. width: 30px;
  287. height: 34px;
  288. line-height: 34px;
  289. text-align: center;
  290. pointer-events: none;
  291. color: #999;
  292. font-size: 18px;
  293. }
  294. }
  295. i.fa-keyboard-o{
  296. position: absolute;
  297. right: 10px;
  298. top: 10px;
  299. }
  300. i.fa-arrow-circle-o-right{
  301. margin-right: 5px;
  302. font-size: 14px;
  303. color: #5078cb;
  304. }
  305. .warn-text-area{
  306. margin-top: 5px;
  307. font-size: 13px;
  308. color: #000;
  309. }
  310. }
  311. .x-login-qrcode{
  312. display: none;
  313. }
  314. }
  315. }
  316. }
  317. </style>