index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. <template>
  2. <div class="reg">
  3. <header class="header">
  4. <div class="container">
  5. <img
  6. style="margin: 24px 0; width: 162px; height: 33px"
  7. v-if="header.companyLogo"
  8. :src="$tools.splitImgHost(header.companyLogo)"
  9. alt=""
  10. />
  11. <div v-else class="logo"></div>
  12. </div>
  13. </header>
  14. <section class="section">
  15. <div class="container">
  16. <div class="container-in">
  17. <div class="left-box"></div>
  18. <div class="right-box">
  19. <div class="login" v-if="state == 1">
  20. <div class="login__header">
  21. <div class="tabs">
  22. <div
  23. class="tab"
  24. :class="{ active: tabIndex == 0 }"
  25. @click="tabIndex = 0"
  26. >
  27. 普通登录
  28. </div>
  29. <div
  30. class="tab"
  31. :class="{ active: tabIndex == 1 }"
  32. @click="tabIndex = 1"
  33. >
  34. 手机快速登录
  35. </div>
  36. </div>
  37. </div>
  38. <div class="login__body">
  39. <div class="normal" v-if="tabIndex == 0">
  40. <el-form
  41. ref="loginForm"
  42. :rules="loginRules"
  43. :model="loginForm"
  44. >
  45. <div class="input">
  46. <el-form-item prop="account">
  47. <el-input
  48. placeholder="手机号/身份证号"
  49. v-model="loginForm.account"
  50. ></el-input>
  51. </el-form-item>
  52. </div>
  53. <div class="input">
  54. <el-form-item prop="pwd"
  55. ><el-input
  56. placeholder="密码"
  57. type="pwd"
  58. v-model="loginForm.pwd"
  59. >
  60. <i
  61. slot="suffix"
  62. class="el-icon-view btn"
  63. ></i> </el-input
  64. ></el-form-item>
  65. </div>
  66. <div class="text">
  67. <a @click="state = 2">立即注册</a>
  68. <a @click="state = 3">找回密码</a>
  69. </div>
  70. <el-button
  71. class="submit"
  72. @click="login"
  73. type="primary"
  74. round
  75. :loading="islogin"
  76. >登录</el-button
  77. >
  78. </el-form>
  79. </div>
  80. <div class="phone" v-if="tabIndex == 1">
  81. <el-form
  82. ref="loginSmsForm"
  83. :rules="loginSmsRules"
  84. :model="loginSmsForm"
  85. >
  86. <div class="input">
  87. <el-form-item prop="tel"
  88. ><el-input
  89. placeholder="手机号"
  90. v-model="loginSmsForm.tel"
  91. ></el-input
  92. ></el-form-item>
  93. </div>
  94. <div class="input">
  95. <el-form-item prop="code"
  96. ><el-input
  97. placeholder="短信验证码"
  98. v-model="loginSmsForm.code"
  99. >
  100. <span
  101. slot="suffix"
  102. @click="getLoginSms"
  103. class="btn"
  104. >{{
  105. countDown == 0
  106. ? "获取验证码"
  107. : `${countDown}秒重新获取`
  108. }}</span
  109. >
  110. </el-input></el-form-item
  111. >
  112. </div>
  113. <div class="text">
  114. <a @click="state = 2">立即注册</a>
  115. <a @click="state = 3">找回密码</a>
  116. </div>
  117. <el-button
  118. class="submit"
  119. @click="loginSms"
  120. :loading="isloginSms"
  121. type="primary"
  122. round
  123. >登录</el-button
  124. >
  125. </el-form>
  126. </div>
  127. </div>
  128. </div>
  129. <div class="register" v-if="state == 2">
  130. <el-form
  131. :model="registerForm"
  132. ref="registerForm"
  133. :rules="registerRules"
  134. >
  135. <div class="register__header">
  136. <div class="title">账号注册</div>
  137. </div>
  138. <div class="register__body">
  139. <div class="input">
  140. <el-form-item prop="tel"
  141. ><el-input
  142. placeholder="手机号"
  143. v-model="registerForm.tel"
  144. ></el-input
  145. ></el-form-item>
  146. </div>
  147. <div class="input">
  148. <el-form-item prop="code">
  149. <el-input
  150. placeholder="获取验证码"
  151. v-model="registerForm.code"
  152. >
  153. <span class="btn" slot="suffix" @click="getRegisterSms">
  154. {{
  155. registerCountDown == 0
  156. ? "获取验证码"
  157. : `${registerCountDown}秒重新获取`
  158. }}
  159. </span>
  160. </el-input>
  161. </el-form-item>
  162. </div>
  163. <div class="input">
  164. <el-form-item prop="pwd"
  165. ><el-input placeholder="密码" v-model="registerForm.pwd">
  166. <i class="el-icon-view"></i> </el-input
  167. ></el-form-item>
  168. </div>
  169. <div class="text">
  170. 已有账号?
  171. <a @click="state = 1">去登录</a>
  172. </div>
  173. <div class="checkbox">
  174. <el-form-item prop="read">
  175. <div>
  176. <input type="checkbox" v-model="registerForm.read" />
  177. 我已认真阅读并同意
  178. </div>
  179. <div>
  180. <a>《用户使用协议》</a>
  181. <a>《个人信息保护政策》</a>
  182. </div>
  183. </el-form-item>
  184. </div>
  185. <el-button
  186. class="submit"
  187. @click="register"
  188. type="primary"
  189. round
  190. :loading="isRegister"
  191. >注册</el-button
  192. >
  193. </div>
  194. </el-form>
  195. </div>
  196. <div class="findpwd" v-if="state == 3">
  197. <el-form
  198. :model="forgetForm"
  199. :rules="forgetRules"
  200. ref="forgetForm"
  201. >
  202. <div class="findpwd__header">
  203. <div class="title">找回密码</div>
  204. </div>
  205. <div class="findpwd__body">
  206. <div class="input">
  207. <el-form-item prop="tel"
  208. ><el-input placeholder="手机号" v-model="forgetForm.tel">
  209. </el-input
  210. ></el-form-item>
  211. </div>
  212. <div class="input">
  213. <el-form-item prop="code">
  214. <el-input
  215. placeholder="短信验证码"
  216. v-model="forgetForm.code"
  217. >
  218. <span class="btn" slot="suffix">获取验证码</span>
  219. </el-input></el-form-item
  220. >
  221. </div>
  222. <div class="input">
  223. <el-form-item prop="pwd">
  224. <el-input placeholder="密码" v-model="forgetForm.pwd">
  225. <i class="el-icon-view btn" slot="suffix"></i>
  226. </el-input>
  227. </el-form-item>
  228. </div>
  229. <div class="input">
  230. <el-form-item prop="pwdAgain"
  231. ><el-input
  232. placeholder="再次输入密码"
  233. v-model="forgetForm.pwdAgain"
  234. >
  235. <i
  236. class="el-icon-view btn"
  237. slot="suffix"
  238. ></i> </el-input
  239. ></el-form-item>
  240. </div>
  241. <div class="text">
  242. <a @click="state = 1">登录</a>
  243. <a @click="state = 2">注册</a>
  244. </div>
  245. <el-button
  246. class="submit"
  247. type="primary"
  248. :loading="isForget"
  249. round
  250. @click="forget"
  251. >确定</el-button
  252. >
  253. </div>
  254. </el-form>
  255. </div>
  256. <div class="findpwd" v-if="state == 4">
  257. <el-form :model="bindForm" :rules="bindRules" ref="bindForm">
  258. <div class="findpwd__header">
  259. <div class="title">关联学员身份</div>
  260. </div>
  261. <div class="findpwd__body">
  262. <div class="input">
  263. <el-form-item prop="realname"
  264. ><el-input
  265. placeholder="真实姓名"
  266. v-model="bindForm.realname"
  267. >
  268. </el-input
  269. ></el-form-item>
  270. </div>
  271. <div class="input">
  272. <el-form-item prop="idCard">
  273. <el-input
  274. placeholder="身份证号码"
  275. v-model="bindForm.idCard"
  276. >
  277. </el-input
  278. ></el-form-item>
  279. </div>
  280. <el-button
  281. class="submit"
  282. type="primary"
  283. :loading="isBind"
  284. round
  285. @click="bind"
  286. >确定</el-button
  287. >
  288. <div class="bind-next" @click="nextBind">下次再关联</div>
  289. </div>
  290. </el-form>
  291. </div>
  292. </div>
  293. </div>
  294. </div>
  295. </section>
  296. <Footer></Footer>
  297. </div>
  298. </template>
  299. <script>
  300. import Footer from "@/components/footer/index";
  301. import { mapGetters } from "vuex";
  302. import { mapMutations } from "vuex";
  303. export default {
  304. name: "login",
  305. components: {
  306. Footer,
  307. },
  308. data() {
  309. const pwdAgainCheck = async (rule, value, callback) => {
  310. if (!value) {
  311. return callback(new Error("请再次输入新密码"));
  312. } else if (this.forgetForm.pwd != this.forgetForm.pwdAgain) {
  313. return callback(new Error("两次输入密码不一致!"));
  314. } else {
  315. callback();
  316. }
  317. };
  318. return {
  319. state: 1, //1登录 2注册 3找回密码 4绑定学员身份
  320. tabIndex: 0,
  321. loginForm: {},
  322. loginSmsForm: {},
  323. registerForm: {},
  324. forgetForm: {},
  325. bindForm: {},
  326. countDown: 0,
  327. countDownTimer: null,
  328. registerCountDown: 0,
  329. registerCountDownTimer: null,
  330. forgetCountDown: 0,
  331. forgetCountDownTimer: null,
  332. getLoginCodeLock: false,
  333. getRegisterCodeLock: false,
  334. getForgetCodeLock: false,
  335. getBindCodeLock: false,
  336. loginRules: {
  337. account: [
  338. { required: true, trigger: "blur", message: "请输入手机号/身份证号" },
  339. ],
  340. pwd: [{ required: true, trigger: "blur", message: "请输入密码" }],
  341. },
  342. loginSmsRules: {
  343. code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
  344. tel: [{ required: true, trigger: "blur", message: "请输入手机号" }],
  345. },
  346. forgetRules: {
  347. code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
  348. tel: [{ required: true, trigger: "blur", message: "请输入手机号" }],
  349. pwd: [{ required: true, trigger: "blur", message: "请输入新密码" }],
  350. pwdAgain: [
  351. {
  352. required: true,
  353. validator: pwdAgainCheck,
  354. trigger: "blur",
  355. },
  356. ],
  357. },
  358. registerRules: {
  359. code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
  360. tel: [{ required: true, trigger: "blur", message: "请输入手机号" }],
  361. pwd: [{ required: true, trigger: "blur", message: "请输入密码" }],
  362. read: [{ required: true, trigger: "blur", message: "请勾选服务协议" }],
  363. },
  364. bindRules: {
  365. realname: [
  366. { required: true, trigger: "blur", message: "请输入真实姓名" },
  367. ],
  368. idCard: [
  369. { required: true, trigger: "blur", message: "请输入身份证号" },
  370. ],
  371. },
  372. islogin: false,
  373. isloginSms: false,
  374. isRegister: false,
  375. isForget: false,
  376. isBind: false,
  377. user_account: "",
  378. token: "",
  379. };
  380. },
  381. computed: {
  382. ...mapGetters(["header"]),
  383. },
  384. mounted() {
  385. this.state = this.$route.query.state || 1;
  386. },
  387. methods: {
  388. ...mapMutations(["setUserInfo"]),
  389. /**
  390. * 账号密码登录
  391. */
  392. login() {
  393. this.$refs.loginForm.validate((valid) => {
  394. if (valid) {
  395. this.islogin = true;
  396. this.$request
  397. .login(this.loginForm)
  398. .then((res) => {
  399. if (res.data.full_info) {
  400. localStorage.setItem("user_account", res.data.user_account);
  401. localStorage.setItem("token", res.data.token);
  402. this.getInfo();
  403. } else {
  404. this.user_account = res.data.user_account;
  405. this.token = res.data.token;
  406. this.islogin = false;
  407. this.state = 4;
  408. }
  409. })
  410. .catch((err) => {
  411. this.islogin = false;
  412. this.$message({
  413. message: err.msg,
  414. type: "error",
  415. });
  416. });
  417. }
  418. });
  419. },
  420. /**
  421. * 获取登录短信
  422. */
  423. getLoginSms() {
  424. this.$refs.loginSmsForm.validateField("tel", (valid) => {
  425. if (!valid) {
  426. if (this.countDown == 0) {
  427. if (this.getLoginCodeLock) {
  428. return;
  429. }
  430. this.getLoginCodeLock = true;
  431. this.$request
  432. .getLoginSms({ tel: this.loginSmsForm.tel })
  433. .then((res) => {
  434. this.getLoginCodeLock = false;
  435. this.$message({
  436. message: `验证码已发送`,
  437. type: "success",
  438. });
  439. this.countDown = 60;
  440. this.countDownTimer = setInterval(() => {
  441. if (this.countDown == 0) {
  442. clearInterval(this.countDownTimer);
  443. } else {
  444. this.countDown--;
  445. }
  446. }, 1000);
  447. })
  448. .catch((err) => {
  449. this.getLoginCodeLock = false;
  450. });
  451. }
  452. }
  453. });
  454. },
  455. /**
  456. * 手机号登录
  457. */
  458. loginSms() {
  459. this.$refs.loginSmsForm.validate((valid) => {
  460. if (valid) {
  461. this.isloginSms = true;
  462. this.$request
  463. .loginSms(this.loginSmsForm)
  464. .then((res) => {
  465. if (res.data.full_info) {
  466. localStorage.setItem("user_account", res.data.user_account);
  467. localStorage.setItem("token", res.data.token);
  468. this.getInfo();
  469. } else {
  470. this.user_account = res.data.user_account;
  471. this.token = res.data.token;
  472. this.isloginSms = false;
  473. this.state = 4;
  474. }
  475. })
  476. .catch((err) => {
  477. this.isloginSms = false;
  478. this.$message({
  479. message: err.msg,
  480. type: "error",
  481. });
  482. });
  483. }
  484. });
  485. },
  486. /**
  487. * 获取用户登录信息
  488. */
  489. getInfo() {
  490. this.$request
  491. .getInfo()
  492. .then((res) => {
  493. this.isRegister = false;
  494. this.islogin = false;
  495. this.isloginSms = false;
  496. this.setUserInfo(res.data);
  497. this.$router.replace("/");
  498. })
  499. .catch((err) => {
  500. this.isRegister = false;
  501. this.islogin = false;
  502. this.isloginSms = false;
  503. this.$message({
  504. message: err.msg,
  505. type: "error",
  506. });
  507. });
  508. },
  509. /**
  510. * 注册
  511. */
  512. register() {
  513. this.$refs.registerForm.validate((valid) => {
  514. if (valid) {
  515. this.isRegister = true;
  516. this.$request
  517. .registerUser(this.registerForm)
  518. .then((res) => {
  519. //自动登录
  520. this.autoLogin();
  521. })
  522. .catch((err) => (this.isRegister = false));
  523. }
  524. });
  525. },
  526. /**
  527. * 获取注册验证码
  528. */
  529. getRegisterSms() {
  530. this.$refs.registerForm.validateField("tel", (valid) => {
  531. if (!valid) {
  532. if (this.registerCountDown == 0) {
  533. if (this.getRegisterCodeLock) {
  534. return;
  535. }
  536. this.getRegisterCodeLock = true;
  537. this.$request
  538. .getLoginSms({ tel: this.loginSmsForm.tel })
  539. .then((res) => {
  540. this.getRegisterCodeLock = false;
  541. this.$message({
  542. message: `验证码已发送`,
  543. type: "success",
  544. });
  545. this.registerCountDown = 60;
  546. this.registerCountDownTimer = setInterval(() => {
  547. if (this.registercountDown == 0) {
  548. clearInterval(this.registerCountDownTimer);
  549. } else {
  550. this.registerCountDown--;
  551. }
  552. }, 1000);
  553. })
  554. .catch((err) => {
  555. this.$message({
  556. message: err.msg,
  557. type: "error",
  558. });
  559. this.getRegisterCodeLock = false;
  560. });
  561. }
  562. }
  563. });
  564. },
  565. /**
  566. * 注册后自动登录并跳转绑定身份信息
  567. */
  568. autoLogin() {
  569. let loginForm = JSON.parse(JSON.stringify(this.registerForm));
  570. loginForm.account = loginForm.tel;
  571. this.$request
  572. .login(loginForm)
  573. .then((res) => {
  574. if (res.data.full_info) {
  575. //信息完善,获取用户信息
  576. localStorage.setItem("user_account", res.data.user_account);
  577. localStorage.setItem("token", res.data.token);
  578. this.getInfo();
  579. } else {
  580. //不完善,跳转完善信息页面
  581. this.user_account = res.data.user_account;
  582. this.token = res.data.token;
  583. this.isRegister = false;
  584. this.state = 4;
  585. }
  586. })
  587. .catch((err) => {
  588. this.isRegister = false;
  589. this.$message({
  590. message: err.msg,
  591. type: "error",
  592. });
  593. });
  594. },
  595. forget() {
  596. this.$refs.forgetForm.validate((valid) => {
  597. if (valid) {
  598. this.isForget = true;
  599. this.$request
  600. .forgetUser(this.forgetForm)
  601. .then((res) => {
  602. this.isForget = false;
  603. this.$message({
  604. message: "修改成功",
  605. type: "success",
  606. });
  607. this.$refs.forgetForm.resetFields();
  608. })
  609. .catch((err) => (this.isForget = false));
  610. }
  611. });
  612. },
  613. nextBind() {
  614. this.state = 1;
  615. this.user_account = "";
  616. this.token = "";
  617. },
  618. bind() {
  619. this.$refs.bindForm.validate((valid) => {
  620. if (valid) {
  621. this.isBind = true;
  622. let bindForm = JSON.parse(JSON.stringify(this.bindForm));
  623. bindForm.token = this.token;
  624. this.$request
  625. .bindIdCard(this.bindForm)
  626. .then((res) => {
  627. this.isBind = false;
  628. this.$message({
  629. message: "关联成功",
  630. type: "success",
  631. });
  632. localStorage.setItem("user_account", this.user_account);
  633. localStorage.setItem("token", this.token);
  634. this.getInfo();
  635. this.$router.replace("/");
  636. })
  637. .catch((err) => {
  638. this.isBind = false;
  639. this.$message({
  640. message: err.msg,
  641. type: "error",
  642. });
  643. });
  644. }
  645. });
  646. },
  647. },
  648. };
  649. </script>
  650. <!-- Add "scoped" attribute to limit CSS to this component only -->
  651. <style scoped lang="scss">
  652. .reg {
  653. .header {
  654. box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.04);
  655. overflow: hidden;
  656. .logo {
  657. margin: 24px 0;
  658. width: 162px;
  659. height: 33px;
  660. background: url("~@/assets/logo.png") no-repeat center;
  661. }
  662. }
  663. .section {
  664. background: #f2f7ff;
  665. .container-in {
  666. width: 100%;
  667. height: 507px;
  668. }
  669. .left-box {
  670. float: left;
  671. width: 496px;
  672. height: 318px;
  673. background: green;
  674. margin-top: 95px;
  675. margin-left: 152px;
  676. }
  677. .right-box {
  678. float: right;
  679. width: 348px;
  680. height: 427px;
  681. background: #ffffff;
  682. box-shadow: 0px 0px 13px 3px rgba(63, 141, 253, 0.1);
  683. border-radius: 8px;
  684. margin-top: 40px;
  685. margin-right: 140px;
  686. .el-form-item {
  687. margin: 0;
  688. }
  689. .login {
  690. &__header {
  691. border-bottom: 2px solid #eee;
  692. .tabs {
  693. display: flex;
  694. width: 100%;
  695. .tab {
  696. cursor: pointer;
  697. text-align: center;
  698. color: #999;
  699. flex: 1;
  700. height: 42px;
  701. line-height: 42px;
  702. position: relative;
  703. &.active {
  704. &::after {
  705. content: "";
  706. display: block;
  707. position: absolute;
  708. width: 138px;
  709. height: 2px;
  710. background: #3f8dfd;
  711. border-radius: 0px;
  712. bottom: -2px;
  713. left: 50%;
  714. margin-left: -69px;
  715. }
  716. }
  717. }
  718. }
  719. }
  720. &__body {
  721. padding: 16px 24px 0;
  722. overflow: hidden;
  723. .input {
  724. margin-top: 24px;
  725. .btn {
  726. font-size: 14px;
  727. font-family: Microsoft YaHei;
  728. font-weight: 400;
  729. color: #3f8dfd;
  730. white-space: nowrap;
  731. cursor: pointer;
  732. }
  733. }
  734. .text {
  735. margin-top: 24px;
  736. display: flex;
  737. justify-content: space-between;
  738. }
  739. .submit {
  740. margin-top: 40px;
  741. width: 300px;
  742. }
  743. }
  744. }
  745. .register {
  746. &__header {
  747. border-bottom: 2px solid #eee;
  748. .title {
  749. height: 42px;
  750. line-height: 42px;
  751. text-align: center;
  752. color: #999;
  753. }
  754. }
  755. &__body {
  756. padding: 0 24px;
  757. overflow: hidden;
  758. .input {
  759. margin-top: 24px;
  760. .btn {
  761. font-size: 14px;
  762. font-family: Microsoft YaHei;
  763. font-weight: 400;
  764. color: #3f8dfd;
  765. white-space: nowrap;
  766. cursor: pointer;
  767. }
  768. }
  769. .text {
  770. margin-top: 10px;
  771. text-align: right;
  772. a {
  773. color: #3f8dfd;
  774. }
  775. }
  776. .checkbox {
  777. margin-top: 10px;
  778. a {
  779. color: #3f8dfd;
  780. }
  781. /deep/ .el-form-item__content {
  782. line-height: 20px;
  783. }
  784. }
  785. .submit {
  786. margin-top: 20px;
  787. width: 300px;
  788. }
  789. }
  790. }
  791. }
  792. .findpwd {
  793. &__header {
  794. border-bottom: 2px solid #eee;
  795. .title {
  796. height: 42px;
  797. line-height: 42px;
  798. text-align: center;
  799. color: #999;
  800. }
  801. }
  802. &__body {
  803. padding: 0 24px;
  804. overflow: hidden;
  805. .input {
  806. margin-top: 24px;
  807. .btn {
  808. font-size: 14px;
  809. font-family: Microsoft YaHei;
  810. font-weight: 400;
  811. color: #3f8dfd;
  812. white-space: nowrap;
  813. cursor: pointer;
  814. }
  815. }
  816. .text {
  817. margin-top: 14px;
  818. display: flex;
  819. justify-content: space-between;
  820. }
  821. .submit {
  822. margin-top: 30px;
  823. width: 300px;
  824. }
  825. .bind-next {
  826. font-size: 14px;
  827. text-align: center;
  828. color: #999;
  829. margin-top: 10px;
  830. cursor: pointer;
  831. }
  832. }
  833. }
  834. }
  835. }
  836. </style>