数字化园区前端项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LoginFrom.vue 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. <template>
  2. <div class="login-from-container" data-1664161475611>
  3. <div class="login-from-box">
  4. <div class="login-from">
  5. <div class="login-title">{{ getTitleText() }}</div>
  6. <div
  7. class="login-sub-title"
  8. v-if="loginMethod == 1 || loginMethod == 2"
  9. >登录之后您可以享受企业服务、税收分析、订阅信息、定制化服务</div>
  10. <!-- 默认登录 -->
  11. <div v-if="loginMethod == 1">
  12. <el-input
  13. placeholder="请输入用户名..."
  14. v-model="accountName"
  15. class="mb-20"
  16. :class="{'is-error':accountNameError}"
  17. @focus="clearError('accountNameError')"
  18. >
  19. <i slot="prefix" class="el-input__icon el-icon-user"></i>
  20. <div class="is-error-info" v-if="accountNameError">请输入用户名</div>
  21. </el-input>
  22. <div class="is-error-info" v-if="accountNameError">请输入用户名...</div>
  23. <el-input
  24. placeholder="请输入登录密码..."
  25. v-model="password"
  26. show-password
  27. class="mb-20"
  28. :class="{'is-error':passwordError}"
  29. @focus="clearError('passwordError')"
  30. >
  31. <i slot="prefix" class="el-input__icon el-icon-lock"></i>
  32. </el-input>
  33. <div class="is-error-info" v-if="passwordError">请输入登录密码...</div>
  34. </div>
  35. <!-- 手机登录 -->
  36. <div v-if="loginMethod == 2">
  37. <el-input placeholder="请输入手机号码..." v-model="mobilePhone" class="mb-20">
  38. <i slot="prefix" class="el-input__icon el-icon-mobile-phone"></i>
  39. </el-input>
  40. <div class="verification-code-row mb-20">
  41. <el-input
  42. placeholder="请输入图片验证码..."
  43. v-model="imgCode"
  44. class="fl img-code-input"
  45. >
  46. <img
  47. slot="prefix"
  48. src="~@/assets/image/login/verificationCode.png"
  49. class="img-code-icon"
  50. alt
  51. />
  52. </el-input>
  53. <div class="img-code-box fl" @click="getVerificationCode">
  54. <img class="imgCode" :src="imgCodeUrl" alt="验证码" />
  55. </div>
  56. </div>
  57. <div class="verification-code-row mb-20">
  58. <el-input
  59. placeholder="请输入手机验证码..."
  60. v-model="phoneCode"
  61. class="fl img-code-input"
  62. :class="{'is-error':phoneCodeError}"
  63. @focus="clearError('phoneCodeError')"
  64. >
  65. <img
  66. slot="prefix"
  67. src="~@/assets/image/login/numCodeIcon.png"
  68. class="img-code-icon-num"
  69. alt
  70. />
  71. </el-input>
  72. <div class="img-code-box get-code fl">
  73. <el-button :disabled="true" v-if="phoneCodeDisable">{{ word }}</el-button>
  74. <el-button v-else @click="getPhoneCode">{{ word }}</el-button>
  75. </div>
  76. <div
  77. class="is-error-info"
  78. style="margin-top:0"
  79. v-if="phoneCodeError"
  80. >请输入手机验证码</div>
  81. </div>
  82. </div>
  83. <!-- 注册 || 忘记密码 -->
  84. <div v-if="loginMethod == 3 || loginMethod == 4">
  85. <el-input
  86. placeholder="请输入手机号码..."
  87. v-model="mobilePhone"
  88. class="mb-20"
  89. :class="{'is-error':mobilePhoneError}"
  90. @focus="clearError('mobilePhoneError')"
  91. >
  92. <i slot="prefix" class="el-input__icon el-icon-mobile-phone"></i>
  93. </el-input>
  94. <div
  95. class="is-error-info"
  96. v-if="mobilePhoneError"
  97. >{{ mobilePhone ? '请输入正确的手机号码':'请输入手机号码' }}</div>
  98. <el-input
  99. placeholder="请输入用户名..."
  100. v-model="accountName"
  101. class="mb-20"
  102. :class="{'is-error':accountNameError}"
  103. @focus="clearError('accountNameError')"
  104. v-if="loginMethod == 3"
  105. >
  106. <i slot="prefix" class="el-input__icon el-icon-user"></i>
  107. </el-input>
  108. <div class="is-error-info" v-if="accountNameError && loginMethod == 3">请输入用户名</div>
  109. <form>
  110. <el-input
  111. placeholder="请输入新密码..."
  112. v-model="newPassword"
  113. show-password
  114. class="mb-20"
  115. :class="{'is-error':newPasswordError}"
  116. @focus="clearError('newPasswordError')"
  117. >
  118. <i slot="prefix" class="el-input__icon el-icon-lock"></i>
  119. </el-input>
  120. </form>
  121. <div class="is-error-info" v-if="newPasswordError">请输入新密码</div>
  122. <form>
  123. <el-input
  124. placeholder="请再次输入新密码..."
  125. v-model="confirmPassword"
  126. show-password
  127. class="mb-20"
  128. :class="{'is-error':confirmPasswordError}"
  129. @focus="clearError('confirmPasswordError')"
  130. >
  131. <i slot="prefix" class="el-input__icon el-icon-lock"></i>
  132. </el-input>
  133. </form>
  134. <div class="is-error-info" v-if="confirmPasswordError">请输入新密码</div>
  135. <div class="verification-code-row mb-20">
  136. <el-input
  137. placeholder="请输入图片验证码..."
  138. v-model="imgCode"
  139. class="fl img-code-input"
  140. :class="{'is-error':imgCodeError}"
  141. @focus="clearError('imgCodeError')"
  142. >
  143. <img
  144. slot="prefix"
  145. src="~@/assets/image/login/verificationCode.png"
  146. class="img-code-icon"
  147. alt
  148. />
  149. </el-input>
  150. <div class="img-code-box fl" @click="getVerificationCode">
  151. <img class="imgCode" :src="imgCodeUrl" alt="验证码" />
  152. </div>
  153. <div class="is-error-info" style="margin-top:0" v-if="imgCodeError">请输入图片验证码</div>
  154. </div>
  155. <div class="verification-code-row mb-20">
  156. <el-input
  157. placeholder="请输入手机验证码..."
  158. v-model="phoneCode"
  159. class="fl img-code-input"
  160. :class="{'is-error':phoneCodeError}"
  161. @focus="clearError('phoneCodeError')"
  162. >
  163. <img
  164. slot="prefix"
  165. src="~@/assets/image/login/numCodeIcon.png"
  166. class="img-code-icon-num"
  167. alt
  168. />
  169. </el-input>
  170. <div class="img-code-box get-code fl">
  171. <el-button :disabled="true" v-if="phoneCodeDisable">{{ word }}</el-button>
  172. <el-button v-else @click="getPhoneCode">{{ word }}</el-button>
  173. </div>
  174. <div
  175. class="is-error-info"
  176. style="margin-top:0"
  177. v-if="phoneCodeError"
  178. >请输入手机验证码</div>
  179. </div>
  180. </div>
  181. <div class="remember-row mb-20" v-if="loginMethod == 1 || loginMethod == 2">
  182. <div class="remember-password fl" v-if="loginMethod == 1">
  183. <el-checkbox v-model="isRemember">记住密码</el-checkbox>
  184. </div>
  185. <span class="forgot-password fr pointer" @click="loginMethodChange(4)">忘记密码?</span>
  186. </div>
  187. <!-- 登录按钮 -->
  188. <div class="login-btn">
  189. <el-button
  190. type="primary"
  191. v-if="loginLoading"
  192. :loading="true"
  193. disabled
  194. >{{ loginLoadingText }}</el-button>
  195. <el-button
  196. type="primary"
  197. v-else
  198. @click="submitLoginInfo"
  199. >{{ getLoginBtnText() }}</el-button>
  200. </div>
  201. <div class="other-login" v-if="loginMethod == 1 || loginMethod == 2">
  202. <span
  203. class="fl pointer"
  204. v-if="loginMethod == 1"
  205. @click="loginMethodChange(2)"
  206. >手机验证码登录</span>
  207. <span
  208. class="fl pointer"
  209. v-if="loginMethod == 2"
  210. @click="loginMethodChange(1)"
  211. >账号密码登录</span>
  212. <span class="fr pointer">
  213. 你还没有账户?
  214. <span class="reg-span" @click="loginMethodChange(3)">立即注册 ></span>
  215. </span>
  216. </div>
  217. <div class="other-login" v-else>
  218. <span class="fr pointer">
  219. 已经拥有账户?
  220. <span class="reg-span" @click="loginMethodChange(1)">立即登录 ></span>
  221. </span>
  222. </div>
  223. </div>
  224. </div>
  225. </div>
  226. </template>
  227. <script>
  228. import "./LoginFrom.scss";
  229. import {
  230. accountLogin,
  231. getMobilePhoneCode,
  232. accountRegister,
  233. mobilePhoneLogin,
  234. forgetPassword,
  235. } from "../../../api/login";
  236. // 密码加密
  237. import Utils from "@/utils/encrypt";
  238. // 引入工具方法
  239. import { sendMsg } from "@/utils/common";
  240. // 导入cookie操作
  241. import { setCookie, getCookie, delCookie } from "@/utils/cookie-util";
  242. export default {
  243. data() {
  244. return {
  245. // 登录loading
  246. loginLoading: false,
  247. loginLoadingText: "",
  248. /**
  249. *
  250. * 登录方式
  251. * 1 默认登录
  252. * 2 手机号登录
  253. * 3 注册
  254. * 4 忘记密码
  255. *
  256. */
  257. loginMethod: 1,
  258. // 用户名
  259. accountName: "",
  260. accountNameError: false,
  261. // 登录密码
  262. password: "",
  263. passwordError: false,
  264. // 手机号码
  265. mobilePhone: "",
  266. mobilePhoneError: false,
  267. // 图片验证码
  268. imgCode: "",
  269. imgCodeUrl: "",
  270. imgCodeError: false,
  271. // 手机验证码
  272. phoneCode: "",
  273. phoneCodeError: false,
  274. // 新密码
  275. newPassword: "",
  276. newPasswordError: false,
  277. // 确认密码
  278. confirmPassword: "",
  279. confirmPasswordError: false,
  280. // 记住密码
  281. isRemember: false,
  282. // 加密码
  283. encrypt: "hAw6eqnFLKxpsDv3",
  284. // 获取手机验证密码倒计时
  285. sendTimer: null,
  286. word: "获取验证码", // 手机短信验证码文字
  287. isOvertime: false, // 手机短信验证时间判断
  288. phoneCodeDisable: false, // 手机短信验证码按钮禁用开启
  289. };
  290. },
  291. mounted() {
  292. this.init();
  293. },
  294. methods: {
  295. //
  296. init() {
  297. // 获取图片验证码
  298. this.getVerificationCode();
  299. // 账号回显
  300. this.accountName = getCookie("accountName");
  301. // 手机号回显
  302. this.mobilePhone = getCookie("mobilePhone");
  303. // 如果有密码记录
  304. if (getCookie("password")) {
  305. this.password = Utils.decrypt(
  306. getCookie("password"),
  307. this.encrypt
  308. );
  309. this.isRemember = true;
  310. }
  311. },
  312. // 获取图片验证码
  313. getVerificationCode() {
  314. this.imgCodeUrl =
  315. process.env.VUE_APP_BASE_API +
  316. "/verificationCode/img?height=40&width=84&fontSize=25" +
  317. "&n=" +
  318. parseInt(Math.random() * 9999 + 1);
  319. },
  320. // 获取手机验证码
  321. getPhoneCode() {
  322. let { imgCode, mobilePhone } = this;
  323. if (this.checkIsAllow(["mobilePhone", "imgCode"])) {
  324. this.phoneCodeDisable = true;
  325. getMobilePhoneCode(mobilePhone.trim(), imgCode.trim())
  326. .then((res) => {
  327. if (res.data.status == 0) {
  328. if (this.isOvertime) {
  329. return false;
  330. }
  331. let time = 60;
  332. this.sendTimer = setInterval(() => {
  333. this.isOvertime = true;
  334. time--;
  335. this.word = "已发送" + time + "秒";
  336. console.log(`测试定时器`);
  337. if (time <= 0) {
  338. this.isOvertime = false;
  339. clearInterval(this.sendTimer);
  340. this.word = "发送验证码";
  341. this.phoneCodeDisable = false;
  342. }
  343. }, 1000);
  344. this.$router.push("/");
  345. console.log("跳转到首页");
  346. } else {
  347. sendMsg(0, res.data.msg);
  348. this.phoneCodeDisable = false;
  349. }
  350. })
  351. .catch((err) => {
  352. sendMsg(0, "获取验证码失败");
  353. console.log(err);
  354. this.phoneCodeDisable = false;
  355. });
  356. }
  357. },
  358. // 登录界面切换
  359. loginMethodChange(status) {
  360. this.loginMethod = status;
  361. this.clearAllError();
  362. },
  363. // 获取title
  364. getTitleText() {
  365. let { loginMethod } = this;
  366. return loginMethod == 1 || loginMethod == 2
  367. ? "松江经济技术开发区(小昆山分区)"
  368. : loginMethod == 3
  369. ? "注册"
  370. : "忘记密码";
  371. },
  372. // 获取登录按钮文本
  373. getLoginBtnText() {
  374. let { loginMethod } = this;
  375. return loginMethod == 1 || loginMethod == 2
  376. ? "登录"
  377. : loginMethod == 3
  378. ? "注册"
  379. : "修改密码";
  380. },
  381. // 提交登录信息
  382. submitLoginInfo() {
  383. // 登录方式
  384. let { loginMethod } = this;
  385. // 检测字段
  386. let checkKeyList = [];
  387. // 账号密码登录
  388. if (loginMethod == 1) {
  389. checkKeyList = ["accountName", "password"];
  390. }
  391. // 手机登录
  392. if (loginMethod == 2) {
  393. checkKeyList = ["mobilePhone", "imgCode", "phoneCode"];
  394. }
  395. // 注册
  396. if (loginMethod == 3) {
  397. checkKeyList = [
  398. "mobilePhone",
  399. "accountName",
  400. "newPassword",
  401. "confirmPassword",
  402. "imgCode",
  403. "phoneCode",
  404. ];
  405. }
  406. // 忘记密码
  407. if (loginMethod == 4) {
  408. checkKeyList = [
  409. "mobilePhone",
  410. "newPassword",
  411. "confirmPassword",
  412. "imgCode",
  413. "phoneCode",
  414. ];
  415. }
  416. // 效验不通过
  417. if (!this.checkIsAllow(checkKeyList)) {
  418. return;
  419. }
  420. // 默认登录
  421. if (loginMethod == 1) {
  422. this.accountLogin();
  423. }
  424. // 手机号登录
  425. if (loginMethod == 2) {
  426. this.mobilePhoneLogin();
  427. }
  428. // 注册账号
  429. if (loginMethod == 3) {
  430. this.accountRegister();
  431. }
  432. // 忘记密码
  433. if (loginMethod == 4) {
  434. this.forgetPassword();
  435. }
  436. },
  437. // 忘记密码 --- 修改密码
  438. forgetPassword() {
  439. let { mobilePhone, newPassword, imgCode, phoneCode } = this;
  440. let param = {
  441. mobilePhone,
  442. newPassword,
  443. imgCode,
  444. smsVerificationCode: phoneCode,
  445. };
  446. this.loginLoading = true;
  447. this.loginLoadingText = "修改中...";
  448. forgetPassword(param)
  449. .then((res) => {
  450. const data = res.data;
  451. if (data.status == 0) {
  452. sendMsg(1, "修改成功");
  453. // 保存用户名
  454. setCookie("accountName", accountName.trim());
  455. this.loginMethodChange(1);
  456. } else {
  457. sendMsg(0, data.msg);
  458. }
  459. this.loginLoading = false;
  460. })
  461. .catch((err) => {
  462. sendMsg(0, "修改失败");
  463. console.log(err);
  464. this.loginLoading = false;
  465. });
  466. },
  467. // 手机号登录
  468. mobilePhoneLogin() {
  469. let { mobilePhone, imgCode, phoneCode } = this;
  470. this.loginLoading = true;
  471. this.loginLoadingText = "登录中...";
  472. mobilePhoneLogin(mobilePhone, imgCode, phoneCode)
  473. .then((res) => {
  474. const data = res.data;
  475. if (data.status == 0) {
  476. sendMsg(1, "登录成功");
  477. // 保存用户名
  478. setCookie("mobilePhone", mobilePhone.trim());
  479. this.loginSuccessFn();
  480. } else {
  481. sendMsg(0, data.msg);
  482. }
  483. this.loginLoading = false;
  484. })
  485. .catch((err) => {
  486. sendMsg(0, "登录失败");
  487. console.log(err);
  488. this.loginLoading = false;
  489. });
  490. },
  491. // 注册账号
  492. accountRegister() {
  493. let {
  494. mobilePhone,
  495. accountName,
  496. newPassword,
  497. confirmPassword,
  498. imgCode,
  499. phoneCode,
  500. } = this;
  501. let param = {
  502. mobilePhone,
  503. accountName,
  504. password: newPassword,
  505. confirmPassword,
  506. imgCode,
  507. smsVerificationCode: phoneCode,
  508. };
  509. this.loginLoading = true;
  510. this.loginLoadingText = "注册中...";
  511. accountRegister(param)
  512. .then((res) => {
  513. const data = res.data;
  514. if (data.status == 0) {
  515. sendMsg(1, "注册成功");
  516. // 保存用户名
  517. setCookie("accountName", accountName.trim());
  518. this.loginSuccessFn();
  519. } else {
  520. sendMsg(0, data.msg);
  521. }
  522. this.loginLoading = false;
  523. })
  524. .catch((err) => {
  525. sendMsg(0, "注册失败");
  526. console.log(err);
  527. this.loginLoading = false;
  528. });
  529. },
  530. // 默认登录
  531. accountLogin() {
  532. let { isRemember, encrypt, accountName, password } = this;
  533. this.loginLoading = true;
  534. this.loginLoadingText = "登录中...";
  535. accountLogin(accountName.trim(), password.trim())
  536. .then((res) => {
  537. const data = res.data;
  538. if (data.status == 0) {
  539. sendMsg(1, "登录成功");
  540. // 保存用户名
  541. setCookie("accountName", accountName.trim());
  542. // 判断是否勾选记住密码
  543. if (isRemember) {
  544. let encryptPwd = Utils.encrypt(
  545. password.trim(),
  546. encrypt
  547. );
  548. setCookie("password", encryptPwd, 7);
  549. } else {
  550. delCookie("password");
  551. }
  552. this.loginSuccessFn();
  553. } else {
  554. sendMsg(0, data.msg);
  555. }
  556. this.loginLoading = false;
  557. })
  558. .catch((err) => {
  559. sendMsg(0, "登录失败");
  560. console.log(err);
  561. this.loginLoading = false;
  562. });
  563. },
  564. // 登录成功后的响应
  565. loginSuccessFn() {
  566. let getLoginFrom = localStorage.getItem("loginFrom") || "/";
  567. this.$router.push(getLoginFrom);
  568. this.$store.dispatch('getUserInfo');
  569. },
  570. // 检测是否通过
  571. checkIsAllow(checkKeyList) {
  572. let isAllow = true;
  573. checkKeyList.forEach((el) => {
  574. if (!this.checkKey(this[el], el + "Error")) {
  575. isAllow = false;
  576. }
  577. });
  578. return isAllow;
  579. },
  580. // 检测字段
  581. checkKey(val, key) {
  582. let flag = true;
  583. if (!val || !val.trim()) {
  584. this[key] = true;
  585. flag = false;
  586. }
  587. if (
  588. key == "mobilePhoneError" &&
  589. !/^1[3|4|5|6|7|8|9][0-9]\d{8}$/.test(val)
  590. ) {
  591. this[key] = true;
  592. flag = false;
  593. }
  594. return flag;
  595. },
  596. // 清楚错误
  597. clearError(key) {
  598. this[key] = false;
  599. },
  600. // 清除所有错误
  601. clearAllError() {
  602. this.accountNameError = false;
  603. this.passwordError = false;
  604. this.newPasswordError = false;
  605. this.confirmPasswordError = false;
  606. this.imgCodeError = false;
  607. this.phoneCodeError = false;
  608. this.mobilePhoneError = false;
  609. },
  610. },
  611. destroyed() {
  612. clearInterval(this.sendTimer);
  613. this.sendTimer = null;
  614. },
  615. };
  616. </script>