Login.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
  1. <template>
  2. <div
  3. class="login"
  4. :style="{
  5. backgroundImage: `url(${backgroundImageUrl})`,
  6. backgroundSize: '100%',
  7. backgroundRepeat: 'no-repeat',
  8. backgroundPosition: '50% 85%',
  9. }"
  10. >
  11. <div>
  12. <div class="login_wrapper">
  13. <div class="login_form">
  14. <section class="login_content">
  15. <div class="login-content1">
  16. <h1>
  17. <img
  18. alt=""
  19. :src="logoUrl"
  20. style="margin-top: -40px; width: 100px; height: 100px"
  21. />
  22. <!-- src="/static/assets/client-base-v4/image/template-logo.png" -->
  23. <div class="desc" data-v-7b9d9b52="">
  24. Prodog 希望帮助您更好的管理物料
  25. </div>
  26. </h1>
  27. <div>
  28. <input
  29. v-model="userName"
  30. autocomplete="off"
  31. type="text"
  32. class="form-control"
  33. :placeholder="$t('lang.login.pleaseInputUserName')"
  34. required
  35. @keyup.enter="login"
  36. />
  37. </div>
  38. <div>
  39. <a-input-password
  40. v-model:value="password"
  41. :placeholder="$t('lang.login.pleaseInputPassword')"
  42. class="input-password"
  43. style="height: 34px"
  44. @press-enter="login"
  45. />
  46. </div>
  47. <div v-if="accountItem.loginSecondaryAuthentication === 'email'">
  48. <div
  49. style="
  50. display: flex;
  51. flex-direction: row;
  52. flex-wrap: nowrap;
  53. justify-content: space-between;
  54. "
  55. >
  56. <div class="input-group" style="margin: 0 0 0px">
  57. <input
  58. v-model="verificationCode"
  59. type="text"
  60. class="form-control"
  61. autocomplete="off"
  62. :placeholder="
  63. $t('lang.login.pleaseInputVerificationCode')
  64. "
  65. style="width: 240px"
  66. />
  67. </div>
  68. <div>
  69. <button
  70. v-if="disabledBtn == false"
  71. class="btn btn-default"
  72. :disabled="disabledBtn"
  73. style="width: 10rem"
  74. @click="sendUserVerificationCode"
  75. >
  76. {{ $t("lang.login.getVerificationCode") }}
  77. </button>
  78. <button
  79. v-else
  80. class="btn btn-default"
  81. :disabled="disabledBtn"
  82. style="width: 10rem"
  83. @click="sendUserVerificationCode"
  84. >
  85. {{ btntxt }}
  86. </button>
  87. </div>
  88. </div>
  89. </div>
  90. <div class="div-date">
  91. <DateTime
  92. v-model="accountDateTime"
  93. :readonly="false"
  94. style="width: 100%"
  95. @keyup.enter="login"
  96. />
  97. </div>
  98. <div>
  99. <select
  100. v-model="languageSelected"
  101. name="language-choice"
  102. class="form-control"
  103. @change="getLanguageSelected"
  104. >
  105. <option value="zh-CN">中文</option>
  106. <option value="en-US">English</option>
  107. </select>
  108. </div>
  109. <div>
  110. <div
  111. style="
  112. display: flex;
  113. flex-direction: row;
  114. flex-wrap: nowrap;
  115. justify-content: space-between;
  116. "
  117. >
  118. <div>
  119. <a-switch v-model:checked="rememberPassword" />
  120. <label
  121. for="inputPassword2"
  122. class="form-control-static remember-password"
  123. style="margin-left: 1rem"
  124. >
  125. {{ $t("lang.login.rememberPassword") }}
  126. </label>
  127. </div>
  128. <div>
  129. <a
  130. class="reset_pass forget-password"
  131. @click="toForgetPassword()"
  132. >{{ $t("lang.login.forgetPassword") }}</a>
  133. </div>
  134. </div>
  135. <div class="clear" />
  136. </div>
  137. <div>
  138. <div>
  139. <a
  140. class="btn btn-default submit"
  141. style="width: 100%"
  142. @click="login"
  143. >{{ $t("lang.login.login") }}</a>
  144. </div>
  145. <div class="clear" />
  146. </div>
  147. <div class="clearfix" />
  148. <div v-if="authSetting != null && authSetting.length > 0">
  149. <div class="separator" />
  150. <div class="other-login-method">其他登录方式</div>
  151. <div class="login-third-box">
  152. <div class="login-third">
  153. <div class="login-third-items">
  154. <span
  155. v-for="item in authSetting"
  156. :key="item.id"
  157. v-tooltip.top="`${item.authType}-${item.name}`"
  158. class="login-third-item"
  159. @click="existsServer(item)"
  160. >
  161. <img :src="getImageSrc(item.className, item.logo)" />
  162. </span>
  163. </div>
  164. </div>
  165. </div>
  166. </div>
  167. </div>
  168. </section>
  169. </div>
  170. </div>
  171. <div v-if="showLeanwoText" style="text-align: center">
  172. <!-- <p>{{ $t("lang.login.copyright") }}</p> -->
  173. <div class="copyright">
  174. <div class="copyright-inner">
  175. {{ $t("lang.login.copyright") }}
  176. &nbsp; &nbsp;
  177. <a href="https://beian.miit.gov.cn/" target="_blank">
  178. 沪ICP备11017244号
  179. </a>
  180. &nbsp; &nbsp;
  181. <a
  182. href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31011202004082"
  183. target="_blank"
  184. >
  185. 沪公网安备31011202004082号
  186. </a>
  187. &nbsp; &nbsp;
  188. <a
  189. href="http://fw.scjgj.sh.gov.cn/lz/licenseLink.do?method=licenceView&amp;entyId=20120314203547743"
  190. target="_blank"
  191. >
  192. 工商亮照
  193. </a>
  194. </div>
  195. </div>
  196. </div>
  197. <div class="account-name">
  198. {{ accountItem.accountName }}
  199. </div>
  200. <Loading v-if="loading" />
  201. </div>
  202. </div>
  203. </template>
  204. <script>
  205. import Common from '../common/Common.js';
  206. import CustomerEnvironment from '../CustomerEnvironment.js';
  207. import TokenClientResource from '../api/base/TokenClientResource.js';
  208. import LoginService from './LoginService.js';
  209. import { Notify, Uuid } from 'pc-component-v3';
  210. import { queryLoginAuth } from '.././identity/configData.js';
  211. import { message } from 'ant-design-vue';
  212. import { getImageSrc } from '../common/image-src';
  213. import dayjs from 'dayjs';
  214. export default {
  215. components: {},
  216. data: function () {
  217. return {
  218. userName: '',
  219. password: '',
  220. accountItem: {},
  221. rememberPassword: false,
  222. accountDateTime: '',
  223. showLeanwoText: false,
  224. languageSelected: 'zh-CN',
  225. loading: false,
  226. btntxt: this.$t('lang.login.getVerificationCode'),
  227. disabledBtn: false,
  228. verificationCode: '', // 验证码
  229. time: 60,
  230. authSetting: [],
  231. getImageSrc,
  232. backgroundImageUrl: '/static/assets/client-base-v4/image/background.svg',
  233. logoUrl: '', // logo路径
  234. };
  235. },
  236. watch: {
  237. rememberPassword: function (newVal) {
  238. var _self = this;
  239. if (!localStorage) {
  240. alert('浏览器不支持localstorage');
  241. } else {
  242. localStorage.setItem('#rememberPassword', _self.rememberPassword);
  243. }
  244. if (newVal == false) {
  245. localStorage.removeItem('#userName');
  246. localStorage.removeItem('#password');
  247. }
  248. },
  249. },
  250. created: function () {},
  251. mounted: function () {
  252. $('body').attr('class', 'body-login');
  253. $('body').children(':first').attr('class', '');
  254. this.initView();
  255. this.queryAllAuthSetting();
  256. this.unqiueAccountManagementDto();
  257. this.getLogoName();
  258. this.getCurrentDate();
  259. this.showLeanwoText = CustomerEnvironment.LOGIN_SHOW_LEANWO_TEXT;
  260. },
  261. methods: {
  262. // 查询系统logo
  263. getLogoName: function () {
  264. const _self = this;
  265. $.ajax({
  266. type: 'GET',
  267. url: Common.getApiURL('clientLogoResource/selectByClientId?logoName=mainLogoName'),
  268. dataType: 'json',
  269. beforeSend: function (request) {
  270. Common.addTokenToRequest(request);
  271. },
  272. success: function (res) {
  273. if (res.errorCode === 0) {
  274. _self.logoUrl = `/Files/0/Images/com.leanwo.prodog.system.model.ClientLogo/${res.data.imageName}`;
  275. }
  276. },
  277. error: function (XMLHttpRequest, textStatus, errorThrown) {
  278. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  279. },
  280. });
  281. },
  282. initView: function () {
  283. var _self = this;
  284. const storageInfo = LoginService.restoreFromLocalStorage();
  285. _self.userName = storageInfo.userName;
  286. _self.password = storageInfo.password;
  287. _self.rememberPassword = storageInfo.rememberPassword;
  288. _self.languageSelected = storageInfo.languageSelected;
  289. },
  290. // 查询单点登录认证源信息
  291. queryAllAuthSetting: function () {
  292. queryLoginAuth().then(
  293. success => {
  294. if (success.errorCode === 0) {
  295. if (success.datas !== null && success.datas !== undefined) {
  296. this.authSetting = success.datas;
  297. }
  298. }
  299. },
  300. error => {
  301. Common.processException(error);
  302. },
  303. );
  304. },
  305. /**
  306. * 根据域名查询账套的信息
  307. */
  308. unqiueAccountManagementDto: function () {
  309. var _self = this;
  310. $.ajax({
  311. url: Common.getApiURL(
  312. 'AccountManagementResource/unqiueAccountManagementDto',
  313. ),
  314. type: 'get',
  315. async: true,
  316. success: function (response) {
  317. if (response.errorCode === 0) {
  318. _self.accountItem = response.data;
  319. } else {
  320. Notify.error('账套获取失败', response.errorMessage);
  321. }
  322. },
  323. error: function (XMLHttpRequest, textStatus, errorThrown) {
  324. console.log(XMLHttpRequest);
  325. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  326. },
  327. });
  328. },
  329. // 判断是哪种单点登录方式
  330. existsServer: function (item) {
  331. if (item.authType === 'SAML') {
  332. this.existsSAML(item.no);
  333. } else if (item.authType === 'CAS') {
  334. this.existsCAS(item.no);
  335. }
  336. },
  337. // 判断SAML服务器是否存在
  338. existsSAML: function (no) {
  339. $.ajax({
  340. url: Common.getApiURL(
  341. 'SamlLogin/samlServiceProviderCheck?authSettingNo=' + no,
  342. ),
  343. type: 'get',
  344. contentType: 'application/json',
  345. dataType: 'json',
  346. success: function (response) {
  347. if (response.errorCode === 0) {
  348. let url = '/api/SamlLogin/index?authSettingNo=' + no;
  349. window.location.href = url;
  350. } else {
  351. Notify.error('错误', response.errorMessage);
  352. }
  353. },
  354. error: function (XMLHttpRequest, textStatus, errorThrown) {
  355. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  356. },
  357. });
  358. },
  359. // 判断CAS服务器是否存在
  360. existsCAS: function (no) {
  361. $.ajax({
  362. url: Common.getApiURL(
  363. 'CasLogin/casServiceProviderCheck?authSettingNo=' + no,
  364. ),
  365. type: 'get',
  366. contentType: 'application/json',
  367. dataType: 'json',
  368. success: function (response) {
  369. if (response.errorCode === 0) {
  370. let url = `/casLogin.html?authSettingNo=${no}`;
  371. window.location.href = url;
  372. console.log(response);
  373. } else {
  374. Notify.error('错误', response.errorMessage);
  375. }
  376. },
  377. error: function (XMLHttpRequest, textStatus, errorThrown) {
  378. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  379. },
  380. });
  381. },
  382. /**
  383. * 发送验证码
  384. */
  385. sendUserVerificationCode: function (event) {
  386. var loginData = {
  387. userName: this.userName,
  388. password: this.password,
  389. accountDateTime: this.accountDateTime,
  390. languageId: this.languageSelected,
  391. verificationCodeType: this.accountItem.loginSecondaryAuthentication,
  392. };
  393. var _self = this;
  394. if (_self.userName.trim() == '' || _self.password.trim() == '') {
  395. Notify.error(
  396. _self.$t('lang.login.getVerificationCode'),
  397. _self.$t('lang.login.getVerificationCodeErrorMssage'),
  398. );
  399. return;
  400. }
  401. $.ajax({
  402. url: Common.getApiUrl2(
  403. 'authApi/UserVerificationCodeResource/sendUserVerificationCode',
  404. ),
  405. async: true,
  406. type: 'post',
  407. data: loginData,
  408. success: function (baseObjectResponse) {
  409. if (baseObjectResponse.errorCode == 0) {
  410. Notify.success(
  411. _self.$t('lang.login.getVerificationCode'),
  412. baseObjectResponse.data,
  413. false,
  414. );
  415. _self.timerStr();
  416. } else {
  417. Notify.error(
  418. _self.$t('lang.login.getVerificationCode'),
  419. baseObjectResponse.data,
  420. false,
  421. );
  422. }
  423. console.log(baseObjectResponse);
  424. },
  425. error: function (XMLHttpRequest, textStatus, errorThrown) {
  426. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  427. },
  428. });
  429. },
  430. timerStr: function () {
  431. if (this.time > 0) {
  432. this.disabledBtn = true;
  433. this.time--;
  434. this.btntxt = this.time + this.$t('lang.login.second');
  435. setTimeout(this.timerStr, 1000);
  436. } else {
  437. this.time = 60;
  438. this.btntxt = this.$t('lang.login.getVerificationCode');
  439. this.disabledBtn = false;
  440. }
  441. },
  442. /**
  443. * 选择的语言发生改变
  444. */
  445. getLanguageSelected: function () {
  446. this.$i18n.locale = this.languageSelected;
  447. localStorage.setItem('#languageSelected', this.languageSelected);
  448. },
  449. login: function (event) {
  450. var loginData = {
  451. userName: this.userName,
  452. password: this.password,
  453. accountDateTime: this.accountDateTime,
  454. languageId: this.languageSelected,
  455. verificationCode: this.verificationCode,
  456. };
  457. var _self = this;
  458. if (_self.userName.trim() == '' || _self.password.trim() == '') {
  459. Notify.error(
  460. _self.$t('lang.login.login'),
  461. _self.$t('lang.login.getVerificationCodeErrorMssage'),
  462. );
  463. return;
  464. }
  465. if (
  466. _self.accountItem.loginSecondaryAuthentication === 'email' &&
  467. _self.verificationCode.trim() == ''
  468. ) {
  469. Notify.error(
  470. _self.$t('lang.login.login'),
  471. _self.$t('lang.login.verificationCodeCannotBeEmpty'),
  472. );
  473. return;
  474. }
  475. $.ajax({
  476. url: Common.getApiUrl2('authApi/LoginResource/login'),
  477. async: true,
  478. type: 'post',
  479. data: loginData,
  480. success: function (loginInfo) {
  481. if (loginInfo.errorCode == 0) {
  482. loginInfo.accountName = _self.accountItem.accountName;
  483. LoginService.setLoginInfo(loginInfo.data, _self.$router);
  484. LoginService.saveLocalStorage(_self);
  485. _self.setTokenClient();
  486. localStorage.setItem('allowSound', false);
  487. } else {
  488. Notify.error(
  489. _self.$t('lang.login.loginFailure'),
  490. loginInfo.errorMessage,
  491. );
  492. }
  493. },
  494. error: function (XMLHttpRequest, textStatus, errorThrown) {
  495. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  496. },
  497. });
  498. },
  499. /**
  500. * 设置TokenClient
  501. * @param {Object} TokenClient
  502. */
  503. setTokenClient: function () {
  504. TokenClientResource.saveTokenClient().then(successData => {
  505. if (successData != null) {
  506. console.log(successData);
  507. }
  508. });
  509. },
  510. toForgetPassword: function () {
  511. this.$router.push('/retrievePassword');
  512. },
  513. /**
  514. * 获取服务端当前时间
  515. */
  516. getCurrentDate: function () {
  517. var _self = this;
  518. $.ajax({
  519. url: Common.getApiUrl2('authApi/LoginResource/getCurrentDate'),
  520. type: 'get',
  521. timeout: 2000,
  522. success: function (data) {
  523. if (data != undefined && data != '') {
  524. _self.accountDateTime = data;
  525. console.log('获取时间成功:' + _self.accountDateTime);
  526. } else {
  527. _self.generateCurrentDate();
  528. }
  529. },
  530. error: function (XMLHttpRequest, textStatus, errorThrown) {
  531. _self.generateCurrentDate();
  532. },
  533. });
  534. },
  535. /**
  536. * 生成当前时间
  537. */
  538. generateCurrentDate: function () {
  539. this.accountDateTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
  540. console.log('自动生成时间成功:' + this.accountDateTime);
  541. },
  542. },
  543. };
  544. </script>
  545. <style scoped>
  546. /* .login { */
  547. /* background-image: linear-gradient(rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.5)), url('../assets/background.svg'); */
  548. /* background-image: url('../assets/background.svg');
  549. background-repeat: no-repeat;
  550. background-position: center 110px;
  551. background-size: 100%;
  552. background-position: 50% 85%; */
  553. /* } */
  554. .login_wrapper {
  555. margin: 0px auto;
  556. padding-top: 5%;
  557. max-width: 350px;
  558. position: relative;
  559. }
  560. .login_form {
  561. top: 0px;
  562. width: 100%;
  563. }
  564. .animate {
  565. -webkit-animation-duration: 0.5s;
  566. -webkit-animation-timing-function: ease;
  567. -webkit-animation-fill-mode: both;
  568. -moz-animation-duration: 0.5s;
  569. -moz-animation-timing-function: ease;
  570. -moz-animation-fill-mode: both;
  571. -o-animation-duration: 0.5s;
  572. -o-animation-timing-function: ease;
  573. -o-animation-fill-mode: both;
  574. -ms-animation-duration: 0.5s;
  575. -ms-animation-timing-function: ease;
  576. -ms-animation-fill-mode: both;
  577. animation-duration: 0.5s;
  578. animation-timing-function: ease;
  579. animation-fill-mode: both;
  580. }
  581. /** /login **/
  582. /** signup **/
  583. .login_box {
  584. padding: 20px;
  585. margin: auto;
  586. }
  587. .left {
  588. float: left;
  589. }
  590. .alignleft {
  591. float: left;
  592. margin-right: 15px;
  593. }
  594. .alignright {
  595. float: right;
  596. margin-left: 15px;
  597. }
  598. .clear {
  599. clear: both;
  600. }
  601. .clearfix:after,
  602. .login-content1:after {
  603. content: ".";
  604. display: block;
  605. height: 0;
  606. clear: both;
  607. visibility: hidden;
  608. }
  609. .separator {
  610. border-top: 1px solid #d8d8d8;
  611. margin-top: 10px;
  612. padding-top: 5px;
  613. }
  614. .login_content {
  615. margin: 0 auto;
  616. padding: 25px 0 0;
  617. position: relative;
  618. text-align: center;
  619. text-shadow: 0 1px 0 #fff;
  620. min-width: 280px;
  621. }
  622. .login_content a,
  623. .login_content .btn-default:hover {
  624. text-decoration: none;
  625. }
  626. .login_content a:hover {
  627. text-decoration: underline;
  628. }
  629. .login_content h1 {
  630. font: normal 25px Helvetica, Arial, sans-serif;
  631. letter-spacing: -0.05em;
  632. line-height: 20px;
  633. margin: 10px 0 20px;
  634. }
  635. .login_content h1:before,
  636. .login_content h1:after {
  637. content: "";
  638. height: 1px;
  639. position: absolute;
  640. top: 10px;
  641. width: 27%;
  642. }
  643. .login_content h1:after {
  644. background: #7e7e7e;
  645. background: linear-gradient(left, #7e7e7e 0%, white 100%);
  646. right: 0;
  647. }
  648. .login_content h1:before {
  649. background: #7e7e7e;
  650. background: linear-gradient(right, #7e7e7e 0%, white 100%);
  651. left: 0;
  652. }
  653. .login_content h1:before,
  654. .login_content h1:after {
  655. content: "";
  656. height: 1px;
  657. position: absolute;
  658. top: 10px;
  659. width: 20%;
  660. }
  661. .login_content h1:after {
  662. background: #7e7e7e;
  663. background: linear-gradient(left, #7e7e7e 0%, white 100%);
  664. right: 0;
  665. }
  666. .login_content h1:before {
  667. background: #7e7e7e;
  668. background: linear-gradient(right, #7e7e7e 0%, white 100%);
  669. left: 0;
  670. }
  671. .login_content .login-content1 {
  672. margin: 20px 0;
  673. position: relative;
  674. }
  675. .login_content .login-content1 input[type="text"],
  676. .login_content .login-content1 input[type="email"],
  677. .login_content .login-content1 input[type="password"],
  678. .login_content .login-content1 .input-password,
  679. .login_content .login-content1 select {
  680. border-radius: 3px;
  681. -ms-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset;
  682. -o-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset;
  683. box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset;
  684. border: 1px solid #c8c8c8;
  685. color: #777;
  686. margin: 0 0 20px;
  687. width: 100%;
  688. }
  689. .login_content .login-content1 input[type="text"]:focus,
  690. .login_content .login-content1 input[type="email"]:focus,
  691. .login_content .login-content1 input[type="password"]:focus,
  692. .login_content .login-content1 select:focus {
  693. -ms-box-shadow: 0 0 2px #ed1c24 inset;
  694. -o-box-shadow: 0 0 2px #ed1c24 inset;
  695. box-shadow: 0 0 2px #a97aad inset;
  696. background-color: #fff;
  697. border: 1px solid #a878af;
  698. outline: none;
  699. }
  700. .login_content .login-content1 div a {
  701. font-size: 12px;
  702. margin: 10px 15px 0 0;
  703. }
  704. .reset_pass {
  705. cursor: pointer;
  706. }
  707. .login_content .login-content1 input[type="submit"],
  708. #content .login-content1 .submit {
  709. float: left;
  710. margin-left: 38px;
  711. }
  712. .remember-password {
  713. color: #73879c;
  714. font-size: 13px;
  715. font-weight: 400;
  716. line-height: 1.471;
  717. }
  718. .remember-row {
  719. text-align: left;
  720. }
  721. .to_register {
  722. cursor: pointer;
  723. }
  724. .div-date {
  725. margin-bottom: 20px;
  726. }
  727. .float-right {
  728. float: right;
  729. }
  730. .float-left {
  731. float: left;
  732. }
  733. .separator > p {
  734. margin-bottom: 0 !important;
  735. }
  736. .login-third-box {
  737. width: 100%;
  738. display: flex;
  739. align-items: center;
  740. border-bottom-left-radius: 2px;
  741. border-bottom-right-radius: 2px;
  742. box-sizing: border-box;
  743. padding: 0;
  744. font-size: 12px;
  745. color: #555666;
  746. }
  747. .login-third {
  748. margin: 0px 6px 6px 0;
  749. box-sizing: border-box;
  750. text-align: center;
  751. margin-left: 12px;
  752. font-size: 0;
  753. position: relative;
  754. margin-left: 0;
  755. }
  756. .login-third-items {
  757. font-size: 0;
  758. position: relative;
  759. margin-left: 0;
  760. }
  761. .login-third-item img {
  762. display: inline-block;
  763. width: 64px;
  764. height: 64px;
  765. border-radius: 10% 10%;
  766. background: #ccc;
  767. cursor: pointer;
  768. }
  769. .forget-password {
  770. margin: 0 !important;
  771. position: relative;
  772. top: 0.5rem;
  773. }
  774. .copyright {
  775. font-size: small;
  776. position: fixed;
  777. bottom: 0;
  778. text-align: center;
  779. width: 100%;
  780. padding-left: 1rem;
  781. padding-right: 1rem;
  782. }
  783. .copyright-inner {
  784. overflow: hidden;
  785. white-space: nowrap;
  786. }
  787. .copyright a {
  788. color: #333;
  789. }
  790. .desc {
  791. margin-top: 12px;
  792. margin-bottom: 2rem;
  793. font-size: 14px;
  794. letter-spacing: 0;
  795. color: rgba(0, 0, 0, 0.65);
  796. }
  797. .account-name {
  798. position: fixed;
  799. top: 1rem;
  800. right: 1rem;
  801. color: rgba(0, 0, 0, 0.45);
  802. }
  803. .other-login-method {
  804. text-align: left;
  805. font-size: 12px;
  806. margin-bottom: 0.4rem;
  807. }
  808. </style>