socialLogin.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <template>
  2. <div class="container">
  3. <div class="logo"></div>
  4. <!-- 登录区域 -->
  5. <div class="content">
  6. <!-- 配图 -->
  7. <div class="pic"></div>
  8. <!-- 表单 -->
  9. <div class="field">
  10. <!-- [移动端]标题 -->
  11. <h2 class="mobile-title">
  12. <h3 class="title">芋道后台管理系统</h3>
  13. </h2>
  14. <!-- 表单 -->
  15. <div class="form-cont">
  16. <el-tabs class="form" v-model="loginForm.loginType " style=" float:none;">
  17. <el-tab-pane label="绑定账号" name="uname">
  18. </el-tab-pane>
  19. </el-tabs>
  20. <div>
  21. <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
  22. <!-- 账号密码登录 -->
  23. <el-form-item prop="username">
  24. <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
  25. <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon"/>
  26. </el-input>
  27. </el-form-item>
  28. <el-form-item prop="password">
  29. <el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码"
  30. @keyup.enter.native="handleLogin">
  31. <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon"/>
  32. </el-input>
  33. </el-form-item>
  34. <el-checkbox v-model="loginForm.rememberMe" style="margin:0 0 25px 0;">记住密码</el-checkbox>
  35. <!-- 下方的登录按钮 -->
  36. <el-form-item style="width:100%;">
  37. <el-button :loading="loading" size="medium" type="primary" style="width:100%;"
  38. @click.native.prevent="getCode">
  39. <span v-if="!loading">登 录</span>
  40. <span v-else>登 录 中...</span>
  41. </el-button>
  42. </el-form-item>
  43. </el-form>
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. <!-- 图形验证码 -->
  49. <Verify ref="verify" :captcha-type="'blockPuzzle'" :img-size="{width:'400px',height:'200px'}"
  50. @success="handleLogin" />
  51. <!-- footer -->
  52. <div class="footer">
  53. Copyright © 2020-2022 iocoder.cn All Rights Reserved.
  54. </div>
  55. </div>
  56. </template>
  57. <script>
  58. import {
  59. getPassword, getRememberMe,
  60. getUsername,
  61. removePassword,
  62. removeUsername,
  63. setPassword,
  64. setRememberMe,
  65. setUsername
  66. } from "@/utils/auth";
  67. import Verify from '@/components/Verifition/Verify';
  68. import {getCaptchaEnable} from "@/utils/ruoyi";
  69. export default {
  70. name: "ThirdLogin",
  71. components: {
  72. Verify
  73. },
  74. data() {
  75. return {
  76. codeUrl: "",
  77. captchaEnable: true,
  78. loginForm: {
  79. loginType: "uname",
  80. username: "admin",
  81. password: "admin123",
  82. rememberMe: false,
  83. captchaVerification: "",
  84. },
  85. loginRules: {
  86. username: [
  87. { required: true, trigger: "blur", message: "用户名不能为空" }
  88. ],
  89. password: [
  90. { required: true, trigger: "blur", message: "密码不能为空" }
  91. ],
  92. },
  93. loading: false,
  94. redirect: undefined,
  95. // 社交登录相关
  96. type: undefined,
  97. code: undefined,
  98. state: undefined,
  99. };
  100. },
  101. created() {
  102. this.getCookie();
  103. // 验证码开关
  104. this.captchaEnable = getCaptchaEnable();
  105. // 重定向地址
  106. this.redirect = this.getUrlValue('redirect');
  107. // 社交登录相关
  108. this.type = this.getUrlValue('type');
  109. this.code = this.$route.query.code;
  110. this.state = this.$route.query.state;
  111. // 尝试登录一下
  112. this.loading = true;
  113. this.$store.dispatch("SocialLogin", {
  114. code: this.code,
  115. state: this.state,
  116. type: this.type
  117. }).then(() => {
  118. this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
  119. }).catch(() => {
  120. this.loading = false;
  121. });
  122. },
  123. methods: {
  124. getCode() {
  125. // 情况一,未开启:则直接登录
  126. if (!this.captchaEnable) {
  127. this.handleLogin({})
  128. return;
  129. }
  130. // 情况二,已开启:则展示验证码;只有完成验证码的情况,才进行登录
  131. // 弹出验证码
  132. this.$refs.verify.show()
  133. },
  134. getCookie() {
  135. const username = getUsername();
  136. const password = getPassword();
  137. const rememberMe = getRememberMe();
  138. this.loginForm = {
  139. username: username ? username : this.loginForm.username,
  140. password: password ? password : this.loginForm.password,
  141. rememberMe: rememberMe ? getRememberMe() : false,
  142. loginType: this.loginForm.loginType,
  143. };
  144. },
  145. handleLogin(captchaParams) {
  146. this.$refs.loginForm.validate(valid => {
  147. if (valid) {
  148. this.loading = true;
  149. if (this.loginForm.rememberMe) {
  150. setUsername(this.loginForm.username)
  151. setPassword(this.loginForm.password)
  152. setRememberMe(this.loginForm.rememberMe)
  153. } else {
  154. removeUsername()
  155. removePassword()
  156. }
  157. this.$store.dispatch("Login", {
  158. socialCode: this.code,
  159. socialState: this.state,
  160. socialType: this.type,
  161. // 账号密码登录
  162. username: this.loginForm.username,
  163. password: this.loginForm.password,
  164. captchaVerification: captchaParams.captchaVerification
  165. }).then(() => {
  166. this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
  167. }).catch(() => {
  168. this.loading = false;
  169. this.getCode()
  170. });
  171. }
  172. });
  173. },
  174. getUrlValue(key) {
  175. const url = new URL(decodeURIComponent(location.href));
  176. return url.searchParams.get(key);
  177. }
  178. }
  179. };
  180. </script>
  181. <style rel="stylesheet/scss" lang="scss">
  182. @import "~@/assets/styles/login.scss";
  183. </style>