maoriaty

配置:web.php

\'mailer\' => [
            \'class\' => \'yii\swiftmailer\Mailer\',
            // send all mails to a file by default. You have to set
            // \'useFileTransport\' to false and configure a transport
            // for the mailer to send real emails.
            \'useFileTransport\' => false,
            \'transport\' => [
                \'class\' => \'Swift_SmtpTransport\',
                \'host\' => \'smtp.qq.com\',
                \'username\' => \'maoriaty@foxmail.com\',
                \'password\' => \'*********\', //授权码
                \'port\' => \'465\',
                \'encryption\' => \'ssl\',
            ],
        ],

忘记密码:publicController.php

// 忘记密码
    public function actionSeekpassword()
    {
        $this->layout = false;
        $model = new Admin;
        if (Yii::$app->request->isPost) {
            $post = Yii::$app->request->post();
            if ($model->seekPass($post)) {
                Yii::$app->session->setFlash(\'info\', \'电子邮箱已经发送成功,请查收\');
            }
        }
        return $this->render(\'seekpassword\', [\'model\' => $model]);
    }

找回密码:admin.php

<?php
namespace app\modules\models;

use Yii;
use yii\db\ActiveRecord;

class Admin extends ActiveRecord
{
    public $rememberMe = true;
    public $repass;

    public static function tableName()
    {
        return "{{%admin}}";
    }

    public function rules()
    {
        return [
            [\'adminuser\', \'required\', \'message\' => \'管理员账号不能为空\', \'on\' => [\'login\', \'seekpass\', \'changepass\']],
            [\'adminpass\', \'required\', \'message\' => \'管理员密码不能为空\', \'on\' => [\'login\', \'changepass\']],
            [\'rememberMe\', \'boolean\', \'on\' => \'login\'],
            [\'adminpass\', \'validatePass\', \'on\' => \'login\'],
            [\'adminemail\', \'required\', \'message\' => \'电子邮箱不能为空\', \'on\' => \'seekpass\'],
            [\'adminemail\', \'email\', \'message\' => \'电子邮箱格式不正确\', \'on\' => \'seekpass\'],
            [\'adminemail\', \'validateEmail\', \'on\' => \'seekpass\'],
            [\'repass\', \'required\', \'message\' => \'确认密码不能为空\', \'on\' => \'changepass\'],
            [\'repass\', \'compare\', \'compareAttribute\' => \'adminpass\', \'message\' => \'两次密码输入不一致\', \'on\' => \'changepass\']
        ];
    }

    public function validatePass()
    {
        if (!$this->hasErrors()) {
            $res = self::find()->where(\'adminuser = :user and adminpass = :pass\', [\':user\' => $this->adminuser, \':pass\' => md5($this->adminpass)])->one();
            if (is_null($res)) {
                $this->addError(\'adminpass\', \'用户名或密码错误\');
            }
        }
    }

    public function validateEmail()
    {
        if (!$this->hasErrors()) {
            $res = self::find()->where(\'adminuser = :user and adminemail = :email\', [\':user\' => $this->adminuser, \':email\' => $this->adminemail])->one();
            if (is_null($res)) {
                $this->addError(\'adminemail\', \'管理员电子邮箱不匹配\');
            }
        }
    }

    // 登陆
    public function login($data)
    {
        $this->scenario = \'login\';
        if ($this->load($data) && $this->validate()) {
            // 存入session
            $lifetime = $this->rememberMe ? 24*3600 : 0; // 过期时间
            $session = Yii::$app->session;
            session_set_cookie_params($lifetime);
            $session[\'admin\'] = [
                \'adminuser\' => $this->adminuser,
                \'isLogin\' => 1
            ];
            $this->updateAll([\'logintime\' => time(), \'loginip\' => ip2long(Yii::$app->request->userIP)], \'adminuser = :user\', [\':user\' => $this->adminuser]);
            return (bool)$session[\'admin\'][\'isLogin\'];
        }
        return false;
    }

    // 找回密码
    public function seekPass($data)
    {
        $this->scenario = \'seekpass\';
        if ($this->load($data) && $this->validate()) {
            // 发送电子邮箱
            $time = time();
            $token = $this->createToken($data[\'Admin\'][\'adminuser\'], $time);
            $mailer = Yii::$app->mailer->compose(\'seekpass\', [\'adminuser\' => $data[\'Admin\'][\'adminuser\'], \'time\' => $time, \'token\' => $token]);
            $mailer->setFrom("maoriaty@foxmail.com");
            $mailer->setTo($data[\'Admin\'][\'adminemail\']);
            $mailer->setSubject("测试商城-找回密码");
            if ($mailer->send()) {
                return true;
            }
        }
        return false;
    }

    // 生成token
    public function createToken($adminuser, $time)
    {
        return md5(md5($adminuser).\base64_encode(Yii::$app->request->userIP).md5($time));
    }

    // 修改密码
    public function changePass($data)
    {
        $this->scenario = \'changepass\';
        if ($this->load($data) && $this->validate()) {
            return (bool)$this->updateAll([\'adminpass\' => md5($this->adminpass)], \'adminuser = :user\', [\':user\' => $this->adminuser]);
        }
        return false;
    }
}

发送内容:mail/seekpass.php

<p>尊敬的<?=$adminuser ?>, 您好:</p>

<p>您的找回密码链接如下:</p>

<?php $url = Yii::$app->urlManager->createAbsoluteUrl([\'admin/manage/mailchangepass\', \'timestamp\' => $time, \'adminuser\' => $adminuser, \'token\' => $token]);  ?>
<p><a href="<?=$url?>"><?=$url?></a></p>

<p>该链接5分钟内有效,请勿传递给别人!</p>

<p>该邮件为系统自动发送,请勿回复!</p>

修改密码:

<?php
namespace app\modules\controllers;

use Yii;
use yii\web\Controller;
use app\modules\models\Admin;

class ManageController extends Controller
{
    public function actionMailchangepass()
    {
        $this->layout = false;
        $time = Yii::$app->request->get(\'timestamp\');
        $adminuser = Yii::$app->request->get(\'adminuser\');
        $token = Yii::$app->request->get(\'token\');
        $model = new Admin;
        $myToken = $model->createToken($adminuser, $time);
        if ($token != $myToken) {
            $this->redirect([\'public/login\']);
            Yii::$app->end();
        }
        if (time()-$time > 300) {
            $this->redirect([\'public/login\']);
            Yii::$app->end();
        }
        if (Yii::$app->request->isPost) {
            $post = Yii::$app->request->post();
            if ($model->changePass($post)) {
                Yii::$app->session->setFlash(\'info\', \'密码修改成功\');
            }
        }
        $model->adminuser = $adminuser;
        return $this->render(\'mailchangepass\', [\'model\' => $model]);
    }
}

视图:mailchangepass.php

<?php $form = ActiveForm::begin([
                \'fieldConfig\' => [
                    \'template\' => \'{input}{error}\'
                ]
            ]); ?>
                <div class="span4 box">
                    <div class="content-wrap">
                        <h6>商城 - 修改密码</h6>
                        <?php 
                            if (Yii::$app->session->hasFlash(\'info\')) {
                                echo Yii::$app->session->getFlash(\'info\');
                            }
                        ?>
                        <?=$form->field($model, \'adminuser\')->hiddenInput();?>
                        <?=$form->field($model, \'adminpass\')->passwordInput([\'class\' => \'span12\', \'placeholder\' => \'新密码\'])?>
                        <?=$form->field($model, \'repass\')->passwordInput([\'class\' => \'span12\', \'placeholder\' => \'确认密码\'])?>
                        <a href="<?=Url::to([\'public/login\']);?>" class="forgot">返回登陆</a>

                        <?=Html::submitButton(\'修改\', [\'class\' => \'btn-glow primary login\']);?>
                </div>
            <?php ActiveForm::end(); ?>

 

分类:

技术点:

相关文章: