login.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <?php
  2. /* @var $this yii\web\View */
  3. /* @var $form yii\bootstrap4\ActiveForm */
  4. /* @var $model LoginForm */
  5. use common\forms\LoginForm;
  6. use yii\bootstrap4\ActiveForm;
  7. use yii\bootstrap4\Html;
  8. use yii\captcha\Captcha;
  9. use common\helpers\Url;
  10. $this->title = Yii::$app->params['adminTitle'];
  11. ?>
  12. <style>
  13. .login-box {
  14. width: 360px;
  15. margin: 7% auto;
  16. }
  17. .wechat-qr-box {
  18. height: 178px;
  19. width: 178px;
  20. top: 10px
  21. }
  22. .wechat-qr-img {
  23. height: 178px;
  24. width: 178px;
  25. padding: 10px;
  26. border: 1px solid #e8eaec;
  27. margin-left: 80px
  28. }
  29. .wechat-qr-shade {
  30. background-color: rgba(0, 0, 0, 0.7);
  31. width: 100%;
  32. height: 100%;
  33. left: 80px;
  34. overflow: hidden;
  35. position: absolute;
  36. right: -2px;
  37. top: -2px;
  38. z-index: 10;
  39. }
  40. .wechat-qr-shade-loading-text,
  41. .wechat-qr-shade-lose-text {
  42. position: relative;
  43. top: 70px;
  44. color: #d2d2d2
  45. }
  46. </style>
  47. <body class="login-page">
  48. <div class="login-box">
  49. <div class="login-logo">
  50. <?= Html::encode(Yii::$app->params['adminTitle']); ?>
  51. </div>
  52. <!-- /.login-logo -->
  53. <div class="card card-primary card-outline card-outline-tabs">
  54. <div class="card-header border-bottom-0 <?= !empty($hasWechat) ? '' : 'hide'; ?>">
  55. <ul class="nav nav-tabs" id="custom-tabs-four-tab" role="tablist" style="padding-left: 70px">
  56. <li class="nav-item">
  57. <a class="nav-link active" data-toggle="pill" href="#custom-1">账号登录</a>
  58. </li>
  59. <li class="nav-item wechat-login">
  60. <a class="nav-link" data-toggle="pill" href="#custom-2">二维码登录</a>
  61. </li>
  62. </ul>
  63. </div>
  64. <div class="card-body login-card-body">
  65. <div class="tab-content" id="custom-tabs-four-tabContent">
  66. <div class="tab-pane fade active show" id="custom-1">
  67. <p class="login-box-msg <?= empty($hasWechat) ? '' : 'hide'; ?>">Welcome to</p>
  68. <?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
  69. <?= $form->field($model, 'username')->textInput(['placeholder' => '登录账号'])->label(false); ?>
  70. <?= $form->field($model, 'password')->passwordInput(['placeholder' => '登录密码'])->label(false); ?>
  71. <?php if ($model->scenario == 'captchaRequired') { ?>
  72. <?= $form->field($model, 'verifyCode')->widget(Captcha::class, [
  73. 'template' => '<div class="row"><div class="col-sm-7">{input}</div><div class="col-sm-5">{image}</div></div>',
  74. 'imageOptions' => [
  75. 'alt' => '点击换图',
  76. 'title' => '点击换图',
  77. 'style' => 'cursor:pointer',
  78. ],
  79. 'options' => [
  80. 'class' => 'form-control',
  81. 'placeholder' => '验证码',
  82. ],
  83. ])->label(false); ?>
  84. <?php } ?>
  85. <?= $form->field($model, 'rememberMe')->checkbox() ?>
  86. <div class="form-group">
  87. <?= Html::submitButton('立即登录', ['class' => 'btn btn-primary btn-block', 'name' => 'login-button']) ?>
  88. </div>
  89. <?php ActiveForm::end(); ?>
  90. <div class="social-auth-links text-center">还没有账号?<?= Html::a('申请入驻', ['register'], [
  91. 'class' => 'blue'
  92. ]); ?></div>
  93. </div>
  94. <div class="tab-pane fade" id="custom-2">
  95. <div class="text-center">
  96. <span class="help">请使用 "微信扫一扫" 进行登录</span><br>
  97. <div class="position-relative wechat-qr-box">
  98. <img src="<?= Url::to(['qr', 'url' => 'loading'])?>" class="wechat-qr-img">
  99. <div class="wechat-qr-shade">
  100. <div class="wechat-qr-shade-loading-text pt-2">
  101. 加载中...
  102. </div>
  103. <div class="wechat-qr-shade-lose-text hide">
  104. <span class="pb-3">二维码已过期</span><br>
  105. <span class="blue pointer" onclick="initWechatLoginQr()">刷新</span>
  106. </div>
  107. </div>
  108. </div>
  109. <div class="pt-3">
  110. <span class="help wechat-lose hide">二维码已过期</span>
  111. <span class="help wechat-expire-seconds">剩余有效期 <span id="expire-seconds">300</span> 秒</span>
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. <div class="social-auth-links text-center">
  117. <p><?= Html::encode(Yii::$app->services->config->backendConfig('web_copyright')); ?></p>
  118. </div>
  119. </div>
  120. <!-- /.login-card-body -->
  121. </div>
  122. </div>
  123. </body>
  124. <script>
  125. //判断是否存在父窗口
  126. if (window.parent !== this.window) {
  127. parent.location.reload();
  128. }
  129. var timer;
  130. var ticket;
  131. $('.wechat-login').click(function () {
  132. initWechatLoginQr();
  133. })
  134. // 启动重新
  135. function initWechatLoginQr() {
  136. clearInterval(timer);
  137. ticket = '';
  138. // 底部文字显示
  139. $(".wechat-expire-seconds").removeClass('hide');
  140. $(".wechat-lose").addClass('hide');
  141. // 遮罩(显示加载中)
  142. $('.wechat-qr-shade').removeClass('hide');
  143. $('.wechat-qr-shade-lose-text').addClass('hide');
  144. $('.wechat-qr-shade-loading-text').removeClass('hide');
  145. $.ajax({
  146. type: "get",
  147. url: "<?= Url::to(['get-wechat-login-qr'])?>",
  148. dataType: "json",
  149. success: function (data) {
  150. if (parseInt(data.code) !== 200) {
  151. rfMsg(data.message);
  152. } else {
  153. $('.wechat-qr-img').attr('src', '<?= Url::to(['qr'])?>' + '?url=' + data.data.url);
  154. $('.wechat-qr-shade').addClass('hide');
  155. $('#expire-seconds').text(data.data.expire_seconds);
  156. timer = setInterval(setTime, 1000);
  157. ticket = data.data.ticket;
  158. }
  159. }
  160. });
  161. }
  162. // 定时器启动
  163. function setTime() {
  164. var seconds = $("#expire-seconds").text();
  165. if (parseInt(seconds) > 0) {
  166. $("#expire-seconds").text(parseInt(seconds) - 1);
  167. // 判断登录
  168. $.ajax({
  169. type: "get",
  170. url: "<?= Url::to(['wechat-login'])?>",
  171. dataType: "json",
  172. data: {ticket: ticket},
  173. success: function (data) {
  174. if (parseInt(data.code) === 200) {
  175. window.location.href = "<?= Url::to(Yii::$app->getHomeUrl())?>";
  176. }
  177. }
  178. });
  179. } else {
  180. // 底部文字显示
  181. $(".wechat-expire-seconds").addClass('hide');
  182. $(".wechat-lose").removeClass('hide');
  183. // 遮罩(显示二维码过期)
  184. $('.wechat-qr-shade').removeClass('hide');
  185. $('.wechat-qr-shade-lose-text').removeClass('hide');
  186. $('.wechat-qr-shade-loading-text').addClass('hide');
  187. // 去除定时器
  188. clearInterval(timer);
  189. }
  190. }
  191. </script>
粤ICP备19079148号