Browse Source

add(personal): home personal page

zhaoyadi 2 years ago
parent
commit
0799a7bb01
97 changed files with 885 additions and 185 deletions
  1. 3 1
      .idea/gradle.xml
  2. 7 5
      app/build.gradle.kts
  3. 24 6
      app/src/main/AndroidManifest.xml
  4. 14 0
      app/src/main/java/com/zaojiao/app/LJGApplication.kt
  5. 23 1
      app/src/main/java/com/zaojiao/app/ui/demo/ComposePerform.kt
  6. 2 0
      app/src/main/java/com/zaojiao/app/ui/home/HomeActivity.kt
  7. 1 1
      app/src/main/java/com/zaojiao/app/ui/home/HomeMainFragment.kt
  8. 10 1
      app/src/main/java/com/zaojiao/app/ui/home/HomePersonFragment.kt
  9. 27 0
      app/src/main/java/com/zaojiao/app/ui/login/LoginActivity.kt
  10. 7 0
      app/src/main/java/com/zaojiao/app/ui/login/LoginViewModel.kt
  11. 0 0
      app/src/main/res/layout/fragment_compose.xml
  12. 1 1
      app/src/main/res/layout/fragment_person.xml
  13. 6 0
      app/src/main/res/layout/include_person_enagage.xml
  14. 5 12
      app/src/main/res/layout/include_person_info.xml
  15. 13 5
      build.gradle.kts
  16. 39 0
      component/common/build.gradle.kts
  17. 2 0
      component/common/src/main/AndroidManifest.xml
  18. 46 0
      component/common/src/main/java/com/zaojiao/component/common/Shadow.kt
  19. 41 0
      component/personal/build.gradle.kts
  20. 1 0
      component/personal/src/main/AndroidManifest.xml
  21. 167 0
      component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalAccount.kt
  22. 133 0
      component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalContent.kt
  23. 4 0
      component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalNavigation.kt
  24. 97 0
      component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalPage.kt
  25. 172 0
      component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalService.kt
  26. 4 0
      component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalViewModel.kt
  27. BIN
      component/personal/src/main/res/mipmap-xhdpi/ic_cart.png
  28. BIN
      component/personal/src/main/res/mipmap-xhdpi/ic_default_avatar.png
  29. BIN
      component/personal/src/main/res/mipmap-xhdpi/ic_message.png
  30. BIN
      component/personal/src/main/res/mipmap-xhdpi/ic_qrcode.png
  31. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_account.png
  32. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_address.png
  33. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_baby.png
  34. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_clockin.png
  35. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_coupon.png
  36. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_course.png
  37. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_customer.png
  38. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_distribuion.png
  39. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_feedback.png
  40. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_history.png
  41. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_invation.png
  42. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_material.png
  43. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_orders.png
  44. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_report.png
  45. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_setting.png
  46. BIN
      component/personal/src/main/res/mipmap-xhdpi/personal_verify.png
  47. BIN
      component/personal/src/main/res/mipmap-xxhdpi/ic_cart.png
  48. BIN
      component/personal/src/main/res/mipmap-xxhdpi/ic_default_avatar.png
  49. BIN
      component/personal/src/main/res/mipmap-xxhdpi/ic_message.png
  50. BIN
      component/personal/src/main/res/mipmap-xxhdpi/ic_qrcode.png
  51. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_account.png
  52. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_address.png
  53. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_baby.png
  54. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_clockin.png
  55. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_coupon.png
  56. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_course.png
  57. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_customer.png
  58. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_distribuion.png
  59. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_feedback.png
  60. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_history.png
  61. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_invation.png
  62. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_material.png
  63. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_orders.png
  64. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_report.png
  65. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_setting.png
  66. BIN
      component/personal/src/main/res/mipmap-xxhdpi/personal_verify.png
  67. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/ic_cart.png
  68. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/ic_default_avatar.png
  69. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/ic_message.png
  70. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/ic_qrcode.png
  71. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_account.png
  72. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_address.png
  73. 0 0
      component/personal/src/main/res/mipmap-xxxhdpi/personal_baby.png
  74. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_clockin.png
  75. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_coupon.png
  76. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_course.png
  77. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_customer.png
  78. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_distribuion.png
  79. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_feedback.png
  80. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_history.png
  81. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_invation.png
  82. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_material.png
  83. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_orders.png
  84. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_report.png
  85. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_setting.png
  86. BIN
      component/personal/src/main/res/mipmap-xxxhdpi/personal_verify.png
  87. 8 4
      http/build.gradle.kts
  88. 0 24
      http/src/androidTest/java/com/zaojiao/http/ExampleInstrumentedTest.kt
  89. 4 2
      http/src/main/java/com/zaojiao/http/HttpManager.kt
  90. 5 0
      http/src/main/java/com/zaojiao/http/HttpRepository.kt
  91. 16 0
      http/src/main/java/com/zaojiao/http/di/HttpModule.kt
  92. 0 17
      http/src/test/java/com/zaojiao/http/ExampleUnitTest.kt
  93. 3 1
      settings.gradle.kts
  94. 0 23
      ui/build.gradle.kts
  95. 0 21
      ui/proguard-rules.pro
  96. 0 54
      ui/src/main/java/com/zaojiao/ui/ClipRRectView.kt
  97. 0 6
      ui/src/main/res/values/styles.xml

+ 3 - 1
.idea/gradle.xml

@@ -12,8 +12,10 @@
           <set>
             <option value="$PROJECT_DIR$" />
             <option value="$PROJECT_DIR$/app" />
+            <option value="$PROJECT_DIR$/component" />
+            <option value="$PROJECT_DIR$/component/common" />
+            <option value="$PROJECT_DIR$/component/personal" />
             <option value="$PROJECT_DIR$/http" />
-            <option value="$PROJECT_DIR$/ui" />
           </set>
         </option>
       </GradleProjectSettings>

+ 7 - 5
app/build.gradle.kts

@@ -1,6 +1,9 @@
+import org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubs
+
 plugins {
     id("com.android.application")
     id("org.jetbrains.kotlin.android")
+    id("kotlin-kapt")
     id("androidx.navigation.safeargs.kotlin")
 }
 
@@ -42,15 +45,11 @@ android {
         compose = true
         viewBinding = true
     }
-
-    kotlinOptions {
-        jvmTarget = "11"
-    }
 }
 
 dependencies {
+    implementation(project(":component:personal"))
     implementation(project(":http"))
-    implementation(project(":ui"))
 
     implementation("androidx.core:core-ktx:1.10.1")
     implementation("androidx.appcompat:appcompat:1.6.1")
@@ -70,6 +69,9 @@ dependencies {
 
     implementation("com.google.accompanist:accompanist-systemuicontroller:0.30.1")
 
+    implementation("com.google.dagger:dagger:2.44.2")
+    add("kapt", "com.google.dagger:dagger-compiler:2.44.2")
+
     testImplementation("junit:junit:4.13.2")
     androidTestImplementation("androidx.test.ext:junit:1.1.5")
     androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")

+ 24 - 6
app/src/main/AndroidManifest.xml

@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
 
     <application
         android:name=".LJGApplication"
@@ -10,19 +9,38 @@
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:supportsRtl="true"
-        android:theme="@style/Theme.Luojigou"
-        tools:targetApi="31">
+        android:theme="@style/Theme.Luojigou">
+
         <activity
             android:name=".ui.home.HomeActivity"
-            android:theme="@style/Theme.Luojigou.LightBar"
-            android:exported="true">
+            android:exported="true"
+            android:theme="@style/Theme.Luojigou.LightBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
+
+            <intent-filter>
+                <data
+                    android:host="www.luojigou.vip"
+                    android:scheme="https" />
+            </intent-filter>
+
+            <intent-filter>
+                <data
+                    android:host="www.luojigou.vip"
+                    android:scheme="http" />
+            </intent-filter>
+
+            <intent-filter>
+                <data
+                    android:host="www.luojigou.vip"
+                    android:scheme="route" />
+            </intent-filter>
         </activity>
 
         <activity android:name=".ui.AdvertiseActivity" />
+        <activity android:name="com.zaojiao.app.ui.login.LoginActivity" />
     </application>
 
 </manifest>

+ 14 - 0
app/src/main/java/com/zaojiao/app/LJGApplication.kt

@@ -1,9 +1,23 @@
 package com.zaojiao.app
 
 import android.app.Application
+import com.zaojiao.app.ui.login.LoginActivity
+import com.zaojiao.http.di.HttpModule
+import dagger.Component
+import javax.inject.Singleton
 
 class LJGApplication : Application() {
+    companion object {
+        val applicationComponent: ApplicationComponent = DaggerApplicationComponent.create()
+    }
+
     override fun onCreate() {
         super.onCreate()
     }
+}
+
+@Singleton
+@Component(modules = [HttpModule::class])
+interface ApplicationComponent {
+    fun inject(activity: LoginActivity)
 }

+ 23 - 1
app/src/main/java/com/zaojiao/app/ui/demo/ComposePerform.kt

@@ -4,6 +4,7 @@ import androidx.compose.foundation.layout.Column
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
 
 @Composable
 fun BalanceColumn() {
@@ -12,9 +13,30 @@ fun BalanceColumn() {
         transactions.runningReduce { a, b -> a + b }
     }
 
-    Column() {
+    Column(
+
+    ) {
         for ((transaction, balance) in transactions.zip(balances)) {
             Text("Transaction: $transaction Balance: $balance")
         }
     }
+}
+
+private class BalanceColumnModifier: Modifier{
+    override fun all(predicate: (Modifier.Element) -> Boolean): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun any(predicate: (Modifier.Element) -> Boolean): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun <R> foldIn(initial: R, operation: (R, Modifier.Element) -> R): R {
+        TODO("Not yet implemented")
+    }
+
+    override fun <R> foldOut(initial: R, operation: (Modifier.Element, R) -> R): R {
+        TODO("Not yet implemented")
+    }
+
 }

+ 2 - 0
app/src/main/java/com/zaojiao/app/ui/home/HomeActivity.kt

@@ -1,5 +1,6 @@
 package com.zaojiao.app.ui.home
 
+import android.content.Intent
 import android.os.Bundle
 import androidx.navigation.findNavController
 import androidx.navigation.fragment.NavHostFragment
@@ -7,6 +8,7 @@ import androidx.navigation.ui.setupWithNavController
 import com.zaojiao.app.R
 import com.zaojiao.app.base.BaseActivity
 import com.zaojiao.app.databinding.ActivityHomeBinding
+import com.zaojiao.app.ui.login.LoginActivity
 
 class HomeActivity : BaseActivity() {
     private var _binding: ActivityHomeBinding? = null

+ 1 - 1
app/src/main/java/com/zaojiao/app/ui/home/HomeMainFragment.kt

@@ -18,7 +18,7 @@ class HomeMainFragment : Fragment() {
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
-        return inflater.inflate(R.layout.fragment_home_main, container, false)
+        return inflater.inflate(R.layout.fragment_compose, container, false)
     }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

+ 10 - 1
app/src/main/java/com/zaojiao/app/ui/home/HomePersonFragment.kt

@@ -4,8 +4,10 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import androidx.compose.ui.platform.ComposeView
 import androidx.fragment.app.Fragment
 import com.zaojiao.app.R
+import com.zaojiao.component.personal.HomePersonalPage
 
 class HomePersonFragment : Fragment() {
     override fun onCreateView(
@@ -13,6 +15,13 @@ class HomePersonFragment : Fragment() {
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
-        return inflater.inflate(R.layout.fragment_person, container, false)
+        return inflater.inflate(R.layout.fragment_compose, container, false)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        if (view is ComposeView) {
+            view.setContent { HomePersonalPage() }
+        }
     }
 }

+ 27 - 0
app/src/main/java/com/zaojiao/app/ui/login/LoginActivity.kt

@@ -0,0 +1,27 @@
+package com.zaojiao.app.ui.login
+
+import android.os.Bundle
+import android.util.Log
+import androidx.appcompat.app.AppCompatActivity
+import com.zaojiao.app.LJGApplication
+import okhttp3.OkHttpClient
+import javax.inject.Inject
+
+class LoginActivity : AppCompatActivity() {
+    @Inject
+    lateinit var loginViewModel: LoginViewModel
+
+    @Inject
+    lateinit var okHttpClient: OkHttpClient
+
+    @Inject
+    lateinit var okHttpClient2: OkHttpClient
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        LJGApplication.applicationComponent.inject(this)
+
+        Log.d("LoginActivity", "okHttpClient  is ${okHttpClient.hashCode()}")
+        Log.d("LoginActivity", "okHttpClient2 is ${okHttpClient2.hashCode()}")
+    }
+}

+ 7 - 0
app/src/main/java/com/zaojiao/app/ui/login/LoginViewModel.kt

@@ -0,0 +1,7 @@
+package com.zaojiao.app.ui.login
+
+import javax.inject.Inject
+
+class LoginViewModel @Inject constructor() {
+
+}

+ 0 - 0
app/src/main/res/layout/fragment_home_main.xml → app/src/main/res/layout/fragment_compose.xml


+ 1 - 1
app/src/main/res/layout/fragment_person.xml

@@ -48,7 +48,7 @@
             android:layout_width="0dp"
             android:layout_height="23dp" />
 
-        <include layout="@layout/fragment_person_info" />
+        <include layout="@layout/include_person_info" />
 
     </androidx.appcompat.widget.LinearLayoutCompat>
 </ScrollView>

+ 6 - 0
app/src/main/res/layout/include_person_enagage.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 5 - 12
app/src/main/res/layout/fragment_person_info.xml → app/src/main/res/layout/include_person_info.xml

@@ -1,20 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="70dp">
 
-    <com.zaojiao.ui.ClipRRectView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        app:radius="35dp">
-
-        <androidx.appcompat.widget.AppCompatImageView
-            android:id="@+id/person_avatar"
-            android:layout_width="70dp"
-            android:layout_height="70dp"
-            android:src="@mipmap/ic_qrcode" />
-    </com.zaojiao.ui.ClipRRectView>
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/person_avatar"
+        android:layout_width="70dp"
+        android:layout_height="70dp"
+        android:src="@mipmap/ic_qrcode" />
 
     <View
         android:layout_width="12dp"

+ 13 - 5
build.gradle.kts

@@ -1,4 +1,6 @@
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile;
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+import org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubs
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 rootProject.buildDir = File("build")
 
@@ -6,15 +8,15 @@ buildscript {
     dependencies {
         classpath("com.android.tools.build:gradle:8.0.1")
         classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.21")
-        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.5.3")
+        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.6.0")
     }
 }
 
 plugins {
     id("com.android.application").version("8.0.1").apply(false)
     id("com.android.library").version("8.0.1").apply(false)
-    id("org.jetbrains.kotlin.android").version("1.8.20").apply(false)
-    id("org.jetbrains.kotlin.kapt").version("1.8.10").apply(false)
+    id("org.jetbrains.kotlin.android").version("1.8.21").apply(false)
+    id("org.jetbrains.kotlin.kapt").version("1.8.21").apply(false)
 }
 
 subprojects {
@@ -23,7 +25,13 @@ subprojects {
     tasks.withType<KotlinCompile>() {
         kotlinOptions {
             freeCompilerArgs = listOf("-Xjsr305=strict")
-            jvmTarget = "17"
+            jvmTarget = "11"
+        }
+    }
+
+    tasks.withType<KaptGenerateStubs> {
+        compilerOptions {
+            jvmTarget.set(JvmTarget.JVM_11)
         }
     }
 }

+ 39 - 0
component/common/build.gradle.kts

@@ -0,0 +1,39 @@
+plugins {
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    namespace = "com.zaojiao.component.common"
+    compileSdk = 33
+
+    defaultConfig {
+        minSdk = 27
+    }
+
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_11
+        targetCompatibility = JavaVersion.VERSION_11
+    }
+
+    composeOptions {
+        kotlinCompilerExtensionVersion = "1.4.7"
+    }
+
+    buildFeatures.compose = true
+
+    kotlinOptions {
+        jvmTarget = "11"
+    }
+}
+
+dependencies {
+    implementation("androidx.core:core-ktx:1.10.1")
+
+    implementation(platform("androidx.compose:compose-bom:2023.05.01"))
+    implementation("androidx.compose.ui:ui")
+    implementation("androidx.compose.runtime:runtime")
+    implementation("androidx.compose.foundation:foundation")
+    implementation("androidx.compose.material3:material3")
+    implementation("androidx.compose.ui:ui-tooling-preview")
+}

+ 2 - 0
component/common/src/main/AndroidManifest.xml

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest />

+ 46 - 0
component/common/src/main/java/com/zaojiao/component/common/Shadow.kt

@@ -0,0 +1,46 @@
+package com.zaojiao.component.common
+
+import android.graphics.BlurMaskFilter
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.drawBehind
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Paint
+import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+
+fun Modifier.shadow(
+    color: Color = Color.Black,
+    offsetX: Dp = 0.dp,
+    offsetY: Dp = 0.dp,
+    blurRadius: Dp = 0.dp,
+    shadowRadius: Dp = 0.dp,
+) = then(
+    drawBehind {
+        drawIntoCanvas { canvas ->
+            val paint = Paint()
+            val frameworkPaint = paint.asFrameworkPaint()
+            if (blurRadius != 0.dp) {
+                frameworkPaint.maskFilter =
+                    (BlurMaskFilter(blurRadius.toPx(), BlurMaskFilter.Blur.NORMAL))
+            }
+            frameworkPaint.color = color.toArgb()
+
+            val leftPixel = offsetX.toPx()
+            val topPixel = offsetY.toPx()
+            val rightPixel = size.width + topPixel
+            val bottomPixel = size.height + leftPixel
+
+            canvas.drawRoundRect(
+                left = leftPixel,
+                top = topPixel,
+                right = rightPixel,
+                bottom = bottomPixel,
+                radiusX = shadowRadius.toPx(),
+                radiusY = shadowRadius.toPx(),
+                paint = paint,
+            )
+        }
+    }
+)

+ 41 - 0
component/personal/build.gradle.kts

@@ -0,0 +1,41 @@
+plugins {
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    namespace = "com.zaojiao.component.personal"
+    compileSdk = 33
+
+    defaultConfig {
+        minSdk = 27
+    }
+
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_11
+        targetCompatibility = JavaVersion.VERSION_11
+    }
+
+    composeOptions {
+        kotlinCompilerExtensionVersion = "1.4.7"
+    }
+
+    buildFeatures.compose = true
+
+    kotlinOptions {
+        jvmTarget = "11"
+    }
+}
+
+dependencies {
+    implementation(project(":component:common"))
+
+    implementation("androidx.core:core-ktx:1.10.1")
+
+    implementation(platform("androidx.compose:compose-bom:2023.05.01"))
+    implementation("androidx.compose.ui:ui")
+    implementation("androidx.compose.runtime:runtime")
+    implementation("androidx.compose.foundation:foundation")
+    implementation("androidx.compose.material3:material3")
+    implementation("androidx.compose.ui:ui-tooling-preview")
+}

+ 1 - 0
ui/src/main/AndroidManifest.xml → component/personal/src/main/AndroidManifest.xml

@@ -1,3 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
 </manifest>

+ 167 - 0
component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalAccount.kt

@@ -0,0 +1,167 @@
+package com.zaojiao.component.personal
+
+import androidx.annotation.DrawableRes
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.widthIn
+import androidx.compose.foundation.layout.wrapContentHeight
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.zaojiao.component.common.shadow
+
+
+@Composable
+fun HomePersonalAccount() {
+    Box(
+        modifier = Modifier
+            .padding(
+                horizontal = 8.dp,
+                vertical = 4.dp,
+            )
+            .shadow(
+                color = Color(0xFFF4F4F4),
+                offsetX = 0.dp,
+                offsetY = 2.dp,
+                blurRadius = 6.dp,
+                shadowRadius = 20.dp,
+            )
+            .background(
+                color = Color.White,
+                shape = RoundedCornerShape(20.dp),
+            ),
+    ) {
+        Column(
+            modifier = Modifier
+                .wrapContentHeight()
+                .fillMaxWidth(),
+        ) {
+            Box(modifier = Modifier.height(16.dp))
+
+            Box(
+                modifier = Modifier.padding(start = 14.dp),
+            ) {
+                Text(
+                    text = "我的账号",
+                    style = TextStyle(
+                        fontSize = 16.sp,
+                        lineHeight = 16.sp,
+                        letterSpacing = 0.38.sp,
+                        fontWeight = FontWeight.Medium,
+                        color = Color(0xFF333333),
+                    ),
+                )
+            }
+
+            Box(modifier = Modifier.height(18.dp))
+            Row(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .wrapContentHeight(),
+                horizontalArrangement = Arrangement.SpaceBetween,
+            ) {
+                HomePersonalAccountItem(
+                    iconRes = R.mipmap.personal_account,
+                    description = "我的账户"
+                )
+                HomePersonalAccountItem(
+                    iconRes = R.mipmap.personal_coupon,
+                    description = "优惠券"
+                )
+                HomePersonalAccountItem(
+                    iconRes = R.mipmap.personal_distribuion,
+                    description = "分销赚钱"
+                )
+                HomePersonalAccountItem(
+                    iconRes = R.mipmap.personal_invation,
+                    description = "邀请有奖"
+                )
+            }
+            Box(modifier = Modifier.height(21.dp))
+            Row(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .wrapContentHeight(),
+                horizontalArrangement = Arrangement.SpaceBetween,
+            ) {
+                HomePersonalAccountItem(
+                    iconRes = R.mipmap.personal_clockin,
+                    description = "我的打卡"
+                )
+                HomePersonalAccountBlank()
+                HomePersonalAccountBlank()
+                HomePersonalAccountBlank()
+            }
+            Box(modifier = Modifier.height(27.dp))
+        }
+    }
+}
+
+@Composable
+fun RowScope.HomePersonalAccountItem(
+    @DrawableRes iconRes: Int,
+    description: String,
+) {
+    Column(
+        modifier = Modifier
+            .weight(1f)
+            .fillMaxHeight()
+            .widthIn(max = 56.dp),
+        verticalArrangement = Arrangement.SpaceBetween,
+        horizontalAlignment = Alignment.CenterHorizontally,
+    ) {
+        Image(
+            painter = painterResource(id = iconRes),
+            contentDescription = description,
+            modifier = Modifier
+                .width(34.dp)
+                .height(34.dp)
+        )
+        Box(modifier = Modifier.height(2.dp))
+        Text(
+            text = description,
+            style = TextStyle(
+                fontSize = 12.sp,
+                lineHeight = 12.sp,
+                fontWeight = FontWeight.Normal,
+                color = Color(0xFF333333),
+            ),
+        )
+    }
+}
+
+@Composable
+fun RowScope.HomePersonalAccountBlank() {
+    Column(
+        modifier = Modifier
+            .weight(1f)
+            .fillMaxHeight()
+            .widthIn(max = 56.dp),
+        verticalArrangement = Arrangement.SpaceBetween,
+        horizontalAlignment = Alignment.CenterHorizontally,
+    ) {
+        Box(
+            modifier = Modifier
+                .width(34.dp)
+                .height(48.dp)
+        )
+    }
+}

+ 133 - 0
component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalContent.kt

@@ -0,0 +1,133 @@
+package com.zaojiao.component.personal
+
+import androidx.annotation.DrawableRes
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.widthIn
+import androidx.compose.foundation.layout.wrapContentHeight
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.zaojiao.component.common.shadow
+
+@Composable
+fun HomePersonalContent() {
+    Box(
+        modifier = Modifier
+            .padding(
+                horizontal = 8.dp,
+                vertical = 4.dp,
+            )
+            .shadow(
+                color = Color(0xFFF4F4F4),
+                offsetX = 0.dp,
+                offsetY = 2.dp,
+                blurRadius = 6.dp,
+                shadowRadius = 20.dp,
+            )
+            .background(
+                color = Color.White,
+                shape = RoundedCornerShape(20.dp),
+            ),
+    ) {
+        Column(
+            modifier = Modifier
+                .wrapContentHeight()
+                .fillMaxWidth(),
+        ) {
+            Box(modifier = Modifier.height(16.dp))
+
+            Box(
+                modifier = Modifier.padding(start = 14.dp),
+            ) {
+                Text(
+                    text = "我的内容",
+                    style = TextStyle(
+                        fontSize = 16.sp,
+                        lineHeight = 16.sp,
+                        letterSpacing = 0.38.sp,
+                        fontWeight = FontWeight.Medium,
+                        color = Color(0xFF333333),
+                    ),
+                )
+            }
+
+            Box(modifier = Modifier.height(18.dp))
+            Row(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .wrapContentHeight(),
+                horizontalArrangement = Arrangement.SpaceBetween,
+            ) {
+                HomePersonalContentItem(
+                    iconRes = R.mipmap.personal_history,
+                    description = "观看历史"
+                )
+                HomePersonalContentItem(
+                    iconRes = R.mipmap.personal_orders,
+                    description = "全部订单"
+                )
+                HomePersonalContentItem(
+                    iconRes = R.mipmap.personal_course,
+                    description = "我的课程"
+                )
+                HomePersonalContentItem(
+                    iconRes = R.mipmap.personal_report,
+                    description = "成长报告"
+                )
+            }
+            Box(modifier = Modifier.height(27.dp))
+        }
+    }
+}
+
+@Composable
+fun RowScope.HomePersonalContentItem(
+    @DrawableRes iconRes: Int,
+    description: String,
+) {
+    Column(
+        modifier = Modifier
+            .weight(1f)
+            .fillMaxHeight()
+            .widthIn(max = 56.dp),
+        verticalArrangement = Arrangement.SpaceBetween,
+        horizontalAlignment = Alignment.CenterHorizontally,
+    ) {
+        Image(
+            painter = painterResource(id = iconRes),
+            contentDescription = description,
+            modifier = Modifier
+                .width(44.dp)
+                .height(44.dp)
+        )
+        Box(modifier = Modifier.height(5.dp))
+        Text(
+            text = description,
+            style = TextStyle(
+                fontSize = 12.sp,
+                lineHeight = 12.sp,
+                fontWeight = FontWeight.Normal,
+                color = Color(0xFF333333),
+            ),
+        )
+    }
+}

+ 4 - 0
component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalNavigation.kt

@@ -0,0 +1,4 @@
+package com.zaojiao.component.personal
+
+class HomePersonalNavigation {
+}

+ 97 - 0
component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalPage.kt

@@ -0,0 +1,97 @@
+package com.zaojiao.component.personal
+
+import androidx.annotation.DrawableRes
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.statusBarsPadding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.widthIn
+import androidx.compose.foundation.layout.wrapContentHeight
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.zaojiao.component.common.shadow
+
+@Composable
+fun HomePersonalPage() {
+    Box(
+        modifier = Modifier
+            .statusBarsPadding()
+            .background(
+                brush = Brush.verticalGradient(
+                    listOf(Color(0xFFFEFEFE), Color(0xFFFAFAFA)),
+                )
+            )
+            .fillMaxSize()
+    ) {
+
+        LazyColumn(
+
+        ) {
+            item {
+                HomePersonalTopBar()
+            }
+
+            item {
+                HomePersonalUserBar()
+            }
+
+            item {
+                HomePersonalEngage()
+            }
+
+            item {
+                HomePersonalContent()
+            }
+
+            item {
+                HomePersonalAccount()
+            }
+
+            item {
+                HomePersonalService()
+            }
+
+            item{
+
+            }
+        }
+    }
+}
+
+@Composable
+fun HomePersonalTopBar() {
+
+}
+
+@Composable
+fun HomePersonalUserBar() {
+
+}
+
+@Composable
+fun HomePersonalEngage() {
+
+}
+
+

+ 172 - 0
component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalService.kt

@@ -0,0 +1,172 @@
+package com.zaojiao.component.personal
+
+import androidx.annotation.DrawableRes
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.widthIn
+import androidx.compose.foundation.layout.wrapContentHeight
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.zaojiao.component.common.shadow
+
+@Composable
+fun HomePersonalService() {
+    Box(
+        modifier = Modifier
+            .padding(
+                horizontal = 8.dp,
+                vertical = 4.dp,
+            )
+            .shadow(
+                color = Color(0xFFF4F4F4),
+                offsetX = 0.dp,
+                offsetY = 2.dp,
+                blurRadius = 6.dp,
+                shadowRadius = 20.dp,
+            )
+            .background(
+                color = Color.White,
+                shape = RoundedCornerShape(20.dp),
+            ),
+    ) {
+        Column(
+            modifier = Modifier
+                .wrapContentHeight()
+                .fillMaxWidth(),
+        ) {
+            Box(modifier = Modifier.height(16.dp))
+
+            Box(
+                modifier = Modifier.padding(start = 14.dp),
+            ) {
+                Text(
+                    text = "我的服务",
+                    style = TextStyle(
+                        fontSize = 16.sp,
+                        lineHeight = 16.sp,
+                        letterSpacing = 0.38.sp,
+                        fontWeight = FontWeight.Medium,
+                        color = Color(0xFF333333),
+                    ),
+                )
+            }
+
+            Box(modifier = Modifier.height(18.dp))
+            Row(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .wrapContentHeight(),
+                horizontalArrangement = Arrangement.SpaceBetween,
+            ) {
+                HomePersonalServiceItem(
+                    iconRes = R.mipmap.personal_baby,
+                    description = "宝宝档案",
+                )
+                HomePersonalServiceItem(
+                    iconRes = R.mipmap.personal_address,
+                    description = "优惠券",
+                )
+                HomePersonalServiceItem(
+                    iconRes = R.mipmap.personal_verify,
+                    description = "查询真伪",
+                )
+                HomePersonalServiceItem(
+                    iconRes = R.mipmap.personal_material,
+                    description = "资料领取",
+                )
+            }
+            Box(modifier = Modifier.height(21.dp))
+            Row(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .wrapContentHeight(),
+                horizontalArrangement = Arrangement.SpaceBetween,
+            ) {
+                HomePersonalServiceItem(
+                    iconRes = R.mipmap.personal_customer,
+                    description = "在线客服",
+                )
+                HomePersonalServiceItem(
+                    iconRes = R.mipmap.personal_feedback,
+                    description = "帮助与反馈",
+                )
+                HomePersonalServiceItem(
+                    iconRes = R.mipmap.personal_setting,
+                    description = "设置",
+                )
+                HomePersonalServiceBlank()
+            }
+            Box(modifier = Modifier.height(27.dp))
+        }
+    }
+}
+
+@Composable
+fun RowScope.HomePersonalServiceItem(
+    @DrawableRes iconRes: Int,
+    description: String,
+) {
+    Column(
+        modifier = Modifier
+            .weight(1f)
+            .fillMaxHeight()
+            .widthIn(max = 64.dp),
+        verticalArrangement = Arrangement.SpaceBetween,
+        horizontalAlignment = Alignment.CenterHorizontally,
+    ) {
+        Image(
+            painter = painterResource(id = iconRes),
+            contentDescription = description,
+            modifier = Modifier
+                .width(34.dp)
+                .height(34.dp)
+        )
+        Box(modifier = Modifier.height(2.dp))
+        Text(
+            text = description,
+            style = TextStyle(
+                fontSize = 12.sp,
+                lineHeight = 12.sp,
+                fontWeight = FontWeight.Normal,
+                color = Color(0xFF333333),
+            ),
+        )
+    }
+}
+
+@Composable
+fun RowScope.HomePersonalServiceBlank() {
+    Column(
+        modifier = Modifier
+            .weight(1f)
+            .fillMaxHeight()
+            .widthIn(max = 64.dp),
+        verticalArrangement = Arrangement.SpaceBetween,
+        horizontalAlignment = Alignment.CenterHorizontally,
+    ) {
+        Box(
+            modifier = Modifier
+                .width(34.dp)
+                .height(48.dp)
+        )
+    }
+}

+ 4 - 0
component/personal/src/main/kotlin/com/zaojiao/component/personal/HomePersonalViewModel.kt

@@ -0,0 +1,4 @@
+package com.zaojiao.component.personal
+
+class HomePersonalViewModel {
+}

BIN
component/personal/src/main/res/mipmap-xhdpi/ic_cart.png


BIN
component/personal/src/main/res/mipmap-xhdpi/ic_default_avatar.png


BIN
component/personal/src/main/res/mipmap-xhdpi/ic_message.png


BIN
component/personal/src/main/res/mipmap-xhdpi/ic_qrcode.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_account.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_address.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_baby.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_clockin.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_coupon.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_course.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_customer.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_distribuion.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_feedback.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_history.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_invation.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_material.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_orders.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_report.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_setting.png


BIN
component/personal/src/main/res/mipmap-xhdpi/personal_verify.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/ic_cart.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/ic_default_avatar.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/ic_message.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/ic_qrcode.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_account.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_address.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_baby.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_clockin.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_coupon.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_course.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_customer.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_distribuion.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_feedback.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_history.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_invation.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_material.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_orders.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_report.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_setting.png


BIN
component/personal/src/main/res/mipmap-xxhdpi/personal_verify.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/ic_cart.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/ic_default_avatar.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/ic_message.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/ic_qrcode.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_account.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_address.png


+ 0 - 0
component/personal/src/main/res/mipmap-xxxhdpi/personal_baby.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_clockin.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_coupon.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_course.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_customer.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_distribuion.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_feedback.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_history.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_invation.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_material.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_orders.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_report.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_setting.png


BIN
component/personal/src/main/res/mipmap-xxxhdpi/personal_verify.png


+ 8 - 4
http/build.gradle.kts

@@ -1,6 +1,7 @@
 plugins {
     id("com.android.library")
     id("org.jetbrains.kotlin.android")
+    id("kotlin-kapt")
 }
 
 android {
@@ -35,9 +36,12 @@ android {
 dependencies {
     implementation("androidx.core:core-ktx:1.10.1")
 
-    implementation("com.squareup.okhttp3:okhttp:4.10.0")
-    implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
+    implementation("com.google.dagger:dagger:2.44.2")
+    add("kapt", "com.google.dagger:dagger-compiler:2.44.2")
 
-    implementation("com.squareup.retrofit2:retrofit:2.9.0")
-    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
+    api("com.squareup.okhttp3:okhttp:4.10.0")
+    api("com.squareup.okhttp3:logging-interceptor:4.10.0")
+
+    api("com.squareup.retrofit2:retrofit:2.9.0")
+    api("com.squareup.retrofit2:converter-gson:2.9.0")
 }

+ 0 - 24
http/src/androidTest/java/com/zaojiao/http/ExampleInstrumentedTest.kt

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

+ 4 - 2
http/src/main/java/com/zaojiao/http/HttpManager.kt

@@ -9,7 +9,7 @@ object HttpManager {
     private const val API_ENDPOINT = "https://open.api.luojigou.vip"
     private const val TIMEOUT: Long = 30 * 1000
 
-    private val okHttpClient by lazy {
+    private val _okHttpClient by lazy {
         OkHttpClient.Builder()
             .connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
             .readTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
@@ -20,9 +20,11 @@ object HttpManager {
             .build()
     }
 
+    public val httpClient get() = _okHttpClient
+
     private val restfulClient by lazy {
         Retrofit.Builder()
-            .client(okHttpClient)
+            .client(_okHttpClient)
             .baseUrl(API_ENDPOINT)
             .addConverterFactory(GsonConverterFactory.create())
             .build()

+ 5 - 0
http/src/main/java/com/zaojiao/http/HttpRepository.kt

@@ -0,0 +1,5 @@
+package com.zaojiao.http
+
+abstract class HttpRepository {
+    protected val httpManager = HttpManager
+}

+ 16 - 0
http/src/main/java/com/zaojiao/http/di/HttpModule.kt

@@ -0,0 +1,16 @@
+package com.zaojiao.http.di
+
+import dagger.Module
+import dagger.Provides
+import okhttp3.OkHttpClient
+import javax.inject.Singleton
+
+@Module
+class HttpModule {
+
+    @Singleton
+    @Provides
+    fun provideHttpClient(): OkHttpClient {
+        return OkHttpClient.Builder().build()
+    }
+}

+ 0 - 17
http/src/test/java/com/zaojiao/http/ExampleUnitTest.kt

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

+ 3 - 1
settings.gradle.kts

@@ -18,4 +18,6 @@ dependencyResolutionManagement {
 
 include(":app")
 include(":http")
-include(":ui")
+
+include(":component:personal")
+include(":component:common")

+ 0 - 23
ui/build.gradle.kts

@@ -1,23 +0,0 @@
-plugins {
-    id("com.android.library")
-    id("org.jetbrains.kotlin.android")
-}
-
-android {
-    namespace = "com.zaojiao.ui"
-    compileSdk = 33
-    defaultConfig.minSdk = 24
-    kotlinOptions.jvmTarget = "17"
-    compileOptions.sourceCompatibility = JavaVersion.VERSION_17
-    compileOptions.targetCompatibility = JavaVersion.VERSION_17
-
-    buildTypes {
-        release {
-            isMinifyEnabled = false
-        }
-    }
-}
-
-dependencies {
-    implementation("androidx.core:core-ktx:1.10.1")
-}

+ 0 - 21
ui/proguard-rules.pro

@@ -1,21 +0,0 @@
-# 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

+ 0 - 54
ui/src/main/java/com/zaojiao/ui/ClipRRectView.kt

@@ -1,54 +0,0 @@
-package com.zaojiao.ui
-
-import android.content.Context
-import android.graphics.Canvas
-import android.graphics.Path
-import android.graphics.RectF
-import android.util.AttributeSet
-import android.view.ViewGroup
-
-class ClipRRectView @JvmOverloads constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyle: Int = 0,
-) : ViewGroup(context, attrs, defStyle) {
-    private val path = Path()
-    private var radius = 0f
-
-    init {
-        val ta = context.obtainStyledAttributes(attrs, R.styleable.ClipRRectView)
-        radius = ta.getDimension(R.styleable.ClipRRectView_radius, 0f)
-        ta.recycle()
-    }
-
-    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
-        assert(childCount <= 1)
-
-        val child = getChildAt(0)
-        measureChild(child, widthMeasureSpec, heightMeasureSpec)
-        setMeasuredDimension(child.measuredWidth, child.measuredHeight)
-    }
-
-    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
-        val child = getChildAt(0)
-        child.layout(l, t, r, b)
-    }
-
-    override fun dispatchDraw(canvas: Canvas?) {
-        path.reset()
-        path.addRoundRect(
-            RectF(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat()),
-            radius,
-            radius,
-            Path.Direction.CW
-        )
-
-        canvas?.apply {
-//            save()
-            clipPath(path)
-            super.dispatchDraw(canvas)
-//            restore()
-        }
-    }
-}

+ 0 - 6
ui/src/main/res/values/styles.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <declare-styleable name="ClipRRectView">
-        <attr name="radius" format="dimension" />
-    </declare-styleable>
-</resources>