Как перенаправить пользователя на определенное действие в Cloud Firestore?

#java #android #firebase #firebase-authentication #google-cloud-firestore

#java #Android #firebase #firebase-аутентификация #google-cloud-firestore

Вопрос:

При регистрации учетной записи с использованием Firebase auth я сохранял электронные письма в 2 категориях «Учитель» и «Ученик». Я добавляю электронные письма в Firestore 2 разных категорий «Учитель» и «Ученик» с email помощью и password . Когда я вхожу в систему, я хочу проверить, к какой категории относится электронное письмо (учитель или ученик), как я могу это сделать, я попробовал запрос firestore isequalsto, но он не отличался.

Вот моя база данных

Учительница

введите описание изображения здесь

Студенты

введите описание изображения здесь

Любое другое возможное решение?

вот мой код для входа в систему

 package com.example.dell.step;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResu<
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;

public class LoginActivity extends AppCompatActivity {


    private Button mRegbtn;
    private Button mloginbtn;
    private EditText mEmail;
    private EditText mPassword;

    private Toolbar mToolbar;

    private FirebaseAuth mAuth;

    private ProgressDialog mLoginDialog;
    private FirebaseFirestore firebaseFirestore;
    private CollectionReference collectionReference_I;
    private CollectionReference collectionReference_S;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);


        mAuth = FirebaseAuth.getInstance();

        //Progress Dialog

        mLoginDialog = new ProgressDialog(this);

        //FOr Toolbar

        mToolbar = findViewById(R.id.login_toolbar);
        setSupportActionBar(mToolbar);
        getSupportActionBar().setTitle("Login Account");


        mloginbtn = findViewById(R.id.login_btn);
        mEmail = findViewById(R.id.login_email);
        mPassword = findViewById(R.id.login_password);

        mRegbtn = findViewById(R.id.login_reg_btn);

        firebaseFirestore = FirebaseFirestore.getInstance();

        mRegbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent regIntent = new Intent(LoginActivity.this, RegisterActivity.class);
                startActivity(regIntent);
                finish();

            }
        });


        mloginbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String email = mEmail.getText().toString();
                String password = mPassword.getText().toString();

                if (!TextUtils.isEmpty(email) amp;amp; !TextUtils.isEmpty(password)) {
                    mLoginDialog.setTitle("Login User");
                    mLoginDialog.setMessage("Please wait while we login to your account :)");
                    //it stops cancel Dialog when user touch on screen
                    mLoginDialog.setCanceledOnTouchOutside(false);
                    mLoginDialog.show();

                    login_user(email, password);
                }
            }
        });


    }

    private void login_user(final String email, final String password) {

        collectionReference_I = firebaseFirestore.collection("Teacher");
        collectionReference_S = firebaseFirestore.collection("Student");

        collectionReference_I.whereEqualTo("teacher_email", email).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot documentSnapshots) {

                mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {


                        if (task.isSuccessful()) {

                            //Dismiss the progress Dialog
                            mLoginDialog.dismiss();


                            //user is registered
                            Toast.makeText(LoginActivity.this, "Welcome to Teacher Account", Toast.LENGTH_SHORT).show();
                            Intent mainIntent = new Intent(LoginActivity.this, MainActivity.class);
                            startActivity(mainIntent);
                            finish();


                        } else {

                            mLoginDialog.hide();

                            //if user is not registered
                            Toast.makeText(LoginActivity.this, "Cannot Log in Please check the form and try again!", Toast.LENGTH_LONG).show();

                        }

                    }
                });


            }
        });

        collectionReference_S.whereEqualTo("Student_email", email).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot documentSnapshots) {

                mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {


                        if (task.isSuccessful()) {

                            //Dismiss the progress Dialog
                            mLoginDialog.dismiss();


                            //user is registered
                            Toast.makeText(LoginActivity.this, "Welcome to Student Account", Toast.LENGTH_SHORT).show();
                            Intent mainIntent = new Intent(LoginActivity.this, StudentMain.class);
                            startActivity(mainIntent);
                            finish();


                        } else {

                            mLoginDialog.hide();

                            //if user is not registered
                            Toast.makeText(LoginActivity.this, "Cannot Log in Please check the form and try again!", Toast.LENGTH_LONG).show();

                        }

                    }
                });


            }
        });


    }
}
  

Комментарии:

1. Не могли бы вы опубликовать свою структуру базы данных и какую ошибку / вывод вы получили при текущем подходе?

2. я добавляю изображения, теперь проверьте сообщение, пожалуйста

3. Итак, глядя на вашу структуру данных и объяснение, которое вы дали, я думаю, вы просто хотите иметь возможность различать, относится ли это электронное письмо к учителю или нет? Правильно? или есть что-то еще, чего мне не хватает?

4.@SabaNayab Вы должны поместить всех пользователей в одну таблицу, вызываемую user , например, и добавить вызываемый атрибут user_type TEACHER , или STUDENT тогда вы сможете делать то, что хотите, с помощью одного вызова API (запроса), затем, если электронная почта существует, проверьте тип пользователя, иначе пользователь не существует.

5. да @MayurGajra

Ответ №1:

Использование двух разных коллекций, по одной для каждого типа ваших пользователей, не совсем гибкое решение. Другим более простым решением может быть:

 Firestore-root
   |
   --- users (collection)
        |
        --- uid (document)
        |    |
        |    --- email: "student@email.com"
        |    |
        |    --- password: "********"
        |    |
        |    --- type: "student"
        |
        --- uid (document)
             |
             --- email: "teacher@email.com"
             |
             --- password: "********"
             |
             --- type: "teacher"
  

Смотрите, я добавил тип пользователя в качестве свойства вашего пользовательского объекта. Теперь, чтобы получить пользователя на основе адреса электронной почты, пожалуйста, используйте следующие строки кода:

 FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference usersRef = rootRef.collection("users");
Query query = usersRef.whereEqualTo("email", "student@email.com")
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                String email = document.getString("email");
                String password = document.getString("password");
                mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(/* ... */);
            }
        }
    }
});
  

После аутентификации пользователя, чтобы перенаправить пользователя на соответствующее действие, пожалуйста, используйте следующие строки кода:

 String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
usersRef.document(uid).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                String type = document.getString("type");
                if(type.equals("student")) {
                    startActivity(new Intent(MainActivity.this, Student.class));
                } else if (type.equals("teacher")) {
                    startActivity(new Intent(MainActivity.this, Teacher.class));
                }
            }
        }
    }
});
  

Комментарии:

1. если я хочу проверить электронную почту на странице входа в систему, как я могу это сделать в приведенном выше ответе, я должен сначала перенаправить на главную страницу, а затем проверить тип пользователя

2. Сделайте это в два этапа: сначала получите адрес электронной почты и пароль, войдите в систему и перенаправьте обоих на главную страницу, а затем перенаправьте каждого пользователя на нужную страницу.

Ответ №2:

 package com.example.myapplicationomostff

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.annotation.NonNull
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.tasks.OnCompleteListener
import com.google.android.gms.tasks.Task
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.firestore.QueryDocumentSnapshot
import com.google.firebase.firestore.QuerySnapshot
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_registy.*


class MainActivity : AppCompatActivity() {

    var myauth =FirebaseAuth.getInstance()
    var rootRef = FirebaseFirestore.getInstance()
    var usersRef = rootRef.collection("users")






    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btnlogin.setOnClickListener {
            var email =txtemaillogin.text.toString().trim()
            var password =txtpasslogin.text.toString().trim()
            userlogin(email,password)


            }



        btnregistry.setOnClickListener{


            var intent = Intent(this, chose::class.java)
            startActivity(intent)

        }




        }

    private fun userlogin(email: String, password: String) {
        var query = usersRef.whereEqualTo("email",email)
        query.get().addOnCompleteListener { task ->
            if (task.isSuccessful) {
                for (document in task.getResult()!!) {
                    var email1 = document.getString("email").toString()
                    var password1 = document.getString("password").toString()
                    if(password1 == password
                        amp;amp; email1 == email
                    ){
                        myauth.signInWithEmailAndPassword(email1, password1).addOnCompleteListener{
                            if(it.isSuccessful){

                                val uid = FirebaseAuth.getInstance().currentUser?.uid
                                if (uid != null) {
                                    usersRef.document(uid).get().addOnCompleteListener { task ->
                                        if (task.isSuccessful) {
                                            val document = task.result
                                            if (document != null) {
                                                if (document.exists()) {
                                                    val type = document.getString("type")
                                                    if (type == "doc") {
                                                        startActivity(Intent(this@MainActivity,docpage::class.java))
                                                    } else if (type == "eng") {
                                                        startActivity(Intent(this@MainActivity, engpage::class.java))
                                                    }else  if (type=="mos"){
                                                        startActivity(Intent(this@MainActivity, chosepage::class.java))


                                                    }
                                                }
                                            }
                                        }
                                    }
                                }



                                Toast.makeText(this,"ok",Toast.LENGTH_LONG).show()
                            }else{
                                Toast.makeText(this,"erorr",Toast.LENGTH_LONG).show()

                            }
                        }
                    }else{
                        Toast.makeText(this,"مش مسجل ف الموقع ",Toast.LENGTH_LONG).show()


}
  

Комментарии:

1. Отвечая на старый вопрос, ваш ответ был бы гораздо полезнее для других пользователей StackOverflow, если бы вы включили некоторый контекст, чтобы объяснить, как ваш ответ помогает, особенно для вопроса, на который уже есть принятый ответ.