فهرست منبع

登录与注册

詹子聪 5 سال پیش
والد
کامیت
8f8d5d89fc
26فایلهای تغییر یافته به همراه1076 افزوده شده و 11 حذف شده
  1. 2 0
      app/build.gradle
  2. 1 1
      app/src/main/AndroidManifest.xml
  3. 1 1
      app/src/main/java/com/miekir/ym/base/ApiService.java
  4. 1 1
      app/src/main/java/com/miekir/ym/tool/DataTool.java
  5. 42 0
      app/src/main/java/com/miekir/ym/tool/MD5Tool.java
  6. 74 0
      app/src/main/java/com/miekir/ym/tool/StringTool.java
  7. 3 3
      app/src/main/java/com/miekir/ym/ui/MainActivity.kt
  8. 1 1
      app/src/main/java/com/miekir/ym/ui/coupon/CouponAdapter.java
  9. 1 1
      app/src/main/java/com/miekir/ym/ui/coupon/CouponBean.java
  10. 1 1
      app/src/main/java/com/miekir/ym/ui/coupon/CouponFragment.java
  11. 1 1
      app/src/main/java/com/miekir/ym/ui/coupon/CouponPresenter.java
  12. 1 1
      app/src/main/java/com/miekir/ym/ui/coupon/ICouponView.java
  13. 16 0
      app/src/main/java/com/miekir/ym/ui/home/login/ILoginView.java
  14. 135 0
      app/src/main/java/com/miekir/ym/ui/home/login/LoginActivity.java
  15. 49 0
      app/src/main/java/com/miekir/ym/ui/home/login/LoginPresenter.java
  16. 45 0
      app/src/main/java/com/miekir/ym/ui/home/register/CodePresenter.java
  17. 18 0
      app/src/main/java/com/miekir/ym/ui/home/register/ICodeView.java
  18. 158 0
      app/src/main/java/com/miekir/ym/ui/home/register/RegisterActivity.java
  19. 94 0
      app/src/main/java/com/miekir/ym/ui/home/register/fill/FillDataActivity.java
  20. 16 0
      app/src/main/java/com/miekir/ym/ui/home/register/fill/IRegisterView.java
  21. 57 0
      app/src/main/java/com/miekir/ym/ui/home/register/fill/RegisterPresenter.java
  22. 22 0
      app/src/main/res/drawable-v21/selector_btn.xml
  23. 113 0
      app/src/main/res/layout/activity_fill_data.xml
  24. 97 0
      app/src/main/res/layout/activity_login.xml
  25. 118 0
      app/src/main/res/layout/activity_register.xml
  26. 9 0
      app/src/main/res/menu/menu_done.xml

+ 2 - 0
app/build.gradle

@@ -65,6 +65,8 @@ dependencies {
     // 动态权限申请firefly1126/android_permission_aspectjx
     compile 'com.firefly1126.permissionaspect:permissionaspect:1.0.1'
 
+    implementation "com.github.VictorAlbertos:RxActivityResult:0.4.5-2.x"
+
     // 适配器
     implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50'
     implementation 'com.google.android.material:material:1.1.0'

+ 1 - 1
app/src/main/AndroidManifest.xml

@@ -16,7 +16,7 @@
         android:requestLegacyExternalStorage="true"
         android:networkSecurityConfig="@xml/network"
         android:name=".YangApplication">
-        <activity android:name=".ui.MainActivity"
+        <activity android:name=".ui.home.MainActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:screenOrientation="portrait"
             android:theme="@style/AppTheme">

+ 1 - 1
app/src/main/java/com/miekir/ym/base/ApiService.java

@@ -4,7 +4,7 @@ package com.miekir.ym.base;
 
 import com.miekir.network.base.BaseResponse;
 import com.miekir.ym.bean.BeiUser;
-import com.miekir.ym.ui.coupon.CouponBean;
+import com.miekir.ym.ui.home.coupon.CouponBean;
 
 import java.util.List;
 import java.util.Map;

+ 1 - 1
app/src/main/java/com/miekir/ym/tool/DataTool.java

@@ -2,7 +2,7 @@ package com.miekir.ym.tool;
 
 
 import com.miekir.ym.constant.ConstantUrl;
-import com.miekir.ym.ui.coupon.CouponBean;
+import com.miekir.ym.ui.home.coupon.CouponBean;
 
 import java.util.ArrayList;
 import java.util.List;

+ 42 - 0
app/src/main/java/com/miekir/ym/tool/MD5Tool.java

@@ -0,0 +1,42 @@
+package com.miekir.ym.tool;
+
+
+import java.nio.charset.Charset;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/8/7 18:37
+ * Description: md5工具
+ */
+public class MD5Tool {
+    private MD5Tool(){}
+
+    /**
+     * 将字符串转成MD5值
+     * @param string
+     * @return
+     */
+    public static String stringToMD5(String string) {
+        byte[] hash;
+        try {
+            hash = MessageDigest.getInstance("MD5").digest(string.getBytes(Charset.forName("UTF-8")));
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            return null;
+        }
+
+        StringBuilder hex = new StringBuilder(hash.length * 2);
+        for (byte b : hash) {
+            if ((b & 0xFF) < 0x10) {
+                hex.append(0);
+            }
+            hex.append(Integer.toHexString(b & 0xFF));
+        }
+        return hex.toString();
+    }
+
+}

+ 74 - 0
app/src/main/java/com/miekir/ym/tool/StringTool.java

@@ -0,0 +1,74 @@
+package com.miekir.ym.tool;
+
+import android.text.TextUtils;
+import android.util.Base64;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.nio.charset.StandardCharsets;
+import java.text.DecimalFormat;
+
+/**
+ *
+ *
+ * @author Miekir
+ * @date 2020/7/11 21:59
+ * Description: 字符串相关工具
+ */
+public class StringTool {
+    private StringTool() {}
+
+    private static final DecimalFormat FORMAT_TWO = new DecimalFormat("#.00");
+    public static String getShowMoney(double number) {
+        return FORMAT_TWO.format(number);
+    }
+
+    public static String getEncodeString(String rawString) {
+        String base64String = Base64.encodeToString(rawString.getBytes(StandardCharsets.UTF_8), Base64.NO_WRAP);
+        StringBuilder stringBuffer = new StringBuilder(base64String);
+        if (base64String.length() > 0) {
+            stringBuffer.setCharAt(base64String.length()/2, 's');
+        }
+        String base64Reverse = stringBuffer.reverse().toString();
+        return MD5Tool.stringToMD5(base64Reverse);
+    }
+
+    /**
+     * 分转元,保留2位小数
+     * @return
+     */
+    public static String longCent2Yuan(long cent) {
+        BigDecimal centDecimal = BigDecimal.valueOf(cent);
+        BigDecimal exchangeNum = BigDecimal.valueOf(100);
+        BigDecimal yuanDecimal = centDecimal.divide(exchangeNum, 2, RoundingMode.UNNECESSARY);
+        return yuanDecimal.toPlainString();
+    }
+
+    public static String getNumberString(long number) {
+        if (number > 100000) {
+            return "10w+";
+        }
+
+        if (number > 10000) {
+            return "1w+";
+        }
+
+        if (number > 1000) {
+            return "1k+";
+        }
+
+        return String.valueOf(number);
+    }
+
+    public static String getMixToken(String token) {
+        if (TextUtils.isEmpty(token) || token.length() < 2) {
+            return token;
+        }
+        int len = token.length();
+        char[] tokenArray = token.toCharArray();
+        char temp = tokenArray[len-2];
+        tokenArray[len-2] = tokenArray[len-1];
+        tokenArray[len-1] = temp;
+        return new String(tokenArray);
+    }
+}

+ 3 - 3
app/src/main/java/com/miekir/ym/ui/MainActivity.kt

@@ -1,4 +1,4 @@
-package com.miekir.ym.ui
+package com.miekir.ym.ui.home
 
 import android.os.Bundle
 import androidx.fragment.app.Fragment
@@ -8,8 +8,8 @@ import com.miekir.ym.R
 import com.miekir.ym.base.YangActivity
 import com.miekir.ym.listener.AppbarTranslateListener
 import com.miekir.ym.listener.ITopActionListener
-import com.miekir.ym.ui.coupon.CouponBean
-import com.miekir.ym.ui.coupon.CouponFragment
+import com.miekir.ym.ui.home.coupon.CouponBean
+import com.miekir.ym.ui.home.coupon.CouponFragment
 import kotlinx.android.synthetic.main.activity_main.*
 import java.util.*
 

+ 1 - 1
app/src/main/java/com/miekir/ym/ui/coupon/CouponAdapter.java

@@ -1,4 +1,4 @@
-package com.miekir.ym.ui.coupon;
+package com.miekir.ym.ui.home.coupon;
 
 import android.app.Activity;
 import android.content.Context;

+ 1 - 1
app/src/main/java/com/miekir/ym/ui/coupon/CouponBean.java

@@ -1,4 +1,4 @@
-package com.miekir.ym.ui.coupon;
+package com.miekir.ym.ui.home.coupon;
 
 import com.miekir.ym.constant.ConstantUrl;
 

+ 1 - 1
app/src/main/java/com/miekir/ym/ui/coupon/CouponFragment.java

@@ -1,4 +1,4 @@
-package com.miekir.ym.ui.coupon;
+package com.miekir.ym.ui.home.coupon;
 
 import android.content.DialogInterface;
 

+ 1 - 1
app/src/main/java/com/miekir/ym/ui/coupon/CouponPresenter.java

@@ -1,4 +1,4 @@
-package com.miekir.ym.ui.coupon;
+package com.miekir.ym.ui.home.coupon;
 
 import android.text.TextUtils;
 

+ 1 - 1
app/src/main/java/com/miekir/ym/ui/coupon/ICouponView.java

@@ -1,4 +1,4 @@
-package com.miekir.ym.ui.coupon;
+package com.miekir.ym.ui.home.coupon;
 
 import com.miekir.mvp.view.IView;
 

+ 16 - 0
app/src/main/java/com/miekir/ym/ui/home/login/ILoginView.java

@@ -0,0 +1,16 @@
+package com.miekir.ym.ui.home.login;
+
+import com.miekir.mvp.view.IView;
+import com.miekir.ym.bean.BeiUser;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/8/2 10:29
+ * Description: 获取验证码的回调
+ */
+public interface ILoginView extends IView {
+
+    void onLoginResult(BeiUser user, String message);
+}

+ 135 - 0
app/src/main/java/com/miekir/ym/ui/home/login/LoginActivity.java

@@ -0,0 +1,135 @@
+package com.miekir.ym.ui.home.login;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.material.textfield.TextInputEditText;
+
+import com.miekir.common.utils.ToastTool;
+import com.miekir.common.utils.ViewTool;
+import com.miekir.mvp.presenter.InjectPresenter;
+import com.miekir.ym.R;
+import com.miekir.ym.base.YangActivity;
+import com.miekir.ym.bean.BeiUser;
+import com.miekir.ym.manager.UserInfoManager;
+import com.miekir.ym.tool.StringTool;
+import com.miekir.ym.ui.home.register.RegisterActivity;
+
+import rx_activity_result2.RxActivityResult;
+
+
+/**
+ * @author Miekir
+ * @date 2020/6/18 16:48
+ * Description: 登录界面
+ */
+public class LoginActivity extends YangActivity implements View.OnClickListener, ILoginView {
+    private TextInputEditText et_email;
+    private TextInputEditText et_password;
+
+    @InjectPresenter
+    LoginPresenter presenter;
+
+    @Override
+    public int getLayoutId() {
+        return R.layout.activity_login;
+    }
+
+    @Override
+    public void initViews(Bundle savedInstanceState) {
+        setTitle("使用电子邮箱登录");
+        et_email = findViewById(R.id.et_email);
+        et_password = findViewById(R.id.et_password);
+        ViewTool.setOnClickListener(this, this, new int[]{R.id.btn_login, R.id.tv_forget});
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.menu_done, menu);
+        MenuItem item = menu.findItem(R.id.action_done);
+        item.setTitle("  注册账号  ");
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.action_done:
+                // 注册
+                Intent registerIntent = new Intent(this, RegisterActivity.class);
+                RxActivityResult.on(this).startIntent(registerIntent)
+                        .filter(result -> result.resultCode() == RESULT_OK)
+                        .doOnNext(result -> {
+                            // 注册成功之后关闭登录界面
+                            ToastTool.showShort("注册成功");
+                            //startActivity(new Intent(LoginActivity.this, MineActivity.class));
+                            finish();
+                        })
+                        .subscribe();
+                break;
+            default:
+                break;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.tv_forget:
+                // 忘记密码
+//                Intent forgetIntent = new Intent(this, ForgetActivity.class);
+//                RxActivityResult.on(this).startIntent(forgetIntent)
+//                        .filter(result -> result.resultCode() == RESULT_OK)
+//                        .doOnNext(result -> {
+//                            // 找回密码成功之后关闭登录界面
+//                            //startActivity(new Intent(LoginActivity.this, MineActivity.class));
+//                            finish();
+//                        })
+//                        .subscribe();
+                break;
+
+            case R.id.btn_login:
+                String email = et_email.getEditableText().toString();
+                String password = et_password.getEditableText().toString();
+                if (TextUtils.isEmpty(email)) {
+                    ToastTool.showShort("邮箱不能为空");
+                    return;
+                }
+                if (TextUtils.isEmpty(password)) {
+                    ToastTool.showShort("密码不能为空");
+                    return;
+                }
+
+                password = StringTool.getEncodeString(password);
+                if (TextUtils.isEmpty(password)) {
+                    ToastTool.showShort("该手机不支持加密算法");
+                    return;
+                }
+                showLoading();
+                presenter.submitLogin(email, password);
+                break;
+            default:
+                break;
+        }
+    }
+
+    @Override
+    public void onLoginResult(BeiUser user, String message) {
+        hideLoading();
+        if (user != null) {
+            UserInfoManager.getInstance().setBeiUser(user);
+            ToastTool.showShort("登录成功");
+            //startActivity(new Intent(this, MineActivity.class));
+            finish();
+        } else {
+            ToastTool.showShort(message);
+        }
+    }
+}

+ 49 - 0
app/src/main/java/com/miekir/ym/ui/home/login/LoginPresenter.java

@@ -0,0 +1,49 @@
+package com.miekir.ym.ui.home.login;
+
+import android.text.TextUtils;
+
+import com.miekir.mvp.presenter.BasePresenter;
+import com.miekir.network.RetrofitHelper;
+import com.miekir.network.widget.observe.MvpObserver;
+import com.miekir.network.widget.observe.NetMvpObserver;
+import com.miekir.ym.base.ApiService;
+import com.miekir.ym.bean.BeiUser;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * @author Miekir
+ * @date 2020/7/9 20:54
+ * Description: 商品的相关数据接口处理
+ */
+public class LoginPresenter extends BasePresenter<ILoginView> {
+
+    public void submitLogin(String email, String password) {
+        NetMvpObserver<BeiUser> observer = new NetMvpObserver<BeiUser>(this) {
+            @Override
+            public void onSuccess(int code, BeiUser beiUser) {
+                post(view -> view.onLoginResult(beiUser, null));
+            }
+
+            @Override
+            public void onFailure(int code, Throwable e, String errMsg) {
+                post(view -> view.onLoginResult(null, TextUtils.isEmpty(errMsg) ? "登录失败" : errMsg));
+            }
+        };
+
+        RetrofitHelper.getInstance()
+                .getRequestApi(ApiService.class)
+                .submitLogin(email, password)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(observer);
+
+        mProgressDisposableList.add(observer);
+    }
+
+    @Override
+    public void onInit() {
+
+    }
+}

+ 45 - 0
app/src/main/java/com/miekir/ym/ui/home/register/CodePresenter.java

@@ -0,0 +1,45 @@
+package com.miekir.ym.ui.home.register;
+
+import com.miekir.mvp.presenter.BasePresenter;
+import com.miekir.network.RetrofitHelper;
+import com.miekir.network.widget.observe.NetMvpObserver;
+import com.miekir.ym.base.ApiService;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * @author Miekir
+ * @date 2020/7/9 20:54
+ * Description: 商品的相关数据接口处理
+ */
+public class CodePresenter extends BasePresenter<ICodeView> {
+
+    public void getCode(String email) {
+        NetMvpObserver<Boolean> observer = new NetMvpObserver<Boolean>(this) {
+            @Override
+            public void onSuccess(int code, Boolean result) {
+                post(view -> view.onGetCode(result, null));
+            }
+
+            @Override
+            public void onFailure(int code, Throwable e, String errMsg) {
+                post(view -> view.onGetCode(false, errMsg));
+            }
+        };
+
+        RetrofitHelper.getInstance()
+                .getRequestApi(ApiService.class)
+                .getCode(email)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(observer);
+
+        mProgressDisposableList.add(observer);
+    }
+
+    @Override
+    public void onInit() {
+
+    }
+}

+ 18 - 0
app/src/main/java/com/miekir/ym/ui/home/register/ICodeView.java

@@ -0,0 +1,18 @@
+package com.miekir.ym.ui.home.register;
+
+import com.miekir.mvp.view.IView;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/8/2 10:29
+ * Description: 获取验证码的回调
+ */
+public interface ICodeView extends IView {
+    /**
+     *
+     * @param isSuccess 是否成功
+     */
+    void onGetCode(boolean isSuccess, String message);
+}

+ 158 - 0
app/src/main/java/com/miekir/ym/ui/home/register/RegisterActivity.java

@@ -0,0 +1,158 @@
+package com.miekir.ym.ui.home.register;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.material.textfield.TextInputEditText;
+import com.miekir.common.utils.ToastTool;
+import com.miekir.common.utils.ViewTool;
+import com.miekir.mvp.presenter.InjectPresenter;
+import com.miekir.ym.R;
+import com.miekir.ym.base.YangActivity;
+
+import java.lang.ref.WeakReference;
+
+import rx_activity_result2.RxActivityResult;
+
+/**
+ * @author Miekir
+ * @date 2020/6/18 16:48
+ * Description: 登录界面
+ */
+public class RegisterActivity extends YangActivity implements View.OnClickListener, ICodeView {
+    public static final String KEY_EMAIL = "email";
+    public static final String KEY_CODE = "code";
+
+    private TextInputEditText et_email;
+    private TextInputEditText et_code;
+    private Button btn_get_code;
+
+    private String email;
+    private String code;
+
+    @InjectPresenter
+    CodePresenter presenter;
+
+    /**验证码倒计时*/
+    private static final int MSG_TIME = 0;
+    private static final int TIME_GET_PERIOD = 61;
+    private int mRestTime = TIME_GET_PERIOD;
+    private static class TimeHandler extends Handler {
+        private WeakReference<RegisterActivity> weakReference;
+        public TimeHandler(RegisterActivity activity) {
+            weakReference = new WeakReference<>(activity);
+        }
+
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            super.handleMessage(msg);
+            RegisterActivity activity = weakReference.get();
+            if (activity == null) {
+                return;
+            }
+            activity.mRestTime -= 1;
+            if (activity.mRestTime == 0) {
+                activity.btn_get_code.setText("获取验证码");
+                activity.btn_get_code.setEnabled(true);
+                activity.mRestTime = TIME_GET_PERIOD;
+            } else {
+                activity.btn_get_code.setText("重新获取(" + activity.mRestTime + "S)");
+                activity.mTimeHandler.sendEmptyMessageDelayed(MSG_TIME, 1000);
+            }
+        }
+    }
+    private Handler mTimeHandler = new TimeHandler(this);
+
+    @Override
+    public int getLayoutId() {
+        return R.layout.activity_register;
+    }
+
+    @Override
+    public void initViews(Bundle savedInstanceState) {
+        setTitle("使用电子邮箱注册");
+        ViewTool.setOnClickListener(this, this, new int[]{R.id.btn_get_code, R.id.btn_next});
+        et_email = findViewById(R.id.et_email);
+        et_code = findViewById(R.id.et_code);
+        btn_get_code = findViewById(R.id.btn_get_code);
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.btn_next:
+                // 完善资料
+                email = et_email.getEditableText().toString();
+                if (TextUtils.isEmpty(email)) {
+                    ToastTool.showShort("邮箱不能为空");
+                    return;
+                }
+
+                if (!email.contains("@")) {
+                    ToastTool.showShort("请输入合法的邮箱");
+                    return;
+                }
+
+                code = et_code.getEditableText().toString();
+                if (TextUtils.isEmpty(code)) {
+                    ToastTool.showShort("验证码不能为空");
+                    return;
+                }
+
+//                Intent fillDataIntent = new Intent(this, FillDataActivity.class);
+//                fillDataIntent.putExtra(KEY_EMAIL, email);
+//                fillDataIntent.putExtra(KEY_CODE, code);
+//                RxActivityResult.on(this).startIntent(fillDataIntent)
+//                        .filter(result -> result.resultCode() == RESULT_OK)
+//                        .doOnNext(result -> {
+//                            // 注册成功之后关闭登录界面
+//                            setResult(RESULT_OK);
+//                            finish();
+//                        })
+//                        .subscribe();
+                break;
+
+            case R.id.btn_get_code:
+                // 获取验证码
+                email = et_email.getEditableText().toString();
+                if (TextUtils.isEmpty(email)) {
+                    ToastTool.showShort("邮箱不能为空");
+                    return;
+                }
+                showLoading();
+                presenter.getCode(email);
+                break;
+            default:
+                break;
+        }
+    }
+
+    @Override
+    public void onGetCode(boolean isSuccess, String message) {
+        hideLoading();
+        if (isSuccess) {
+            ToastTool.showShort("验证码发送成功");
+            btn_get_code.setEnabled(false);
+            mTimeHandler.sendEmptyMessage(MSG_TIME);
+        } else {
+            if (TextUtils.isEmpty(message)) {
+                ToastTool.showShort("验证码发送失败");
+            } else {
+                ToastTool.showShort(message);
+            }
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mTimeHandler.removeMessages(MSG_TIME);
+    }
+}

+ 94 - 0
app/src/main/java/com/miekir/ym/ui/home/register/fill/FillDataActivity.java

@@ -0,0 +1,94 @@
+package com.miekir.ym.ui.home.register.fill;
+
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import com.google.android.material.textfield.TextInputEditText;
+import com.miekir.common.utils.ToastTool;
+import com.miekir.mvp.presenter.InjectPresenter;
+import com.miekir.ym.R;
+import com.miekir.ym.base.YangActivity;
+import com.miekir.ym.bean.BeiUser;
+import com.miekir.ym.manager.UserInfoManager;
+import com.miekir.ym.tool.StringTool;
+import com.miekir.ym.ui.home.register.RegisterActivity;
+
+/**
+ * @author Miekir
+ * @date 2020/6/18 16:48
+ * Description: 完善资料界面
+ */
+public class FillDataActivity extends YangActivity implements IRegisterView {
+    private TextInputEditText et_password;
+    private TextInputEditText et_nickname;
+    private TextInputEditText et_cash_account;
+
+    private BeiUser mBeiUser;
+    private String email;
+    private String code;
+
+    @InjectPresenter
+    RegisterPresenter presenter;
+
+    @Override
+    public int getLayoutId() {
+        return R.layout.activity_fill_data;
+    }
+
+    @Override
+    public void initViews(Bundle savedInstanceState) {
+        setTitle("完善提现资料");
+        et_password = findViewById(R.id.et_password);
+        et_nickname = findViewById(R.id.et_nickname);
+        et_cash_account = findViewById(R.id.et_cash_account);
+        email = getIntent().getStringExtra(RegisterActivity.KEY_EMAIL);
+        code = getIntent().getStringExtra(RegisterActivity.KEY_CODE);
+        findViewById(R.id.btn_finish).setOnClickListener(v -> {
+            submitRegister();
+        });
+    }
+
+    private void submitRegister() {
+        String password = et_password.getEditableText().toString();
+        String nickname = et_nickname.getEditableText().toString();
+        String cashAccount = et_cash_account.getEditableText().toString();
+        if (TextUtils.isEmpty(password)) {
+            ToastTool.showShort("请输入密码");
+            return;
+        }
+        if (TextUtils.isEmpty(nickname)) {
+            ToastTool.showShort("请输入昵称");
+            return;
+        }
+        if (TextUtils.isEmpty(cashAccount)) {
+            ToastTool.showShort("请输入提现账号");
+            return;
+        }
+
+        String encodeString = StringTool.getEncodeString(password);
+        if (TextUtils.isEmpty(encodeString)) {
+            ToastTool.showShort("该手机不支持加密算法");
+            return;
+        }
+        mBeiUser = new BeiUser();
+        mBeiUser.email = email;
+        mBeiUser.password = encodeString;
+        mBeiUser.nickName = nickname;
+        mBeiUser.cashAccount = cashAccount;
+        showLoading();
+        presenter.submitRegister(mBeiUser, code);
+    }
+
+    @Override
+    public void onRegisterResult(BeiUser user, String message) {
+        hideLoading();
+        if (user != null) {
+            // 保存到本地
+            UserInfoManager.getInstance().setBeiUser(user);
+            setResult(RESULT_OK);
+            finish();
+        } else {
+            ToastTool.showShort(message);
+        }
+    }
+}

+ 16 - 0
app/src/main/java/com/miekir/ym/ui/home/register/fill/IRegisterView.java

@@ -0,0 +1,16 @@
+package com.miekir.ym.ui.home.register.fill;
+
+import com.miekir.mvp.view.IView;
+import com.miekir.ym.bean.BeiUser;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/8/2 10:29
+ * Description: 注册的回调
+ */
+public interface IRegisterView extends IView {
+
+    void onRegisterResult(BeiUser user, String message);
+}

+ 57 - 0
app/src/main/java/com/miekir/ym/ui/home/register/fill/RegisterPresenter.java

@@ -0,0 +1,57 @@
+package com.miekir.ym.ui.home.register.fill;
+
+import android.text.TextUtils;
+
+import com.miekir.mvp.presenter.BasePresenter;
+import com.miekir.network.RetrofitHelper;
+import com.miekir.network.widget.observe.NetMvpObserver;
+import com.miekir.ym.base.ApiService;
+import com.miekir.ym.bean.BeiUser;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * @author Miekir
+ * @date 2020/7/9 20:54
+ * Description: 商品的相关数据接口处理
+ */
+public class RegisterPresenter extends BasePresenter<IRegisterView> {
+
+    public void submitRegister(BeiUser user, String code) {
+        NetMvpObserver<BeiUser> observer = new NetMvpObserver<BeiUser>(this) {
+            @Override
+            public void onSuccess(int code, BeiUser result) {
+                post(view -> view.onRegisterResult(result, null));
+            }
+
+            @Override
+            public void onFailure(int code, Throwable e, String errMsg) {
+                post(view -> view.onRegisterResult(null, TextUtils.isEmpty(errMsg) ? "注册失败" : errMsg));
+            }
+        };
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("email", user.email);
+        map.put("code", code);
+        map.put("password", user.password);
+        map.put("nickname", user.nickName);
+        map.put("cashAccount", user.cashAccount);
+        RetrofitHelper.getInstance()
+                .getRequestApi(ApiService.class)
+                .submitRegister(map)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(observer);
+
+        mProgressDisposableList.add(observer);
+    }
+
+    @Override
+    public void onInit() {
+
+    }
+}

+ 22 - 0
app/src/main/res/drawable-v21/selector_btn.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true">
+        <shape android:shape="rectangle">
+            <corners android:radius="@dimen/margin_ss"/>
+            <solid android:color="@color/green_pressed"/>
+        </shape>
+    </item>
+
+    <!--<item android:state_enabled="false">
+        <shape android:shape="rectangle">
+            <corners android:radius="@dimen/margin_ss"/>
+            <solid android:color="@color/green_logo"/>
+        </shape>
+    </item>-->
+    <item>
+        <shape android:shape="rectangle">
+            <corners android:radius="@dimen/margin_ss"/>
+            <solid android:color="@color/green_logo"/>
+        </shape>
+    </item>
+</selector>

+ 113 - 0
app/src/main/res/layout/activity_fill_data.xml

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/colorPrimary"
+    android:fitsSystemWindows="true"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
+    android:orientation="vertical">
+    <!--启用深色模式之后,需要使用fitsSystemWindows来不让布局上滑-->
+
+    <include layout="@layout/view_toolbar" />
+    <!--阴影效果android:background="?android:attr/listDivider"-->
+
+
+    <com.google.android.material.textfield.TextInputLayout
+        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/margin_default"
+        android:layout_marginTop="@dimen/margin_default"
+        android:layout_marginEnd="@dimen/margin_default"
+        android:hint="请设置密码"
+        app:boxBackgroundMode="outline"
+        app:boxCornerRadiusBottomEnd="4dp"
+        app:boxCornerRadiusBottomStart="4dp"
+        app:boxCornerRadiusTopEnd="4dp"
+        app:boxCornerRadiusTopStart="4dp"
+        app:boxStrokeWidth="@dimen/width_stroke"
+        app:boxStrokeWidthFocused="@dimen/width_stroke">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:id="@+id/et_password"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textPassword"
+            android:maxLength="20"
+            android:textSize="@dimen/text_normal_s" />
+
+    </com.google.android.material.textfield.TextInputLayout>
+
+
+    <com.google.android.material.textfield.TextInputLayout
+        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/margin_default"
+        android:layout_marginTop="@dimen/margin_default"
+        android:layout_marginEnd="@dimen/margin_default"
+        android:hint="请输入昵称"
+        app:boxBackgroundMode="outline"
+        app:boxCornerRadiusBottomEnd="4dp"
+        app:boxCornerRadiusBottomStart="4dp"
+        app:boxCornerRadiusTopEnd="4dp"
+        app:boxCornerRadiusTopStart="4dp"
+        app:boxStrokeWidth="@dimen/width_stroke"
+        app:boxStrokeWidthFocused="@dimen/width_stroke">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:id="@+id/et_nickname"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:inputType="text"
+            android:maxLength="12"
+            android:textSize="@dimen/text_normal_s" />
+    </com.google.android.material.textfield.TextInputLayout>
+
+    <com.google.android.material.textfield.TextInputLayout
+        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/margin_default"
+        android:layout_marginTop="@dimen/margin_default"
+        android:layout_marginEnd="@dimen/margin_default"
+        android:hint="请输入提现账号(目前仅支持支付宝)"
+        app:boxBackgroundMode="outline"
+        app:boxCornerRadiusBottomEnd="4dp"
+        app:boxCornerRadiusBottomStart="4dp"
+        app:boxCornerRadiusTopEnd="4dp"
+        app:boxCornerRadiusTopStart="4dp"
+        app:boxStrokeWidth="@dimen/width_stroke"
+        app:boxStrokeWidthFocused="@dimen/width_stroke">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:id="@+id/et_cash_account"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:inputType="numberDecimal"
+            android:digits="0123456789"
+            android:maxLength="11"
+            android:textSize="@dimen/text_normal_s" />
+    </com.google.android.material.textfield.TextInputLayout>
+
+    <android.widget.Button
+        android:id="@+id/btn_finish"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="0dp"
+        android:layout_marginTop="@dimen/margin_default"
+        android:layout_marginStart="@dimen/margin_default"
+        android:layout_marginEnd="@dimen/margin_default"
+        android:paddingTop="@dimen/padding_full_width"
+        android:paddingBottom="@dimen/padding_full_width"
+        android:text="完成注册  轻松购物"
+        android:textColor="@color/white"
+        android:textStyle="bold"
+        android:background="@drawable/selector_btn"
+        style="?android:attr/borderlessButtonStyle"/>
+
+
+
+</LinearLayout>

+ 97 - 0
app/src/main/res/layout/activity_login.xml

@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/colorPrimary"
+    android:fitsSystemWindows="true"
+    android:orientation="vertical"
+    android:focusable="true"
+    android:focusableInTouchMode="true">
+    <!--启用深色模式之后,需要使用fitsSystemWindows来不让布局上滑-->
+
+    <include layout="@layout/view_toolbar" />
+    <!--阴影效果android:background="?android:attr/listDivider"-->
+
+    <com.google.android.material.textfield.TextInputLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/margin_default"
+        android:layout_marginEnd="@dimen/margin_default"
+        android:layout_marginTop="@dimen/margin_default"
+        android:hint="请输入邮箱"
+        app:boxBackgroundMode="outline"
+        app:boxCornerRadiusBottomEnd="4dp"
+        app:boxCornerRadiusBottomStart="4dp"
+        app:boxCornerRadiusTopEnd="4dp"
+        app:boxCornerRadiusTopStart="4dp"
+        app:boxStrokeWidth="@dimen/width_stroke"
+        app:boxStrokeWidthFocused="@dimen/width_stroke"
+        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:id="@+id/et_email"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textSize="@dimen/text_normal_s"
+            android:inputType="textEmailAddress"
+            android:maxLength="50"/>
+    </com.google.android.material.textfield.TextInputLayout>
+
+
+    <com.google.android.material.textfield.TextInputLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/margin_default"
+        android:layout_marginEnd="@dimen/margin_default"
+        android:layout_marginTop="@dimen/margin_default"
+        android:hint="请输入密码"
+        app:boxBackgroundMode="outline"
+        app:boxCornerRadiusBottomEnd="4dp"
+        app:boxCornerRadiusBottomStart="4dp"
+        app:boxCornerRadiusTopEnd="4dp"
+        app:boxCornerRadiusTopStart="4dp"
+        app:boxStrokeWidth="@dimen/width_stroke"
+        app:boxStrokeWidthFocused="@dimen/width_stroke"
+        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:id="@+id/et_password"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textPassword"
+            android:maxLength="20"
+            android:textSize="@dimen/text_normal_s"/>
+
+    </com.google.android.material.textfield.TextInputLayout>
+
+    <TextView
+        android:id="@+id/tv_forget"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/margin_message"
+        android:layout_marginEnd="@dimen/margin_default"
+        android:text="忘记密码"
+        android:textColor="@color/gray_hint"
+        android:textStyle="bold"
+        android:textSize="@dimen/text_s"
+        android:background="?attr/selectableItemBackground"
+        android:layout_gravity="end"/>
+
+    <android.widget.Button
+        android:id="@+id/btn_login"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="0dp"
+        android:layout_marginTop="@dimen/margin_message"
+        android:layout_marginStart="@dimen/margin_default"
+        android:layout_marginEnd="@dimen/margin_default"
+        android:paddingTop="@dimen/padding_full_width"
+        android:paddingBottom="@dimen/padding_full_width"
+        android:text="立即登录  轻松购物"
+        android:textColor="@color/white"
+        android:textStyle="bold"
+        android:background="@drawable/selector_btn"
+        style="?android:attr/borderlessButtonStyle"/>
+
+</LinearLayout>

+ 118 - 0
app/src/main/res/layout/activity_register.xml

@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/colorPrimary"
+    android:fitsSystemWindows="true"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
+    android:orientation="vertical">
+    <!--启用深色模式之后,需要使用fitsSystemWindows来不让布局上滑-->
+
+    <include layout="@layout/view_toolbar" />
+    <!--阴影效果android:background="?android:attr/listDivider"-->
+
+
+    <com.google.android.material.textfield.TextInputLayout
+        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/margin_default"
+        android:layout_marginTop="@dimen/margin_default"
+        android:layout_marginEnd="@dimen/margin_default"
+        android:hint="请输入邮箱"
+        app:boxBackgroundMode="outline"
+        app:boxCornerRadiusBottomEnd="4dp"
+        app:boxCornerRadiusBottomStart="4dp"
+        app:boxCornerRadiusTopEnd="4dp"
+        app:boxCornerRadiusTopStart="4dp"
+        app:boxStrokeWidth="@dimen/width_stroke"
+        app:boxStrokeWidthFocused="@dimen/width_stroke">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:id="@+id/et_email"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textEmailAddress"
+            android:maxLength="50"
+            android:textSize="@dimen/text_normal_s" />
+    </com.google.android.material.textfield.TextInputLayout>
+
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/margin_default"
+        android:layout_marginTop="@dimen/margin_default"
+        android:layout_marginEnd="@dimen/margin_default">
+
+        <com.google.android.material.textfield.TextInputLayout
+            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+            android:layout_width="match_parent"
+
+            android:layout_height="wrap_content"
+            android:hint="请输入邮箱验证码"
+            android:orientation="horizontal"
+            app:boxBackgroundMode="outline"
+            app:boxCornerRadiusBottomEnd="4dp"
+            app:boxCornerRadiusBottomStart="4dp"
+            app:boxCornerRadiusTopEnd="4dp"
+            app:boxCornerRadiusTopStart="4dp"
+            app:boxStrokeWidth="@dimen/width_stroke"
+            app:boxStrokeWidthFocused="@dimen/width_stroke">
+
+            <com.google.android.material.textfield.TextInputEditText
+                android:id="@+id/et_code"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:digits="0123456789"
+                android:inputType="number"
+                android:maxLength="6"
+                android:textSize="@dimen/text_normal_s" />
+
+        </com.google.android.material.textfield.TextInputLayout>
+
+        <!--去除按钮阴影style="?android:attr/borderlessButtonStyle"-->
+        <!--用android.widget.Button代替Button就不会有Material风格了,当前style下Button的background无效-->
+        <android.widget.Button
+            android:id="@+id/btn_get_code"
+            style="?android:attr/borderlessButtonStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical|end"
+            android:elevation="0dp"
+            android:layout_marginTop="@dimen/margin_sss"
+            android:layout_marginEnd="@dimen/margin_ss"
+            android:minWidth="0dp"
+            android:minHeight="0dp"
+            android:paddingStart="@dimen/margin_s"
+            android:paddingTop="@dimen/margin_ss"
+            android:paddingEnd="@dimen/margin_s"
+            android:paddingBottom="@dimen/margin_ss"
+            android:text="获取验证码"
+            android:textColor="@color/green_logo"
+            android:textSize="@dimen/text_s"
+            android:textStyle="bold"
+            android:background="?selectableItemBackground"/>
+    </FrameLayout>
+
+    <android.widget.Button
+        android:id="@+id/btn_next"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="0dp"
+        android:layout_marginTop="@dimen/margin_default"
+        android:layout_marginStart="@dimen/margin_default"
+        android:layout_marginEnd="@dimen/margin_default"
+        android:paddingTop="@dimen/padding_full_width"
+        android:paddingBottom="@dimen/padding_full_width"
+        android:text="下一步  完善提现信息"
+        android:textColor="@color/white"
+        android:textStyle="bold"
+        android:background="@drawable/selector_btn"
+        style="?android:attr/borderlessButtonStyle"/>
+
+
+
+</LinearLayout>

+ 9 - 0
app/src/main/res/menu/menu_done.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item
+        android:id="@+id/action_done"
+        android:orderInCategory="100"
+        android:title="  完成  "
+        app:showAsAction="ifRoom" />
+</menu>