Browse Source

整理项目文件
修改Log日志框架

liukai 2 years ago
commit
5c22107fe8
100 changed files with 4770 additions and 0 deletions
  1. 94 0
      .gitignore
  2. 3 0
      README.md
  3. 1 0
      app/.gitignore
  4. 20 0
      app/build.gradle
  5. 3 0
      app/multidex-config.pro
  6. 208 0
      app/proguard-rules.pro
  7. 24 0
      app/src/androidTest/java/com/guadou/kt_zoom/ExampleInstrumentedTest.kt
  8. 37 0
      app/src/main/AndroidManifest.xml
  9. 67 0
      app/src/main/java/com/hongyegroup/zhurijob/app/MyApplication.kt
  10. 33 0
      app/src/main/java/com/hongyegroup/zhurijob/di/ApplicationModule.kt
  11. 34 0
      app/src/main/java/com/hongyegroup/zhurijob/router/AppComponentServiceImpl.kt
  12. 64 0
      app/src/main/java/com/hongyegroup/zhurijob/ui/SplashActivity.kt
  13. BIN
      app/src/main/res/drawable-xhdpi/splash_center_blue_logo.webp
  14. 11 0
      app/src/main/res/drawable/layer_start_window.xml
  15. 30 0
      app/src/main/res/layout/activity_splash.xml
  16. 4 0
      app/src/main/res/values/colors.xml
  17. 5 0
      app/src/main/res/values/strings.xml
  18. 16 0
      app/src/main/res/values/style.xml
  19. 17 0
      app/src/test/java/com/guadou/kt_zoom/ExampleUnitTest.kt
  20. 62 0
      build.gradle
  21. 23 0
      config.gradle
  22. 1 0
      cpt_auth/.gitignore
  23. 5 0
      cpt_auth/build.gradle
  24. 21 0
      cpt_auth/proguard-rules.pro
  25. 26 0
      cpt_auth/src/androidTest/java/com/hongyegroup/cpt_auth/ExampleInstrumentedTest.java
  26. 17 0
      cpt_auth/src/main/AndroidManifest.xml
  27. 18 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/bean/Book.java
  28. 10 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/bean/Pencil.java
  29. 25 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/di/AuthDIModel.kt
  30. 9 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/http/AuthApiService.kt
  31. 12 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/http/AuthRetrofit.kt
  32. 11 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/repository/DemoRepository.kt
  33. 11 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/repository/SchoolRepository.kt
  34. 9 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/state/LoginViewState.kt
  35. 18 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/vm/UserForgotViewModel.kt
  36. 86 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/vm/UserLoginViewModel.kt
  37. 34 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/vm/UserRegisterViewModel.kt
  38. 20 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/router/AuthComponentServiceImpl.kt
  39. 76 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/ui/UserForgotActivity.kt
  40. 161 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/ui/UserLoginActivity.kt
  41. 117 0
      cpt_auth/src/main/java/com/hongyegroup/cpt_auth/ui/UserRegisterActivity.kt
  42. BIN
      cpt_auth/src/main/res/drawable-xhdpi/auth_login_top_img.webp
  43. BIN
      cpt_auth/src/main/res/drawable-xxhdpi/auth_login_logo.webp
  44. BIN
      cpt_auth/src/main/res/drawable-xxhdpi/auth_login_passcode_icon.webp
  45. BIN
      cpt_auth/src/main/res/drawable-xxhdpi/auth_login_password_icon.webp
  46. BIN
      cpt_auth/src/main/res/drawable-xxhdpi/auth_login_qq_icon.webp
  47. BIN
      cpt_auth/src/main/res/drawable-xxhdpi/auth_login_wechat_icon.webp
  48. BIN
      cpt_auth/src/main/res/drawable-xxhdpi/auth_login_xuxian.webp
  49. 214 0
      cpt_auth/src/main/res/layout/activity_user_forgot.xml
  50. 418 0
      cpt_auth/src/main/res/layout/activity_user_login.xml
  51. 251 0
      cpt_auth/src/main/res/layout/activity_user_register.xml
  52. 17 0
      cpt_auth/src/test/java/com/hongyegroup/cpt_auth/ExampleUnitTest.java
  53. 1 0
      cpt_ewallet/.gitignore
  54. 5 0
      cpt_ewallet/build.gradle
  55. 21 0
      cpt_ewallet/proguard-rules.pro
  56. 26 0
      cpt_ewallet/src/androidTest/java/com/hongyegroup/cpt_main/ExampleInstrumentedTest.java
  57. 29 0
      cpt_ewallet/src/main/AndroidManifest.xml
  58. 8 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/bean/BankCardBean.java
  59. 10 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/bean/WalletHistoryBean.java
  60. 136 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletHistoryViewModel.kt
  61. 13 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletMainViewModel.kt
  62. 89 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletSalaryCardViewModel.kt
  63. 16 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletWithdrawalViewModel.kt
  64. 16 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/SalaryAddOneViewModel.kt
  65. 16 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/SalaryAddThreeViewModel.kt
  66. 16 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/SalaryAddTwoViewModel.kt
  67. 13 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/WithdrawalSuccessViewModel.kt
  68. 16 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/WithdrawalVerifyViewModel.kt
  69. 26 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/router/EWalletComponentServiceImpl.kt
  70. 181 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletHistoryActivity.kt
  71. 55 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletMainFragment.kt
  72. 139 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletSalaryCardActivity.kt
  73. 85 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletWithdrawalActivity.kt
  74. 77 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/SalaryCardAddStepOneActivity.kt
  75. 99 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/SalaryCardAddStepThreeActivity.kt
  76. 71 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/SalaryCardAddStepTwoActivity.kt
  77. 51 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/WithdrawalSuccessActivity.kt
  78. 94 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/WithdrawalVerifyActivity.kt
  79. 94 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/widget/ChooseBankCardPopup.kt
  80. BIN
      cpt_ewallet/src/main/res/drawable-xhdpi/jsyh.webp
  81. BIN
      cpt_ewallet/src/main/res/drawable-xhdpi/step_selected_icon.webp
  82. BIN
      cpt_ewallet/src/main/res/drawable-xhdpi/step_unselected_icon.webp
  83. BIN
      cpt_ewallet/src/main/res/drawable-xhdpi/wallet_salary_card_add_icon.webp
  84. BIN
      cpt_ewallet/src/main/res/drawable-xhdpi/wallet_salary_card_icon.webp
  85. BIN
      cpt_ewallet/src/main/res/drawable-xhdpi/wallet_transtion_history_icon.webp
  86. BIN
      cpt_ewallet/src/main/res/drawable-xhdpi/wallet_withdrawal_success.webp
  87. BIN
      cpt_ewallet/src/main/res/drawable-xxhdpi/wallet_salary_card_add_icon.webp
  88. BIN
      cpt_ewallet/src/main/res/drawable-xxhdpi/wallet_salary_card_icon.webp
  89. BIN
      cpt_ewallet/src/main/res/drawable-xxhdpi/wallet_transtion_history_icon.webp
  90. BIN
      cpt_ewallet/src/main/res/drawable-xxhdpi/wallet_withdrawal_success.webp
  91. 10 0
      cpt_ewallet/src/main/res/drawable/shape_salary_card_top_yellow.xml
  92. 10 0
      cpt_ewallet/src/main/res/drawable/shape_salary_card_unbind_border.xml
  93. 110 0
      cpt_ewallet/src/main/res/layout/activity_ewallet_history.xml
  94. 53 0
      cpt_ewallet/src/main/res/layout/activity_ewallet_salarycard.xml
  95. 161 0
      cpt_ewallet/src/main/res/layout/activity_ewallet_withdrawal.xml
  96. 189 0
      cpt_ewallet/src/main/res/layout/activity_salary_card_add_one.xml
  97. 144 0
      cpt_ewallet/src/main/res/layout/activity_salary_card_add_three.xml
  98. 190 0
      cpt_ewallet/src/main/res/layout/activity_salary_card_add_two.xml
  99. 157 0
      cpt_ewallet/src/main/res/layout/activity_withdrawal_success.xml
  100. 0 0
      cpt_ewallet/src/main/res/layout/activity_withdrawal_verify.xml

+ 94 - 0
.gitignore

@@ -0,0 +1,94 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches/build_file_checksums.ser
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+proguardMapping.txt
+
+# ---> Android
+# Built application files
+*.apk
+*.ap_
+
+# Files for the Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# ---> JetBrains
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
+
+*.iml
+
+## Directory-based project format:
+.idea/
+# if you remove the above rule, at least ignore the following:
+
+# User-specific stuff:
+# .idea/workspace.xml
+# .idea/tasks.xml
+# .idea/dictionaries
+
+# Sensitive or high-churn files:
+# .idea/dataSources.ids
+# .idea/dataSources.xml
+# .idea/sqlDataSources.xml
+# .idea/dynamic.xml
+# .idea/uiDesigner.xml
+
+# Gradle:
+# .idea/gradle.xml
+# .idea/libraries
+
+# Mongo Explorer plugin:
+# .idea/mongoSettings.xml
+
+## File-based project format:
+*.ipr
+*.iws
+
+## Plugin-specific files:
+
+# IntelliJ
+/out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties

+ 3 - 0
README.md

@@ -0,0 +1,3 @@
+# YYCircle_CN_Android
+
+YYCircle中国版

+ 1 - 0
app/.gitignore

@@ -0,0 +1 @@
+/build

+ 20 - 0
app/build.gradle

@@ -0,0 +1,20 @@
+apply from: "../runing_default_config.gradle"
+
+//apply plugin: 'com.didiglobal.booster'
+
+android {
+    defaultConfig {
+        versionCode 100
+        versionName "1.0.0"
+        applicationId "com.hongyegroup.zhurijob"
+    }
+}
+
+dependencies {
+    //依赖模块
+    implementation project(':cs_cptServices')
+    implementation project(':cpt_auth')
+    implementation project(':cpt_main')
+    implementation project(':cpt_parttime')
+    implementation project(':cpt_ewallet')
+}

+ 3 - 0
app/multidex-config.pro

@@ -0,0 +1,3 @@
+#Dex的自定义规则
+-keep class com.guadou.lib_baselib.base.BaseApplication
+-keep class com.hongyegroup.zhurijob.app.MyApplication

+ 208 - 0
app/proguard-rules.pro

@@ -0,0 +1,208 @@
+
+#---------------------------------基本指令区----------------------------------
+-optimizationpasses 5
+-dontusemixedcaseclassnames
+-dontskipnonpubliclibraryclasses
+-dontskipnonpubliclibraryclassmembers
+-dontpreverify
+-verbose
+-printmapping proguardMapping.txt
+-optimizations !code/simplification/cast,!field/*,!class/merging/*
+-keepattributes *Annotation*,InnerClasses
+-keepattributes Signature
+-keepattributes SourceFile,LineNumberTable
+#---------------------------------默认保留区---------------------------------
+-keep public class * extends android.app.Activity
+-keep public class * extends android.app.Application
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+-keep public class * extends android.view.View
+-keep class android.support.** {*;}
+-keepclasseswithmembernames class * {
+    native <methods>;
+}
+-keepclassmembers class * extends android.app.Activity{
+    public void *(android.view.View);
+}
+-keepclassmembers enum * {
+    public static **[] values();
+    public static ** valueOf(java.lang.String);
+}
+-keep public class * extends android.view.View{
+    *** get*();
+    void set*(***);
+    public <init>(android.content.Context);
+    public <init>(android.content.Context, android.util.AttributeSet);
+    public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+-keepclasseswithmembers class * {
+    public <init>(android.content.Context, android.util.AttributeSet);
+    public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+-keep class * implements android.os.Parcelable {
+  public static final android.os.Parcelable$Creator *;
+}
+-keepclassmembers class * implements java.io.Serializable {
+    static final long serialVersionUID;
+    private static final java.io.ObjectStreamField[] serialPersistentFields;
+    private void writeObject(java.io.ObjectOutputStream);
+    private void readObject(java.io.ObjectInputStream);
+    java.lang.Object writeReplace();
+    java.lang.Object readResolve();
+}
+# ActionBarSherlock
+-keep class android.support.** { *; }
+-keep interface android.support.** { *; }
+-keep class com.actionbarsherlock.** { *; }
+-keep interface com.actionbarsherlock.** { *; }
+# Keep line numbers to alleviate debugging stack traces
+-renamesourcefileattribute SourceFile
+
+-keep class **.R$* {
+ *;
+}
+
+-ignorewarnings
+
+-keep class * {
+    public private *;
+}
+
+-keepclassmembers class * {
+    void *(**On*Event);
+}
+
+-keep class * implements com.guadou.lib_baselib.base.mvi.BaseViewState
+
+#----------------------------------------------------------------------------
+
+#---------------------------------1.实体类---------------------------------
+
+-keep class com.guadou.kt_zoom.bean.** { *; }
+-keep class com.guadou.lib_baselib.bean.** { *; }
+
+
+#--------------------------------第三方混淆--------------------------------------------
+# OkHttp3
+-dontwarn okhttp3.logging.**
+-keep class okhttp3.internal.**{*;}
+-dontwarn okio.**
+
+#glide
+-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
+  **[] $VALUES;
+  public *;
+}
+
+# Gson
+-keepattributes *Annotation*
+-keepattributes Signature
+-dontwarn sun.misc.**
+-keep class com.google.gson.stream.** { *; }
+-keep class com.google.gson.examples.android.model.** { *; }
+-keep class * implements com.google.gson.TypeAdapterFactory
+-keep class * implements com.google.gson.JsonSerializer
+-keep class * implements com.google.gson.JsonDeserializer
+
+# Retrofit
+-dontwarn retrofit2.**
+-keep class retrofit2.** { *; }
+-keepattributes Signature
+-keepattributes Exceptions
+# converters and adapters. 是否要注释
+-keepclassmembernames,allowobfuscation interface * {
+    @retrofit2.http.* <methods>;
+}
+-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
+
+
+#Retrofit+rxjava+rxandroid+gson+okhttp
+-dontwarn javax.annotation.**
+-dontwarn javax.inject.**
+
+#AndPermission
+-dontwarn com.yanzhenjie.permission.**
+
+#激光推送
+-dontoptimize
+-dontpreverify
+-dontwarn cn.jpush.**
+-keep class cn.jpush.** { *; }
+
+#okhttp
+-dontwarn okhttp3.**
+-keep class okhttp3.**{*;}
+
+#okio
+-dontwarn okio.**
+-keep class okio.**{*;}
+
+#brvah
+-keep class com.chad.library.adapter.** {
+*;
+}
+-keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter
+-keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder
+-keepclassmembers  class **$** extends com.chad.library.adapter.base.viewholder.BaseViewHolder {
+     <init>(...);
+}
+
+
+#==================其他==========================
+
+-dontwarn com.google.**
+-keep class com.google.gson.** {*;}
+-keep class com.google.protobuf.** {*;}
+
+-keep class com.google.gson.examples.android.model.** { *; }
+-keep class * implements com.google.gson.TypeAdapterFactory
+-keep class * implements com.google.gson.JsonSerializer
+-keep class * implements com.google.gson.JsonDeserializer
+
+#Gson容错处理
+-keep class com.ke.gson.** { *; }
+
+##腾讯系列
+#-keep class com.tencent.** { *; }
+
+
+#LiveBus
+-dontwarn com.jeremyliao.liveeventbus.**
+-keep class com.jeremyliao.liveeventbus.** { *; }
+-keep class androidx.lifecycle.** { *; }
+-keep class androidx.arch.core.** { *; }
+
+
+# Rules for Kotlin Coroutines
+-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
+-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
+-keepnames class kotlinx.coroutines.android.AndroidExceptionPreHandler {}
+-keepnames class kotlinx.coroutines.android.AndroidDispatcherFactory {}
+
+-keepclassmembernames class kotlinx.** {
+    volatile <fields>;
+}
+
+
+#PictureSelector 2.0
+-keep class com.luck.picture.lib.** { *; }
+#Ucrop
+-dontwarn com.yalantis.ucrop**
+-keep class com.yalantis.ucrop** { *; }
+-keep interface com.yalantis.ucrop** { *; }
+#Okio
+-dontwarn org.codehaus.mojo.animal_sniffer.*
+
+
+#ARouter
+-keep public class com.alibaba.android.arouter.routes.**{*;}
+-keep public class com.alibaba.android.arouter.facade.**{*;}
+-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
+# 如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口
+-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
+# 如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现
+# -keep class * implements com.alibaba.android.arouter.facade.template.IProvider
+

+ 24 - 0
app/src/androidTest/java/com/guadou/kt_zoom/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.guadou.kt_zoom
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+    @Test
+    fun useAppContext() {
+        // Context of the app under test.
+        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+        assertEquals("com.guadou.kt_zoom", appContext.packageName)
+    }
+}

+ 37 - 0
app/src/main/AndroidManifest.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.hongyegroup.zhurijob"
+    tools:ignore="GoogleAppIndexingWarning">
+
+    <uses-permission android:name="android.permission.CAMERA" />
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
+
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+
+    <application
+        android:name="com.hongyegroup.zhurijob.app.MyApplication"
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+
+        <activity
+            android:name="com.hongyegroup.zhurijob.ui.SplashActivity"
+            android:exported="true"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme_welcome">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+
+        </activity>
+
+    </application>
+
+</manifest>

+ 67 - 0
app/src/main/java/com/hongyegroup/zhurijob/app/MyApplication.kt

@@ -0,0 +1,67 @@
+package com.hongyegroup.zhurijob.app
+
+import android.app.ActivityManager
+import android.content.Context
+import android.os.Build
+import android.os.Process
+import android.webkit.WebView
+import com.guadou.cs_cptservices.YYConstants
+import com.guadou.lib_baselib.base.BaseApplication
+import com.guadou.lib_baselib.ext.SP
+import com.guadou.lib_baselib.ext.checkEmpty
+import dagger.hilt.android.HiltAndroidApp
+
+@HiltAndroidApp
+class MyApplication : BaseApplication() {
+
+    override fun onCreate() {
+        super.onCreate()
+
+//        initBugly()
+
+        //WebView的兼容
+        setupWebView()
+
+        //设置全局的一些常量与状态
+        setupState()
+    }
+
+    private fun setupState() {
+
+        val isLogin = !SP().getString(YYConstants.SP_KEY_TOKEN, "").checkEmpty()
+        setUserIsLogin(isLogin)
+
+    }
+
+    //兼容Android-P
+    private fun setupWebView() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            val processName = getProcessName(this)
+            if ("com.monstarlab.yyjobs" != processName) {
+                WebView.setDataDirectorySuffix(processName ?: "app")
+            }
+        }
+    }
+
+    //获取当前的进程名称
+    private fun getProcessName(context: Context?): String? {
+        if (context == null) return ""
+        val manager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+        for (processInfo in manager.runningAppProcesses) {
+            if (processInfo.pid == Process.myPid()) {
+                return processInfo.processName
+            }
+        }
+        return ""
+    }
+
+    /**
+     * 初始化Bugly,捕获到异常信息上传到Bugly平台
+     */
+//    private fun initBugly() {
+//
+//        CrashReport.initCrashReport(applicationContext, "afcd34c05f", true)
+//
+//    }
+
+}

+ 33 - 0
app/src/main/java/com/hongyegroup/zhurijob/di/ApplicationModule.kt

@@ -0,0 +1,33 @@
+package com.hongyegroup.zhurijob.di
+
+import android.app.Application
+import com.google.gson.Gson
+import com.hjq.gson.factory.GsonFactory
+import com.hongyegroup.zhurijob.app.MyApplication
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+/**
+ * 全局的DI注入
+ */
+@Module
+@InstallIn(SingletonComponent::class)
+class ApplicationModule {
+
+    //如果是自己定义的MyApplication,通过一个Module向下转型
+    @Provides
+    fun provideMyApplication(application: Application): MyApplication {
+        return application as MyApplication
+    }
+
+    //全局的Gson  使用框架进行容错处理
+    @Provides
+    @Singleton
+    fun provideGson(): Gson {
+        return GsonFactory.getSingletonGson()
+    }
+
+}

+ 34 - 0
app/src/main/java/com/hongyegroup/zhurijob/router/AppComponentServiceImpl.kt

@@ -0,0 +1,34 @@
+package com.hongyegroup.zhurijob.router
+
+import android.app.Activity
+import android.content.Context
+import com.alibaba.android.arouter.facade.annotation.Route
+import com.guadou.cs_router.ARouterPath
+import com.guadou.cs_router.app.IAppComponentServer
+import com.guadou.lib_baselib.utils.log.YYLogUtils
+
+@Route(path = ARouterPath.PATH_SERVICE_APP, name = "App模块路由服务")
+class AppComponentServiceImpl : IAppComponentServer {
+
+    override fun initSMS(): IAppComponentServer {
+        return this
+    }
+
+    override fun sendSMSCode(
+        activity: Activity, phone: String, sendAction: ((isSuccess: Boolean) -> Unit)?, verifyAction: ((isSuccess: Boolean) -> Unit)?
+    ) {
+
+    }
+
+    override fun verifySMSCode(activity: Activity, code: String, verifyAction: ((isSuccess: Boolean) -> Unit)?) {
+
+    }
+
+    override fun gotoLoginPage() {
+        YYLogUtils.w("AppComponentServiceImpl-gotoLoginPage()")
+    }
+
+    override fun init(context: Context?) {
+        YYLogUtils.w("AppComponentServiceImpl-init")
+    }
+}

+ 64 - 0
app/src/main/java/com/hongyegroup/zhurijob/ui/SplashActivity.kt

@@ -0,0 +1,64 @@
+package com.hongyegroup.zhurijob.ui
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import com.guadou.cs_cptservices.YYConstants
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.base.vm.EmptyViewModel
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.ext.SP
+import com.guadou.lib_baselib.ext.checkEmpty
+import com.guadou.lib_baselib.utils.BitmapUtils
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.log.YYLogUtils
+import com.hongyegroup.cpt_auth.ui.UserLoginActivity
+import com.hongyegroup.cpt_main.ui.MainActivity
+import com.hongyegroup.zhurijob.R
+import com.hongyegroup.zhurijob.databinding.ActivitySplashBinding
+
+@SuppressLint("CustomSplashScreen")
+class SplashActivity : YYBaseVDBActivity<EmptyViewModel, ActivitySplashBinding>() {
+
+    companion object {
+        //起始页面延迟的时间
+        const val SPLASH_DELAY_TIMESTAMP: Long = 1000
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_splash)
+    }
+
+    override fun startObserve() {
+
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+
+        //清除BitmapUtil的缓存图片
+        BitmapUtils.getInstance(mContext).deleteBitmapCacheDir()
+
+        //开启倒计时,还是直接启动
+        navLoginOrMain()
+
+        YYLogUtils.w("viewmodel:$mViewModel")
+    }
+
+    private fun navLoginOrMain() {
+
+        CommUtils.getHandler().postDelayed({
+
+            if (SP().getString(YYConstants.SP_KEY_TOKEN, "").checkEmpty()) {
+                //登录
+                UserLoginActivity.startInstance()
+            } else {
+                //首页
+                MainActivity.startInstance()
+            }
+
+            finish()
+
+        }, SPLASH_DELAY_TIMESTAMP)
+
+    }
+
+}

BIN
app/src/main/res/drawable-xhdpi/splash_center_blue_logo.webp


+ 11 - 0
app/src/main/res/drawable/layer_start_window.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@color/white"/>
+
+    <item>
+        <bitmap
+            android:gravity="center"
+            android:src="@drawable/splash_center_blue_logo"/>
+    </item>
+
+</layer-list>

+ 30 - 0
app/src/main/res/layout/activity_splash.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+    </data>
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/white"
+        tools:viewBindingIgnore="true">
+
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:src="@drawable/splash_center_blue_logo" />
+
+
+    </FrameLayout>
+
+</layout>
+
+

+ 4 - 0
app/src/main/res/values/colors.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="page_bg">#f7f7f7</color>
+</resources>

+ 5 - 0
app/src/main/res/values/strings.xml

@@ -0,0 +1,5 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+
+    <string name="app_name" tools:ignore="MissingTranslation">逐日兼职</string>
+
+</resources>

+ 16 - 0
app/src/main/res/values/style.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <!--app-splash的启动theme,不带状态栏-->
+    <style name="AppTheme_welcome" parent="@android:style/Theme.NoTitleBar.Fullscreen">
+        <item name="android:windowBackground">@drawable/layer_start_window</item>
+        <item name="windowActionBar">false</item>
+        <item name="windowNoTitle">true</item>
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+        <item name="android:windowAnimationStyle">@style/my_animation_activity</item>
+    </style>
+
+
+</resources>

+ 17 - 0
app/src/test/java/com/guadou/kt_zoom/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package com.guadou.kt_zoom
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+    @Test
+    fun addition_isCorrect() {
+        assertEquals(4, 2 + 2)
+    }
+}

+ 62 - 0
build.gradle

@@ -0,0 +1,62 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+apply from: "dependent.gradle"
+apply from: "config.gradle"
+
+buildscript {
+    ext.kotlin_version = '1.5.31'
+    ext.booster_version = '4.4.0'
+
+    repositories {
+        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
+        google()
+        maven { url 'https://jitpack.io' }
+        mavenCentral()
+        jcenter()
+    }
+
+    dependencies {
+        classpath 'com.android.tools.build:gradle:7.0.3'
+
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+
+        //路由
+        classpath 'com.alibaba:arouter-register:1.0.2'
+
+        //Hilt插件
+        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.38.1'
+
+        // ==================== Booster优化插件 ====================
+        // 基础框架
+        classpath "com.didiglobal.booster:booster-gradle-plugin:$booster_version"
+        // 多线程优化
+        classpath "com.didiglobal.booster:booster-transform-thread:$booster_version"
+        // WebView 预加载
+        classpath "com.didiglobal.booster:booster-transform-webview:$booster_version"
+        // SharedPreferences 优化
+        classpath "com.didiglobal.booster:booster-transform-shared-preferences:$booster_version"
+
+        // 资源压缩
+        classpath "com.didiglobal.booster:booster-task-compression-cwebp:$booster_version"
+        // 文件压缩
+//        classpath "com.didiglobal.booster:booster-task-compression-processed-res:$booster_version"
+        // 去冗余资源
+        classpath "com.didiglobal.booster:booster-task-resource-deredundancy:$booster_version"
+        // 资源索引内联
+        classpath "com.didiglobal.booster:booster-transform-r-inline:$booster_version"
+
+        // 修复 finalizer 导致的 TimeoutException
+        classpath "com.didiglobal.booster:booster-transform-finalizer-watchdog-daemon:$booster_version"
+        // 检查覆盖安装导致的 Resources 和 Assets 未加载的 Bug
+        classpath "com.didiglobal.booster:booster-transform-res-check:$booster_version"
+        // 修复 Toast 在 Android 7.1 上的 Bug
+        classpath "com.didiglobal.booster:booster-transform-toast:$booster_version"
+        // 处理系统 Crash
+        classpath "com.didiglobal.booster:booster-transform-activity-thread:$booster_version"
+
+    }
+
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}

+ 23 - 0
config.gradle

@@ -0,0 +1,23 @@
+ext {
+
+    AppName = '逐日兼职'
+
+//    isLocalRelease = true     //本地打包环境  release设置true
+//    isLocalRelease = false     //本地打包环境 debug设置false
+
+
+//    isReleaseUrl = true       //使用的服务器域名的环境, 正式环境设置true
+    isReleaseUrl = false       //使用的服务器域名的环境,测试环境设置false (线上环境)
+
+
+    // 测试环境的域名
+    baseUrl_dev = 'http://yyjobs-api-dev.guabean.com'
+    // 正式环境的域名
+    baseUrl_relese = 'https://api.yyjobs.sg'
+
+    //极光测试环境key
+    jpush_key_dev = 'f6d78be334419bcfc9e1de54'
+    //极光正式环境key
+    jpush_key_relese = '32dcfe077bda72c4f4c4a2d4'
+
+}

+ 1 - 0
cpt_auth/.gitignore

@@ -0,0 +1 @@
+/build

+ 5 - 0
cpt_auth/build.gradle

@@ -0,0 +1,5 @@
+apply from: "../module_default_config.gradle"
+
+dependencies {
+
+}

+ 21 - 0
cpt_auth/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 26 - 0
cpt_auth/src/androidTest/java/com/hongyegroup/cpt_auth/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package com.hongyegroup.cpt_auth;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        assertEquals("com.hongyegroup.cpt_auth", appContext.getPackageName());
+    }
+}

+ 17 - 0
cpt_auth/src/main/AndroidManifest.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.hongyegroup.cpt_auth">
+
+    <application android:allowBackup="true">
+
+        <activity
+            android:name=".ui.UserLoginActivity"
+            android:launchMode="singleTask" />
+
+        <activity android:name=".ui.UserRegisterActivity" />
+
+        <activity android:name=".ui.UserForgotActivity" />
+
+    </application>
+
+</manifest>

+ 18 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/bean/Book.java

@@ -0,0 +1,18 @@
+package com.hongyegroup.cpt_auth.bean;
+
+
+import com.guadou.lib_baselib.utils.log.YYLogUtils;
+
+public class Book {
+
+    private Pencil pencil;
+
+    public Book(Pencil pencil) {
+        this.pencil = pencil;
+    }
+
+    public void sayBook() {
+        YYLogUtils.w("Book:" + this.toString());
+        pencil.sayPencil();
+    }
+}

+ 10 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/bean/Pencil.java

@@ -0,0 +1,10 @@
+package com.hongyegroup.cpt_auth.bean;
+
+
+import com.guadou.lib_baselib.utils.log.YYLogUtils;
+
+public class Pencil {
+    public void sayPencil() {
+        YYLogUtils.w("Pencil - i'm pencil");
+    }
+}

+ 25 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/di/AuthDIModel.kt

@@ -0,0 +1,25 @@
+package com.hongyegroup.cpt_auth.di
+
+import com.hongyegroup.cpt_auth.bean.Book
+import com.hongyegroup.cpt_auth.bean.Pencil
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.components.ActivityComponent
+
+@Module
+@InstallIn(ActivityComponent::class)
+class AuthDIModel {
+
+    //Activity级别同一个实例
+    @Provides
+    fun providePencil(): Pencil {
+        return Pencil()
+    }
+
+    @Provides
+    fun provideBook(pencil: Pencil): Book {   //找到这里的时候 发现需要一个Pencil 然后再去找Pencil
+        return Book(pencil)
+    }
+
+}

+ 9 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/http/AuthApiService.kt

@@ -0,0 +1,9 @@
+package com.hongyegroup.cpt_auth.http
+
+/**
+ * 模块的Api接口
+ */
+interface AuthApiService {
+
+
+}

+ 12 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/http/AuthRetrofit.kt

@@ -0,0 +1,12 @@
+package com.hongyegroup.cpt_auth.http
+
+
+import com.guadou.cs_cptservices.YYConstants
+import com.guadou.lib_baselib.base.BaseRetrofitClient
+
+object AuthRetrofit : BaseRetrofitClient() {
+
+    //模块的ApiService
+    val apiService by lazy { getService(AuthApiService::class.java, YYConstants.BASE_URL) }
+
+}

+ 11 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/repository/DemoRepository.kt

@@ -0,0 +1,11 @@
+package com.hongyegroup.cpt_auth.mvvm.repository
+
+import com.guadou.lib_baselib.base.vm.BaseRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class DemoRepository @Inject constructor() : BaseRepository() {
+
+
+}

+ 11 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/repository/SchoolRepository.kt

@@ -0,0 +1,11 @@
+package com.hongyegroup.cpt_auth.mvvm.repository
+
+import com.guadou.lib_baselib.base.vm.BaseRepository
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class SchoolRepository @Inject constructor() : BaseRepository() {
+
+
+}

+ 9 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/state/LoginViewState.kt

@@ -0,0 +1,9 @@
+package com.hongyegroup.cpt_auth.mvvm.state
+
+import com.guadou.lib_baselib.base.mvi.BaseViewState
+
+data class LoginViewState(
+
+    var isChanged: Boolean = false,
+) : BaseViewState
+

+ 18 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/vm/UserForgotViewModel.kt

@@ -0,0 +1,18 @@
+package com.hongyegroup.cpt_auth.mvvm.vm
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class UserForgotViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    val mPhoneNumLD = MutableLiveData<String>()    //电话号码值
+    val mVerityCodeLD = MutableLiveData<String>()    //验证码值
+    val mPasswordLD = MutableLiveData<String>()    //密码值
+
+}

+ 86 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/vm/UserLoginViewModel.kt

@@ -0,0 +1,86 @@
+package com.hongyegroup.cpt_auth.mvvm.vm
+
+import android.app.Activity
+import android.view.View
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.cs_cptservices.YYConstants
+import com.guadou.cs_cptservices.popup.FullWidthTextPopup
+import com.guadou.cs_router.YYRouterService
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.ext.SP
+import com.guadou.lib_baselib.ext.dp2px
+import com.guadou.lib_baselib.utils.log.YYLogUtils
+import com.hongyegroup.cpt_auth.mvvm.repository.DemoRepository
+import com.hongyegroup.cpt_auth.mvvm.repository.SchoolRepository
+import com.lxj.xpopup.XPopup
+import com.lxj.xpopup.enums.PopupPosition
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.withContext
+import javax.inject.Inject
+
+@HiltViewModel
+class UserLoginViewModel @Inject constructor(
+    private val mRepository: DemoRepository,
+    private val mSchoolRepository: SchoolRepository,
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    val mPhoneNumLD = MutableLiveData<String>()    //电话号码值
+    val mPasswordLD = MutableLiveData<String>()    //密码登录-密码值
+    val mPassCodeLD = MutableLiveData<String>()    //验证码登录-验证码值
+    var mMobileCodeLiveData = MutableLiveData<String>()    //当前选中的区号
+
+    //全部的电话号码区号集合
+    private val countyCodes = listOf("+1", "+44", "+60", "+61", "+63", "+65", "+66", "+84", "+86", "+852")
+
+    val mLoginSuccessLD = MutableLiveData<Boolean>()  //登录成功的回调
+
+    init {
+        mMobileCodeLiveData.value = "+86"
+
+        YYLogUtils.w("mRepository:" + mRepository + " mSchoolRepository:" + mSchoolRepository +" savedStateHandle:"+savedStateHandle)
+    }
+
+    /**
+     * 下拉选选择国家区号
+     */
+    fun showCountryCodePopup(view: View, activity: Activity) {
+
+        XPopup.Builder(activity)
+            .hasShadowBg(false)
+            .isCenterHorizontal(true) //是否与目标水平居中对齐
+            .offsetY(-5)
+            .popupPosition(PopupPosition.Bottom) //手动指定弹窗的位置
+            .atView(view) // 依附于所点击的View,内部会自动判断在上方或者下方显示
+            .asCustom(FullWidthTextPopup(activity, view, dp2px(300f), countyCodes) { _, text ->
+                mMobileCodeLiveData.value = text
+            })
+            .show()
+
+    }
+
+    /**
+     * 执行登录请求
+     */
+    fun requestLogin() {
+
+        launchOnUI {
+            loadStartProgress()
+
+            withContext(Dispatchers.IO) {
+                SP().putString(YYConstants.SP_KEY_TOKEN, "test")
+                YYRouterService.serviceComponentServer?.resetLoginStatus()
+
+                delay(2500)
+            }
+
+            loadHideProgress()
+            mLoginSuccessLD.value = true
+        }
+
+    }
+
+}

+ 34 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/mvvm/vm/UserRegisterViewModel.kt

@@ -0,0 +1,34 @@
+package com.hongyegroup.cpt_auth.mvvm.vm
+
+import android.app.Application
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.utils.log.YYLogUtils
+import com.hongyegroup.cpt_auth.mvvm.repository.DemoRepository
+import com.hongyegroup.cpt_auth.mvvm.repository.SchoolRepository
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class UserRegisterViewModel @Inject constructor(
+    private val mRepository: DemoRepository,
+    private val mSchoolRepository: SchoolRepository,
+    private val savedStateHandle: SavedStateHandle,
+    private val application: Application
+) : BaseViewModel() {
+
+    val mPhoneNumLD = MutableLiveData<String>()    //电话号码值
+    val mVerityCodeLD = MutableLiveData<String>()    //验证码值
+    val mPasswordLD = MutableLiveData<String>()    //密码值
+    val mInviteCodeLD = MutableLiveData<String>()    //邀请码值
+
+    init {
+        YYLogUtils.w(
+            "mRepository:" + mRepository + " mSchoolRepository:" +
+                    mSchoolRepository + " savedStateHandle:" + savedStateHandle
+                    + " application:" + application + " activity:" + getActionLiveData()
+        )
+
+    }
+}

+ 20 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/router/AuthComponentServiceImpl.kt

@@ -0,0 +1,20 @@
+package com.hongyegroup.cpt_auth.router
+
+import android.content.Context
+import com.alibaba.android.arouter.facade.annotation.Route
+import com.guadou.cs_router.ARouterPath
+import com.guadou.cs_router.auth.IAuthComponentServer
+import com.hongyegroup.cpt_auth.ui.UserLoginActivity
+
+@Route(path = ARouterPath.PATH_SERVICE_AUTH, name = "Auth模块路由服务")
+class AuthComponentServiceImpl : IAuthComponentServer {
+
+    override fun startLoginPage() {
+        UserLoginActivity.startInstance()
+    }
+
+    override fun init(context: Context?) {
+    }
+
+
+}

+ 76 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/ui/UserForgotActivity.kt

@@ -0,0 +1,76 @@
+package com.hongyegroup.cpt_auth.ui
+
+import android.content.Intent
+import android.os.Bundle
+import android.text.method.HideReturnsTransformationMethod
+import android.text.method.PasswordTransformationMethod
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_auth.BR
+import com.hongyegroup.cpt_auth.R
+import com.hongyegroup.cpt_auth.databinding.ActivityUserForgotBinding
+import com.hongyegroup.cpt_auth.mvvm.vm.UserForgotViewModel
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class UserForgotActivity : YYBaseVDBActivity<UserForgotViewModel, ActivityUserForgotBinding>() {
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, UserForgotActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_user_forgot, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+
+        initListener()
+    }
+
+    private fun initListener() {
+        mBinding.cbPsd.setOnCheckedChangeListener { _, isChecked ->
+            //设置密码隐藏与显示
+            mBinding.etPassword.transformationMethod =
+                if (isChecked) HideReturnsTransformationMethod.getInstance() else PasswordTransformationMethod.getInstance()
+
+        }
+    }
+
+    override fun startObserve() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        //获取验证码
+        fun getVerityCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            toast("获取验证码")
+        }
+
+        //执行注册
+        fun doResetPsd() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            val phone = mViewModel.mPhoneNumLD.value
+            val verityCode = mViewModel.mVerityCodeLD.value
+            val password = mViewModel.mPasswordLD.value
+
+            toast("params phone:$phone verityCode:$verityCode password:$password")
+        }
+
+    }
+}

+ 161 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/ui/UserLoginActivity.kt

@@ -0,0 +1,161 @@
+package com.hongyegroup.cpt_auth.ui
+
+import android.content.Intent
+import android.os.Bundle
+import android.text.method.HideReturnsTransformationMethod
+import android.text.method.PasswordTransformationMethod
+import android.view.View
+import androidx.lifecycle.MutableLiveData
+import com.alibaba.android.arouter.facade.annotation.Route
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.cs_router.ARouterPath
+import com.guadou.cs_router.YYRouterService
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.guadou.lib_baselib.utils.StatusBarUtils
+import com.hongyegroup.cpt_auth.BR
+import com.hongyegroup.cpt_auth.R
+import com.hongyegroup.cpt_auth.bean.Book
+import com.hongyegroup.cpt_auth.databinding.ActivityUserLoginBinding
+import com.hongyegroup.cpt_auth.mvvm.vm.UserLoginViewModel
+import dagger.hilt.android.AndroidEntryPoint
+import javax.inject.Inject
+
+/**
+ * 用户登录页面
+ */
+@Route(path = ARouterPath.PATH_AUTH_PAGE_LOGIN)
+@AndroidEntryPoint
+class UserLoginActivity : YYBaseVDBActivity<UserLoginViewModel, ActivityUserLoginBinding>() {
+
+    @Inject
+    lateinit var iBook: Book
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, UserLoginActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        StatusBarUtils.immersive(this)
+        setStatusBarWhiteText()
+
+        initListener()
+
+        iBook.sayBook()
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_user_login, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun startObserve() {
+        mViewModel.mLoginSuccessLD.observe(this) {
+            if (it != null && it) {
+                gotoMainPage()
+            }
+        }
+    }
+
+    private fun initListener() {
+        mBinding.cbPsd.setOnCheckedChangeListener { _, isChecked ->
+            //设置密码隐藏与显示
+            mBinding.etPassword.transformationMethod =
+                if (isChecked) HideReturnsTransformationMethod.getInstance() else PasswordTransformationMethod.getInstance()
+        }
+    }
+
+    private fun gotoMainPage() {
+        YYRouterService.mainComponentServer?.startMainPage()
+        finish()
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        var isPasswordType = MutableLiveData(true)  //当前是密码登录模式
+
+        //选电话区号
+        fun selectCountryCode(view: View) {
+            KeyboardUtils.hideSoftInput(mActivity)
+            mViewModel.showCountryCodePopup(view, mActivity)
+        }
+
+        //切换为密码登录模式
+        fun changePasswordType() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            isPasswordType.value = true
+        }
+
+        //切换为验证码登录模式
+        fun changeVerifyCodeType() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            isPasswordType.value = false
+        }
+
+        //获取验证码
+        fun getVerityCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            toast("获取验证码")
+        }
+
+        //用户协议
+        fun userAgreement() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            toast("用户协议")
+        }
+
+        //隐私协议
+        fun privateAgreement() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            toast("隐私协议")
+        }
+
+        //点击登录
+        fun doLogin() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            if (mBinding.cbAgree.isChecked) {
+                val userPhone = mViewModel.mMobileCodeLiveData.value + mViewModel.mPhoneNumLD.value
+                val password = if (isPasswordType.value == true) mViewModel.mPasswordLD.value else mViewModel.mPassCodeLD.value
+
+                mViewModel.requestLogin()
+
+            } else {
+                toast("请同意用户协议")
+            }
+        }
+
+        //微信登录
+        fun wechatLogin() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            toast("微信登录")
+        }
+
+        //QQ登录
+        fun qqLogin() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            toast("QQ登录")
+        }
+
+        //注册账号
+        fun registAccount() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            UserRegisterActivity.startInstance()
+        }
+
+        //忘记密码
+        fun forgotPsd() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            UserForgotActivity.startInstance()
+        }
+    }
+}

+ 117 - 0
cpt_auth/src/main/java/com/hongyegroup/cpt_auth/ui/UserRegisterActivity.kt

@@ -0,0 +1,117 @@
+package com.hongyegroup.cpt_auth.ui
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import android.text.method.HideReturnsTransformationMethod
+import android.text.method.PasswordTransformationMethod
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.ext.countDown
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_auth.BR
+import com.hongyegroup.cpt_auth.R
+import com.hongyegroup.cpt_auth.databinding.ActivityUserRegisterBinding
+import com.hongyegroup.cpt_auth.mvvm.vm.UserRegisterViewModel
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.cancel
+
+/**
+ * 用户注册页面
+ */
+@AndroidEntryPoint
+class UserRegisterActivity : YYBaseVDBActivity<UserRegisterViewModel, ActivityUserRegisterBinding>() {
+
+    private var mCountDownScope: CoroutineScope? = null
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, UserRegisterActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_user_register, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+
+        initListener()
+    }
+
+
+    private fun initListener() {
+        mBinding.cbPsd.setOnCheckedChangeListener { _, isChecked ->
+            //设置密码隐藏与显示
+            mBinding.etPassword.transformationMethod =
+                if (isChecked) HideReturnsTransformationMethod.getInstance() else PasswordTransformationMethod.getInstance()
+
+        }
+    }
+
+    override fun startObserve() {
+
+    }
+
+    //开始倒计时
+    @ExperimentalCoroutinesApi
+    @SuppressLint("SetTextI18n")
+    private fun startCountDown() {
+
+        countDown(59, start = {
+            mCountDownScope = it
+        }, end = {
+            mBinding.tvGetCode.apply {
+                isEnabled = true
+                text = "获取验证码"
+            }
+        }, next = {
+            mBinding.tvGetCode.apply {
+                isEnabled = false
+                text = "重新获取($it)"
+            }
+        })
+    }
+
+    override fun onDestroy() {
+        mCountDownScope?.cancel()
+        super.onDestroy()
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+
+    inner class ClickProxy {
+
+        //获取验证码
+        @ExperimentalCoroutinesApi
+        fun getVerityCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            toast("获取验证码")
+            startCountDown()
+        }
+
+        //执行注册
+        fun doRegist() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            val phone = mViewModel.mPhoneNumLD.value
+            val verityCode = mViewModel.mVerityCodeLD.value
+            val password = mViewModel.mPasswordLD.value
+            val inviteCode = mViewModel.mInviteCodeLD.value
+
+            toast("params phone:$phone verityCode:$verityCode password:$password inviteCode:$inviteCode")
+        }
+
+    }
+
+}

BIN
cpt_auth/src/main/res/drawable-xhdpi/auth_login_top_img.webp


BIN
cpt_auth/src/main/res/drawable-xxhdpi/auth_login_logo.webp


BIN
cpt_auth/src/main/res/drawable-xxhdpi/auth_login_passcode_icon.webp


BIN
cpt_auth/src/main/res/drawable-xxhdpi/auth_login_password_icon.webp


BIN
cpt_auth/src/main/res/drawable-xxhdpi/auth_login_qq_icon.webp


BIN
cpt_auth/src/main/res/drawable-xxhdpi/auth_login_wechat_icon.webp


BIN
cpt_auth/src/main/res/drawable-xxhdpi/auth_login_xuxian.webp


+ 214 - 0
cpt_auth/src/main/res/layout/activity_user_forgot.xml

@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_auth.mvvm.vm.UserForgotViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_auth.ui.UserForgotActivity.ClickProxy" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/page_bg"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:Easy_title="重置密码" />
+
+        <com.guadou.lib_baselib.font_text_view.TextViewMedium
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_45dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:layout_marginRight="@dimen/d_15dp"
+            android:gravity="center_vertical"
+            android:text="请执行以下操作,完成密码重置"
+            android:textColor="@color/gray_88"
+            android:textSize="@dimen/d_14sp" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_1dp"
+            android:background="@color/light_gray_divider" />
+
+        <!--   手机号码     -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="手机号"
+                android:textColor="@color/black_33" />
+
+            <EditText
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="5"
+                android:background="@null"
+                android:hint="请输入您的手机号"
+                android:inputType="phone"
+                android:singleLine="true"
+                android:text="@={viewModel.MPhoneNumLD}"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp"
+                binding:typefaceMedium="@{true}" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_1dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:background="@color/light_gray_divider" />
+
+        <!-- 验证码 -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="验证码"
+                android:textColor="@color/black_33" />
+
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="5">
+
+                <EditText
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="@null"
+                    android:hint="请输入验证码"
+                    android:inputType="number"
+                    android:singleLine="true"
+                    android:text="@={viewModel.MVerityCodeLD}"
+                    android:textColor="@color/black_33"
+                    android:textSize="@dimen/d_15sp"
+                    binding:typefaceMedium="@{true}" />
+
+                <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:background="@drawable/shape_blue_round3_border"
+                    android:paddingLeft="@dimen/d_25dp"
+                    android:paddingTop="@dimen/d_8dp"
+                    android:paddingRight="@dimen/d_25dp"
+                    android:paddingBottom="@dimen/d_8dp"
+                    android:text="获取验证码"
+                    android:textColor="@color/app_blue"
+                    android:textSize="@dimen/d_13sp"
+                    binding:clicks="@{click.getVerityCode}" />
+
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_1dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:background="@color/light_gray_divider" />
+
+        <!-- 新密码 -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="新密码"
+                android:textColor="@color/black_33" />
+
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="5">
+
+                <EditText
+                    android:id="@+id/et_password"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="@null"
+                    android:hint="最少8位数,包含大小写和数字"
+                    android:inputType="textPassword"
+                    android:singleLine="true"
+                    android:text="@={viewModel.MPasswordLD}"
+                    android:textColor="@color/black_33"
+                    android:textSize="@dimen/d_15sp"
+                    binding:typefaceMedium="@{true}" />
+
+                <CheckBox
+                    android:id="@+id/cb_psd"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/d_10dp"
+                    android:button="@drawable/selector_check_password_hide" />
+
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_1dp"
+            android:background="@color/light_gray_divider" />
+
+
+        <Button
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_45dp"
+            android:layout_marginLeft="@dimen/d_28dp"
+            android:layout_marginTop="@dimen/d_60dp"
+            android:layout_marginRight="@dimen/d_28dp"
+            android:background="@drawable/selector_blue_btn_bg_round5"
+            android:text="重置密码"
+            android:textColor="@color/white"
+            android:textSize="@dimen/d_17sp"
+            binding:clicks="@{click.doResetPsd}"
+            binding:typefaceBold="@{true}" />
+
+    </LinearLayout>
+
+</layout>

+ 418 - 0
cpt_auth/src/main/res/layout/activity_user_login.xml

@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_auth.mvvm.vm.UserLoginViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_auth.ui.UserLoginActivity.ClickProxy" />
+
+    </data>
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/white"
+        android:overScrollMode="never"
+        android:scrollbars="none">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@color/app_blue"
+                android:orientation="vertical">
+
+                <ImageView
+                    android:id="@+id/iv_top_img"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:scaleType="centerCrop"
+                    android:src="@drawable/auth_login_top_img"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <View
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    android:background="@drawable/shape_white_top_round15"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintLeft_toLeftOf="parent"
+                    app:layout_constraintRight_toRightOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/iv_top_img" />
+
+                <androidx.constraintlayout.utils.widget.ImageFilterView
+                    android:id="@+id/iv_login_logo"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:src="@drawable/auth_login_logo"
+                    app:layout_constraintBottom_toBottomOf="@id/iv_top_img"
+                    app:layout_constraintLeft_toLeftOf="parent"
+                    app:layout_constraintRight_toRightOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/iv_top_img" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:focusable="true"
+                android:focusableInTouchMode="true"
+                android:orientation="vertical">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/d_23dp"
+                    android:layout_marginTop="@dimen/d_10dp"
+                    android:layout_marginRight="@dimen/d_23dp"
+                    android:gravity="bottom"
+                    android:orientation="horizontal">
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewBold
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="手机验证码登录"
+                        android:textColor="@color/black"
+                        android:textSize="@{click.isPasswordType?@dimen/d_15sp:@dimen/d_21sp}"
+                        android:textStyle="bold"
+                        binding:clicks="@{click.changeVerifyCodeType}" />
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewBold
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/d_35dp"
+                        android:text="密码登录"
+                        android:textColor="@color/black"
+                        android:textSize="@{click.isPasswordType?@dimen/d_21sp:@dimen/d_15sp}"
+                        android:textStyle="bold"
+                        binding:clicks="@{click.changePasswordType}"
+                        tools:textSize="@dimen/d_21sp" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/d_50dp"
+                    android:layout_marginLeft="@dimen/d_35dp"
+                    android:layout_marginTop="@dimen/d_20dp"
+                    android:layout_marginRight="@dimen/d_35dp"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal">
+
+                    <LinearLayout
+                        android:layout_width="@dimen/d_55dp"
+                        android:layout_height="wrap_content"
+                        android:gravity="center_vertical"
+                        android:onClick="@{click.selectCountryCode}"
+                        android:orientation="horizontal">
+
+                        <com.guadou.lib_baselib.font_text_view.TextViewBold
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/d_15sp"
+                            binding:text="@{viewModel.mMobileCodeLiveData}"
+                            tools:text="+86" />
+
+                        <ImageView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/d_8dp"
+                            android:src="@drawable/ic_drop_down_gray" />
+
+                    </LinearLayout>
+
+                    <EditText
+                        android:id="@+id/et_phone_num"
+                        android:layout_width="0dp"
+                        android:layout_height="match_parent"
+                        android:layout_weight="1"
+                        android:background="@null"
+                        android:hint="请输入手机号码"
+                        android:inputType="phone"
+                        android:paddingLeft="@dimen/d_9dp"
+                        android:singleLine="true"
+                        android:text="@={viewModel.mPhoneNumLD}"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/d_14sp"
+                        binding:typefaceMedium="@{true}" />
+
+                </LinearLayout>
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginLeft="@dimen/d_28dp"
+                    android:layout_marginRight="@dimen/d_28dp"
+                    android:background="@color/light_gray_divider" />
+
+                <!--   密码输入框   -->
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/d_50dp"
+                    android:layout_marginLeft="@dimen/d_35dp"
+                    android:layout_marginTop="@dimen/d_5dp"
+                    android:layout_marginRight="@dimen/d_35dp"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal"
+                    binding:isVisibleGone="@{click.isPasswordType}">
+
+                    <FrameLayout
+                        android:layout_width="@dimen/d_55dp"
+                        android:layout_height="wrap_content">
+
+                        <ImageView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/d_10dp"
+                            android:src="@drawable/auth_login_password_icon" />
+
+                    </FrameLayout>
+
+                    <EditText
+                        android:id="@+id/et_password"
+                        android:layout_width="0dp"
+                        android:layout_height="match_parent"
+                        android:layout_weight="1"
+                        android:background="@null"
+                        android:hint="请输入密码"
+                        android:inputType="textPassword"
+                        android:paddingLeft="@dimen/d_9dp"
+                        android:singleLine="true"
+                        android:text="@={viewModel.mPasswordLD}"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/d_14sp"
+                        binding:onKeyEnter="@{click.doLogin}"
+                        binding:typefaceMedium="@{true}" />
+
+                    <CheckBox
+                        android:id="@+id/cb_psd"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/d_10dp"
+                        android:button="@drawable/selector_check_password_hide" />
+
+                </LinearLayout>
+
+                <!--   验证码的输入框   -->
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/d_35dp"
+                    android:layout_marginTop="@dimen/d_5dp"
+                    android:layout_marginRight="@dimen/d_35dp"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal"
+                    android:paddingTop="@dimen/d_15dp"
+                    android:paddingBottom="@dimen/d_15dp"
+                    binding:isVisibleGone="@{!click.isPasswordType}"
+                    tools:visibility="gone">
+
+                    <FrameLayout
+                        android:layout_width="@dimen/d_55dp"
+                        android:layout_height="wrap_content">
+
+                        <ImageView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/d_10dp"
+                            android:src="@drawable/auth_login_passcode_icon" />
+
+                    </FrameLayout>
+
+                    <EditText
+                        android:id="@+id/et_passcode"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:background="@null"
+                        android:hint="请输入验证码"
+                        android:inputType="textPassword"
+                        android:paddingLeft="@dimen/d_9dp"
+                        android:singleLine="true"
+                        android:text="@={viewModel.MPassCodeLD}"
+                        android:textColor="@color/black"
+                        android:textCursorDrawable="@null"
+                        android:textSize="@dimen/d_14sp"
+                        binding:onKeyEnter="@{click.doLogin}"
+                        binding:typefaceMedium="@{true}" />
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="获取验证码"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/d_14sp"
+                        binding:clicks="@{click.getVerityCode}" />
+
+                </LinearLayout>
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginLeft="@dimen/d_28dp"
+                    android:layout_marginRight="@dimen/d_28dp"
+                    android:background="@color/light_gray_divider" />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="32dp"
+                    android:layout_marginTop="@dimen/d_22dp"
+                    android:layout_marginRight="32dp"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal">
+
+                    <CheckBox
+                        android:id="@+id/cb_agree"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/transparent"
+                        android:button="@drawable/selector_radio_blue"
+                        android:checked="false"
+                        android:clickable="true" />
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/d_10dp"
+                        android:text="已阅读并同意"
+                        android:textColor="@color/gray_99" />
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/d_6dp"
+                        android:text="用户协议"
+                        android:textColor="@color/app_blue"
+                        binding:clicks="@{click.userAgreement}" />
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/d_6dp"
+                        android:text="和"
+                        android:textColor="@color/gray_99" />
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/d_6dp"
+                        android:text="隐私协议"
+                        android:textColor="@color/app_blue"
+                        binding:clicks="@{click.privateAgreement}" />
+
+                </LinearLayout>
+
+                <Button
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/d_45dp"
+                    android:layout_marginLeft="@dimen/d_28dp"
+                    android:layout_marginTop="@dimen/d_21dp"
+                    android:layout_marginRight="@dimen/d_28dp"
+                    android:background="@drawable/selector_blue_btn_bg_round5"
+                    android:text="登录"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/d_17sp"
+                    binding:clicks="@{click.doLogin}"
+                    binding:typefaceBold="@{true}" />
+
+                <FrameLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/d_28dp"
+                    android:layout_marginTop="@dimen/d_15dp"
+                    android:layout_marginRight="@dimen/d_28dp">
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="注册账号"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/d_14sp"
+                        binding:clicks="@{click.registAccount}" />
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="right"
+                        android:text="忘记密码"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/d_14sp"
+                        binding:clicks="@{click.forgotPsd}" />
+
+                </FrameLayout>
+
+                <FrameLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/d_28dp"
+                    android:layout_marginTop="@dimen/d_28dp"
+                    android:layout_marginRight="@dimen/d_28dp">
+
+                    <ImageView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center_vertical"
+                        android:src="@drawable/auth_login_xuxian" />
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center|center_vertical"
+                        android:text="其它登录方式"
+                        android:textColor="@color/gray_99"
+                        android:textSize="@dimen/d_12sp" />
+
+                    <ImageView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="right|center_vertical"
+                        android:src="@drawable/auth_login_xuxian" />
+
+                </FrameLayout>
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginTop="@dimen/d_18dp"
+                    android:layout_marginBottom="@dimen/d_25dp"
+                    android:orientation="horizontal">
+
+                    <ImageView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:src="@drawable/auth_login_wechat_icon"
+                        binding:clicks="@{click.wechatLogin}" />
+
+                    <ImageView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/d_45dp"
+                        android:src="@drawable/auth_login_qq_icon"
+                        binding:clicks="@{click.qqLogin}" />
+                </LinearLayout>
+
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+    </ScrollView>
+
+
+</layout>

+ 251 - 0
cpt_auth/src/main/res/layout/activity_user_register.xml

@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_auth.mvvm.vm.UserRegisterViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_auth.ui.UserRegisterActivity.ClickProxy" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/page_bg"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:Easy_title="注册账号" />
+
+        <com.guadou.lib_baselib.font_text_view.TextViewMedium
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_45dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:layout_marginRight="@dimen/d_15dp"
+            android:gravity="center_vertical"
+            android:text="请执行以下操作,完成账号注册"
+            android:textColor="@color/gray_88"
+            android:textSize="@dimen/d_14sp" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_1dp"
+            android:background="@color/light_gray_divider" />
+
+        <!--   手机号码     -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="手机号"
+                android:textColor="@color/black_33" />
+
+            <EditText
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="5"
+                android:background="@null"
+                android:hint="请输入您的手机号"
+                android:inputType="phone"
+                android:singleLine="true"
+                android:text="@={viewModel.MPhoneNumLD}"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp"
+                binding:typefaceMedium="@{true}" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_1dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:background="@color/light_gray_divider" />
+
+        <!-- 验证码 -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="验证码"
+                android:textColor="@color/black_33" />
+
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="5">
+
+                <EditText
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="@null"
+                    android:hint="请输入验证码"
+                    android:inputType="number"
+                    android:singleLine="true"
+                    android:text="@={viewModel.MVerityCodeLD}"
+                    android:textColor="@color/black_33"
+                    android:textSize="@dimen/d_15sp"
+                    binding:typefaceMedium="@{true}" />
+
+                <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                    android:id="@+id/tv_get_code"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:background="@drawable/shape_blue_round3_border"
+                    android:paddingLeft="@dimen/d_25dp"
+                    android:paddingTop="@dimen/d_8dp"
+                    android:paddingRight="@dimen/d_25dp"
+                    android:paddingBottom="@dimen/d_8dp"
+                    android:text="获取验证码"
+                    android:textColor="@color/app_blue"
+                    android:textSize="@dimen/d_13sp"
+                    binding:clicks="@{click.getVerityCode}" />
+
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_1dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:background="@color/light_gray_divider" />
+
+        <!-- 新密码 -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="新密码"
+                android:textColor="@color/black_33" />
+
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="5">
+
+                <EditText
+                    android:id="@+id/et_password"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="@null"
+                    android:hint="最少8位数,包含大小写和数字"
+                    android:inputType="textPassword"
+                    android:singleLine="true"
+                    android:text="@={viewModel.MPasswordLD}"
+                    android:textColor="@color/black_33"
+                    android:textSize="@dimen/d_15sp"
+                    binding:typefaceMedium="@{true}" />
+
+                <CheckBox
+                    android:id="@+id/cb_psd"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/d_10dp"
+                    android:button="@drawable/selector_check_password_hide" />
+
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_1dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:background="@color/light_gray_divider" />
+
+        <!--   邀请码     -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="邀请码"
+                android:textColor="@color/black_33" />
+
+            <EditText
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="5"
+                android:background="@null"
+                android:hint="请输入6位邀请码(非必填)"
+                android:singleLine="true"
+                android:text="@={viewModel.MInviteCodeLD}"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp"
+                binding:typefaceMedium="@{true}" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_1dp"
+            android:background="@color/light_gray_divider" />
+
+        <Button
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_45dp"
+            android:layout_marginLeft="@dimen/d_28dp"
+            android:layout_marginTop="@dimen/d_60dp"
+            android:layout_marginRight="@dimen/d_28dp"
+            android:background="@drawable/selector_blue_btn_bg_round5"
+            android:text="注册"
+            android:textColor="@color/white"
+            android:textSize="@dimen/d_17sp"
+            binding:clicks="@{click.doRegist}"
+            binding:typefaceBold="@{true}" />
+
+    </LinearLayout>
+
+</layout>

+ 17 - 0
cpt_auth/src/test/java/com/hongyegroup/cpt_auth/ExampleUnitTest.java

@@ -0,0 +1,17 @@
+package com.hongyegroup.cpt_auth;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+    @Test
+    public void addition_isCorrect() {
+        assertEquals(4, 2 + 2);
+    }
+}

+ 1 - 0
cpt_ewallet/.gitignore

@@ -0,0 +1 @@
+/build

+ 5 - 0
cpt_ewallet/build.gradle

@@ -0,0 +1,5 @@
+apply from: "../module_default_config.gradle"
+
+dependencies {
+
+}

+ 21 - 0
cpt_ewallet/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 26 - 0
cpt_ewallet/src/androidTest/java/com/hongyegroup/cpt_main/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package com.hongyegroup.cpt_main;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        assertEquals("com.hongyegroup.cpt_parttime", appContext.getPackageName());
+    }
+}

+ 29 - 0
cpt_ewallet/src/main/AndroidManifest.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.hongyegroup.cpt_ewallet">
+
+    <application android:allowBackup="true">
+
+        <activity
+            android:name=".ui.EWalletWithdrawalActivity"
+            android:launchMode="singleTask" />
+
+        <activity android:name=".ui.WithdrawalVerifyActivity" />
+
+        <activity android:name=".ui.WithdrawalSuccessActivity" />
+
+        <activity android:name=".ui.EWalletHistoryActivity" />
+
+        <activity android:name=".ui.EWalletSalaryCardActivity" />
+
+        <activity
+            android:name=".ui.SalaryCardAddStepOneActivity"
+            android:launchMode="singleTask" />
+
+        <activity android:name=".ui.SalaryCardAddStepTwoActivity" />
+
+        <activity android:name=".ui.SalaryCardAddStepThreeActivity" />
+
+    </application>
+
+</manifest>

+ 8 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/bean/BankCardBean.java

@@ -0,0 +1,8 @@
+package com.hongyegroup.cpt_ewallet.bean;
+
+public class BankCardBean {
+    public String id;
+    public String name;
+    public String code;
+    public String money;
+}

+ 10 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/bean/WalletHistoryBean.java

@@ -0,0 +1,10 @@
+package com.hongyegroup.cpt_ewallet.bean;
+
+public class WalletHistoryBean {
+    public String id;
+    public String title;
+    public String content;
+    public String createAt;
+
+    public String groupDate;
+}

+ 136 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletHistoryViewModel.kt

@@ -0,0 +1,136 @@
+package com.hongyegroup.cpt_ewallet.mvvm
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.view.View
+import android.widget.TextView
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.bigkoo.pickerview.builder.TimePickerBuilder
+import com.guadou.cs_cptservices.binding.BaseDataBindingAdapter
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.ext.checkEmpty
+import com.guadou.lib_baselib.utils.CommUtils
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.bean.WalletHistoryBean
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.withContext
+import java.util.*
+import javax.inject.Inject
+
+@HiltViewModel
+class EWalletHistoryViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    val mKeywordLiveData = MutableLiveData<String>()  //搜索Key值
+
+    var mCurPage = 1
+    private var isNeedPlaceHolder = true
+    var isNeedCleanAllData = true
+    var mDatas = mutableListOf<WalletHistoryBean>()
+    val mAdapter by lazy { BaseDataBindingAdapter(R.layout.item_ewallet_history, BR.item, mDatas) }
+
+    private val startCalendar = Calendar.getInstance()
+    private val endCalendar = Calendar.getInstance()
+    private var mSelectTimeStamp: Long = System.currentTimeMillis()
+
+    init {
+        //当前页面时间设置区间
+        startCalendar.add(Calendar.YEAR, -3)
+    }
+
+    /**
+     * 获取兼职工作列表
+     */
+    fun requestHistoryList(): LiveData<Boolean> {
+        val liveData = MutableLiveData<Boolean>()
+
+        launchOnUI {
+            //开始Loading
+            if (isNeedPlaceHolder) loadStartLoading()
+            val result = withContext(Dispatchers.IO) {
+                delay(1000)
+
+                val list = mutableListOf<WalletHistoryBean>()
+                for (i in 1..10) {
+                    list.add(WalletHistoryBean().apply {
+                        groupDate = "2022-03-$mCurPage 星期二"
+                    })
+                }
+                return@withContext list
+            }
+
+            loadSuccess()
+            handleData(result)
+            liveData.postValue(true)
+        }
+
+        return liveData
+    }
+
+    //处理数据-添加或刷新
+    @SuppressLint("NotifyDataSetChanged")
+    private fun handleData(list: List<WalletHistoryBean>?) {
+        if (!list.checkEmpty()) {
+            //有数据,判断是刷新还是加载更多的数据
+            if (isNeedCleanAllData) {
+                //刷新的方式
+                mDatas.clear()
+                mDatas.addAll(list!!)
+                mAdapter.notifyDataSetChanged()
+            } else {
+                //加载更多
+                mDatas.addAll(list!!)
+                mAdapter.notifyItemRangeInserted(mDatas.size - list.size, list.size)
+                mAdapter.loadMoreModule.loadMoreComplete()
+            }
+        } else {
+            //展示无数据
+            if (isNeedCleanAllData && mCurPage == 1) {
+                mDatas.clear()
+                mAdapter.notifyDataSetChanged()
+                //展示无数据的布局
+                val emptyView: View = CommUtils.inflate(R.layout.item_empty_layout)
+                emptyView.findViewById<TextView>(R.id.tv_empty_msg).text = "你没有任何记录"
+                mAdapter.setEmptyView(emptyView)
+            } else {
+                //如果是加载更多,展示加载完成,没有更多数据了
+                mAdapter.loadMoreModule.loadMoreEnd()
+            }
+        }
+        isNeedPlaceHolder = false
+        isNeedCleanAllData = false
+    }
+
+    /**
+     * 选择日期筛选
+     */
+    fun selectDateMonth(activity: Activity): LiveData<String> {
+        val liveData = MutableLiveData<String>()
+
+        //时间选择器
+        val pickerBuilder = TimePickerBuilder(activity) { date, _ ->
+            mSelectTimeStamp = date.time
+            liveData.value = mSelectTimeStamp.toString()
+        }
+            .isDialog(true)
+            .setRangDate(startCalendar, endCalendar)
+            .setTitleText("选择月份")
+            .setType(booleanArrayOf(true, true, false, false, false, false))
+
+        //默认选中现在时间
+        val calendar = Calendar.getInstance()
+        calendar.timeInMillis = mSelectTimeStamp
+        pickerBuilder.setDate(calendar)
+
+        pickerBuilder.build().show()
+
+        return liveData
+    }
+
+}

+ 13 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletMainViewModel.kt

@@ -0,0 +1,13 @@
+package com.hongyegroup.cpt_ewallet.mvvm
+
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class EWalletMainViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+}

+ 89 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletSalaryCardViewModel.kt

@@ -0,0 +1,89 @@
+package com.hongyegroup.cpt_ewallet.mvvm
+
+import android.annotation.SuppressLint
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.cs_cptservices.binding.BaseDataBindingAdapter
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.ext.checkEmpty
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.bean.BankCardBean
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.withContext
+import javax.inject.Inject
+
+@HiltViewModel
+class EWalletSalaryCardViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    var mCurPage = 1
+    private var isNeedPlaceHolder = true
+    var isNeedCleanAllData = true
+    var mDatas = mutableListOf<BankCardBean>()
+    val mAdapter by lazy { BaseDataBindingAdapter(R.layout.item_my_salary_card, BR.item, mDatas) }
+
+
+    /**
+     * 获取通知列表
+     */
+    fun getAllBankCards(): LiveData<Boolean> {
+        val liveData = MutableLiveData<Boolean>()
+
+        launchOnUI {
+            //开始Loading
+            if (isNeedPlaceHolder) loadStartLoading()
+            val result = withContext(Dispatchers.IO) {
+                delay(1000)
+
+                val list = mutableListOf<BankCardBean>()
+                for (i in 1..10) {
+                    list.add(BankCardBean())
+                }
+                return@withContext list
+            }
+
+            loadSuccess()
+            handleData(result)
+            liveData.postValue(true)
+
+        }
+
+        return liveData
+    }
+
+    //处理数据-添加或刷新
+    @SuppressLint("NotifyDataSetChanged")
+    private fun handleData(list: List<BankCardBean>?) {
+        if (!list.checkEmpty()) {
+            //有数据,判断是刷新还是加载更多的数据
+            if (isNeedCleanAllData) {
+                //刷新的方式
+                mDatas.clear()
+                mDatas.addAll(list!!)
+                mAdapter.notifyDataSetChanged()
+            } else {
+                //加载更多
+                mDatas.addAll(list!!)
+                mAdapter.notifyItemRangeInserted(mDatas.size + mAdapter.headerLayoutCount - list.size, list.size)
+                mAdapter.loadMoreModule.loadMoreComplete()
+            }
+        } else {
+            //展示无数据
+            if (isNeedCleanAllData && mCurPage == 1) {
+                mDatas.clear()
+                mAdapter.notifyDataSetChanged()
+            } else {
+                //如果是加载更多,展示加载完成,没有更多数据了
+                mAdapter.loadMoreModule.loadMoreEnd()
+            }
+        }
+        isNeedPlaceHolder = false
+        isNeedCleanAllData = false
+    }
+
+}

+ 16 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletWithdrawalViewModel.kt

@@ -0,0 +1,16 @@
+package com.hongyegroup.cpt_ewallet.mvvm
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class EWalletWithdrawalViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    var mMoneyLD = MutableLiveData<String>()  //输入的提现金额
+
+}

+ 16 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/SalaryAddOneViewModel.kt

@@ -0,0 +1,16 @@
+package com.hongyegroup.cpt_ewallet.mvvm
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class SalaryAddOneViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    val mBankCodeLd = MutableLiveData<String>()  //银行卡号
+
+}

+ 16 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/SalaryAddThreeViewModel.kt

@@ -0,0 +1,16 @@
+package com.hongyegroup.cpt_ewallet.mvvm
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class SalaryAddThreeViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    var mCodeLD = MutableLiveData<String>()  //输入的验证码
+
+}

+ 16 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/SalaryAddTwoViewModel.kt

@@ -0,0 +1,16 @@
+package com.hongyegroup.cpt_ewallet.mvvm
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class SalaryAddTwoViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    val mBankMobileLd = MutableLiveData<String>()  //银行电话号码
+
+}

+ 13 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/WithdrawalSuccessViewModel.kt

@@ -0,0 +1,13 @@
+package com.hongyegroup.cpt_ewallet.mvvm
+
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class WithdrawalSuccessViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+}

+ 16 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/WithdrawalVerifyViewModel.kt

@@ -0,0 +1,16 @@
+package com.hongyegroup.cpt_ewallet.mvvm
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class WithdrawalVerifyViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    var mCodeLD = MutableLiveData<String>()  //输入的验证码
+
+}

+ 26 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/router/EWalletComponentServiceImpl.kt

@@ -0,0 +1,26 @@
+package com.hongyegroup.cpt_ewallet.router
+
+import android.content.Context
+import androidx.fragment.app.Fragment
+import com.alibaba.android.arouter.facade.annotation.Route
+import com.guadou.cs_router.ARouterPath
+import com.guadou.cs_router.ewallet.IEWalletComponentServer
+import com.guadou.lib_baselib.utils.log.YYLogUtils
+import com.hongyegroup.cpt_ewallet.ui.EWalletMainFragment
+
+@Route(path = ARouterPath.PATH_SERVICE_WALLET, name = "EWallet模块路由服务")
+class EWalletComponentServiceImpl : IEWalletComponentServer {
+
+    override fun startWithdrawalPage() {
+        YYLogUtils.w("EWalletComponentServiceImpl-startWithdrawalPage")
+    }
+
+    override fun obtainEWalletMainFragment(): Fragment {
+        return EWalletMainFragment()
+    }
+
+    override fun init(context: Context?) {
+    }
+
+
+}

+ 181 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletHistoryActivity.kt

@@ -0,0 +1,181 @@
+package com.hongyegroup.cpt_ewallet.ui
+
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import com.chad.library.adapter.base.listener.OnLoadMoreListener
+import com.gavin.com.library.PowerfulStickyDecoration
+import com.gavin.com.library.listener.PowerGroupListener
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.ext.dp2px
+import com.guadou.lib_baselib.ext.vertical
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.databinding.ActivityEwalletHistoryBinding
+import com.hongyegroup.cpt_ewallet.mvvm.EWalletHistoryViewModel
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * 电子钱包的历史记录列表
+ */
+@AndroidEntryPoint
+class EWalletHistoryActivity : YYBaseVDBActivity<EWalletHistoryViewModel, ActivityEwalletHistoryBinding>(), OnRefreshListener,
+    OnLoadMoreListener {
+
+    private var mTopDecoration: PowerfulStickyDecoration? = null
+    private val mClickProxy by lazy { ClickProxy() }
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, EWalletHistoryActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_ewallet_history, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, mClickProxy)
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+
+        initRV()
+        initData()
+        initListener()
+    }
+
+    private fun initData() {
+        mViewModel.requestHistoryList().observe(this) {
+            mBinding.refreshLayout.finishRefresh()
+            mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = true
+
+            //清楚悬停头缓存
+            if (mViewModel.isNeedCleanAllData) {
+                mTopDecoration?.clearCache()
+            }
+        }
+    }
+
+    private fun initRV() {
+
+        //悬停头的定义
+        val listener: PowerGroupListener = object : PowerGroupListener {
+            override fun getGroupName(position: Int): String? {
+                //获取组名,用于判断是否是同一组
+                return if (mViewModel.mDatas.size > position) {
+                    mViewModel.mDatas[position].groupDate
+                } else null
+            }
+
+            override fun getGroupView(position: Int): View {
+                //获取自定定义的组View
+                return if (mViewModel.mDatas.size > position) {
+                    layoutInflater.inflate(R.layout.item_history_income_header, null, false).apply {
+                        findViewById<TextView>(R.id.tv_head_job_date).text = mViewModel.mDatas[position].groupDate
+                    }
+                } else {
+                    View(mActivity).apply { setBackgroundColor(Color.WHITE) }
+                }
+            }
+        }
+        mTopDecoration = PowerfulStickyDecoration.Builder
+            .init(listener)
+            .setGroupHeight(dp2px(40f))
+            .setCacheEnable(true)
+            .setHeaderCount(0) //是否有头布局->头布局的数量
+            .setOnClickListener { _, _ -> //Head点击事件
+                toast("查询当前月份的月度清单")
+            }
+            .build()
+
+        //设置悬停头和Adapter
+        mBinding.recyclerView.vertical()
+            .apply {
+                addItemDecoration(mTopDecoration!!)
+                adapter = mViewModel.mAdapter
+            }
+    }
+
+    private fun initListener() {
+        //Adapter的滑动监听,监听加载更多
+        mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = false
+        mViewModel.mAdapter.loadMoreModule.preLoadNumber = 4
+        mViewModel.mAdapter.loadMoreModule.setOnLoadMoreListener(this)
+
+        //刷新控件初始化
+        mBinding.refreshLayout.setEnableNestedScroll(true)
+        mBinding.refreshLayout.setEnableLoadMore(false)
+        mBinding.refreshLayout.setEnableRefresh(true)
+        mBinding.refreshLayout.setOnRefreshListener(this)
+
+        //Item点击
+        mViewModel.mAdapter.addChildClickViewIds(R.id.ll_content_root)
+        mViewModel.mAdapter.setOnItemChildClickListener { _, _, position ->
+            val item = mViewModel.mDatas[position]
+            toast("去历史详情页面")
+        }
+
+        //右上角时间筛选
+        mBinding.easyTitle.addRightImg(R.drawable.title_red_date_icon) {
+            mViewModel.selectDateMonth(mActivity).observe(this) {
+                scrollTopRefresh()
+            }
+        }
+    }
+
+    override fun onRefresh(refreshLayout: RefreshLayout) {
+        mViewModel.isNeedCleanAllData = true
+        mViewModel.mAdapter.loadMoreModule.loadMoreComplete()
+        mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = false
+        mViewModel.mCurPage = 1
+        initData()
+    }
+
+    override fun onLoadMore() {
+        mViewModel.isNeedCleanAllData = false
+        mViewModel.mCurPage++
+        initData()
+    }
+
+    //自动刷新
+    private fun scrollTopRefresh() {
+        if (mViewModel.mDatas.size > 1) {
+            mBinding.recyclerView.scrollToPosition(0)
+        }
+        mBinding.refreshLayout.autoRefresh()
+    }
+
+    override fun startObserve() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        //执行搜索
+        fun doSearch() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            scrollTopRefresh()
+        }
+
+        //搜索的删除
+        fun searchDel() {
+            mViewModel.mKeywordLiveData.value = ""
+            doSearch()
+        }
+
+    }
+}

+ 55 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletMainFragment.kt

@@ -0,0 +1,55 @@
+package com.hongyegroup.cpt_ewallet.ui
+
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.fragment.YYBaseVDBFragment
+import com.guadou.cs_cptservices.interfaces.IFragmentRefresh
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.databinding.FragmentEwalletMainBinding
+import com.hongyegroup.cpt_ewallet.mvvm.EWalletMainViewModel
+
+/**
+ * 首页5页面之一 钱包的页面
+ */
+class EWalletMainFragment : YYBaseVDBFragment<EWalletMainViewModel, FragmentEwalletMainBinding>(), IFragmentRefresh {
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.fragment_ewallet_main, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun startObserve() {
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+    }
+
+    override fun scrollTopRefresh() {
+        toast("EWalletMainFragment - scrollTopRefresh")
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        //去提现
+        fun gotoWithdrawal() {
+            EWalletWithdrawalActivity.startInstance()
+        }
+
+        //去工资卡
+        fun gotoSalaryCard() {
+            EWalletSalaryCardActivity.startInstance()
+        }
+
+        //去历史页面
+        fun gotoHistory() {
+            EWalletHistoryActivity.startInstance()
+        }
+    }
+
+}

+ 139 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletSalaryCardActivity.kt

@@ -0,0 +1,139 @@
+package com.hongyegroup.cpt_ewallet.ui
+
+import android.content.Intent
+import android.os.Bundle
+import androidx.databinding.DataBindingUtil
+import com.chad.library.adapter.base.listener.OnLoadMoreListener
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.cs_cptservices.popup.CustomNormalPopup
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.ext.vertical
+import com.guadou.lib_baselib.utils.CommUtils
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.bean.BankCardBean
+import com.hongyegroup.cpt_ewallet.databinding.ActivityEwalletSalarycardBinding
+import com.hongyegroup.cpt_ewallet.databinding.ItemSalaryBankCardHeaderBinding
+import com.hongyegroup.cpt_ewallet.mvvm.EWalletSalaryCardViewModel
+import com.lxj.xpopup.XPopup
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * 电子钱包工资卡列表
+ */
+@AndroidEntryPoint
+class EWalletSalaryCardActivity : YYBaseVDBActivity<EWalletSalaryCardViewModel, ActivityEwalletSalarycardBinding>(), OnRefreshListener,
+    OnLoadMoreListener {
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, EWalletSalaryCardActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_ewallet_salarycard)
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+
+        initRV()
+        initData()
+        initListener()
+    }
+
+    private fun initData() {
+        mViewModel.getAllBankCards().observe(this) {
+            mBinding.refreshLayout.finishRefresh()
+            mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = true
+        }
+    }
+
+    private fun initRV() {
+        //获取到头部局
+        val headerView = CommUtils.inflate(R.layout.item_salary_bank_card_header)
+        //绑定DataBinding 并赋值自定义的数据
+        DataBindingUtil.bind<ItemSalaryBankCardHeaderBinding>(headerView)?.apply {
+            setVariable(BR.click, ClickProxy())
+        }
+        mViewModel.mAdapter.addHeaderView(headerView)
+
+        mBinding.recyclerView.vertical().adapter = mViewModel.mAdapter
+    }
+
+    private fun initListener() {
+        //Adapter的滑动监听,监听加载更多
+        mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = false
+        mViewModel.mAdapter.loadMoreModule.preLoadNumber = 4
+        mViewModel.mAdapter.loadMoreModule.setOnLoadMoreListener(this)
+
+        //刷新控件初始化
+        mBinding.refreshLayout.setEnableNestedScroll(true)
+        mBinding.refreshLayout.setEnableLoadMore(false)
+        mBinding.refreshLayout.setEnableRefresh(true)
+        mBinding.refreshLayout.setOnRefreshListener(this)
+
+        //Item点击
+        mViewModel.mAdapter.addChildClickViewIds(R.id.ll_content_root, R.id.tv_bank_unbind)
+        mViewModel.mAdapter.setOnItemChildClickListener { _, view, position ->
+            val item = mViewModel.mDatas[position]
+            when (view.id) {
+                R.id.tv_bank_unbind -> {
+                    unbindCardPopup(item)
+                }
+                else -> {
+                    toast("进入我的银行卡:$position")
+                }
+            }
+
+        }
+    }
+
+    //解绑银行卡弹窗
+    private fun unbindCardPopup(cardBean: BankCardBean) {
+        XPopup.Builder(mActivity)
+            .asCustom(
+                CustomNormalPopup(mActivity, null, "确认解绑银行卡?", "确认解绑", "放弃解绑") {
+                    toast("执行解绑操作")
+                }
+            )
+            .show()
+    }
+
+    override fun onRefresh(refreshLayout: RefreshLayout) {
+        mViewModel.isNeedCleanAllData = true
+        mViewModel.mAdapter.loadMoreModule.loadMoreComplete()
+        mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = false
+        //直接调用,参数从成员变量中获取
+        mViewModel.mCurPage = 1
+        initData()
+    }
+
+    override fun onLoadMore() {
+        mViewModel.isNeedCleanAllData = false
+        mViewModel.mCurPage++
+        initData()
+    }
+
+    override fun startObserve() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        //添加新的银行卡
+        fun addBankCard() {
+            SalaryCardAddStepOneActivity.startInstance()
+        }
+    }
+}

+ 85 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletWithdrawalActivity.kt

@@ -0,0 +1,85 @@
+package com.hongyegroup.cpt_ewallet.ui
+
+import android.content.Intent
+import android.os.Bundle
+import android.text.Html
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.databinding.ActivityEwalletWithdrawalBinding
+import com.hongyegroup.cpt_ewallet.mvvm.EWalletWithdrawalViewModel
+import com.hongyegroup.cpt_ewallet.widget.ChooseBankCardPopup
+import com.lxj.xpopup.XPopup
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class EWalletWithdrawalActivity : YYBaseVDBActivity<EWalletWithdrawalViewModel, ActivityEwalletWithdrawalBinding>() {
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, EWalletWithdrawalActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_ewallet_withdrawal, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+
+        initData()
+
+    }
+
+    private fun initData() {
+        mBinding.tvMoneyAvailable.text = Html.fromHtml(getString(R.string.ewallet_balance_available, "980.5"))
+    }
+
+    override fun startObserve() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        //选择银行卡
+        fun selectBankCard() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            chooseBankCard()
+        }
+
+        //选择银行卡Popup
+        private fun chooseBankCard() {
+            XPopup.Builder(mActivity)
+                .moveUpToKeyboard(false)
+                .hasShadowBg(true)
+                .asCustom(ChooseBankCardPopup(mActivity,
+                    addNewCardAction = {
+                        //去添加新的银行卡
+                        SalaryCardAddStepOneActivity.startInstance()
+                    }, chooseCardAction = { pos ->
+                        toast("选择了第 $pos 个索引")
+                    })
+                )
+                .show()
+        }
+
+        //去下一步
+        fun gotoNext() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            WithdrawalVerifyActivity.startInstance()
+        }
+
+    }
+}

+ 77 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/SalaryCardAddStepOneActivity.kt

@@ -0,0 +1,77 @@
+package com.hongyegroup.cpt_ewallet.ui
+
+import android.content.Intent
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.cs_cptservices.popup.CustomNormalPopup
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.databinding.ActivitySalaryCardAddOneBinding
+import com.hongyegroup.cpt_ewallet.mvvm.SalaryAddOneViewModel
+import com.lxj.xpopup.XPopup
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * 添加银行卡的第一步
+ */
+@AndroidEntryPoint
+class SalaryCardAddStepOneActivity : YYBaseVDBActivity<SalaryAddOneViewModel, ActivitySalaryCardAddOneBinding>() {
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, SalaryCardAddStepOneActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun onNewIntent(intent: Intent?) {
+        super.onNewIntent(intent)
+        //当重新启动此页面关闭此页面
+        finish()
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_salary_card_add_one, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+    }
+
+    override fun startObserve() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        //展示提示弹窗
+        fun showTips() {
+            KeyboardUtils.hideSoftInput(mActivity)
+
+            XPopup.Builder(mActivity)
+                .asCustom(
+                    CustomNormalPopup(
+                        mActivity, "持卡人说明",
+                        "为了您的账户资金安全,\n只能绑定持卡人本人的银行卡。", "知道了"
+                    )
+                )
+                .show()
+        }
+
+        //下一步
+        fun gotoNext() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            SalaryCardAddStepTwoActivity.startInstance()
+        }
+
+    }
+}

+ 99 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/SalaryCardAddStepThreeActivity.kt

@@ -0,0 +1,99 @@
+package com.hongyegroup.cpt_ewallet.ui
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.ext.countDown
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.databinding.ActivitySalaryCardAddThreeBinding
+import com.hongyegroup.cpt_ewallet.mvvm.SalaryAddThreeViewModel
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.cancel
+
+/**
+ * 添加银行卡的第三步
+ */
+@AndroidEntryPoint
+class SalaryCardAddStepThreeActivity : YYBaseVDBActivity<SalaryAddThreeViewModel, ActivitySalaryCardAddThreeBinding>() {
+
+    private var mCountDownScope: CoroutineScope? = null
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, SalaryCardAddStepThreeActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_salary_card_add_three, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+    }
+
+    override fun startObserve() {
+
+    }
+
+    //开始倒计时
+    @ExperimentalCoroutinesApi
+    @SuppressLint("SetTextI18n")
+    private fun startCountDown() {
+
+        countDown(59, start = {
+            mCountDownScope = it
+        }, end = {
+            mBinding.tvGetCode.apply {
+                isEnabled = true
+                text = "获取验证码"
+            }
+        }, next = {
+            mBinding.tvGetCode.apply {
+                isEnabled = false
+                text = "重新获取($it)"
+            }
+        })
+    }
+
+    override fun onDestroy() {
+        mCountDownScope?.cancel()
+        super.onDestroy()
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        fun gotoNext() {
+            KeyboardUtils.hideSoftInput(mActivity)
+
+            //发出消息通知 添加银行卡完成
+            //1.我的工资卡列表刷新  2.提现页面刷新
+
+            SalaryCardAddStepOneActivity.startInstance()
+        }
+
+        //获取短信验证码
+        @ExperimentalCoroutinesApi
+        fun getVerityCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            toast("获取短信验证码")
+            startCountDown()
+        }
+
+    }
+}

+ 71 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/SalaryCardAddStepTwoActivity.kt

@@ -0,0 +1,71 @@
+package com.hongyegroup.cpt_ewallet.ui
+
+import android.content.Intent
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.cs_cptservices.popup.CustomNormalPopup
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.databinding.ActivitySalaryCardAddTwoBinding
+import com.hongyegroup.cpt_ewallet.mvvm.SalaryAddTwoViewModel
+import com.lxj.xpopup.XPopup
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * 添加银行卡的第二步
+ */
+@AndroidEntryPoint
+class SalaryCardAddStepTwoActivity : YYBaseVDBActivity<SalaryAddTwoViewModel, ActivitySalaryCardAddTwoBinding>() {
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, SalaryCardAddStepTwoActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_salary_card_add_two, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+    }
+
+    override fun startObserve() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        //展示提示弹窗
+        fun showTips() {
+            KeyboardUtils.hideSoftInput(mActivity)
+
+            XPopup.Builder(mActivity)
+                .asCustom(
+                    CustomNormalPopup(
+                        mActivity, "手机号说明",
+                        "银行预留的手机号是办理该银行\n卡时所填写的手机号码。\n没有预留、手机号忘记或者已停\n用,请联系银行客服更新处理", "知道了"
+                    )
+                )
+                .show()
+        }
+
+        //下一步
+        fun gotoNext() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            SalaryCardAddStepThreeActivity.startInstance()
+        }
+
+    }
+}

+ 51 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/WithdrawalSuccessActivity.kt

@@ -0,0 +1,51 @@
+package com.hongyegroup.cpt_ewallet.ui
+
+import android.content.Intent
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.utils.CommUtils
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.databinding.ActivityWithdrawalSuccessBinding
+import com.hongyegroup.cpt_ewallet.mvvm.WithdrawalSuccessViewModel
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class WithdrawalSuccessActivity : YYBaseVDBActivity<WithdrawalSuccessViewModel, ActivityWithdrawalSuccessBinding>() {
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, WithdrawalSuccessActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_withdrawal_success, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+    }
+
+    override fun startObserve() {
+
+    }
+
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        //点击完成
+        fun withdrawFinish() {
+            EWalletWithdrawalActivity.startInstance()
+        }
+
+    }
+}

+ 94 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/WithdrawalVerifyActivity.kt

@@ -0,0 +1,94 @@
+package com.hongyegroup.cpt_ewallet.ui
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.ext.countDown
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.databinding.ActivityWithdrawalVerifyBinding
+import com.hongyegroup.cpt_ewallet.mvvm.WithdrawalVerifyViewModel
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.cancel
+
+@AndroidEntryPoint
+class WithdrawalVerifyActivity : YYBaseVDBActivity<WithdrawalVerifyViewModel, ActivityWithdrawalVerifyBinding>() {
+
+    private var mCountDownScope: CoroutineScope? = null
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, WithdrawalVerifyActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_withdrawal_verify, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+    }
+
+    override fun startObserve() {
+
+    }
+
+    //开始倒计时
+    @ExperimentalCoroutinesApi
+    @SuppressLint("SetTextI18n")
+    private fun startCountDown() {
+
+        countDown(59, start = {
+            mCountDownScope = it
+        }, end = {
+            mBinding.tvGetCode.apply {
+                isEnabled = true
+                text = "获取验证码"
+            }
+        }, next = {
+            mBinding.tvGetCode.apply {
+                isEnabled = false
+                text = "重新获取($it)"
+            }
+        })
+    }
+
+    override fun onDestroy() {
+        mCountDownScope?.cancel()
+        super.onDestroy()
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        fun gotoNext() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            WithdrawalSuccessActivity.startInstance()
+            finish()
+        }
+
+        //获取短信验证码
+        @ExperimentalCoroutinesApi
+        fun getVerityCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            toast("获取短信验证码")
+            startCountDown()
+        }
+
+    }
+
+}

+ 94 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/widget/ChooseBankCardPopup.kt

@@ -0,0 +1,94 @@
+package com.hongyegroup.cpt_ewallet.widget
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.view.View
+import android.widget.ImageView
+import androidx.recyclerview.widget.RecyclerView
+import com.guadou.lib_baselib.ext.click
+import com.guadou.lib_baselib.ext.vertical
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.bean.BankCardBean
+import com.lxj.easyadapter.EasyAdapter
+import com.lxj.easyadapter.MultiItemTypeAdapter
+import com.lxj.easyadapter.ViewHolder
+import com.lxj.xpopup.core.CenterPopupView
+import com.lxj.xpopup.util.XPopupUtils
+
+/**
+ * MC提交错误提示弹窗
+ */
+@SuppressLint("ViewConstructor")
+class ChooseBankCardPopup(
+    context: Context,
+    private val addNewCardAction: (() -> Unit)? = null,
+    private val chooseCardAction: ((pos: Int) -> Unit)? = null,
+) : CenterPopupView(context) {
+
+    private lateinit var rvBankCard: RecyclerView
+    private val mDatas = mutableListOf<BankCardBean>()
+
+    override fun getImplLayoutId(): Int = R.layout.popup_choose_bank_card
+
+    override fun onCreate() {
+        super.onCreate()
+
+        findViewById<View>(R.id.ll_add_card).click {
+            //添加银行卡
+            addNewCardAction?.invoke()
+            dismiss()
+        }
+        findViewById<View>(R.id.iv_popup_close).click {
+            dismiss()
+        }
+
+        initData()
+
+        rvBankCard = findViewById(R.id.rv_bank_card)
+        initRV()
+    }
+
+    private fun initData() {
+        mDatas.add(BankCardBean().apply {
+            name = "平安银行 储蓄卡(尾号 5788)"
+        })
+        mDatas.add(BankCardBean().apply {
+            name = "建设银行卡 储蓄卡(尾号 5788)"
+        })
+        mDatas.add(BankCardBean().apply {
+            name = "招商银行 储蓄卡(尾号 5788)"
+        })
+        mDatas.add(BankCardBean().apply {
+            name = "平安银行 储蓄卡(尾号 5788)"
+        })
+        mDatas.add(BankCardBean().apply {
+            name = "中信银行 储蓄卡(尾号 5788)"
+        })
+    }
+
+    private fun initRV() {
+        val mAdapter: EasyAdapter<BankCardBean> = object : EasyAdapter<BankCardBean>(mDatas, R.layout.item_chosoe_bank_card) {
+            override fun bind(holder: ViewHolder, item: BankCardBean, position: Int) {
+                holder.setText(R.id.tv_bank_name, item.name)
+                holder.getView<ImageView>(R.id.iv_bank_logo).setImageResource(R.drawable.jsyh)
+            }
+        }
+        mAdapter.setOnItemClickListener(object : MultiItemTypeAdapter.SimpleOnItemClickListener() {
+            override fun onItemClick(view: View, holder: RecyclerView.ViewHolder, position: Int) {
+                chooseCardAction?.invoke(position)
+                dismiss()
+
+            }
+        })
+
+        rvBankCard.vertical().apply {
+            adapter = mAdapter
+        }
+    }
+
+    //如果不设置可能出现xml的背景圆角无法正常显示
+    override fun getMaxWidth(): Int {
+        return if (popupInfo.maxWidth == 0) (XPopupUtils.getWindowWidth(context) * 0.99f).toInt() else popupInfo.maxWidth
+    }
+
+}

BIN
cpt_ewallet/src/main/res/drawable-xhdpi/jsyh.webp


BIN
cpt_ewallet/src/main/res/drawable-xhdpi/step_selected_icon.webp


BIN
cpt_ewallet/src/main/res/drawable-xhdpi/step_unselected_icon.webp


BIN
cpt_ewallet/src/main/res/drawable-xhdpi/wallet_salary_card_add_icon.webp


BIN
cpt_ewallet/src/main/res/drawable-xhdpi/wallet_salary_card_icon.webp


BIN
cpt_ewallet/src/main/res/drawable-xhdpi/wallet_transtion_history_icon.webp


BIN
cpt_ewallet/src/main/res/drawable-xhdpi/wallet_withdrawal_success.webp


BIN
cpt_ewallet/src/main/res/drawable-xxhdpi/wallet_salary_card_add_icon.webp


BIN
cpt_ewallet/src/main/res/drawable-xxhdpi/wallet_salary_card_icon.webp


BIN
cpt_ewallet/src/main/res/drawable-xxhdpi/wallet_transtion_history_icon.webp


BIN
cpt_ewallet/src/main/res/drawable-xxhdpi/wallet_withdrawal_success.webp


+ 10 - 0
cpt_ewallet/src/main/res/drawable/shape_salary_card_top_yellow.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <solid android:color="#F4BD41" />
+
+    <corners
+        android:topLeftRadius="@dimen/d_5dp"
+        android:topRightRadius="@dimen/d_5dp" />
+
+</shape>

+ 10 - 0
cpt_ewallet/src/main/res/drawable/shape_salary_card_unbind_border.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <solid android:color="@color/white" />
+
+   <stroke android:color="#C9C9C9" android:width="@dimen/d_0.7dp"/>
+
+    <corners android:radius="@dimen/d_3dp"/>
+
+</shape>

+ 110 - 0
cpt_ewallet/src/main/res/layout/activity_ewallet_history.xml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_ewallet.mvvm.EWalletHistoryViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_ewallet.ui.EWalletHistoryActivity.ClickProxy" />
+
+        <import type="android.text.TextUtils" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/white"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+            android:id="@+id/easy_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:Easy_menuImgSize="@dimen/d_17dp"
+            app:Easy_title="交易记录" />
+
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="32dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:layout_marginTop="@dimen/d_11dp"
+            android:layout_marginRight="@dimen/d_15dp"
+            android:layout_marginBottom="@dimen/d_11dp"
+            android:background="@drawable/shape_search_gray_bg_corners20"
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+            <ImageView
+                android:layout_width="@dimen/d_16dp"
+                android:layout_height="@dimen/d_16dp"
+                android:layout_marginLeft="@dimen/d_12dp"
+                android:src="@drawable/search_icon"
+                binding:clicks="@{click.doSearch}" />
+
+            <EditText
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d_12dp"
+                android:layout_weight="1"
+                android:background="@color/transparent"
+                android:hint="搜索"
+                android:imeOptions="actionSearch"
+                android:singleLine="true"
+                android:text="@={viewModel.mKeywordLiveData}"
+                android:textColor="@color/black"
+                android:textColorHint="@color/gray_99"
+                android:textSize="@dimen/d_14sp"
+                binding:onKeyEnter="@{click.doSearch}"
+                binding:typefaceMedium="@{true}" />
+
+            <ImageView
+                android:layout_width="@dimen/d_16dp"
+                android:layout_height="@dimen/d_16dp"
+                android:layout_marginRight="@dimen/d_10dp"
+                android:src="@drawable/search_delete"
+                android:visibility="gone"
+                binding:clicks="@{click.searchDel}"
+                binding:isVisibleGone="@{!TextUtils.isEmpty(viewModel.MKeywordLiveData)}" />
+
+        </LinearLayout>
+
+        <!--   刷新+列表   -->
+        <com.scwang.smart.refresh.layout.SmartRefreshLayout
+            android:id="@+id/refresh_layout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:focusable="true"
+            android:focusableInTouchMode="true"
+            app:srlEnablePreviewInEditMode="true"
+            app:srlPrimaryColor="@color/white">
+
+            <com.scwang.smart.refresh.header.ClassicsHeader
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/recycler_view"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:overScrollMode="never"
+                android:scrollbars="vertical">
+
+            </androidx.recyclerview.widget.RecyclerView>
+
+        </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+    </LinearLayout>
+
+</layout>

+ 53 - 0
cpt_ewallet/src/main/res/layout/activity_ewallet_salarycard.xml

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/page_bg"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+            android:id="@+id/easy_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:Easy_title="我的工资卡" />
+
+
+        <!--   刷新+列表   -->
+        <com.scwang.smart.refresh.layout.SmartRefreshLayout
+            android:id="@+id/refresh_layout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:focusable="true"
+            android:focusableInTouchMode="true"
+            app:srlEnablePreviewInEditMode="true"
+            app:srlPrimaryColor="@color/white">
+
+            <com.scwang.smart.refresh.header.ClassicsHeader
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/recycler_view"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:overScrollMode="never"
+                android:scrollbars="none" />
+
+        </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+    </LinearLayout>
+
+</layout>

+ 161 - 0
cpt_ewallet/src/main/res/layout/activity_ewallet_withdrawal.xml

@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_ewallet.mvvm.EWalletWithdrawalViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_ewallet.ui.EWalletWithdrawalActivity.ClickProxy" />
+
+        <import type="android.text.TextUtils" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/page_bg"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:Easy_title="提现" />
+
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@drawable/selector_btn_white_gray_bg"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingTop="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp"
+            android:paddingBottom="@dimen/d_11dp"
+            binding:clicks="@{click.selectBankCard}">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:id="@+id/tv_card_text"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="储蓄卡"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:id="@+id/tv_card_name"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="68dp"
+                android:text="平安银行(尾号5788)"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d_8dp"
+                android:text="预计2小时内到账"
+                android:textColor="@color/gray_88"
+                android:textSize="@dimen/d_12sp"
+                app:layout_constraintLeft_toLeftOf="@id/tv_card_name"
+                app:layout_constraintTop_toBottomOf="@id/tv_card_name" />
+
+
+            <ImageView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:src="@drawable/more_gray_icon"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintRight_toRightOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:background="@color/divider_gray_c5" />
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="金额"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp" />
+
+            <EditText
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_gravity="center_vertical"
+                android:layout_marginLeft="68dp"
+                android:layout_weight="1"
+                android:background="@color/transparent"
+                android:inputType="numberDecimal"
+                android:singleLine="true"
+                android:text="@={viewModel.mMoneyLD}"
+                android:textColor="@color/black"
+                android:textColorHint="@color/gray_99"
+                android:textSize="@dimen/d_14sp"
+                binding:setDecimalPoints="@{2}"
+                binding:typefaceMedium="@{true}" />
+
+        </FrameLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/divider_gray_c5" />
+
+
+        <com.guadou.lib_baselib.font_text_view.TextViewMedium
+            android:id="@+id/tv_money_available"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/d_16dp"
+            android:layout_marginTop="@dimen/d_13dp"
+            android:layout_marginRight="@dimen/d_16dp"
+            android:text="当前可提现980.00元,单笔提现限额10000.00元"
+            android:textColor="@color/gray_88"
+            android:textSize="@dimen/d_14sp" />
+
+
+        <Button
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_45dp"
+            android:layout_marginLeft="@dimen/d_28dp"
+            android:layout_marginTop="@dimen/d_20dp"
+            android:layout_marginRight="@dimen/d_28dp"
+            android:background="@drawable/selector_blue_btn_bg_round5"
+            android:text="下一步"
+            android:textColor="@color/white"
+            android:textSize="@dimen/d_17sp"
+            binding:clicks="@{click.gotoNext}"
+            binding:typefaceBold="@{true}" />
+
+    </LinearLayout>
+
+</layout>

+ 189 - 0
cpt_ewallet/src/main/res/layout/activity_salary_card_add_one.xml

@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_ewallet.mvvm.SalaryAddOneViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_ewallet.ui.SalaryCardAddStepOneActivity.ClickProxy" />
+
+        <import type="android.text.TextUtils" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/page_bg"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:Easy_title="添加银行卡" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <ImageView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:scaleType="fitStart"
+                android:src="@drawable/step_selected_icon" />
+
+            <ImageView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d_6dp"
+                android:layout_marginRight="@dimen/d_6dp"
+                android:layout_weight="1"
+                android:src="@drawable/step_unselected_icon" />
+
+
+            <ImageView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:scaleType="fitEnd"
+                android:src="@drawable/step_unselected_icon" />
+
+        </LinearLayout>
+
+
+        <com.guadou.lib_baselib.font_text_view.TextViewMedium
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/d_16dp"
+            android:layout_marginTop="@dimen/d_15dp"
+            android:layout_marginRight="@dimen/d_16dp"
+            android:layout_marginBottom="@dimen/d_13dp"
+            android:text="请添加持卡人本人的银行卡"
+            android:textColor="@color/gray_88"
+            android:textSize="@dimen/d_14sp" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/divider_gray_c5" />
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="持卡人"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:layout_marginLeft="68dp"
+                android:layout_weight="1"
+                android:text="田晓霞"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp" />
+
+            <ImageView
+                binding:clicks="@{click.showTips}"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical|right"
+                android:padding="@dimen/d_5dp"
+                android:src="@drawable/gray_yips_icon" />
+
+        </FrameLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:background="@color/divider_gray_c5" />
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="卡号"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp" />
+
+            <EditText
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_gravity="center_vertical"
+                android:layout_marginLeft="68dp"
+                android:layout_weight="1"
+                android:background="@color/transparent"
+                android:hint="输入银行卡卡号"
+                android:inputType="number"
+                android:singleLine="true"
+                android:text="@={viewModel.mBankCodeLd}"
+                android:textColor="@color/black_33"
+                android:textColorHint="@color/gray_99"
+                android:textSize="@dimen/d_15sp"
+                binding:typefaceMedium="@{true}" />
+
+        </FrameLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/divider_gray_c5" />
+
+        <com.guadou.lib_baselib.font_text_view.TextViewMedium
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/d_16dp"
+            android:layout_marginTop="@dimen/d_13dp"
+            android:layout_marginRight="@dimen/d_16dp"
+            android:drawableLeft="@drawable/gray_password_icon"
+            android:drawablePadding="@dimen/d_7dp"
+            android:text="信息加密处理,仅用于银行验证"
+            android:textColor="@color/gray_88"
+            android:textSize="@dimen/d_14sp" />
+
+
+        <Button
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_45dp"
+            android:layout_marginLeft="@dimen/d_28dp"
+            android:layout_marginTop="@dimen/d_20dp"
+            android:layout_marginRight="@dimen/d_28dp"
+            android:background="@drawable/selector_blue_btn_bg_round5"
+            android:text="下一步"
+            android:textColor="@color/white"
+            android:textSize="@dimen/d_17sp"
+            binding:clicks="@{click.gotoNext}"
+            binding:typefaceBold="@{true}" />
+
+    </LinearLayout>
+
+</layout>

+ 144 - 0
cpt_ewallet/src/main/res/layout/activity_salary_card_add_three.xml

@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_ewallet.mvvm.SalaryAddThreeViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_ewallet.ui.SalaryCardAddStepThreeActivity.ClickProxy" />
+
+        <import type="android.text.TextUtils" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/page_bg"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:Easy_title="填写验证码" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <ImageView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:scaleType="fitStart"
+                android:src="@drawable/step_selected_icon" />
+
+            <ImageView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d_6dp"
+                android:layout_marginRight="@dimen/d_6dp"
+                android:layout_weight="1"
+                android:src="@drawable/step_selected_icon" />
+
+
+            <ImageView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:scaleType="fitEnd"
+                android:src="@drawable/step_selected_icon" />
+
+        </LinearLayout>
+
+
+        <com.guadou.lib_baselib.font_text_view.TextViewMedium
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/d_16dp"
+            android:layout_marginTop="@dimen/d_25dp"
+            android:layout_marginRight="@dimen/d_16dp"
+            android:layout_marginBottom="@dimen/d_25dp"
+            android:text="绑定银行卡需要短信确认\n验证码已发送至手机号:133****5888"
+            android:textColor="@color/gray_88"
+            android:textSize="@dimen/d_14sp" />
+
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/divider_gray_c5" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+            <EditText
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:layout_marginLeft="@dimen/d_15dp"
+                android:layout_marginRight="@dimen/d_15dp"
+                android:layout_weight="1"
+                android:background="@color/transparent"
+                android:hint="请输入短信验证码"
+                android:inputType="number"
+                android:singleLine="true"
+                android:text="@={viewModel.MCodeLD}"
+                android:textColor="@color/black"
+                android:textColorHint="@color/gray_99"
+                android:textSize="@dimen/d_15sp"
+                binding:typefaceMedium="@{true}" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:id="@+id/tv_get_code"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="@dimen/d_15dp"
+                android:background="@drawable/shape_blue_round3_border"
+                android:paddingLeft="@dimen/d_25dp"
+                android:paddingTop="@dimen/d_8dp"
+                android:paddingRight="@dimen/d_25dp"
+                android:paddingBottom="@dimen/d_8dp"
+                android:text="获取验证码"
+                android:textColor="@color/app_blue"
+                android:textSize="@dimen/d_13sp"
+                binding:clicks="@{click.getVerityCode}" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/divider_gray_c5" />
+
+        <Button
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_45dp"
+            android:layout_marginLeft="@dimen/d_28dp"
+            android:layout_marginTop="@dimen/d_35dp"
+            android:layout_marginRight="@dimen/d_28dp"
+            android:background="@drawable/selector_blue_btn_bg_round5"
+            android:text="完成"
+            android:textColor="@color/white"
+            android:textSize="@dimen/d_17sp"
+            binding:clicks="@{click.gotoNext}"
+            binding:typefaceBold="@{true}" />
+
+    </LinearLayout>
+
+</layout>

+ 190 - 0
cpt_ewallet/src/main/res/layout/activity_salary_card_add_two.xml

@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_ewallet.mvvm.SalaryAddTwoViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_ewallet.ui.SalaryCardAddStepTwoActivity.ClickProxy" />
+
+        <import type="android.text.TextUtils" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/page_bg"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:Easy_title="添加银行卡" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <ImageView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:scaleType="fitStart"
+                android:src="@drawable/step_selected_icon" />
+
+            <ImageView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d_6dp"
+                android:layout_marginRight="@dimen/d_6dp"
+                android:layout_weight="1"
+                android:src="@drawable/step_selected_icon" />
+
+
+            <ImageView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:scaleType="fitEnd"
+                android:src="@drawable/step_unselected_icon" />
+
+        </LinearLayout>
+
+
+        <com.guadou.lib_baselib.font_text_view.TextViewMedium
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/d_16dp"
+            android:layout_marginTop="@dimen/d_15dp"
+            android:layout_marginRight="@dimen/d_16dp"
+            android:layout_marginBottom="@dimen/d_13dp"
+            android:text="请添加持卡人本人的银行卡"
+            android:textColor="@color/gray_88"
+            android:textSize="@dimen/d_14sp" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/divider_gray_c5" />
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="卡类型"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:layout_marginLeft="68dp"
+                android:layout_weight="1"
+                android:text="平安银行 储蓄卡"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp" />
+
+        </FrameLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:layout_marginLeft="@dimen/d_15dp"
+            android:background="@color/divider_gray_c5" />
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@color/white"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="手机号"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_15sp" />
+
+            <EditText
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_gravity="center_vertical"
+                android:layout_marginLeft="68dp"
+                android:layout_weight="1"
+                android:background="@color/transparent"
+                android:hint="请输入银行预留手机号码"
+                android:inputType="phone"
+                android:singleLine="true"
+                android:text="@={viewModel.mBankMobileLd}"
+                android:textColor="@color/black_33"
+                android:textColorHint="@color/gray_99"
+                android:textSize="@dimen/d_15sp"
+                binding:typefaceMedium="@{true}" />
+
+            <ImageView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical|right"
+                android:padding="@dimen/d_5dp"
+                android:src="@drawable/gray_yips_icon"
+                binding:clicks="@{click.showTips}" />
+
+        </FrameLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/divider_gray_c5" />
+
+
+        <com.guadou.lib_baselib.font_text_view.TextViewMedium
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/d_16dp"
+            android:layout_marginTop="@dimen/d_13dp"
+            android:layout_marginRight="@dimen/d_16dp"
+            android:drawableLeft="@drawable/gray_password_icon"
+            android:drawablePadding="@dimen/d_7dp"
+            android:text="信息加密处理,仅用于银行验证"
+            android:textColor="@color/gray_88"
+            android:textSize="@dimen/d_14sp" />
+
+
+        <Button
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_45dp"
+            android:layout_marginLeft="@dimen/d_28dp"
+            android:layout_marginTop="@dimen/d_20dp"
+            android:layout_marginRight="@dimen/d_28dp"
+            android:background="@drawable/selector_blue_btn_bg_round5"
+            android:text="下一步"
+            android:textColor="@color/white"
+            android:textSize="@dimen/d_17sp"
+            binding:clicks="@{click.gotoNext}"
+            binding:typefaceBold="@{true}" />
+
+    </LinearLayout>
+
+</layout>

+ 157 - 0
cpt_ewallet/src/main/res/layout/activity_withdrawal_success.xml

@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_ewallet.mvvm.WithdrawalSuccessViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_ewallet.ui.WithdrawalSuccessActivity.ClickProxy" />
+
+        <import type="android.text.TextUtils" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/page_bg"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:Easy_title="提现结果" />
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="185dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:drawableTop="@drawable/wallet_withdrawal_success"
+                android:drawablePadding="@dimen/d_17dp"
+                android:text="已提交银行处理"
+                android:textColor="@color/withdrawal_success_text"
+                android:textSize="@dimen/d_16sp" />
+
+        </FrameLayout>
+
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@drawable/selector_btn_white_gray_bg"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_17dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="预计到账时间"
+                android:textColor="@color/gray_66"
+                android:textSize="@dimen/d_14sp" />
+
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical|right"
+                android:text="预计 2022-01-14 16:55:18前到账"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_14sp" />
+
+        </FrameLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/divider_color_ee" />
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@drawable/selector_btn_white_gray_bg"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_17dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="提现到"
+                android:textColor="@color/gray_66"
+                android:textSize="@dimen/d_14sp" />
+
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical|right"
+                android:text="平安银行 储蓄卡 (5788)"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_14sp" />
+
+        </FrameLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/divider_color_ee" />
+
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_48dp"
+            android:background="@drawable/selector_btn_white_gray_bg"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_17dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:text="提现金额"
+                android:textColor="@color/gray_66"
+                android:textSize="@dimen/d_14sp" />
+
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical|right"
+                android:text="980.00元"
+                android:textColor="@color/black_33"
+                android:textSize="@dimen/d_14sp" />
+
+        </FrameLayout>
+
+
+        <Button
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_45dp"
+            android:layout_marginLeft="@dimen/d_28dp"
+            android:layout_marginTop="@dimen/d_45dp"
+            android:layout_marginRight="@dimen/d_28dp"
+            android:background="@drawable/selector_blue_btn_bg_round5"
+            android:text="完成"
+            android:textColor="@color/white"
+            android:textSize="@dimen/d_17sp"
+            binding:clicks="@{click.withdrawFinish}"
+            binding:typefaceBold="@{true}" />
+
+    </LinearLayout>
+
+</layout>

+ 0 - 0
cpt_ewallet/src/main/res/layout/activity_withdrawal_verify.xml


Some files were not shown because too many files changed in this diff