رفتن به مطلب
انجمن اندروید ایران | آموزش برنامه نویسی اندروید و موبایل
  • android.png.1fab383bc8500cd93127cebc65b1dcab.png

ساخت فرم forgot password


پست های پیشنهاد شده

سلام...من یه فرم لاگین و رجیستر با استفاده از php& mysql درست کردم، حالا میخوام forgot password رو هم بهش اضافه کنم؟ کسی نمونه کدی ازش داره و یا میتونه راهنماییم کنه؟؟؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

با سلامیک نمونه کامل سورس برای پیاده سازی مورد درخواستی شما.هرجای سورس نکته / ابهامی داشت بفرمایید تا بیشتر راهنمایی کنیم.ساختار دیتابیس : 

CREATE TABLE password_reset_request (sno int(11) NOT NULL AUTO_INCREMENT,email varchar(50) NOT NULL,encrypted_temp_password varchar(256) NOT NULL,salt varchar(10) NOT NULL,created_at datetime DEFAULT NULL,PRIMARY KEY (sno))

کدهای مربوط به Operation دیتابیس :در این کد موارد مانند امنیت پسور هم لحاض شده شده و Encrypt میشود.

<?php class DBOperations{     public function passwordResetRequest($email){         $random_string = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 6)), 0, 6);        $hash = $this->getHash($random_string);        $encrypted_temp_password = $hash["encrypted"];        $salt = $hash["salt"];         $sql = 'SELECT COUNT(*) from password_reset_request WHERE email =:email';        $query = $this -> conn -> prepare($sql);        $query -> execute(array('email' => $email));         if($query){             $row_count = $query -> fetchColumn();             if ($row_count == 0){                 $insert_sql = 'INSERT INTO password_reset_request SET email =:email,encrypted_temp_password =:encrypted_temp_password,                salt =alt,created_at = :created_at';                $insert_query = $this ->conn ->prepare($insert_sql);                $insert_query->execute(array(':email' => $email, ':encrypted_temp_password' => $encrypted_temp_password,                        'alt' => $salt, ':created_at' => date("Y-m-d H:i")));                 if ($insert_query) {                     $user["email"] = $email;                    $user["temp_password"] = $random_string;                     return $user;                 } else {                     return false;                 }            } else {                 $update_sql = 'UPDATE password_reset_request SET email =:email,encrypted_temp_password =:encrypted_temp_password,                salt =alt,created_at = :created_at';                $update_query = $this -> conn -> prepare($update_sql);                $update_query -> execute(array(':email' => $email, ':encrypted_temp_password' => $encrypted_temp_password,                        'alt' => $salt, ':created_at' => date("Y-m-d H:i")));                 if ($update_query) {                     $user["email"] = $email;                    $user["temp_password"] = $random_string;                    return $user;                 } else {                     return false;                 }            }        } else {             return false;        }    }     public function resetPassword($email,$code,$password){         $sql = 'SELECT * FROM password_reset_request WHERE email = :email';        $query = $this -> conn -> prepare($sql);        $query -> execute(array(':email' => $email));        $data = $query -> fetchObject();        $salt = $data -> salt;        $db_encrypted_temp_password = $data -> encrypted_temp_password;         if ($this -> verifyHash($code.$salt,$db_encrypted_temp_password) ) {             $old = new DateTime($data -> created_at);            $now = new DateTime(date("Y-m-d H:i"));            $diff = $now->getTimestamp() - $old->getTimestamp();             if($diff < 120) {                 return $this -> changePassword($email, $password);             } else {                 false;            }        } else {             return false;        }    }}

کدهای مربوط به عملیات یا Functions : 

<?php require_once 'DBOperations.php';require 'PHPMailer/PHPMailerAutoload.php'; class Functions{     private $db;    private $mail;     public function __construct() {         $this -> db = new DBOperations();        $this -> mail = new PHPMailer;     }     public function resetPasswordRequest($email){         $db = $this -> db;         if ($db -> checkUserExist($email)) {             $result =  $db -> passwordResetRequest($email);             if(!$result){                 $response["result"] = "failure";                $response["message"] = "Reset Password Failure";                return json_encode($response);             } else {                 $mail_result = $this -> sendEmail($result["email"],$result["temp_password"]);                 if($mail_result){                     $response["result"] = "success";                    $response["message"] = "Check your mail for reset password code.";                    return json_encode($response);                 } else {                     $response["result"] = "failure";                    $response["message"] = "Reset Password Failure";                    return json_encode($response);                }            }        } else {             $response["result"] = "failure";            $response["message"] = "Email does not exist";            return json_encode($response);         }    }     public function resetPassword($email,$code,$password){         $db = $this -> db;         if ($db -> checkUserExist($email)) {             $result =  $db -> resetPassword($email,$code,$password);             if(!$result){                 $response["result"] = "failure";                $response["message"] = "Reset Password Failure";                return json_encode($response);             } else {                 $response["result"] = "success";                $response["message"] = "Password Changed Successfully";                return json_encode($response);             }        } else {             $response["result"] = "failure";            $response["message"] = "Email does not exist";            return json_encode($response);         }    }     public function sendEmail($email,$temp_password){         $mail = $this -> mail;        $mail->isSMTP();        $mail->Host = 'smtp.gmail.com';        $mail->SMTPAuth = true;        $mail->Username = '[email protected]';        $mail->Password = 'password';        $mail->SMTPSecure = 'ssl';        $mail->Port = 465;         $mail->From = '[email protected]';        $mail->FromName = 'Your Name';        $mail->addAddress($email, 'Your Name');         $mail->addReplyTo('[email protected]', 'Your Name');         $mail->WordWrap = 50;        $mail->isHTML(true);         $mail->Subject = 'Password Reset Request';        $mail->Body    = 'Hi,

Your password reset code is '.$temp_password.' . This code expires in 120 seconds. Enter this code within 120 seconds to reset your password.

Thanks,
Learn2Crack.';         if(!$mail->send()) {             return $mail->ErrorInfo;         } else {             return true;         }    }     public function sendPHPMail($email,$temp_password){         $subject = 'Password Reset Request';        $message = 'Hi,nn Your password reset code is '.$temp_password.' . This code expires in 120 seconds. Enter this code within 120 seconds to reset your password.nnThanks,nLearn2Crack.';        $from = "[email protected]";        $headers = "From:" . $from;         return mail($email,$subject,$message,$headers);     }}

کد دسترسی یا index :

if ($operation == 'resPassReq') { if(isset($data -> user) && !empty($data -> user) &&isset($data -> user -> email)){ $user = $data -> user;$email = $user -> email; echo $fun -> resetPasswordRequest($email); } else { echo $fun -> getMsgInvalidParam(); }}else if ($operation == 'resPass') { if(isset($data -> user) && !empty($data -> user) && isset($data -> user -> email) && isset($data -> user -> password)&& isset($data -> user -> code)){ $user = $data -> user;$email = $user -> email;$code = $user -> code;$password = $user -> password; echo $fun -> resetPassword($email,$code,$password); } else { echo $fun -> getMsgInvalidParam(); }

تیکه کدهای بالا سمت سرور میباشند!و اما کدهای مربوط به کلاینت : کدهای مربوط به رابط کاربری برنامه یا XML : 

<?xml version="1.0" encoding="utf-8"?>                                                                             

کدهای جاوا که قالب Fragment پیدا سازی شده اند : 

import android.app.Fragment;import android.app.FragmentTransaction;import android.os.Bundle;import android.os.CountDownTimer;import android.support.design.widget.Snackbar;import android.support.v7.widget.AppCompatButton;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView; import com.learn2crack.loginregistration.models.ServerRequest;import com.learn2crack.loginregistration.models.ServerResponse;import com.learn2crack.loginregistration.models.User; import retrofit2.Call;import retrofit2.Callback;import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory; public class ResetPasswordFragment extends Fragment implements View.OnClickListener{     private AppCompatButton btn_reset;    private EditText et_email,et_code,et_password;    private TextView tv_timer;    private ProgressBar progress;    private boolean isResetInitiated = false;    private String email;    private CountDownTimer countDownTimer;     @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {         View view = inflater.inflate(R.layout.fragment_password_reset,container,false);        initViews(view);        return view;    }     private void initViews(View view){         btn_reset = (AppCompatButton)view.findViewById(R.id.btn_reset);        tv_timer = (TextView)view.findViewById(R.id.timer);        et_code = (EditText)view.findViewById(R.id.et_code);        et_email = (EditText)view.findViewById(R.id.et_email);        et_password = (EditText)view.findViewById(R.id.et_password);        et_password.setVisibility(View.GONE);        et_code.setVisibility(View.GONE);        tv_timer.setVisibility(View.GONE);        btn_reset.setOnClickListener(this);        progress = (ProgressBar)view.findViewById(R.id.progress);     }     @Override    public void onClick(View v) {        switch (v.getId()){             case R.id.btn_reset:                 if(!isResetInitiated) {                     email = et_email.getText().toString();                    if (!email.isEmpty()) {                        progress.setVisibility(View.VISIBLE);                        initiateResetPasswordProcess(email);                    } else {                         Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show();                    }                } else {                     String code = et_code.getText().toString();                    String password = et_password.getText().toString();                     if(!code.isEmpty() && !password.isEmpty()){                         finishResetPasswordProcess(email,code,password);                    } else {                         Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show();                    }                 }                 break;        }    }     private void initiateResetPasswordProcess(String email){         Retrofit retrofit = new Retrofit.Builder()                .baseUrl(Constants.BASE_URL)                .addConverterFactory(GsonConverterFactory.create())                .build();         RequestInterface requestInterface = retrofit.create(RequestInterface.class);         User user = new User();        user.setEmail(email);        ServerRequest request = new ServerRequest();        request.setOperation(Constants.RESET_PASSWORD_INITIATE);        request.setUser(user);        Call response = requestInterface.operation(request);         response.enqueue(new Callback() {            @Override            public void onResponse(Call call, retrofit2.Response response) {                 ServerResponse resp = response.body();                Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();                 if(resp.getResult().equals(Constants.SUCCESS)){                     Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();                    et_email.setVisibility(View.GONE);                    et_code.setVisibility(View.VISIBLE);                    et_password.setVisibility(View.VISIBLE);                    tv_timer.setVisibility(View.VISIBLE);                    btn_reset.setText("Change Password");                    isResetInitiated = true;                    startCountdownTimer();                 } else {                     Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();                 }                progress.setVisibility(View.INVISIBLE);            }             @Override            public void onFailure(Call call, Throwable t) {                 progress.setVisibility(View.INVISIBLE);                Log.d(Constants.TAG,"failed");                Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();             }        });    }     private void finishResetPasswordProcess(String email,String code, String password){         Retrofit retrofit = new Retrofit.Builder()                .baseUrl(Constants.BASE_URL)                .addConverterFactory(GsonConverterFactory.create())                .build();         RequestInterface requestInterface = retrofit.create(RequestInterface.class);         User user = new User();        user.setEmail(email);        user.setCode(code);        user.setPassword(password);        ServerRequest request = new ServerRequest();        request.setOperation(Constants.RESET_PASSWORD_FINISH);        request.setUser(user);        Call response = requestInterface.operation(request);         response.enqueue(new Callback() {            @Override            public void onResponse(Call call, retrofit2.Response response) {                 ServerResponse resp = response.body();                Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();                 if(resp.getResult().equals(Constants.SUCCESS)){                     Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();                    countDownTimer.cancel();                    isResetInitiated = false;                    goToLogin();                 } else {                     Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();                 }                progress.setVisibility(View.INVISIBLE);            }             @Override            public void onFailure(Call call, Throwable t) {                 progress.setVisibility(View.INVISIBLE);                Log.d(Constants.TAG,"failed");                Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();             }        });    }     private void startCountdownTimer(){        countDownTimer = new CountDownTimer(120000, 1000) {             public void onTick(long millisUntilFinished) {                tv_timer.setText("Time remaining : " + millisUntilFinished / 1000);            }             public void onFinish() {                Snackbar.make(getView(), "Time Out ! Request again to reset password.", Snackbar.LENGTH_LONG).show();                goToLogin();            }        }.start();    }     private void goToLogin(){         Fragment login = new LoginFragment();        FragmentTransaction ft = getFragmentManager().beginTransaction();        ft.replace(R.id.fragment_frame,login);        ft.commit();    }}

کد رو بررسی کنید اگر سوالی / مشکلی داشتید مطرح کنید تا راهنماییتان کنم.توجه داشته باشید که اگر قصد راهنمایی کامل بخواین صورت نمیگیره چرا که اول باید خودتون بررسی کنید، فقط تیکه کدی رو که اشکال دارید مطرح کنید.درضمن یادمه دوستانی در مورد retrofit سوالاتی رو میپرسیدن، این سورس کد برپایه Retrofit میباشد. پس سورس کد خوبی هم برای اون دسته از دوستان میتونه باشهامیدوارم که به دردتون بخوره.موفق باشید:heart:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

با سلام

یک نمونه کامل سورس برای پیاده سازی مورد درخواستی شما.

هرجای سورس نکته / ابهامی داشت بفرمایید تا بیشتر راهنمایی کنیم.

سلام داداش ببخشید بی جا میپرسم من از این کتابخونه استفاده میکنم ولی وقتی متنای فارسی میفرستم دیتابیس ذخیره بشه به صورت ??? ذخیره میشه

شما راه حلی داری برای این مشکل؟:(

لینک ارسال
به اشتراک گذاری در سایت های دیگر

با سلام

یک نمونه کامل سورس برای پیاده سازی مورد درخواستی شما.

هرجای سورس نکته / ابهامی داشت بفرمایید تا بیشتر راهنمایی کنیم.

سلام داداش ببخشید بی جا میپرسم من از این کتابخونه استفاده میکنم ولی وقتی متنای فارسی میفرستم دیتابیس ذخیره بشه به صورت ??? ذخیره میشه

شما راه حلی داری برای این مشکل؟:(

موقع ارسال به UTF-8 تبدیل کنید بعد ارسال کنید

لینک ارسال
به اشتراک گذاری در سایت های دیگر

با سلام

یک نمونه کامل سورس برای پیاده سازی مورد درخواستی شما.

هرجای سورس نکته / ابهامی داشت بفرمایید تا بیشتر راهنمایی کنیم.

سلام داداش ببخشید بی جا میپرسم من از این کتابخونه استفاده میکنم ولی وقتی متنای فارسی میفرستم دیتابیس ذخیره بشه به صورت ??? ذخیره میشه

شما راه حلی داری برای این مشکل؟:(

موقع ارسال به UTF-8 تبدیل کنید بعد ارسال کنید

من هرچی گشتم نفهمیدم چجوری وگرنه اینکارو قبلا گفتن که انجام بدم

کل مستندات رتروفیت رو زیر و رو کردم نفهمیدم باز

میشه کدشو بذاری؟

و دقیقا کجاش باید اینکار رو بکنیم؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...