精华内容
下载资源
问答
  • 设置思路 1、用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码。 2、当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的E-MAIL邮箱,提交。 3、系统通过该邮箱,从...
  • 账号通过邮箱找回密码功能设计

    万次阅读 2016-09-02 18:10:01
    通常所说的密码找回功能不是真的能把忘记的密码找回,因为我们的密码是加密保存的,一般开发者会在验证用户信息后通过程序生成一个新密码或者生成一个特定的链接并发送邮件到用户邮箱,用户从邮箱链接到网站的重置...

    通常所说的密码找回功能不是真的能把忘记的密码找回,因为我们的密码是加密保存的,一般开发者会在验证用户信息后通过程序生成一个新密码或者生成一个特定的链接并发送邮件到用户邮箱,用户从邮箱链接到网站的重置密码模块重新设置新密码。

    当然现在有的网站也有手机短信的方式找回密码,原理就是通过发送验证码来验明正身,和发送邮件验证一样,最终还是要通过重置密码来完成找回密码的流程。
    密码找回的功能,一般步骤是:

    1.表单输入注册时的邮箱;
    2.验证用户邮箱是否正确,如果用户邮箱不存在网站的用户表中,则提示用户邮箱未注册;
    3.发送邮件,如果用户邮箱确实存在用户表中,则组合用于验证用户信息的字符串,并构造URL发送到用户邮箱中;
    4.用户登录邮箱收取邮件,点击URL链接到网站验证程序;
    5.网站程序通过用户请求的字符串查询本地用户表,比对用户信息是否正确;
    6.如果正确则转到重置密码页面重新设置新密码,反之则提示用户验证无效。

    HTML
    我们在找回密码的页面上放置一个要求用户输入注册时所用的邮箱,然后提交前台js来处理交互。

    <p><strong>输入您注册的电子邮箱,找回密码:</strong></p> 
    <p><input type="text" class="input" name="email" id="email"><span id="chkmsg"></span></p> 
    <p><input type="button" class="btn" id="sub_btn" value="提 交"></p> 

    jQuery
    当用户输入完邮箱并点击提交后,jQuery先验证邮箱格式是否正确,如果正确则通过向后台sendmail.php发送Ajax请求,sendmail.php负责验证邮箱是否存在和发送邮件,并会返回相应的处理结果给前台页面,请看jQuery代码:

    $(function(){ 
        $("#sub_btn").click(function(){ 
            var email = $("#email").val(); 
            var preg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; //匹配Email 
            if(email=='' || !preg.test(email)){ 
                $("#chkmsg").html("请填写正确的邮箱!"); 
            }else{ 
                $("#sub_btn").attr("disabled","disabled").val('提交中..').css("cursor","default"); 
                $.post("sendmail.php",{mail:email},function(msg){ 
                    if(msg=="noreg"){ 
                        $("#chkmsg").html("该邮箱尚未注册!"); 
                        $("#sub_btn").removeAttr("disabled").val('提 交').css("cursor","pointer"); 
                    }else{ 
                        $(".demo").html("<h3>"+msg+"</h3>"); 
                    } 
                }); 
            } 
        }); 
    }) 

    以上使用的jQuery代码很方便简洁的完成了前端交互操作,如果您有一定的jQuery基础,那上面的代码一目了然,不多解释。

    PHP
    sendmail.php需要验证Email是否存在系统用户表中,如果有,则读取用户信息,将用户id、用户名和密码惊醒md5加密生成一个特别的字符串作为找回密码的验证码,然后构造URL。同时我们为了控制URL链接的时效性,将记录用户提交找回密码动作的操作时间,最后调用邮件发送类发送邮件到用户邮箱,发送邮件类smtp.class.php已经打包好,请下载。

    include_once("connect.php");//连接数据库 
    
    $email = stripslashes(trim($_POST['mail'])); 
    
    $sql = "select id,username,password from `t_user` where `email`='$email'"; 
    $query = mysql_query($sql); 
    $num = mysql_num_rows($query); 
    if($num==0){//该邮箱尚未注册! 
        echo 'noreg'; 
        exit;     
    }else{ 
        $row = mysql_fetch_array($query); 
        $getpasstime = time(); 
        $uid = $row['id']; 
        $token = md5($uid.$row['username'].$row['password']);//组合验证码 
        $url = "http://www.helloweba.com/demo/resetpass/reset.php?email=".$email." 
    &token=".$token;//构造URL 
        $time = date('Y-m-d H:i'); 
        $result = sendmail($time,$email,$url); 
        if($result==1){//邮件发送成功 
            $msg = '系统已向您的邮箱发送了一封邮件<br/>请登录到您的邮箱及时重置您的密码!'; 
            //更新数据发送时间 
            mysql_query("update `t_user` set `getpasstime`='$getpasstime' where id='$uid '"); 
        }else{ 
            $msg = $result; 
        } 
        echo $msg; 
    } 
    
    //发送邮件 
    function sendmail($time,$email,$url){ 
        include_once("smtp.class.php"); 
        $smtpserver = ""; //SMTP服务器,如smtp.163.com 
        $smtpserverport = 25; //SMTP服务器端口 
        $smtpusermail = ""; //SMTP服务器的用户邮箱 
        $smtpuser = ""; //SMTP服务器的用户帐号 
        $smtppass = ""; //SMTP服务器的用户密码 
        $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);  
        //这里面的一个true是表示使用身份验证,否则不使用身份验证. 
        $emailtype = "HTML"; //信件类型,文本:text;网页:HTML 
        $smtpemailto = $email; 
        $smtpemailfrom = $smtpusermail; 
        $emailsubject = "Helloweba.com - 找回密码"; 
        $emailbody = "亲爱的".$email.":<br/>您在".$time."提交了找回密码请求。请点击下面的链接重置密码 
    (按钮24小时内有效)。<br/><a href='".$url."'target='_blank'>".$url."</a>"; 
        $rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); 
    
        return $rs; 
    } 

    好了,这个时候你的邮箱将会收到一封来自helloweba的密码找回邮件,邮件内容中有一个URL链接,点击该链接到helloweba.com的reset.php来验证邮箱。

    include_once("connect.php");//连接数据库 
    
    $token = stripslashes(trim($_GET['token'])); 
    $email = stripslashes(trim($_GET['email'])); 
    $sql = "select * from `t_user` where email='$email'"; 
    
    $query = mysql_query($sql); 
    $row = mysql_fetch_array($query); 
    if($row){ 
        $mt = md5($row['id'].$row['username'].$row['password']); 
        if($mt==$token){ 
            if(time()-$row['getpasstime']>24*60*60){ 
                $msg = '该链接已过期!'; 
            }else{ 
                //重置密码... 
                $msg = '请重新设置密码,显示重置密码表单,<br/>这里只是演示,略过。'; 
            } 
        }else{ 
            $msg =  '无效的链接'; 
        } 
    }else{ 
        $msg =  '错误的链接!';     
    } 
    echo $msg; 

    reset.php首先接受参数email和token,然后根据email查询数据表t_user中是否存在该Email,如果存在则获取该用户的信息,并且和sendmail.php中的token组合方式一样构建token值,然后与url传过来的token进行对比,如果当前时间与发送邮件时的时间相差超过24小时的,则提示“该链接已过期!”,反之,则说明链接有效,并且调转到重置密码页面,最后就是用户自己设置新密码了。

    展开全文
  • 邮件发送功能: 主要实现了用户注册邮箱验证,成功后发邮件到注册邮箱中去,然后可以去点击连接进行激活,不激活不能进行登录,会提示未激活账号,如果忘记密码可以通过邮箱或者用户名去找回密码发邮件到注册的邮箱...
  • PHP会员找回密码功能实现实例介绍

    千次阅读 2016-06-12 13:58:16
    设置思路 1、用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码。 2、当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的E-MAIL邮箱,提交。 3、系统通过...
    你做的网站有会员系统那必须就自动找回密码功能了,也就是忘记密码功能,如果用户忘记了密码可以通过邮箱或手机号直接找回密码,下面我来介绍邮箱找回密码方法。

    设置思路

    1、用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码。

    2、当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的E-MAIL邮箱,提交。

    3、系统通过该邮箱,从数据库中查找到该用户信息,并更新该用户的密码为一个临时密码(比如:12345678)。

    4、系统借助Jmail功能把该用户的信息发送到该用户的邮箱中(内容包括:用户名、临时密码、提醒用户及时修改临时密码的提示语)。

    5、用户用临时密码即可登录。


    HTML

    我们在找回密码的页面上放置一个要求用户输入注册时所用的邮箱,然后提交前台js来处理交互。

     代码如下 复制代码

    <p><strong>输入您注册的电子邮箱,找回密码:</strong></p> 
    <p><input type="text" class="input" name="email" id="email"><span id="chkmsg"></span></p> 
    <p><input type="button" class="btn" id="sub_btn" value="提 交"></p>

    jQuery

    当用户输入完邮箱并点击提交后,jQuery先验证邮箱格式是否正确,如果正确则通过向后台sendmail.php发送Ajax请求,sendmail.php负责验证邮箱是否存在和发送邮件,并会返回相应的处理结果给前台页面,请看jQuery代码:

     代码如下 复制代码

    $(function(){ 
        $("#sub_btn").click(function(){ 
            var email = $("#email").val(); 
            var preg = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*/; //匹配Email 
            if(email=='' || !preg.test(email)){ 
                $("#chkmsg").html("请填写正确的邮箱!"); 
            }else{ 
                $("#sub_btn").attr("disabled","disabled").val('提交中..').css("cursor","default"); 
                $.post("sendmail.php",{mail:email},function(msg){ 
                    if(msg=="noreg"){ 
                        $("#chkmsg").html("该邮箱尚未注册!"); 
                        $("#sub_btn").removeAttr("disabled").val('提 交').css("cursor","pointer"); 
                    }else{ 
                        $(".demo").html("<h3>"+msg+"</h3>"); 
                    } 
                }); 
            } 
        }); 
    })

    以上使用的jQuery代码很方便简洁的完成了前端交互操作,如果您有一定的jQuery基础,那上面的代码一目了然,不多解释。

    当然别忘了在页面中加载jQuery库文件,有的同学经常问我说从www.111cn.net下载了demo怎么用不了,那80%是jquery或者其他文件加载路径错了导致没加载必要的文件。
    PHP

    sendmail.php需要验证Email是否存在系统用户表中,如果有,则读取用户信息,将用户id、用户名和密码惊醒md5加密生成一个特别的字符串作为找回密码的验证码,然后构造URL。同时我们为了控制URL链接的时效性,将记录用户提交找回密码动作的操作时间,最后调用邮件发送类发送邮件到用户邮箱,发送邮件类smtp.class.php已经打包好,请下载。

     代码如下 复制代码

    include_once("connect.php");//连接数据库 
     
    $email = stripslashes(trim($_POST['mail'])); 
         
    $sql = "select id,username,password from `t_user` where `email`='$email'"; 
    $query = mysql_query($sql); 
    $num = mysql_num_rows($query); 
    if($num==0){//该邮箱尚未注册! 
        echo 'noreg'; 
        exit;     
    }else{ 
        $row = mysql_fetch_array($query); 
        $getpasstime = time(); 
        $uid = $row['id']; 
        $token = md5($uid.$row['username'].$row['password']);//组合验证码 
        $url = "/demo/resetpass/reset.php?email=".$email." 
    &token=".$token;//构造URL 
        $time = date('Y-m-d H:i'); 
        $result = sendmail($time,$email,$url); 
        if($result==1){//邮件发送成功 
            $msg = '系统已向您的邮箱发送了一封邮件<br/>请登录到您的邮箱及时重置您的密码!'; 
            //更新数据发送时间 
            mysql_query("update `t_user` set `getpasstime`='$getpasstime' where id='$uid '"); 
        }else{ 
            $msg = $result; 
        } 
        echo $msg; 

     
    //发送邮件 
    function sendmail($time,$email,$url){ 
        include_once("smtp.class.php"); 
        $smtpserver = ""; //SMTP服务器,如smtp.163.com 
        $smtpserverport = 25; //SMTP服务器端口 
        $smtpusermail = ""; //SMTP服务器的用户邮箱 
        $smtpuser = ""; //SMTP服务器的用户帐号 
        $smtppass = ""; //SMTP服务器的用户密码 
        $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);  
        //这里面的一个true是表示使用身份验证,否则不使用身份验证. 
        $emailtype = "HTML"; //信件类型,文本:text;网页:HTML 
        $smtpemailto = $email; 
        $smtpemailfrom = $smtpusermail; 
        $emailsubject = "www.111cn.net - 找回密码"; 
        $emailbody = "亲爱的".$email.":<br/>您在".$time."提交了找回密码请求。请点击下面的链接重置密码 
    (按钮24小时内有效)。<br/><a href='".$url."'target='_blank'>".$url."</a>"; 
        $rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); 
     
        return $rs; 
    }

    好了,这个时候你的邮箱将会收到一封来自helloweba的密码找回邮件,邮件内容中有一个URL链接,点击该链接到www.111cn.net的reset.php来验证邮箱。

     代码如下 复制代码

    include_once("connect.php");//连接数据库 
     
    $token = stripslashes(trim($_GET['token'])); 
    $email = stripslashes(trim($_GET['email'])); 
    $sql = "select * from `t_user` where email='$email'"; 
     
    $query = mysql_query($sql); 
    $row = mysql_fetch_array($query); 
    if($row){ 
        $mt = md5($row['id'].$row['username'].$row['password']); 
        if($mt==$token){ 
            if(time()-$row['getpasstime']>24*60*60){ 
                $msg = '该链接已过期!'; 
            }else{ 
                //重置密码... 
                $msg = '请重新设置密码,显示重置密码表单,<br/>这里只是演示,略过。'; 
            } 
        }else{ 
            $msg =  '无效的链接'; 
        } 
    }else{ 
        $msg =  '错误的链接!';     

    echo $msg;

    reset.php首先接受参数email和token,然后根据email查询数据表t_user中是否存在该Email,如果存在则获取该用户的信息,并且和sendmail.php中的token组合方式一样构建token值,然后与url传过来的token进行对比,如果当前时间与发送邮件时的时间相差超过24小时的,则提示“该链接已过期!”,反之,则说明链接有效,并且调转到重置密码页面,最后就是用户自己设置新密码了。

    小结:通过注册邮箱验证与本文邮件找回密码,我们知道发送邮件在网站开发中的应用以及它的重要性,当然,现在也流行短信验证应用,这个需要相关的短信接口对接就可以了。

    最后,附上数据表t_user结构:

     代码如下 复制代码

    CREATE TABLE `t_user` ( 
      `id` int(11) NOT NULL auto_increment, 
      `username` varchar(30) NOT NULL, 
      `password` varchar(32) NOT NULL, 
      `email` varchar(50) NOT NULL, 
      `getpasstime` int(10) NOT NULL, 
      PRIMARY KEY  (`id`) 
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

    smtp.class.php类文件

     代码如下 复制代码

    <?php

    class Smtp{

        /* Public Variables */

     var $smtp_port;

     var $time_out;

     var $host_name;

     var $log_file;

     var $relay_host;

     var $debug;

     var $auth;

     var $user;

     var $pass;

     /* Private Variables */
     var $sock;

     /* Constractor */

     function smtp($relay_host = "", $smtp_port = 25, $auth = false, $user, $pass) {
      $this->debug = false;

      $this->smtp_port = $smtp_port;

      $this->relay_host = $relay_host;

      $this->time_out = 30; //is used in fsockopen()

      $this->auth = $auth; //auth

      $this->user = $user;

      $this->pass = $pass;

      $this->host_name = "localhost"; //is used in HELO command
      $this->log_file = "";

      $this->sock = false;
     }

     /* Main Function */

     function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "") {
      $mail_from = $this->get_address($this->strip_comment($from));

      $body = ereg_replace("(^|(rn))(.)", "1.3", $body);

      $header .= "MIME-Version:1.0rn";

      if ($mailtype == "HTML") {
       $header .= "Content-Type:text/htmlrn";
      }

      $header .= "To: " . $to . "rn";

      if ($cc != "") {
       $header .= "Cc: " . $cc . "rn";
      }

      $header .= "From: $from<" . $from . ">rn";

      $header .= "Subject: " . $subject . "rn";

      $header .= $additional_headers;

      $header .= "Date: " . date("r") . "rn";

      $header .= "X-Mailer:By Redhat (PHP/" . phpversion() . ")rn";

      list ($msec, $sec) = explode(" ", microtime());

      $header .= "Message-ID: <" . date("YmdHis", $sec) . "." . ($msec * 1000000) . "." . $mail_from . ">rn";

      $TO = explode(",", $this->strip_comment($to));

      if ($cc != "") {
       $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
      }

      if ($bcc != "") {
       $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
      }

      $sent = true;

      foreach ($TO as $rcpt_to) {
       $rcpt_to = $this->get_address($rcpt_to);

       if (!$this->smtp_sockopen($rcpt_to)) {
        $this->log_write("Error: Cannot send email to " . $rcpt_to . "n");

        $sent = false;

        continue;
       }

       if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
        $this->log_write("E-mail has been sent to <" . $rcpt_to . ">n");
       } else {
        $this->log_write("Error: Cannot send email to <" . $rcpt_to . ">n");

        $sent = false;
       }

       fclose($this->sock);

       $this->log_write("Disconnected from remote hostn");
      }

      return $sent;
     }

     /* Private Functions */

     function smtp_send($helo, $from, $to, $header, $body = "") {
      if (!$this->smtp_putcmd("HELO", $helo)) {
       return $this->smtp_error("sending HELO command");
      }
      // auth
      if ($this->auth) {
       if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
        return $this->smtp_error("sending HELO command");
       }

       if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
        return $this->smtp_error("sending HELO command");
       }
      }

      if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">")) {
       return $this->smtp_error("sending MAIL FROM command");
      }

      if (!$this->smtp_putcmd("RCPT", "TO:<" . $to . ">")) {
       return $this->smtp_error("sending RCPT TO command");
      }

      if (!$this->smtp_putcmd("DATA")) {
       return $this->smtp_error("sending DATA command");
      }

      if (!$this->smtp_message($header, $body)) {
       return $this->smtp_error("sending message");
      }

      if (!$this->smtp_eom()) {
       return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
      }

      if (!$this->smtp_putcmd("QUIT")) {
       return $this->smtp_error("sending QUIT command");
      }

      return true;
     }

     function smtp_sockopen($address) {
      if ($this->relay_host == "") {
       return $this->smtp_sockopen_mx($address);
      } else {
       return $this->smtp_sockopen_relay();
      }
     }

     function smtp_sockopen_relay() {
      $this->log_write("Trying to " . $this->relay_host . ":" . $this->smtp_port . "n");

      $this->sock = @ fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);

      if (!($this->sock && $this->smtp_ok())) {
       $this->log_write("Error: Cannot connenct to relay host " . $this->relay_host . "n");

       $this->log_write("Error: " . $errstr . " (" . $errno . ")n");

       return false;
      }

      $this->log_write("Connected to relay host " . $this->relay_host . "n");

      return true;
      ;
     }

     function smtp_sockopen_mx($address) {
      $domain = ereg_replace("^.+@([^@]+)$", "1", $address);

      if (!@ getmxrr($domain, $MXHOSTS)) {
       $this->log_write("Error: Cannot resolve MX "" . $domain . ""n");

       return false;
      }

      foreach ($MXHOSTS as $host) {
       $this->log_write("Trying to " . $host . ":" . $this->smtp_port . "n");

       $this->sock = @ fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);

       if (!($this->sock && $this->smtp_ok())) {
        $this->log_write("Warning: Cannot connect to mx host " . $host . "n");

        $this->log_write("Error: " . $errstr . " (" . $errno . ")n");

        continue;
       }

       $this->log_write("Connected to mx host " . $host . "n");

       return true;
      }

      $this->log_write("Error: Cannot connect to any mx hosts (" . implode(", ", $MXHOSTS) . ")n");

      return false;
     }

     function smtp_message($header, $body) {
      fputs($this->sock, $header . "rn" . $body);

      $this->smtp_debug("> " . str_replace("rn", "n" . "> ", $header . "n> " . $body . "n> "));

      return true;
     }

     function smtp_eom() {
      fputs($this->sock, "rn.rn");

      $this->smtp_debug(". [EOM]n");

      return $this->smtp_ok();
     }

     function smtp_ok() {
      $response = str_replace("rn", "", fgets($this->sock, 512));

      $this->smtp_debug($response . "n");

      if (!ereg("^[23]", $response)) {
       fputs($this->sock, "QUITrn");

       fgets($this->sock, 512);

       $this->log_write("Error: Remote host returned "" . $response . ""n");

       return false;
      }

      return true;
     }

     function smtp_putcmd($cmd, $arg = "") {
      if ($arg != "") {
       if ($cmd == "")
        $cmd = $arg;

       else
        $cmd = $cmd . " " . $arg;
      }

      fputs($this->sock, $cmd . "rn");

      $this->smtp_debug("> " . $cmd . "n");

      return $this->smtp_ok();
     }

     function smtp_error($string) {
      $this->log_write("Error: Error occurred while " . $string . ".n");

      return false;
     }

     function log_write($message) {
      $this->smtp_debug($message);

      if ($this->log_file == "") {
       return true;
      }

      $message = date("M d H:i:s ") . get_current_user() . "[" . getmypid() . "]: " . $message;

      if (!@ file_exists($this->log_file) || !($fp = @ fopen($this->log_file, "a"))) {
       $this->smtp_debug("Warning: Cannot open log file "" . $this->log_file . ""n");

       return false;
       ;
      }

      flock($fp, LOCK_EX);

      fputs($fp, $message);

      fclose($fp);

      return true;
     }

     function strip_comment($address) {
      $comment = "([^()]*)";

      while (ereg($comment, $address)) {
       $address = ereg_replace($comment, "", $address);
      }

      return $address;
     }

     function get_address($address) {
      $address = ereg_replace("([ trn])+", "", $address);

      $address = ereg_replace("^.*<(.+)>.*$", "1", $address);

      return $address;
     }

     function smtp_debug($message) {
      if ($this->debug) {
       echo $message . "
       ;";
      }
     }
    }
    ?>

    最后面有个数据库连接类,这里就不介绍了大大家可以百本站找相关的数据库连接mysql类哦。

    展开全文
  • 掌握设置密保的功能开发,通过密保我们可以找回用户的密码,来保证用户的安全。具体布局将不在展示,只说明一些功能模块的实现。工具类对于一个项目来说,项目中将多次用到sharedPreferences共享参数,去存...

    前言

    大家好,我是 Vic,今天给大家带来AndroidStudio制作“我”的界面,设置,修改密码,设置密保和找回密码的概述,希望你们喜欢

    学习目标

    1. 掌握修改密码功能的开发,和实现用户密码的修改;
    2. 掌握设置密保的功能开发,通过密保我们可以找回用户的密码,来保证用户的安全。
    3. 具体布局将不在展示,只说明一些功能模块的实现。

    工具类

    对于一个项目来说,项目中将多次用到sharedPreferences共享参数,去存储用户的登录状态或清除登录状态,“我”的界面也要求用到读取用户姓名的方法,所以我们干脆把这三个方法都扔到AnalysisUtils里面吧。

    在Utils包中新建一个Java类,名为AnalysisUtils。

    public class AnalysisUtils {
        //读取用户名
        public static String readLoginUserName(Context context){
            SharedPreferences sharedPreferences = context.getSharedPreferences("loginInfo",Context.MODE_PRIVATE);
            String userName=sharedPreferences.getString("loginUserName","");
            return userName;
        }
    
        //读取登录状态
        public static boolean readLoginStatus(Context context){
            SharedPreferences sharedPreferences = context.getSharedPreferences("loginInfo",Context.MODE_PRIVATE);
            boolean isLogin=sharedPreferences.getBoolean("isLogin",false);
            return isLogin;
        }
    
        //清除登录状态
        public static void cleanLoginStatus(Context context){
            SharedPreferences sharedPreferences = context.getSharedPreferences("loginInfo",Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putBoolean("isLogin",false);
            editor.putString("loginUserName","");
            editor.commit();
        }
    }
    

    我的界面

    我的界面的头像部分,要实现两个功能:

    1. 打开“我”的界面后,要进行判断是否已登录,已登录显示用户名,未登录显示“点击登陆”。

    2. 头像点击后,会判断是否登录,如果登录了,则跳转到个人资料界面,如果没登录,则跳转到login登录的页面。

    完成第一个功能

    onViewCreate()里写个if else判断语句,根据当前登录状态来显示同像下相应的文本。

    if (AnalysisUtils.readLoginStatus(getActivity())){
            tv_user_name.setText(AnalysisUtils.readLoginUserName(getActivity()));
         }else {
            tv_user_name.setText("点击登录");
    }
    

    登陆

    未登录时,点击登陆,打开登陆页面后,需要MainActivity更新状态并显示,所以用startActivityForResult()方法打开。

    老样子,用startActivityForResult()打开,MainActivity就要加上onActivityForResult()方法来执行响应。

    接下来看看相关代码:

    //onActivityResult();
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            //判断从LoginActivity传过来登陆状态,并执行响应动作。
            if (data!=null){
                boolean isLogin=data.getBooleanExtra("isLogin",false);
                //从登录活动获得isLogin==true,从设置活动获得isLogin==false,他们的请求码都是1
                //之后还可以根据请求码和结果码完成更多需求
                if (isLogin){
                    //0
                    setSelectStatus(0);
                }else {
                    //我
                    setSelectStatus(2);
                }
            }
    }
    

    退出清除登陆状态

    连续点击返回两次则退出,两次点击间隔超过2秒则提示再按一次退出。

     protected long exitTime;
        //给MainActivity加上退出清除登陆状态的方法。
        // 连续点击返回两次则退出,两次点击间隔超过2秒则提示再按一次退出。
        @Override
        public boolean onKeyDown(int keyCode,KeyEvent event){
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
                if ((System.currentTimeMillis()-exitTime) > 2000){
                    Toast.makeText(MainActivity.this,"再按一次退出博学谷",Toast.LENGTH_SHORT).show();
                    exitTime=System.currentTimeMillis();
                }else {
                    this.finish();
                    if (AnalysisUtils.readLoginStatus(this)){
                        AnalysisUtils.cleanLoginStatus(this);
                    }
                    System.exit(0);
                }
                return true;
            }
            return super.onKeyDown(keyCode,event);
    }
    

    设置页面功能模块

    实例化:

    private void initView(){
            rl_modify_psw=findViewById(R.id.rl_modify_psw);
            rl_security_setting=findViewById(R.id.rl_security_setting);
            rl_exit_login=findViewById(R.id.rl_exit_login);
            //标题栏
            title_bar=findViewById(R.id.title_bar);
            tv_back=findViewById(R.id.tv_back);
            tv_main_title=findViewById(R.id.tv_main_title);
            //给tv_main_title设置个文本,给title_bar加个背景
            tv_main_title.setText("设置");
            title_bar.setBackgroundColor(Color.parseColor("#30B4FF"));
            //添加监听器
            tv_back.setOnClickListener(this);
            rl_modify_psw.setOnClickListener(this);
            rl_security_setting.setOnClickListener(this);
            rl_exit_login.setOnClickListener(this);
    }
    

    修改密码

    private void initView() {
            //标题栏
            title_bar=findViewById(R.id.title_bar);
            tv_back=findViewById(R.id.tv_back);
            tv_main_title=findViewById(R.id.tv_main_title);
            //modify
            et_original_psw=findViewById(R.id.et_original_psw);
            et_new_psw=findViewById(R.id.et_new_psw);
            et_new_psw_again=findViewById(R.id.et_new_psw_again);
            btn_save=findViewById(R.id.btn_save);
            //tv_main_title 修改密码
            tv_main_title.setText("修改密码");
            //响应
            btn_save.setOnClickListener(this);
            tv_back.setOnClickListener(this);
    }
    
    private void submit() {
            String psw=et_original_psw.getText().toString().trim();
            String newPsw=et_new_psw.getText().toString().trim();
            String again=et_new_psw_again.getText().toString().trim();
            if (TextUtils.isEmpty(psw)){
                Toast.makeText(this,"请输入原始密码",Toast.LENGTH_SHORT).show();
                return;
            }else if (!MD5Utils.md5(psw).equals(readPsw())){
                Log.i("MD5Utils.md5(psw)",""+MD5Utils.md5(psw));
                Log.i("readPsw",""+readPsw());
                Toast.makeText(this,"输入的密码与原始密码不一致",Toast.LENGTH_SHORT).show();
                return;
            }else if (MD5Utils.md5(newPsw).equals(readPsw())){
                Toast.makeText(this,"输入的新密码与原始密码不能一致",Toast.LENGTH_SHORT).show();
                return;
            }else if (TextUtils.isEmpty(psw)){
                Toast.makeText(this,"请输入密码",Toast.LENGTH_SHORT).show();
                return;
            }else if (TextUtils.isEmpty(again)){
                Toast.makeText(this,"请再次输入新密码",Toast.LENGTH_SHORT).show();
            }else if (!newPsw.equals(again)){
                Toast.makeText(this,"再次输入的新密码不一致",Toast.LENGTH_SHORT).show();
                return;
            }else {
                Toast.makeText(this,"新密码设置成功", Toast.LENGTH_SHORT).show();
                modifyPsw(newPsw);//
                Intent intent=new Intent(ModifyPswActivity.this,LoginActivity.class);
                startActivity(intent);
                //关闭设置页面
                //在submit方法中,密码修改成功之后除了把当前页面关了,还要把设置界面也关了,所以用到instance
                SettingActivity.instance.finish();
                //关闭修改密码页面
                ModifyPswActivity.this.finish();
            }
    }
    
    //modifypsw
    String md5psw=MD5Utils.md5(newPsw);
    SharedPreferences sharedPreferences=getSharedPreferences("loginInfo",MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(userName,md5psw);
    editor.commit();
    
    //readPsw
    SharedPreferences sharedPreferences=getSharedPreferences("loginInfo",MODE_PRIVATE);
    String spPsw=sharedPreferences.getString(userName,"");
    Log.i("username",userName);
    Log.i("spPsw",spPsw);
    return spPsw;
    

    设置密保和找回密码

    主要功能代码:

      /**
         * 保存初始化密码
         **/
        private void savePsw(String name, String resetPsw){
            /*String md5Psw= MD5Utils.md5("123456");
            SharedPreferences sharedPreferences = getSharedPreferences("loginInfo",MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString(name,md5Psw);
            editor.commit();*/
            String md5Psw = MD5Utils.md5(resetPsw);
            SharedPreferences sp = getSharedPreferences("loginInfo", MODE_PRIVATE);
            SharedPreferences.Editor editor = sp.edit();
            editor.putString(name, md5Psw);
            editor.commit();
        }
        private boolean isExistUserName(String name){
            boolean hasUserName=false;
            SharedPreferences sharedPreferences=getSharedPreferences("loginInfo",MODE_PRIVATE);
            String spPsw=sharedPreferences.getString(name,"");
            if (!TextUtils.isEmpty(spPsw)){
                hasUserName=true;
            }
            return hasUserName;
        }
        /**
         * 读取密保
         **/
        private String readSecurity(String name){
            SharedPreferences sharedPreferences=getSharedPreferences("loginInfo",MODE_PRIVATE);
            String security=sharedPreferences.getString(name+"_security","");
            return security;
        }
        /**
         * 保存密保名字
         **/
        private void saveSecurity(String validateName) {
            SharedPreferences sharedPreferences=getSharedPreferences("loginInfo",MODE_PRIVATE);
            SharedPreferences.Editor editor=sharedPreferences.edit();
            editor.putString(AnalysisUtils.readLoginUserName(this)+"_security",validateName);
            editor.commit();
        }
    

    保存功能代码:

    private void submit() {
            // validate
            String validateName = et_validate_name.getText().toString().trim();
            if ("security".equals(from)) {  //设置密保
                if (TextUtils.isEmpty(validateName)) {
                    Toast.makeText(this, "请输入要验证的姓名", Toast.LENGTH_SHORT).show();
                    return;
                } else {
                    Toast.makeText(this, "密保设置成功", Toast.LENGTH_SHORT).show();
                    //保存到
                    saveSecurity(validateName);
                    FindPwdActivity.this.finish();
                    return;
                }
            }else {
                final String name=et_user_name.getText().toString().trim();
                String sp_security=readSecurity(name);
                if (TextUtils.isEmpty(name)){
                    Toast.makeText(this,"请输入您的用户名",Toast.LENGTH_SHORT).show();
                    return;
                }else if (!isExistUserName(name)){
                    Toast.makeText(this,"您输入的用户名不存在",Toast.LENGTH_SHORT).show();
                    return;
                }else if (TextUtils.isEmpty(validateName)){
                    Toast.makeText(this,"请输入要验证的姓名",Toast.LENGTH_SHORT).show();
                    return;
                }else if (!validateName.equals(sp_security)){
                    Toast.makeText(this,"输入的密保不正确",Toast.LENGTH_SHORT).show();
                    return;
                }else {
                    //输入密保正确,重新给用户设置一个密码
                    tv_reset_psw.setVisibility(View.VISIBLE);
                    et_reset_psw.setVisibility(View.VISIBLE);
                    btn_validate.setText("确认");
                    btn_validate.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            String resetPsw = et_reset_psw.getText().toString().trim();
                            //暂时仅验证不为空
                            if (!TextUtils.isEmpty(resetPsw)) {
                                savePsw(name, resetPsw);
                                FindPwdActivity.this.finish();
                            } else {
                                Toast.makeText(FindPwdActivity.this, "请输入要设置的新密码", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                }
            }
        }
    

    修复fragment

    在未登录状态下,点击“点击登录”按钮,登录完成后,应该显示“我”的界面,并且正常显示用户名。

    getSupportFragmentManager().beginTransaction().replace(R.id.main_body,new CourseFragment()).commit();
    

    把该代码放入到fragment刷新中。

    如果觉得不错,那就点个赞吧!❤️

    总结

    • 本文讲了AndroidStudio制作“我”的界面,设置,修改密码,设置密保和找回密码,界面的布局介绍,如果您还有更好地理解,欢迎沟通
    • 定位:分享 Android&Java知识点,有兴趣可以继续关注
    展开全文
  • 本文使用qq邮箱,需要登录邮箱,在设置-账户里面开启SMTP服务,要记下授权码 前端html {#找回密码的表单#} <form action="" method="post" id="login"> {% csrf_token %} <input type="text" ...

    本文使用qq邮箱,需要登录邮箱,在设置-账户里面开启SMTP服务,要记下授权码

    前端html

    {#找回密码的表单#}
    
    <form action="" method="post" id="login">
        {% csrf_token %}
        <input type="text" class="name" name="member_name" Placeholder="Username" required=""/>
        <input type="text" class="email" name="member_email" Placeholder="email" required=""/>
    
        <div class="login-agileits-bottom">
            <h6><a href="javascript:;" type="button" id="onsubmit">提交</a></h6>
        </div>
    </form>
    
    {#找回密码的表单结束#}

    前端js

    {#  找回密码的jquery  #}
    $(document).ready(function () {
        $('#onsubmit').click(function () {
            $.post('/blog/findpwd/', $('#login').serialize(), function (data) {
                if (data['status'] == 0) {
                    layer.msg(data.info,{
                        time:2000
                    });
                    {#location.href = "/blog/login/";#}
                } else {
                    layer.msg(data['info'])
                }
            }, 'json')
        })
    });
    {#  找回密码的jquery结束  #}

    路由

    # 找回密码
    re_path('findpwd/', login.findpwd,name='findpwd'),

    方法

    def findpwd(request):
        from django.core.mail import send_mail
        from mysite7 import settings
        import threading
        from blog.utils import function  # 引入自定义的验证码
        if request.method == 'POST':
            res = {'status': None, 'info': None}
            member_name = request.POST.get('member_name')
            member_email = request.POST.get('member_email')
            member_obj = Member.objects.filter(member_name=member_name, member_email=member_email).first()
            
            if member_obj:
                # 随机生成新密码
                num = function.range_num(6)
                new_pwd = Member.objects.filter(member_name=member_name).update(member_pwd=make_password(num))
                if new_pwd:
                    res['status'] = 0
                    res['info'] = '邮件已发送,注意查收'
                    t = threading.Thread(target=send_mail, args=(
                        '%s在找回密码' % member_name,
                        '您的密码已经被重置,新密码为%s' % num,
                        settings.EMAIL_HOST_USER,
                        ['%s' % member_obj.member_email]
                    ))
                    t.start()
                else:
                    res['status'] = 1
                    res['info'] = '密码找回失败'
                return HttpResponse(json.dumps(res))
            else:
                res['status'] = 3
                res['info'] = '用户/邮箱不存在'
            return HttpResponse(json.dumps(res))
        return render(request, 'blog/findPwd.html')

    项目目录下创建untils文件夹,文件夹下创建function.py文件,封装生成的随机密码

    # 随机数
    def range_num(num):
        # 定义一个种子,从这里面随机拿出一个值,可以是字母
        seeds = "1234567890"
        # 定义一个空列表,每次循环,将拿到的值,加入列表
        random_num = []
        # choice函数:每次从seeds拿一个值,加入列表
        for i in range(num):
            random_num.append(random.choice(seeds))
        # 将列表里的值,变成四位字符串
        return "" . join(random_num)#5454

    settings.py文件中设置

    EMAIL_HOST='smtp.qq.com'
    EMAIL_PORT=465
    EMAIL_HOST_USER='3028981710@qq.com'#账号
    EMAIL_HOST_PASSWORD='kimtvyyymbwodgaf'#密码(授权码)
    EMAIL_USE_SSL=True

    页面效果

    done。

    转载于:https://www.cnblogs.com/nmsghgnv/p/11366130.html

    展开全文
  • 把查找我的手机和发送最后位置功能打开 3.在浏览器输入cloud.huawei.com/ 可浏览器打开或者下载PC客户端。 输入自己的华为账号登录(第一次登录会提示手机验证,后面同一设备就不要了) 4.选择查找我的手机功能 ...
  • 因为考虑到代码的安全,公司直接在内网搭建了一个Gitlab代码仓库。这样对于内网开发提交、更新代码非常快; 但是最近有个开发说密码忘记了,叫帮忙修改,虽然用管理员登陆去修改用户密码是...邮件找回密码 1、因为...
  • 手机丢失事件早已屡见不鲜,几乎每一天都会有人丢失手机。那么,手机丢失后该采取什么...首先,为了为了提高找回手机的可能性,我们需要在购买OPPO手机,上手之后,进入OPPO手机设置,然后进入【云服务】设置,然后...
  • Eclipse中设置本地历史记录、代码找回一、设置本地历史...根据自己的情况进行设置,然后就可以从文件列表中直接打开本地历史记录,还集成了比较功能。 二、代码找回 SVN还原更新,本地代码没有提交,不小心代码被覆...
  • 发送邮件链接,密码找回链接发送,召回界面设置
  • 很多用户试着注册等半天都没有收到邮件,其实我们是需要单独设置这个发送邮件的功能的。我们需要安装一个WP SMTP插件,并做一定配置就可以轻松解决这个问题。 1、配置邮箱的SMTP服务的基础信息 新浪邮箱,126...
  • 前一段时间,由于网站需要做找回密码的功能,需要给往用户的邮箱中发送邮件,在网上找了段代码,写上去之后,发现邮件老是跑到垃圾箱中,我在网上试图找到原因,网上说的好多都是什么词语过滤问题,一直没有找到满意...
  • 背景条件: 使用的是asp.net mvc6 ,Microsoft.AspNet.Identity 如果没用Microsoft.AspNet.Identity,那这篇文章对你帮助不大。...3、用户打开自己的邮箱,点击重置密码链接,跳转到重置密码页面重新设置密码 4、在重置
  • 华为p9手机恢复出厂设置了如何找回

    千次阅读 2016-06-16 11:49:48
    新买的华为p9手机,刚拿到手... 很多人不太了解出厂设置是什么,如今,我们用的都是智能手机,智能手机里都有一个恢复出厂设置功能。有时候手机因为一些问题,有的朋友就会选择手机恢复出厂设置,这个功能其实大家
  • 本项目是用eclipse软件编写,经过我的亲自实践,其真实有效,希望能给您有所帮助???????? 项目版本:android4.0 AVD建议:android...功能完善 效果图: 1.创建设置密保和找回密码界面布局文件activity_find_psw.x...
  • 在我们使用阿里云的云虚拟主机搭建WordPress站点时,里面的邮件发送即使设置好了,也发送不了邮件。注:阿里云的主机都是通过SMTP来进行发送邮件的,需要开启主机的fsockopen。但是WordPress的SMTP是通过steam_...
  • 在实现js验证邮箱格式的时候,按钮单击事件没反应,调用360的开发者模式F12,发现错误是按钮中的单击方法没有定义,但自己已经定义了,就觉得很奇怪,感觉是浏览器问题,然后换了chrome发现功能正常了。很困惑360...
  • Mediawiki邮件功能设置

    万次阅读 2010-08-16 20:31:00
    在mediawiki中的邮件功能主要有: 1注册新用户时会发邮件到用户注册信箱进行确认。 2用户修改,找回密码时会发邮件确认。 3用户的监视页面发生改变时会发邮件通知已经注册监视了该页面...
  • 前不久一个电脑系统的菜鸟问...我就这样回答他,其实微软早在从Vista开始,“Windows Image Acquisition (WIA)”服务已经不再提供在资源管理器显示摄像头图标的功能了。 而要想在我的电脑中看到摄像头,只能走曲线救国
  • 但这并不是环境问题也不是此功能被移除,而是SharePoint 2010添加了使用Alert Me的判断条件,需要事先在Farm Level或者Web Application Level设置Outgoing E-mail Setting才可以enable使用。本文主要介绍两种配置...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 771
精华内容 308
关键字:

找回设置功能