实现登录和注册功能

master
fangshicai 3 years ago
parent b426f30ead
commit bcf9360497

@ -12,6 +12,6 @@
</deviceKey>
</Target>
</targetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2022-06-09T08:12:58.562036Z" />
<timeTargetWasSelectedWithDropDown value="2022-06-15T13:04:33.385030900Z" />
</component>
</project>

@ -10,7 +10,7 @@
<entry key="..\:/andriod/Android_Couser_Design/app/src/main/res/drawable/ic_visibility_black_24dp.xml" value="0.1345" />
<entry key="..\:/andriod/Android_Couser_Design/app/src/main/res/drawable/ic_visibility_off_black_24dp.xml" value="0.1345" />
<entry key="..\:/andriod/Android_Couser_Design/app/src/main/res/layout/activity_detail.xml" value="0.11354166666666667" />
<entry key="..\:/andriod/Android_Couser_Design/app/src/main/res/layout/activity_login.xml" value="0.16799999999999998" />
<entry key="..\:/andriod/Android_Couser_Design/app/src/main/res/layout/activity_login.xml" value="0.2" />
<entry key="..\:/andriod/Android_Couser_Design/app/src/main/res/layout/activity_main.xml" value="0.1" />
</map>
</option>

@ -51,4 +51,12 @@ dependencies {
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
// Gson
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
//lombok
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
//material3
implementation 'com.google.android.material:material:1.5.0'
}

@ -7,6 +7,19 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 允许联网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取GSM2g、WCDMA联通3g等网络状态的信息 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 获取wifi网络状态的信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 保持CPU 运转,屏幕和键盘灯有可能是关闭的,用于文件上传和下载 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- 获取sd卡写的权限用于文件上传和下载 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许读取手机状态 用于创建BmobInstallation -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"

@ -3,25 +3,6 @@ package com.android;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.android.bean.ResponseData;
import com.android.bean.User;
import com.android.model.LoginListener;
import com.android.model.LoginModel;
import com.android.model.LoginModelImpl;
import com.android.model.longinHttp_Interface;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity{
@Override

@ -8,14 +8,14 @@ import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.R;
import com.android.bean.ResponseData;
import com.android.bean.User;
import com.android.model.LoginListener;
import com.android.model.LoginModel;
import com.android.model.LoginModelImpl;
import com.android.model.login.LoginListener;
import com.android.model.login.LoginModel;
import com.android.model.login.LoginModelImpl;
import com.android.utils.watcher.MyWatcher;
public class LoginActivity extends AppCompatActivity implements LoginListener, View.OnClickListener {
private static final String TAG ="LoginActivity";
@ -24,6 +24,8 @@ public class LoginActivity extends AppCompatActivity implements LoginListener, V
private EditText etPwd;
private EditText etAccount;
private Button LoginButton;
private Button getVerificationCode;
private Button RegisterButton;
private String account;
private String password;
@ -39,35 +41,59 @@ public class LoginActivity extends AppCompatActivity implements LoginListener, V
etPwd = findViewById(R.id.et_pwd);
etAccount = findViewById(R.id.et_acc);
getVerificationCode = findViewById(R.id.bt_getCode);
LoginButton = findViewById(R.id.bt_login);
RegisterButton = findViewById(R.id.bt_register);
//监视手机号格式 注册监听在里面
etAccount.addTextChangedListener(new MyWatcher(getVerificationCode,RegisterButton,this));
//获取验证码按钮
getVerificationCode.setOnClickListener(this);
//登录按钮
LoginButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
account = etAccount.getText().toString();
password = etPwd.getText().toString();
loginModel.longin(account,password,this);
switch (v.getId()){
case R.id.bt_getCode:
loginModel.sendVerifyCode(account,this);
Log.e("TAG","验证码");break;
case R.id.bt_login:Log.e("TAG","登录");
password = etPwd.getText().toString();
loginModel.longin(account,password,this);
break;
case R.id.bt_register:
password = etPwd.getText().toString();
loginModel.registerUser(account,password,this);
break;
}
}
@Override
public void onSuccess(ResponseData<User> responseData) {
public void onLoginSuccess(ResponseData<User> responseData) {
this.responseData = responseData;
login();
}
private void login() {
if(responseData.getCode() == 200){
Intent intent = new Intent(LoginActivity.this,HomePageActivity.class);
startActivity(intent);
}else {
Toast.makeText(LoginActivity.this,"账号或密码错误",Toast.LENGTH_SHORT);
}
@Override
public void onGetCodeSuccess(ResponseData<String> responseData) {
Log.e(TAG,"onGetCodeSuccess"+responseData.getCode());
}
@Override
public void onRejisterSuccess(ResponseData<String> responseData) {
Log.e(TAG,"onRejisterSuccess"+responseData.getCode());
}
@ -75,4 +101,13 @@ public class LoginActivity extends AppCompatActivity implements LoginListener, V
public void onError() {
}
private void login() {
if(responseData.getCode() == 200){
Intent intent = new Intent(LoginActivity.this,HomePageActivity.class);
startActivity(intent);
}else {
Log.e("login",responseData.getMsg());
}
}
}

@ -1,10 +1,24 @@
package com.android.bean;
import com.google.gson.annotations.SerializedName;
import java.util.Objects;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
public class User {
@SerializedName("id")
private Integer id;
private String password;
private String userName;
private String code;
private String phone;
private String avatar;
private String appKey;
private Integer money;
public Integer getId() {
return id;
@ -14,14 +28,6 @@ public class User {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
@ -29,4 +35,44 @@ public class User {
public void setUserName(String userName) {
this.userName = userName;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getAppKey() {
return appKey;
}
public void setAppKey(String appKey) {
this.appKey = appKey;
}
public Integer getMoney() {
return money;
}
public void setMoney(Integer money) {
this.money = money;
}
}

@ -1,10 +0,0 @@
package com.android.model;
import com.android.bean.ResponseData;
import com.android.bean.User;
public interface LoginListener {
void onSuccess(ResponseData<User> responseData);
void onError();
}

@ -1,5 +0,0 @@
package com.android.model;
public interface LoginModel {
void longin(String account,String password,LoginListener loginListener);
}

@ -1,60 +0,0 @@
package com.android.model;
import android.util.Log;
import android.view.View;
import com.android.bean.ResponseData;
import com.android.bean.User;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class LoginModelImpl implements LoginModel{
private final static String TAG = "LoginModelImpl";
@Override
public void longin(String account,String password,final LoginListener loginListener) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://47.107.52.7:88/member/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build();
longinHttp_Interface request = retrofit.create(longinHttp_Interface.class);
Observable<ResponseData<User>> observable =
request.getObservableTest(password, account);
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseData<User>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull ResponseData<User> userResponseData) {
loginListener.onSuccess(userResponseData);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}

@ -0,0 +1,14 @@
package com.android.model.login;
import com.android.bean.ResponseData;
import com.android.bean.User;
public interface LoginListener {
void onLoginSuccess(ResponseData<User> responseData);
void onGetCodeSuccess(ResponseData<String> responseData);
void onRejisterSuccess(ResponseData<String> responseData);
void onError();
}

@ -0,0 +1,8 @@
package com.android.model.login;
public interface LoginModel {
void longin(String account,String password,LoginListener loginListener);
void sendVerifyCode(String phoneNumber,LoginListener loginListener);
void registerUser(String phoneNumber,String code,LoginListener loginListener);
}

@ -0,0 +1,158 @@
package com.android.model.login;
import android.util.Log;
import com.android.bean.ResponseData;
import com.android.bean.User;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class LoginModelImpl implements LoginModel{
private final static String TAG = "LoginModelImpl";
/**
*
* @param account
* @param phoneCode
* @param loginListener
*/
@Override
public void longin(String account,String phoneCode,final LoginListener loginListener) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://47.107.52.7:88/member/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build();
longinHttp_Interface request = retrofit.create(longinHttp_Interface.class);
User user = new User();
user.setCode(phoneCode);
user.setPhone(account);
Log.e("TAG",phoneCode);
Log.e("TAG",account);
Observable<ResponseData<User>> observable = request.login(user);
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseData<User>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull ResponseData<User> userResponseData) {
loginListener.onLoginSuccess(userResponseData);
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("onError",e.toString());
}
@Override
public void onComplete() {
}
});
}
/**
*
* @param phoneNumber
*/
@Override
public void sendVerifyCode(String phoneNumber,final LoginListener loginListener) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://47.107.52.7:88/member/")
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
longinHttp_Interface httpInterface = retrofit.create(longinHttp_Interface.class);
Observable<ResponseData<String>> observable = httpInterface.sendCode(phoneNumber);
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseData<String>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull ResponseData<String> stringResponseData) {
loginListener.onGetCodeSuccess(stringResponseData);
}
@Override
public void onError(@NonNull Throwable e) {
Log.d(TAG,"error");
}
@Override
public void onComplete() {
}
});
}
/**
*
* @param phoneNumber
* @param code
*/
@Override
public void registerUser(String phoneNumber, String code,final LoginListener loginListener) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://47.107.52.7:88/member/")
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
longinHttp_Interface httpInterface = retrofit.create(longinHttp_Interface.class);
User user = new User();
user.setPhone(phoneNumber);
user.setCode(code);
Observable<ResponseData<String>> observable = httpInterface.register(user);
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseData<String>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull ResponseData<String> stringResponseData) {
loginListener.onRejisterSuccess(stringResponseData);
Log.e(TAG,"注册成功");
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}

@ -0,0 +1,38 @@
package com.android.model.login;
import com.android.bean.ResponseData;
import com.android.bean.User;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
/*
"http://47.107.52.7:88/member/photo/user/login?password=123456&username=fangshicai"
*/
public interface longinHttp_Interface {
//登录
@POST("tran/user/login")
@Headers({"appId:b34ac21286ae45938add627b418a4871",
"appSecret:67526def9de11d4a64f5e80e60ed3372eea69"})
Observable<ResponseData<User>> login(@Body User user);
//获取验证码
@GET("tran/user/send")
@Headers({"appId:b34ac21286ae45938add627b418a4871",
"appSecret:67526def9de11d4a64f5e80e60ed3372eea69"})
Observable<ResponseData<String>> sendCode(@Query("phone") String phone);
@POST("tran/user/register")
@Headers({"appId:b34ac21286ae45938add627b418a4871",
"appSecret:67526def9de11d4a64f5e80e60ed3372eea69"})
Observable<ResponseData<String>> register(@Body User user);
}

@ -1,39 +0,0 @@
package com.android.model;
import com.android.bean.ResponseData;
import com.android.bean.User;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
/*
"http://47.107.52.7:88/member/photo/user/login?password=123456&username=fangshicai"
*/
public interface longinHttp_Interface {
@GET("demo/login")
// @FormUrlEncoded
@Headers({"appId:46351c5d3fdd44a084167c7186772a2e","appSecret:21671c3772dd71d3340f3ae77355421aa335f"})
Call<ResponseData<User>> service(@Query("password") String password
, @Query("username") String username
);
@POST("demo/create")
// @FormUrlEncoded
@Headers({"appId:46351c5d3fdd44a084167c7186772a2e","appSecret:21671c3772dd71d3340f3ae77355421aa335f"})
Call<ResponseData<String>> rejest(@Body User user);
@GET("demo/login")
@Headers({"appId:46351c5d3fdd44a084167c7186772a2e","appSecret:21671c3772dd71d3340f3ae77355421aa335f"})
Observable<ResponseData<User>> getObservableTest(@Query("password") String password
, @Query("username") String username
);
}

@ -0,0 +1,44 @@
package com.android.utils.watcher;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.Button;
import com.android.activity.LoginActivity;
public class MyWatcher implements TextWatcher {
private Button getVerificationCode,registerButton;
private LoginActivity loginActivity;
public MyWatcher() {
}
public MyWatcher(Button getVerificationCode, Button registerButton, LoginActivity loginActivity) {
this.getVerificationCode = getVerificationCode;
this.registerButton = registerButton;
this.loginActivity = loginActivity;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//当号码大于11位时显示按钮
if(s.length()>=11){
getVerificationCode.setEnabled(true);
//注册按钮
registerButton.setOnClickListener(loginActivity);
}
}
@Override
public void afterTextChanged(Editable s) {
}
}

@ -5,30 +5,78 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.LoginActivity">
<EditText
android:id="@+id/et_acc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:layout_marginLeft="12dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/et_acc"
android:hint="账号"/>
<EditText
android:id="@+id/et_pwd"
android:hint="请输入手机号"/>
<RelativeLayout
android:id="@+id/login_layout"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:layout_marginLeft="12dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_acc"
android:hint="密码"/>
<Button
android:id="@+id/bt_login"
app:layout_constraintTop_toBottomOf="@+id/et_acc">
<EditText
android:id="@+id/et_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_alignBaseline="@id/bt_getCode"
android:hint="请输入验证码"/>
<Button
android:id="@+id/bt_getCode"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_gravity="center"
android:enabled="false"
android:text="获取验证码"
android:textSize="16sp" />
</RelativeLayout>
<RelativeLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_pwd"
android:hint="密码"/>
app:layout_constraintTop_toBottomOf="@id/login_layout"
>
<Button
android:id="@+id/bt_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录"
android:textSize="24sp"
android:layout_marginEnd="240dp"
style="?attr/materialButtonOutlinedStyle"
/>
<Button
android:id="@+id/bt_register"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="注册"
android:textSize="24sp"
android:layout_marginStart="240dp"
style="?attr/materialButtonOutlinedStyle"
/>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Loading…
Cancel
Save