login.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <template xmlns="">
  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. <div class="login-title">账号登录</div>
  17. <el-tabs class="form" v-model="loginForm.loginType" style=" float:none;" @tab-click="handleClick">
  18. <el-tab-pane label="密码登录" name="uname">
  19. </el-tab-pane>
  20. <el-tab-pane label="验证码登录" name="sms">
  21. </el-tab-pane>
  22. </el-tabs>
  23. <div>
  24. <el-form ref="loginForm" :model="loginForm" :rules="LoginRules" class="login-form">
  25. <!-- 账号密码登录 -->
  26. <div v-if="loginForm.loginType === 'uname'">
  27. <el-form-item prop="username">
  28. <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="手机号">
  29. <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon"/>
  30. </el-input>
  31. </el-form-item>
  32. <el-form-item prop="password">
  33. <el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码"
  34. @keyup.enter.native="getCode">
  35. <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon"/>
  36. </el-input>
  37. </el-form-item>
  38. <el-checkbox v-model="loginForm.rememberMe" style="margin:0 0 25px 0;">记住密码</el-checkbox>
  39. <a class="forget-password" href="/password/forget">忘记密码?</a>
  40. </div>
  41. <!-- 短信验证码登录 -->
  42. <div v-if="loginForm.loginType === 'sms'">
  43. <el-form-item prop="mobile">
  44. <el-input v-model="loginForm.mobile" type="text" auto-complete="off" placeholder="请输入手机号">
  45. <svg-icon slot="prefix" icon-class="phone" class="el-input__icon input-icon"/>
  46. </el-input>
  47. </el-form-item>
  48. <el-form-item prop="mobileCode">
  49. <el-input v-model="loginForm.mobileCode" type="text" auto-complete="off" placeholder="短信验证码"
  50. class="sms-login-mobile-code-prefix"
  51. @keyup.enter.native="handleLogin">
  52. <template>
  53. <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon"/>
  54. </template>
  55. <template slot="append">
  56. <span v-if="mobileCodeTimer <= 0" class="getMobileCode" @click="getSmsCode" style="cursor: pointer;">获取验证码</span>
  57. <span v-if="mobileCodeTimer > 0" class="getMobileCode">{{ mobileCodeTimer }}秒后可重新获取</span>
  58. </template>
  59. </el-input>
  60. </el-form-item>
  61. </div>
  62. <!-- 下方的登录按钮 -->
  63. <el-form-item style="width:100%;">
  64. <el-button :loading="loading" size="medium" type="primary" style="width:100%;"
  65. @click.native.prevent="getCode">
  66. <span v-if="!loading">登 录</span>
  67. <span v-else>登 录 中...</span>
  68. </el-button>
  69. </el-form-item>
  70. <!-- 注册 -->
  71. <div class="register-tip">
  72. 没有账号?
  73. <span class="register-btn" @click="doRegister()">免费注册</span>
  74. </div>
  75. </el-form>
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. <!-- footer -->
  81. <!-- <div class="footer">
  82. Copyright © 2020-2022 iocoder.cn All Rights Reserved.
  83. </div> -->
  84. </div>
  85. </template>
  86. <script>
  87. import {sendSmsCode} from "@/api/login";
  88. import {getTenantIdByName} from "@/api/system/tenant";
  89. import {
  90. getPassword,
  91. getRememberMe,
  92. getUsername,
  93. removePassword,
  94. removeRememberMe,
  95. removeUsername,
  96. setPassword,
  97. setRememberMe,
  98. setTenantId,
  99. setUsername,
  100. removeTenantId
  101. } from "@/utils/auth";
  102. export default {
  103. name: "Login",
  104. data() {
  105. return {
  106. mobileCodeTimer: 0,
  107. loginForm: {
  108. loginType: "uname",
  109. username: "",
  110. password: "",
  111. mobile: "",
  112. mobileCode: "",
  113. rememberMe: false,
  114. },
  115. scene: 1,
  116. LoginRules: {
  117. username: [
  118. {required: true, trigger: "blur", message: "手机号不能为空"},
  119. {
  120. validator: (rule, value, callback) => {
  121. // if (/^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/.test(value) === false) {
  122. // callback(new Error("手机号格式错误"));
  123. // } else {
  124. // removeTenantId()
  125. // getTenantIdByName(value).then(res => {
  126. // const tenantId = res.data;
  127. // if (tenantId && tenantId >= 0) {
  128. // setTenantId(tenantId)
  129. // callback();
  130. // } else {
  131. // callback('该手机号未创建账号,请重新输入');
  132. // }
  133. // });
  134. // }
  135. removeTenantId()
  136. getTenantIdByName(value).then(res => {
  137. const tenantId = res.data;
  138. if (tenantId && tenantId >= 0) {
  139. setTenantId(tenantId)
  140. callback();
  141. } else {
  142. callback('该手机号未创建账号,请重新输入');
  143. }
  144. });
  145. },
  146. trigger: 'blur'
  147. }
  148. ],
  149. password: [
  150. {required: true, trigger: "blur", message: "密码不能为空"}
  151. ],
  152. mobile: [
  153. {required: true, trigger: "blur", message: "手机号不能为空"},
  154. {
  155. validator: function (rule, value, callback) {
  156. if (/^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/.test(value) === false) {
  157. callback(new Error("手机号格式错误"));
  158. } else {
  159. removeTenantId()
  160. getTenantIdByName(value).then(res => {
  161. const tenantId = res.data;
  162. if (tenantId && tenantId >= 0) {
  163. setTenantId(tenantId)
  164. callback();
  165. } else {
  166. callback('该手机号未创建账号,请重新输入');
  167. }
  168. });
  169. }
  170. }, trigger: "blur"
  171. }
  172. ],
  173. },
  174. loading: false,
  175. };
  176. },
  177. created() {
  178. this.getCookie();
  179. },
  180. methods: {
  181. handleClick(){
  182. debugger
  183. this.$refs['loginForm'].clearValidate()
  184. },
  185. //跳转注册
  186. doRegister() {
  187. this.$router.push({path: '/register'})
  188. },
  189. getCode() {
  190. this.handleLogin({})
  191. },
  192. getCookie() {
  193. const username = getUsername();
  194. const password = getPassword();
  195. const rememberMe = getRememberMe();
  196. this.loginForm = {
  197. ...this.loginForm,
  198. username: username ? username : this.loginForm.username,
  199. password: password ? password : this.loginForm.password,
  200. rememberMe: rememberMe ? getRememberMe() : false,
  201. };
  202. },
  203. handleLogin() {
  204. this.$refs.loginForm.validate(valid => {
  205. if (valid) {
  206. this.loading = true;
  207. // 设置 Cookie
  208. if (this.loginForm.rememberMe) {
  209. setUsername(this.loginForm.username)
  210. setPassword(this.loginForm.password)
  211. setRememberMe(this.loginForm.rememberMe)
  212. } else {
  213. removeUsername()
  214. removePassword()
  215. removeRememberMe()
  216. }
  217. // setTenantId(1)
  218. this.$store.dispatch(this.loginForm.loginType === "sms" ? "SmsLogin" : "Login", this.loginForm).then(() => {
  219. this.$router.push({path: "/"}).catch(() => {
  220. });
  221. }).catch(() => {
  222. this.loading = false;
  223. });
  224. }
  225. });
  226. },
  227. /** ========== 以下为升级短信登录 ========== */
  228. getSmsCode() {
  229. if (this.mobileCodeTimer > 0) return;
  230. this.$refs.loginForm.validate(valid => {
  231. if (!valid) return;
  232. sendSmsCode(this.loginForm.mobile, this.scene ).then(res => {
  233. this.$modal.msgSuccess("获取验证码成功")
  234. this.mobileCodeTimer = 60;
  235. let msgTimer = setInterval(() => {
  236. this.mobileCodeTimer = this.mobileCodeTimer - 1;
  237. if (this.mobileCodeTimer <= 0) {
  238. clearInterval(msgTimer);
  239. }
  240. }, 1000);
  241. });
  242. });
  243. }
  244. }
  245. };
  246. </script>
  247. <style lang="scss" scoped>
  248. @import "~@/assets/styles/login.scss";
  249. .forget-password {
  250. float: right;
  251. color: #1890ff;
  252. font-size: 14px;
  253. }
  254. a {
  255. outline: none;
  256. text-decoration: none;
  257. }
  258. .login-title{
  259. color: #141e31;
  260. font-size: 32px;
  261. font-weight: 500;
  262. line-height: 48px;
  263. }
  264. .register-tip{
  265. color: #141e31;
  266. font-size: 14px;
  267. line-height: 20px;
  268. margin: 10px 0 20px;
  269. }
  270. .register-btn{
  271. color: #1890ff;
  272. cursor: pointer;
  273. }
  274. .oauth-login {
  275. display: flex;
  276. align-items: center;
  277. cursor:pointer;
  278. }
  279. .oauth-login-item {
  280. display: flex;
  281. align-items: center;
  282. margin-right: 10px;
  283. }
  284. .oauth-login-item img {
  285. height: 25px;
  286. width: 25px;
  287. }
  288. .oauth-login-item span:hover {
  289. text-decoration: underline red;
  290. color: red;
  291. }
  292. .sms-login-mobile-code-prefix {
  293. :deep(.el-input__prefix) {
  294. top: 22%;
  295. }
  296. }
  297. </style>