扩展密码登录

This commit is contained in:
rjb
2026-01-26 11:03:36 +08:00
parent 6f1016161b
commit 179f197748
2 changed files with 291 additions and 12 deletions

View File

@@ -3,9 +3,11 @@ package com.ruilaizi.service.main.activity;
import android.os.Bundle; import android.os.Bundle;
import android.os.CountDownTimer; import android.os.CountDownTimer;
import android.text.Html; import android.text.Html;
import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
@@ -22,14 +24,29 @@ import com.ruilaizi.service.main.activity.mvp.presenterImpl.ISmsCodeDialogPresen
import com.ruilaizi.service.main.activity.mvp.presenterImpl.SmsCodeDialogPresenterImpl; import com.ruilaizi.service.main.activity.mvp.presenterImpl.SmsCodeDialogPresenterImpl;
import com.ruilaizi.service.main.kehu.activity.ShowAty; import com.ruilaizi.service.main.kehu.activity.ShowAty;
import com.ruilaizi.service.main.my.entity.loginBean; import com.ruilaizi.service.main.my.entity.loginBean;
import com.ruilaizi.service.network.http.ApiUtils;
import com.ruilaizi.service.network.http.ResponseBean;
import com.ruilaizi.service.okgonet.HttpConstants;
import com.ruilaizi.service.okgonet.NetApi;
import com.ruilaizi.service.utils.JsonUtils;
import com.ruilaizi.service.utils.PhonenNumUtil; import com.ruilaizi.service.utils.PhonenNumUtil;
import com.ruilaizi.service.utils.ToastUtils; import com.ruilaizi.service.utils.ToastUtils;
import com.ruilaizi.service.utils.checkVersionsUtils.ProfileSpUtils; import com.ruilaizi.service.utils.checkVersionsUtils.ProfileSpUtils;
import com.ruilaizi.service.widget.TitleBar; import com.ruilaizi.service.widget.TitleBar;
import com.lzy.okgo.model.HttpParams;
import com.lzy.okgo.model.Response;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
/** /**
* NewCodeLoginActivity * NewCodeLoginActivity
* 类描述:验证码登录页面 * 类描述:验证码登录页面(已扩展密码登录功能)
*/ */
public class NewCodeLoginActivity extends BaseActivity implements ISmsCodeDialogView { public class NewCodeLoginActivity extends BaseActivity implements ISmsCodeDialogView {
@@ -41,6 +58,13 @@ public class NewCodeLoginActivity extends BaseActivity implements ISmsCodeDialog
private View mErrorView; private View mErrorView;
private TextView mPhoneTv, mPhoneTvtwo; private TextView mPhoneTv, mPhoneTvtwo;
private ISmsCodeDialogPresenter mPresenter; private ISmsCodeDialogPresenter mPresenter;
// 密码登录相关
private String loginType = "code"; // "code" 验证码登录, "password" 密码登录
private EditText et_password; // 密码输入框
private LinearLayout ll_password; // 密码输入区域
private LinearLayout ll_code_input; // 验证码输入区域
private TextView tv_switch_login; // 切换登录方式按钮
/** /**
* 验证码倒计时 * 验证码倒计时
@@ -109,10 +133,40 @@ public class NewCodeLoginActivity extends BaseActivity implements ISmsCodeDialog
et_phone = (EditText) findViewById(R.id.et_phone); et_phone = (EditText) findViewById(R.id.et_phone);
validate_code = (EditText) findViewById(R.id.et_register_validate_code); validate_code = (EditText) findViewById(R.id.et_register_validate_code);
validate = (Button) findViewById(R.id.landingPage_register_validate_button); validate = (Button) findViewById(R.id.landingPage_register_validate_button);
// 初始化密码登录相关控件
et_password = (EditText) findViewById(R.id.et_password);
ll_password = (LinearLayout) findViewById(R.id.ll_password);
ll_code_input = (LinearLayout) findViewById(R.id.ll_code_input);
tv_switch_login = (TextView) findViewById(R.id.tv_switch_login);
// 默认显示验证码登录
switchToCodeLogin();
// 切换登录方式按钮
if (tv_switch_login != null) {
tv_switch_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if ("code".equals(loginType)) {
switchToPasswordLogin();
} else {
switchToCodeLogin();
}
}
});
}
//获取验证码 //获取验证码
validate.setOnClickListener(new View.OnClickListener() { validate.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if ("password".equals(loginType)) {
// 密码登录模式下,点击登录按钮
doPasswordLogin();
return;
}
// 验证码登录模式下,获取验证码
boolean mobile = PhonenNumUtil.isMobile(et_phone.getText().toString()); boolean mobile = PhonenNumUtil.isMobile(et_phone.getText().toString());
if (!mobile) { if (!mobile) {
ToastUtils.showToast(NewCodeLoginActivity.this, "输入的手机号不正确!"); ToastUtils.showToast(NewCodeLoginActivity.this, "输入的手机号不正确!");
@@ -128,18 +182,27 @@ public class NewCodeLoginActivity extends BaseActivity implements ISmsCodeDialog
findViewById(R.id.btn_login).setOnClickListener(new View.OnClickListener() { findViewById(R.id.btn_login).setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
// 验证手机号是否已输入 if ("password".equals(loginType)) {
if (mPhone == null || mPhone.isEmpty()) { // 密码登录
ToastUtils.showToast(NewCodeLoginActivity.this, "请先输入手机号并获取验证码!"); doPasswordLogin();
return; } else {
// 验证码登录
// 验证手机号是否已输入
if (mPhone == null || mPhone.isEmpty()) {
mPhone = et_phone.getText().toString();
if (mPhone == null || mPhone.isEmpty()) {
ToastUtils.showToast(NewCodeLoginActivity.this, "请先输入手机号并获取验证码!");
return;
}
}
// 验证验证码是否已输入
String code = validate_code.getText().toString();
if (code == null || code.isEmpty()) {
ToastUtils.showToast(NewCodeLoginActivity.this, "请输入验证码!");
return;
}
commit(code);
} }
// 验证验证码是否已输入
String code = validate_code.getText().toString();
if (code == null || code.isEmpty()) {
ToastUtils.showToast(NewCodeLoginActivity.this, "请输入验证码!");
return;
}
commit(code);
} }
}); });
@@ -252,6 +315,156 @@ public class NewCodeLoginActivity extends BaseActivity implements ISmsCodeDialog
} }
} }
/**
* 切换到验证码登录模式
*/
private void switchToCodeLogin() {
loginType = "code";
if (ll_password != null) {
ll_password.setVisibility(View.GONE);
}
if (ll_code_input != null) {
ll_code_input.setVisibility(View.VISIBLE);
}
if (validate != null) {
validate.setText("获取验证码");
validate.setEnabled(true);
}
if (tv_switch_login != null) {
tv_switch_login.setText("密码登录");
}
if (findViewById(R.id.btn_login) != null) {
((Button) findViewById(R.id.btn_login)).setText("验证登录");
}
// 隐藏验证码相关提示
if (mPhoneTv != null) {
mPhoneTv.setVisibility(View.GONE);
}
if (rl_phone != null) {
rl_phone.setVisibility(View.GONE);
}
if (mResentBtn != null) {
mResentBtn.setVisibility(View.GONE);
}
}
/**
* 切换到密码登录模式
*/
private void switchToPasswordLogin() {
loginType = "password";
if (ll_password != null) {
ll_password.setVisibility(View.VISIBLE);
}
if (ll_code_input != null) {
ll_code_input.setVisibility(View.GONE);
}
if (validate != null) {
validate.setVisibility(View.GONE);
}
if (tv_switch_login != null) {
tv_switch_login.setText("验证码登录");
}
if (findViewById(R.id.btn_login) != null) {
((Button) findViewById(R.id.btn_login)).setText("登录");
}
// 隐藏验证码相关提示
if (mPhoneTv != null) {
mPhoneTv.setVisibility(View.GONE);
}
if (rl_phone != null) {
rl_phone.setVisibility(View.GONE);
}
if (mResentBtn != null) {
mResentBtn.setVisibility(View.GONE);
}
}
/**
* 执行密码登录
*/
private void doPasswordLogin() {
// 验证手机号
String phone = et_phone.getText().toString();
if (TextUtils.isEmpty(phone)) {
ToastUtils.showToast(this, "请输入手机号!");
return;
}
if (!PhonenNumUtil.isMobile(phone)) {
ToastUtils.showToast(this, "输入的手机号不正确!");
return;
}
// 验证密码
String password = "";
if (et_password != null) {
password = et_password.getText().toString();
}
if (TextUtils.isEmpty(password)) {
ToastUtils.showToast(this, "请输入密码!");
return;
}
mPhone = phone;
mErrorView.setVisibility(View.GONE);
mLoading.setVisibility(View.VISIBLE);
// 调用密码登录接口(使用 NetApi与 LoginPasswordPresenterImpl 保持一致)
final HttpParams paramsPost = new HttpParams();
paramsPost.put("username", phone);
paramsPost.put("password", password);
new NetApi().getPostData(paramsPost, HttpConstants.URi_appLogin)
.subscribe(new Observer<Response>() {
@Override
public void onSubscribe(Disposable d) {
// 可以在这里保存 Disposable用于取消请求
}
@Override
public void onNext(Response response) {
mLoading.setVisibility(View.GONE);
try {
String body = (String) response.body();
if (body != null) {
loginBean loginData = JsonUtils.fromJson(body, loginBean.class);
if (loginData != null && loginData.getCode() == 200) {
// 登录成功
ProfileSpUtils.getInstance().saveLoginSatus(true);
ProfileSpUtils.getInstance().saveProfile(loginData);
startActivity(MainActivity.class);
finish();
} else {
String msg = loginData != null ? loginData.getMsg() : "登录失败,请重试";
ToastUtils.showToast(NewCodeLoginActivity.this, msg);
mErrorView.setVisibility(View.VISIBLE);
}
} else {
ToastUtils.showToast(NewCodeLoginActivity.this, "登录失败,服务器无响应");
mErrorView.setVisibility(View.VISIBLE);
}
} catch (Exception e) {
e.printStackTrace();
ToastUtils.showToast(NewCodeLoginActivity.this, "登录失败:" + e.getMessage());
mErrorView.setVisibility(View.VISIBLE);
}
}
@Override
public void onError(Throwable e) {
mLoading.setVisibility(View.GONE);
e.printStackTrace();
ToastUtils.showToast(NewCodeLoginActivity.this, "网络错误:" + e.getMessage());
mErrorView.setVisibility(View.VISIBLE);
}
@Override
public void onComplete() {
// 请求完成
}
});
}
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();

View File

@@ -127,7 +127,9 @@
<!-- 验证码输入区域 -->
<LinearLayout <LinearLayout
android:id="@+id/ll_code_input"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
@@ -174,12 +176,76 @@
android:text="获取验证码" /> android:text="获取验证码" />
</LinearLayout> </LinearLayout>
<!-- 密码输入区域 -->
<LinearLayout
android:id="@+id/ll_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="24dp"
android:text="密码"
android:layout_marginLeft="32dp"
android:textColor="#ff333333"
android:textSize="17sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="10.5dp"
android:layout_marginLeft="32dp">
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:background="@null"
android:textCursorDrawable="@drawable/color_cursor"
android:inputType="textPassword"
android:singleLine="true"
android:textSize="14sp"
android:textColorHint="@color/colorContestBookBtnGray"
android:hint="请输入密码" />
</LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="0.5dp"
android:layout_marginLeft="32dp"
android:layout_marginRight="32dp"
android:layout_marginTop="10dp"
android:background="#E8E8E8"/>
</LinearLayout>
<View <View
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="0.5dp" android:layout_height="0.5dp"
android:layout_marginLeft="32dp" android:layout_marginLeft="32dp"
android:layout_marginRight="32dp" android:layout_marginRight="32dp"
android:background="#E8E8E8"/> android:background="#E8E8E8"/>
<!-- 切换登录方式按钮 -->
<TextView
android:id="@+id/tv_switch_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:layout_marginLeft="32dp"
android:text="密码登录"
android:textColor="#0078ff"
android:textSize="14sp"
android:clickable="true"
android:focusable="true" />
<ProgressBar <ProgressBar
android:id="@+id/loading" android:id="@+id/loading"