Browse Source

“添加用户模块”

郭彪 2 years ago
parent
commit
56385c303d
67 changed files with 1048 additions and 29 deletions
  1. 1 0
      .idea/.name
  2. 2 0
      .idea/gradle.xml
  3. 10 8
      BaseLibrary/src/main/java/com/cooleshow/base/ext/CommonExt.kt
  4. 15 4
      BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseFunc.kt
  5. 15 4
      BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseFuncBoolean.kt
  6. 28 6
      BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseSubscriber.kt
  7. 16 1
      app/build.gradle
  8. 2 0
      app/src/main/AndroidManifest.xml
  9. 0 5
      app/src/main/java/com/example/cooleshow/uI/activity/MainActivity.kt
  10. 3 1
      gradle.properties
  11. 3 0
      settings.gradle
  12. 1 0
      teacher/.gitignore
  13. 43 0
      teacher/build.gradle
  14. 21 0
      teacher/proguard-rules.pro
  15. 24 0
      teacher/src/androidTest/java/com/cooleshow/teacher/ExampleInstrumentedTest.kt
  16. 23 0
      teacher/src/main/AndroidManifest.xml
  17. 11 0
      teacher/src/main/java/com/cooleshow/teacher/MainActivity.kt
  18. 30 0
      teacher/src/main/res/drawable-v24/ic_launcher_foreground.xml
  19. 170 0
      teacher/src/main/res/drawable/ic_launcher_background.xml
  20. 18 0
      teacher/src/main/res/layout/activity_main.xml
  21. 5 0
      teacher/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  22. 5 0
      teacher/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  23. BIN
      teacher/src/main/res/mipmap-hdpi/ic_launcher.webp
  24. BIN
      teacher/src/main/res/mipmap-hdpi/ic_launcher_round.webp
  25. BIN
      teacher/src/main/res/mipmap-mdpi/ic_launcher.webp
  26. BIN
      teacher/src/main/res/mipmap-mdpi/ic_launcher_round.webp
  27. BIN
      teacher/src/main/res/mipmap-xhdpi/ic_launcher.webp
  28. BIN
      teacher/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
  29. BIN
      teacher/src/main/res/mipmap-xxhdpi/ic_launcher.webp
  30. BIN
      teacher/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
  31. BIN
      teacher/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
  32. BIN
      teacher/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
  33. 16 0
      teacher/src/main/res/values-night/themes.xml
  34. 10 0
      teacher/src/main/res/values/colors.xml
  35. 3 0
      teacher/src/main/res/values/strings.xml
  36. 16 0
      teacher/src/main/res/values/themes.xml
  37. 17 0
      teacher/src/test/java/com/cooleshow/teacher/ExampleUnitTest.kt
  38. 1 0
      usercenter/.gitignore
  39. 69 0
      usercenter/build.gradle
  40. 21 0
      usercenter/proguard-rules.pro
  41. 24 0
      usercenter/src/androidTest/java/com/cooleshow/usercenter/ExampleInstrumentedTest.kt
  42. 29 0
      usercenter/src/main/debug/AndroidManifest.xml
  43. 11 0
      usercenter/src/main/java/com/cooleshow/usercenter/data/protocol/UserInfo.kt
  44. 35 0
      usercenter/src/main/java/com/cooleshow/usercenter/presenter/LoginPresenter.kt
  45. 12 0
      usercenter/src/main/java/com/cooleshow/usercenter/presenter/view/LoginView.kt
  46. 26 0
      usercenter/src/main/java/com/cooleshow/usercenter/service/impl/UserService.kt
  47. 25 0
      usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/LoginActivity.kt
  48. 15 0
      usercenter/src/main/release/AndroidManifest.xml
  49. 30 0
      usercenter/src/main/res/drawable-v24/ic_launcher_foreground.xml
  50. 170 0
      usercenter/src/main/res/drawable/ic_launcher_background.xml
  51. 5 0
      usercenter/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  52. 5 0
      usercenter/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  53. BIN
      usercenter/src/main/res/mipmap-hdpi/ic_launcher.webp
  54. BIN
      usercenter/src/main/res/mipmap-hdpi/ic_launcher_round.webp
  55. BIN
      usercenter/src/main/res/mipmap-mdpi/ic_launcher.webp
  56. BIN
      usercenter/src/main/res/mipmap-mdpi/ic_launcher_round.webp
  57. BIN
      usercenter/src/main/res/mipmap-xhdpi/ic_launcher.webp
  58. BIN
      usercenter/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
  59. BIN
      usercenter/src/main/res/mipmap-xxhdpi/ic_launcher.webp
  60. BIN
      usercenter/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
  61. BIN
      usercenter/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
  62. BIN
      usercenter/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
  63. 16 0
      usercenter/src/main/res/values-night/themes.xml
  64. 10 0
      usercenter/src/main/res/values/colors.xml
  65. 3 0
      usercenter/src/main/res/values/strings.xml
  66. 16 0
      usercenter/src/main/res/values/themes.xml
  67. 17 0
      usercenter/src/test/java/com/cooleshow/usercenter/ExampleUnitTest.kt

+ 1 - 0
.idea/.name

@@ -0,0 +1 @@
+cooleShow

+ 2 - 0
.idea/gradle.xml

@@ -14,6 +14,8 @@
             <option value="$PROJECT_DIR$/BaseLibrary" />
             <option value="$PROJECT_DIR$/Provider" />
             <option value="$PROJECT_DIR$/app" />
+            <option value="$PROJECT_DIR$/teacher" />
+            <option value="$PROJECT_DIR$/usercenter" />
           </set>
         </option>
         <option name="resolveModulePerSourceSet" value="false" />

+ 10 - 8
BaseLibrary/src/main/java/com/cooleshow/base/ext/CommonExt.kt

@@ -16,13 +16,15 @@ import com.cooleshow.base.rx.BaseFuncBoolean
 import com.cooleshow.base.rx.BaseSubscriber
 import com.cooleshow.base.utils.GlideUtils
 import com.cooleshow.base.widgets.DefaultTextWatcher
+import com.kennyc.view.MultiStateView
 import com.trello.rxlifecycle4.LifecycleProvider
 import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread
+import io.reactivex.rxjava3.core.Observable
+import io.reactivex.rxjava3.schedulers.Schedulers
 
 
-import rx.Observable
 
-import rx.schedulers.Schedulers
 
 //Kotlin通用扩展
 
@@ -30,12 +32,12 @@ import rx.schedulers.Schedulers
 /*
     扩展Observable执行
  */
-//fun <T> Observable<T>.excute(subscriber: BaseSubscriber<T>, lifecycleProvider: LifecycleProvider<*>) {
-//    this.subscribeOn(Schedulers.io())
-//            .observeOn(AndroidSchedulers.mainThread())
-//            .compose(lifecycleProvider.bindToLifecycle())
-//            .subscribe(subscriber)
-//}
+fun <T> Observable<T>.excute(subscriber: BaseSubscriber<T>, lifecycleProvider: LifecycleProvider<*>) {
+    this.subscribeOn(Schedulers.io())
+        .observeOn(AndroidSchedulers.mainThread())
+            .compose(lifecycleProvider.bindToLifecycle())
+            .subscribe(subscriber)
+}
 
 /*
     扩展数据转换

+ 15 - 4
BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseFunc.kt

@@ -1,20 +1,31 @@
 package com.cooleshow.base.rx
 
-import com.cooleshow.base.rx.BaseException
 import com.cooleshow.base.common.ResultCode
 import com.cooleshow.base.data.protocol.BaseResp
-import rx.Observable
+import io.reactivex.rxjava3.core.Observable
+import io.reactivex.rxjava3.functions.Function
 import rx.functions.Func1
 
 /*
     通用数据类型转换封装
  */
-class BaseFunc<T>:Func1<BaseResp<T>,Observable<T>>{
-    override fun call(t: BaseResp<T>): Observable<T> {
+//class BaseFunc<T>: Func1<BaseResp<T>, Observable<T>> {
+//    override fun call(t: BaseResp<T>): Observable<T> {
+//        if (t.status != ResultCode.SUCCESS){
+//            return Observable.error(BaseException(t.status,t.message))
+//        }
+//
+//        return Observable.just(t.data)
+//    }
+//}
+
+class BaseFunc<T>: Function<BaseResp<T>, Observable<T>> {
+    override fun apply(t: BaseResp<T>): Observable<T> {
         if (t.status != ResultCode.SUCCESS){
             return Observable.error(BaseException(t.status,t.message))
         }
 
         return Observable.just(t.data)
     }
+
 }

+ 15 - 4
BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseFuncBoolean.kt

@@ -3,18 +3,29 @@ package com.cooleshow.base.rx
 import com.cooleshow.base.rx.BaseException
 import com.cooleshow.base.common.ResultCode
 import com.cooleshow.base.data.protocol.BaseResp
-import rx.Observable
+import io.reactivex.rxjava3.core.Observable
+import io.reactivex.rxjava3.functions.Function
 import rx.functions.Func1
 
 /*
     Boolean类型转换封装
  */
-class BaseFuncBoolean<T>: Func1<BaseResp<T>, Observable<Boolean>> {
-    override fun call(t: BaseResp<T>): Observable<Boolean> {
+//class BaseFuncBoolean<T>: Func1<BaseResp<T>, Observable<Boolean>> {
+//    override fun call(t: BaseResp<T>): Observable<Boolean> {
+//        if (t.status != ResultCode.SUCCESS){
+//            return Observable.error(BaseException(t.status, t.message))
+//        }
+//
+//        return Observable.just(true)
+//    }
+//}
+
+class BaseFuncBoolean<T>: Function<BaseResp<T>, Observable<Boolean>> {
+    override fun apply(t: BaseResp<T>): Observable<Boolean> {
         if (t.status != ResultCode.SUCCESS){
             return Observable.error(BaseException(t.status, t.message))
         }
 
         return Observable.just(true)
     }
-}
+}

+ 28 - 6
BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseSubscriber.kt

@@ -2,16 +2,31 @@ package com.cooleshow.base.rx
 
 import com.cooleshow.base.rx.BaseException
 import com.cooleshow.base.presenter.view.BaseView
-import rx.Subscriber
+import io.reactivex.rxjava3.core.Observer
+import io.reactivex.rxjava3.disposables.Disposable
+import io.reactivex.rxjava3.subscribers.DefaultSubscriber
 
 /*
     Rx订阅者默认实现
  */
-open class BaseSubscriber<T>(val baseView:BaseView):Subscriber<T>() {
+//open class BaseSubscriber<T>(val baseView:BaseView): DefaultSubscriber<T>() {
+//
+//    override fun onNext(t: T) {
+//    }
+//
+//    override fun onError(e: Throwable?) {
+//        baseView.hideLoading()
+//        if (e is BaseException){
+//            baseView.onError(e.msg)
+//        }
+//    }
+//
+//    override fun onComplete() {
+//        baseView.hideLoading()
+//    }
+//}
 
-    override fun onCompleted() {
-        baseView.hideLoading()
-    }
+open class BaseSubscriber<T>(val baseView:BaseView): Observer<T> {
 
     override fun onNext(t: T) {
     }
@@ -22,4 +37,11 @@ open class BaseSubscriber<T>(val baseView:BaseView):Subscriber<T>() {
             baseView.onError(e.msg)
         }
     }
-}
+
+    override fun onComplete() {
+        baseView.hideLoading()
+    }
+
+    override fun onSubscribe(d: Disposable) {
+    }
+}

+ 16 - 1
app/build.gradle

@@ -23,6 +23,16 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
+
+//    sourceSets {
+//        main {
+//            if (isUserModule.toBoolean()) {
+//                manifest.srcFile 'src/main/release/AndroidManifest.xml'
+//            } else {
+//                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
+//            }
+//        }
+//    }
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
@@ -41,9 +51,14 @@ dependencies {
     implementation 'androidx.appcompat:appcompat:1.3.0'
     implementation 'com.google.android.material:material:1.4.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
-    implementation project(path: ':BaseLibrary')
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.3'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+
     implementation project(':Provider')
+    implementation project(path: ':BaseLibrary')
+
+//    if (isUserModule.toBoolean()){
+//        implementation project(':usercenter')
+//    }
 }

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

@@ -1,5 +1,6 @@
 <?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.example.cooleshow">
 
     <application
@@ -8,6 +9,7 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
+        tools:node="replace"
         android:theme="@style/Theme.CooleShow">
         <activity
             android:name=".uI.activity.MainActivity"

+ 0 - 5
app/src/main/java/com/example/cooleshow/uI/activity/MainActivity.kt

@@ -16,12 +16,7 @@ import kotlinx.android.synthetic.main.activity_main.*
 
 class MainActivity :BaseActivity() {
 
-//    @BindView(R.id.mBottomNavBar)
-//    var  mBottomNavBar : BottomNavBar?=null
-//    @BindView(R.id.mContaier)
-//     var  mContaier : FrameLayout?=null
 
-    var username: EditText? = null
     private var pressTime:Long = 0
     //Fragment 栈管理
     private val mStack = Stack<Fragment>()

+ 3 - 1
gradle.properties

@@ -23,4 +23,6 @@ kotlin.code.style=official
 android.nonTransitiveRClass=true
 android.enableJetifier=true
 kapt.use.worker.api=false
-kapt.incremental.apt=false
+kapt.incremental.apt=false
+
+isUserModule = true

+ 3 - 0
settings.gradle

@@ -20,3 +20,6 @@ pluginManagement {
 rootProject.name = "cooleShow"
 include ':app',':Provider',':BaseLibrary'
 
+include ':teacher'
+
+include ':usercenter'

+ 1 - 0
teacher/.gitignore

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

+ 43 - 0
teacher/build.gradle

@@ -0,0 +1,43 @@
+plugins {
+    id 'com.android.application'
+    id 'org.jetbrains.kotlin.android'
+}
+
+android {
+    compileSdkVersion 31
+
+    defaultConfig {
+        applicationId "com.cooleshow.teacher"
+        minSdkVersion 21
+        targetSdkVersion 31
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+    kotlinOptions {
+        jvmTarget = '1.8'
+    }
+}
+
+dependencies {
+
+    implementation 'androidx.core:core-ktx:1.7.0'
+    implementation 'androidx.appcompat:appcompat:1.3.0'
+    implementation 'com.google.android.material:material:1.4.0'
+    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+    testImplementation 'junit:junit:4.13.2'
+    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+}

+ 21 - 0
teacher/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

+ 24 - 0
teacher/src/androidTest/java/com/cooleshow/teacher/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.cooleshow.teacher
+
+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.cooleshow.teacher", appContext.packageName)
+    }
+}

+ 23 - 0
teacher/src/main/AndroidManifest.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.cooleshow.teacher">
+
+    <application
+        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/Theme.CooleShow">
+        <activity
+            android:name=".MainActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>

+ 11 - 0
teacher/src/main/java/com/cooleshow/teacher/MainActivity.kt

@@ -0,0 +1,11 @@
+package com.cooleshow.teacher
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+
+class MainActivity : AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_main)
+    }
+}

+ 30 - 0
teacher/src/main/res/drawable-v24/ic_launcher_foreground.xml

@@ -0,0 +1,30 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108">
+    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
+        <aapt:attr name="android:fillColor">
+            <gradient
+                android:endX="85.84757"
+                android:endY="92.4963"
+                android:startX="42.9492"
+                android:startY="49.59793"
+                android:type="linear">
+                <item
+                    android:color="#44000000"
+                    android:offset="0.0" />
+                <item
+                    android:color="#00000000"
+                    android:offset="1.0" />
+            </gradient>
+        </aapt:attr>
+    </path>
+    <path
+        android:fillColor="#FFFFFF"
+        android:fillType="nonZero"
+        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
+        android:strokeColor="#00000000"
+        android:strokeWidth="1" />
+</vector>

+ 170 - 0
teacher/src/main/res/drawable/ic_launcher_background.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108">
+    <path
+        android:fillColor="#3DDC84"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+</vector>

+ 18 - 0
teacher/src/main/res/layout/activity_main.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Hello World!"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 5 - 0
teacher/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>

+ 5 - 0
teacher/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>

BIN
teacher/src/main/res/mipmap-hdpi/ic_launcher.webp


BIN
teacher/src/main/res/mipmap-hdpi/ic_launcher_round.webp


BIN
teacher/src/main/res/mipmap-mdpi/ic_launcher.webp


BIN
teacher/src/main/res/mipmap-mdpi/ic_launcher_round.webp


BIN
teacher/src/main/res/mipmap-xhdpi/ic_launcher.webp


BIN
teacher/src/main/res/mipmap-xhdpi/ic_launcher_round.webp


BIN
teacher/src/main/res/mipmap-xxhdpi/ic_launcher.webp


BIN
teacher/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp


BIN
teacher/src/main/res/mipmap-xxxhdpi/ic_launcher.webp


BIN
teacher/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp


+ 16 - 0
teacher/src/main/res/values-night/themes.xml

@@ -0,0 +1,16 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Theme.CooleShow" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+        <!-- Primary brand color. -->
+        <item name="colorPrimary">@color/purple_200</item>
+        <item name="colorPrimaryVariant">@color/purple_700</item>
+        <item name="colorOnPrimary">@color/black</item>
+        <!-- Secondary brand color. -->
+        <item name="colorSecondary">@color/teal_200</item>
+        <item name="colorSecondaryVariant">@color/teal_200</item>
+        <item name="colorOnSecondary">@color/black</item>
+        <!-- Status bar color. -->
+        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
+        <!-- Customize your theme here. -->
+    </style>
+</resources>

+ 10 - 0
teacher/src/main/res/values/colors.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="purple_200">#FFBB86FC</color>
+    <color name="purple_500">#FF6200EE</color>
+    <color name="purple_700">#FF3700B3</color>
+    <color name="teal_200">#FF03DAC5</color>
+    <color name="teal_700">#FF018786</color>
+    <color name="black">#FF000000</color>
+    <color name="white">#FFFFFFFF</color>
+</resources>

+ 3 - 0
teacher/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">teacher</string>
+</resources>

+ 16 - 0
teacher/src/main/res/values/themes.xml

@@ -0,0 +1,16 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Theme.CooleShow" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+        <!-- Primary brand color. -->
+        <item name="colorPrimary">@color/purple_500</item>
+        <item name="colorPrimaryVariant">@color/purple_700</item>
+        <item name="colorOnPrimary">@color/white</item>
+        <!-- Secondary brand color. -->
+        <item name="colorSecondary">@color/teal_200</item>
+        <item name="colorSecondaryVariant">@color/teal_700</item>
+        <item name="colorOnSecondary">@color/black</item>
+        <!-- Status bar color. -->
+        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
+        <!-- Customize your theme here. -->
+    </style>
+</resources>

+ 17 - 0
teacher/src/test/java/com/cooleshow/teacher/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package com.cooleshow.teacher
+
+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)
+    }
+}

+ 1 - 0
usercenter/.gitignore

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

+ 69 - 0
usercenter/build.gradle

@@ -0,0 +1,69 @@
+//plugins {
+//    id 'com.android.application'
+//    id 'org.jetbrains.kotlin.android'
+//}
+
+if (isUserModule.toBoolean()) {
+    apply plugin: 'com.android.library'
+} else {
+    apply plugin: 'com.android.application'
+}
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+apply plugin: 'kotlin-kapt'
+apply plugin: 'org.jetbrains.kotlin.android'
+
+kapt {
+    arguments {
+        arg("moduleName", project.getName())
+    }
+}
+
+android {
+    compileSdkVersion 31
+    defaultConfig {
+        minSdkVersion 21
+        targetSdkVersion 31
+        versionCode 1
+        versionName "1.0"
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    sourceSets {
+        main {
+            if (isUserModule.toBoolean()) {
+                manifest.srcFile 'src/main/release/AndroidManifest.xml'
+            } else {
+                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
+            }
+        }
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+    kotlinOptions {
+        jvmTarget = '1.8'
+    }
+}
+
+dependencies {
+    testImplementation 'junit:junit:4.13.2'
+    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+
+    implementation project(':Provider')
+    implementation project(':BaseLibrary')
+    //Dagger2
+    kapt "com.google.dagger:dagger-compiler:$dagger_version"
+    //ARouter
+    kapt "com.alibaba:arouter-compiler:$arouter_api_version"
+}

+ 21 - 0
usercenter/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

+ 24 - 0
usercenter/src/androidTest/java/com/cooleshow/usercenter/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.cooleshow.usercenter
+
+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.cooleshow.usercenter", appContext.packageName)
+    }
+}

+ 29 - 0
usercenter/src/main/debug/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.cooleshow.usercenter">
+
+    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+
+    <application
+            android:name="com.cooleshow.base.common.BaseApplication"
+            android:allowBackup="true"
+            android:label="@string/app_name"
+            android:supportsRtl="true"
+            android:theme="@style/AppTheme">
+
+        <activity android:name=".ui.activity.LoginActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+
+<!--        <activity android:name=".ui.activity.RegisterActivity"/>-->
+<!--        <activity android:name=".ui.activity.ForgetPwdActivity"/>-->
+<!--        <activity android:name=".ui.activity.ResetPwdActivity"/>-->
+<!--        <activity android:name=".ui.activity.UserInfoActivity"/>-->
+    </application>
+
+</manifest>

+ 11 - 0
usercenter/src/main/java/com/cooleshow/usercenter/data/protocol/UserInfo.kt

@@ -0,0 +1,11 @@
+package com.cooleshow.usercenter.data.protocol
+
+/*
+    用户实体类
+ */
+data class UserInfo(val id:String,
+                    val userIcon:String,
+                    val userName:String,
+                    val userGender:String,
+                    val userMobile:String,
+                    val userSign:String)

+ 35 - 0
usercenter/src/main/java/com/cooleshow/usercenter/presenter/LoginPresenter.kt

@@ -0,0 +1,35 @@
+package com.cooleshow.usercenter.presenter
+
+import com.cooleshow.base.ext.excute
+import com.cooleshow.base.presenter.BasePresenter
+import com.cooleshow.base.rx.BaseSubscriber
+import com.cooleshow.usercenter.data.protocol.UserInfo
+import com.cooleshow.usercenter.presenter.view.LoginView
+import com.cooleshow.usercenter.service.impl.UserService
+import javax.inject.Inject
+
+
+/*
+    登录界面 Presenter
+ */
+class LoginPresenter @Inject constructor() : BasePresenter<LoginView>() {
+
+    @Inject
+    lateinit var userService: UserService
+
+    /*
+        登录
+     */
+    fun login(mobile: String, pwd: String, pushId: String) {
+        if (!checkNetWork()) {
+            return
+        }
+        mView.showLoading()
+        userService.login(mobile, pwd, pushId).excute(object : BaseSubscriber<UserInfo>(mView) {
+            override fun onNext(t: UserInfo) {
+                mView.onLoginResult(t)
+            }
+        }, lifecycleProvider)
+    }
+
+}

+ 12 - 0
usercenter/src/main/java/com/cooleshow/usercenter/presenter/view/LoginView.kt

@@ -0,0 +1,12 @@
+package com.cooleshow.usercenter.presenter.view
+
+import com.cooleshow.base.presenter.view.BaseView
+import com.cooleshow.usercenter.data.protocol.UserInfo
+
+/*
+    用户登录 视图回调
+ */
+interface LoginView : BaseView {
+
+    fun onLoginResult(result: UserInfo)
+}

+ 26 - 0
usercenter/src/main/java/com/cooleshow/usercenter/service/impl/UserService.kt

@@ -0,0 +1,26 @@
+package com.cooleshow.usercenter.service.impl
+
+import com.cooleshow.usercenter.data.protocol.UserInfo
+import io.reactivex.rxjava3.core.Observable
+
+
+/*
+    用户模块 业务接口
+ */
+interface UserService {
+
+    //用户注册
+    fun register(mobile:String,pwd:String,verifyCode:String): Observable<Boolean>
+
+    //用户登录
+    fun login(mobile:String,pwd:String,pushId:String):Observable<UserInfo>
+
+    //忘记密码
+    fun forgetPwd(mobile:String,verifyCode:String):Observable<Boolean>
+
+    //重置密码
+    fun resetPwd(mobile:String,pwd:String):Observable<Boolean>
+
+    //编辑用户资料
+    fun editUser(userIcon:String,userName:String,userGender:String,userSign:String):Observable<UserInfo>
+}

+ 25 - 0
usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/LoginActivity.kt

@@ -0,0 +1,25 @@
+package com.cooleshow.usercenter.ui.activity
+
+import android.view.View
+import com.alibaba.android.arouter.facade.annotation.Route
+import com.cooleshow.base.ui.activity.BaseMvpActivity
+import com.cooleshow.provider.router.RouterPath
+import com.cooleshow.usercenter.data.protocol.UserInfo
+import com.cooleshow.usercenter.presenter.LoginPresenter
+import com.cooleshow.usercenter.presenter.view.LoginView
+
+@Route(path = RouterPath.UserCenter.PATH_LOGIN)
+class LoginActivity : BaseMvpActivity<LoginPresenter>(), LoginView, View.OnClickListener{
+
+    override fun injectComponent() {
+        TODO("Not yet implemented")
+    }
+
+    override fun onClick(v: View?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun onLoginResult(result: UserInfo) {
+        TODO("Not yet implemented")
+    }
+}

+ 15 - 0
usercenter/src/main/release/AndroidManifest.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.cooleshow.usercenter">
+
+    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+    <application
+        android:allowBackup="true"
+        android:label="@string/app_name"
+        android:supportsRtl="true">
+
+
+    </application>
+
+</manifest>

+ 30 - 0
usercenter/src/main/res/drawable-v24/ic_launcher_foreground.xml

@@ -0,0 +1,30 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108">
+    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
+        <aapt:attr name="android:fillColor">
+            <gradient
+                android:endX="85.84757"
+                android:endY="92.4963"
+                android:startX="42.9492"
+                android:startY="49.59793"
+                android:type="linear">
+                <item
+                    android:color="#44000000"
+                    android:offset="0.0" />
+                <item
+                    android:color="#00000000"
+                    android:offset="1.0" />
+            </gradient>
+        </aapt:attr>
+    </path>
+    <path
+        android:fillColor="#FFFFFF"
+        android:fillType="nonZero"
+        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
+        android:strokeColor="#00000000"
+        android:strokeWidth="1" />
+</vector>

+ 170 - 0
usercenter/src/main/res/drawable/ic_launcher_background.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108">
+    <path
+        android:fillColor="#3DDC84"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+</vector>

+ 5 - 0
usercenter/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>

+ 5 - 0
usercenter/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>

BIN
usercenter/src/main/res/mipmap-hdpi/ic_launcher.webp


BIN
usercenter/src/main/res/mipmap-hdpi/ic_launcher_round.webp


BIN
usercenter/src/main/res/mipmap-mdpi/ic_launcher.webp


BIN
usercenter/src/main/res/mipmap-mdpi/ic_launcher_round.webp


BIN
usercenter/src/main/res/mipmap-xhdpi/ic_launcher.webp


BIN
usercenter/src/main/res/mipmap-xhdpi/ic_launcher_round.webp


BIN
usercenter/src/main/res/mipmap-xxhdpi/ic_launcher.webp


BIN
usercenter/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp


BIN
usercenter/src/main/res/mipmap-xxxhdpi/ic_launcher.webp


BIN
usercenter/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp


+ 16 - 0
usercenter/src/main/res/values-night/themes.xml

@@ -0,0 +1,16 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Theme.CooleShow" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+        <!-- Primary brand color. -->
+        <item name="colorPrimary">@color/purple_200</item>
+        <item name="colorPrimaryVariant">@color/purple_700</item>
+        <item name="colorOnPrimary">@color/black</item>
+        <!-- Secondary brand color. -->
+        <item name="colorSecondary">@color/teal_200</item>
+        <item name="colorSecondaryVariant">@color/teal_200</item>
+        <item name="colorOnSecondary">@color/black</item>
+        <!-- Status bar color. -->
+        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
+        <!-- Customize your theme here. -->
+    </style>
+</resources>

+ 10 - 0
usercenter/src/main/res/values/colors.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="purple_200">#FFBB86FC</color>
+    <color name="purple_500">#FF6200EE</color>
+    <color name="purple_700">#FF3700B3</color>
+    <color name="teal_200">#FF03DAC5</color>
+    <color name="teal_700">#FF018786</color>
+    <color name="black">#FF000000</color>
+    <color name="white">#FFFFFFFF</color>
+</resources>

+ 3 - 0
usercenter/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">usercenter</string>
+</resources>

+ 16 - 0
usercenter/src/main/res/values/themes.xml

@@ -0,0 +1,16 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Theme.CooleShow" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+        <!-- Primary brand color. -->
+        <item name="colorPrimary">@color/purple_500</item>
+        <item name="colorPrimaryVariant">@color/purple_700</item>
+        <item name="colorOnPrimary">@color/white</item>
+        <!-- Secondary brand color. -->
+        <item name="colorSecondary">@color/teal_200</item>
+        <item name="colorSecondaryVariant">@color/teal_700</item>
+        <item name="colorOnSecondary">@color/black</item>
+        <!-- Status bar color. -->
+        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
+        <!-- Customize your theme here. -->
+    </style>
+</resources>

+ 17 - 0
usercenter/src/test/java/com/cooleshow/usercenter/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package com.cooleshow.usercenter
+
+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)
+    }
+}