소스 검색

@fun: login and some table

bai 3 년 전
부모
커밋
c62c1398ca
20개의 변경된 파일418개의 추가작업 그리고 135개의 파일을 삭제
  1. 14 3
      app/src/main/java/com/ys/bdtp/adm/AdmApplication.kt
  2. 18 38
      app/src/main/java/com/ys/bdtp/adm/App.kt
  3. 7 13
      app/src/main/java/com/ys/bdtp/adm/MainActivity.kt
  4. 3 6
      app/src/main/java/com/ys/bdtp/adm/app/Constants.kt
  5. 3 18
      app/src/main/java/com/ys/bdtp/adm/di/Di.kt
  6. 27 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/Data.kt
  7. 21 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/Http.kt
  8. 8 2
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/Model.kt
  9. 33 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/Response.kt
  10. 39 11
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/dict/EquipmentEntity.kt
  11. 26 13
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/dict/InfoEntity.kt
  12. 13 2
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/dict/MajorEntity.kt
  13. 15 4
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/dict/RelationDictEntity.kt
  14. 44 15
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/dict/SystemEntity.kt
  15. 25 3
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/nt/Api.kt
  16. 40 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/request/Account.kt
  17. 19 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/request/Login.kt
  18. 18 5
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/login/LoginScreen.kt
  19. 26 1
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/login/LoginRepository.kt
  20. 19 1
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/login/LoginViewModel.kt

+ 14 - 3
app/src/main/java/com/ys/bdtp/adm/AdmApplication.kt

@@ -1,11 +1,22 @@
 package com.ys.bdtp.adm
 
 import android.app.Application
+import com.ys.bdtp.adm.di.dbModule
+import com.ys.bdtp.adm.di.httpModule
+import com.ys.bdtp.adm.di.repositoryModule
+import com.ys.bdtp.adm.di.viewModelModule
 import org.kodein.di.DI
 import org.kodein.di.DIAware
+import org.kodein.di.android.x.androidXModule
+
+class AdmApplication : Application(), DIAware {
+    override val di: DI by DI.lazy {
+        import(androidXModule(this@AdmApplication))
+        import(httpModule)
+        import(repositoryModule)
+        import(viewModelModule)
+        import(dbModule)
+    }
 
-class AdmApplication : Application(),DIAware{
-    override val di: DI
-        get() = TODO("Not yet implemented")
 
 }

+ 18 - 38
app/src/main/java/com/ys/bdtp/adm/App.kt

@@ -1,58 +1,38 @@
 package com.ys.bdtp.adm
 
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.height
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Surface
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.SideEffect
-import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.unit.dp
 import com.google.accompanist.insets.ProvideWindowInsets
 import com.google.accompanist.systemuicontroller.rememberSystemUiController
 import com.ys.bdtp.adm.app.theme.AdmTheme
-import com.ys.bdtp.adm.di.di
-import com.ys.bdtp.adm.mvvm.ui.compose.SelectButton
-import com.ys.bdtp.adm.mvvm.ui.compose.SelectState
+import com.ys.bdtp.adm.mvvm.ui.screen.login.LoginScreen
 import org.kodein.di.compose.onDIContext
-import org.kodein.di.compose.withDI
 
 @Composable
-fun App() = withDI(di(LocalContext.current)) {
+fun App() = onDIContext(LocalContext.current) {
+    val systemUiController = rememberSystemUiController()
+    val useDarkIcons = MaterialTheme.colors.isLight
 
-    onDIContext(LocalContext.current) {
-        val systemUiController = rememberSystemUiController()
-        val useDarkIcons = MaterialTheme.colors.isLight
-
-        AdmTheme() {
-            ProvideWindowInsets {
-                Surface(color = MaterialTheme.colors.background) {
-                    SideEffect {
-                        systemUiController.setNavigationBarColor(
-                            color = Color.Transparent,
-                            darkIcons = useDarkIcons,
-                        )
-
-                        systemUiController.setStatusBarColor(
-                            color = Color.Transparent,
-                            darkIcons = useDarkIcons,
-                        )
-                    }
-                    Column {
-                        Spacer(Modifier.height(39.dp))
-                        // CadHeadMiddle()
-                        SelectButton(
-                            SelectState.Left,
-                            click = { state ->
-                                println("state:$state")
-                            })
-                    }
+    AdmTheme() {
+        ProvideWindowInsets {
+            Surface(color = MaterialTheme.colors.background) {
+                SideEffect {
+                    systemUiController.setNavigationBarColor(
+                        color = Color.Transparent,
+                        darkIcons = useDarkIcons,
+                    )
 
+                    systemUiController.setStatusBarColor(
+                        color = Color.Transparent,
+                        darkIcons = useDarkIcons,
+                    )
                 }
+                LoginScreen()
             }
         }
     }
-}
+}

+ 7 - 13
app/src/main/java/com/ys/bdtp/adm/MainActivity.kt

@@ -4,25 +4,19 @@ import android.os.Bundle
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
 import androidx.core.view.WindowCompat
+import org.kodein.di.DI
+import org.kodein.di.DIAware
+import org.kodein.di.android.closestDI
+
+class MainActivity : ComponentActivity(), DIAware {
+
+    override val di: DI by closestDI()
 
-class MainActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         WindowCompat.setDecorFitsSystemWindows(window, false)
         setContent {
             App()
         }
-        /* setContent {
-             // Update the system bars to be translucent
-             val systemUiController = rememberSystemUiController()
-             val useDarkIcons = MaterialTheme.colors.isLight
-             SideEffect {
-                 systemUiController.setSystemBarsColor(Color.Transparent, darkIcons = useDarkIcons)
-             }
-
-             ProvideWindowInsets {
-                 Sample()
-             }
-         }*/
     }
 }

+ 3 - 6
app/src/main/java/com/ys/bdtp/adm/app/Constants.kt

@@ -3,15 +3,12 @@ package com.ys.bdtp.adm.app
 /**
  * 测试服务器 IP
  */
-const val testIP = "http://192.168.0.48:8876/"
 
-const val test2IP = "http://192.168.0.11:8876/"
+const val devUrl = "http://develop.ysbdtp.com/adm-server/"
 
-const val tencentIP = "http://82.157.28.170:8876/"
+const val baseUrl = "http://www.ysbdtp.com/adm-server/"
 
-const val JdIP = "http://www.ysbdtp.com/adm-poc-backend/"
-
-const val IP = JdIP
+const val IP = devUrl
 
 const val devFileServiceUrl = "http://develop.persagy.com/image-service/"
 

+ 3 - 18
app/src/main/java/com/ys/bdtp/adm/di/Di.kt

@@ -1,8 +1,6 @@
 package com.ys.bdtp.adm.di
 
-import android.content.Context
 import android.util.Log
-import com.ys.bdtp.adm.AdmApplication
 import com.ys.bdtp.adm.app.IP
 import com.ys.bdtp.adm.app.converter.NullOrEmptyConverter
 import com.ys.bdtp.adm.app.interceptor.GzipRequestInterceptor
@@ -16,27 +14,14 @@ import com.ys.bdtp.adm.mvvm.vm.main.MainRepository
 import com.ys.bdtp.adm.mvvm.vm.main.MainViewModel
 import okhttp3.OkHttpClient
 import okhttp3.logging.HttpLoggingInterceptor
-import org.kodein.di.DI
-import org.kodein.di.android.x.androidXModule
-import org.kodein.di.bind
-import org.kodein.di.bindSingleton
-import org.kodein.di.instance
-import org.kodein.di.provider
-import org.kodein.di.singleton
+import org.kodein.di.*
 import retrofit2.Retrofit
 import retrofit2.converter.gson.GsonConverterFactory
 import java.io.UnsupportedEncodingException
 import java.util.concurrent.TimeUnit
 
-fun di(context: Context) = DI {
-    import(androidXModule(context.applicationContext as AdmApplication))
-    import(httpModule)
-    import(repositoryModule)
-    import(viewModelModule)
-    import(dbModule)
-}
 
-private val httpModule = DI.Module("httpModule") {
+val httpModule = DI.Module("httpModule") {
     // 构建 Retrofit 对象
     bind {
         singleton {
@@ -90,7 +75,7 @@ private val httpModule = DI.Module("httpModule") {
 
 val repositoryModule = DI.Module("repository") {
     bind { provider { FlashRepository(instance()) } }
-    bind { provider { LoginRepository(instance()) } }
+    bind { provider { LoginRepository(instance(), instance()) } }
     bind { provider { MainRepository(instance()) } }
 }
 

+ 27 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/Data.kt

@@ -1,5 +1,7 @@
 package com.ys.bdtp.adm.mvvm.model
 
+import kotlinx.coroutines.flow.*
+
 /**
  * UI 数据类
  *
@@ -31,3 +33,28 @@ sealed interface State {
     object Loading : State
     object Failure : State
 }
+
+inline fun <ResultType, RequestType> data(
+    crossinline fromDb: () -> Flow<ResultType>,
+    crossinline fromNt: suspend () -> RequestType,
+    crossinline onSuccess: suspend (RequestType) -> Unit,
+    crossinline onFailure: (Throwable) -> Unit = {},
+    crossinline isFromNt: (ResultType) -> Boolean = { true }
+): Flow<Data<ResultType>> = flow {
+    emit(Data.loading())
+    val data = fromDb().firstOrNull()
+    val isNt = data == null || isFromNt(data)
+
+    val flow = if (!isNt) {
+        fromDb().map { Data.success(it) }
+    } else {
+        try {
+            onSuccess(fromNt())
+            fromDb().map { Data.success(it) }
+        } catch (e: Exception) {
+            onFailure(e)
+            fromDb().map { Data.failure(e.message ?: "") }
+        }
+    }
+    emitAll(flow)
+}

+ 21 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/Http.kt

@@ -0,0 +1,21 @@
+package com.ys.bdtp.adm.mvvm.model
+
+
+/**
+ * 网络请求
+ *
+ * @param block 请求方法
+ * @return [Response] 请求结果封装
+ */
+suspend fun <T> request(block: suspend () -> Model<T>): Response<T> {
+    return try {
+        val model = block()
+        if (model.result == "success") {
+            Response.create(model.data)
+        } else {
+            Response.create(model.message ?: "request ok, but no data")
+        }
+    } catch (e: Throwable) {
+        Response.create(e.message ?: "request crash but nothing")
+    }
+}

+ 8 - 2
app/src/main/java/com/ys/bdtp/adm/mvvm/model/Model.kt

@@ -2,9 +2,15 @@ package com.ys.bdtp.adm.mvvm.model
 
 /**
  * Api 请求数据容器
+ *
+ * @author bai
+ *
+ * @param result 请求状态, 成功: "success", 失败: http://39.102.54.110:9009/utils/common.html#%E9%94%99%E8%AF%AF%E7%A0%81%E5%88%97%E8%A1%A8
+ * @param message 请求信息
+ * @param data 网络请求返回数据
  */
 data class Model<T>(
-    val code: String,
-    val msg: String? = null,
+    val result: String,
+    val message: String? = null,
     val data: T
 )

+ 33 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/Response.kt

@@ -0,0 +1,33 @@
+package com.ys.bdtp.adm.mvvm.model
+
+/**
+ * 网络请求状态
+ *
+ * @author bai
+ */
+sealed class Response<T> {
+    companion object {
+        fun <T> create(message: String): FailureResponse<T> {
+            return FailureResponse(message)
+        }
+
+        fun <T> create(data: T): Response<T> {
+            return SuccessResponse(data)
+        }
+    }
+}
+
+/**
+ * 网络请求成功
+ *
+ * @author bai
+ */
+data class SuccessResponse<T>(val data: T) : Response<T>()
+
+
+/**
+ * 网络请求失败
+ *
+ * @author bai
+ */
+data class FailureResponse<T>(val message: String) : Response<T>()

+ 39 - 11
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/dict/EquipmentEntity.kt

@@ -6,23 +6,51 @@ import androidx.room.PrimaryKey
 import java.io.Serializable
 
 /**
- * 设备字典表(远程无对应表)
+ * 字典, 设备表
+ *
+ * @author bai
+ *
+ * @param id
+ * @param code 系统编码
+ * @param name 系统名称
+ * @param objType 对象类型: "equipment"
+ * @param aliasCode 编码别名
+ * @param aliasName 名称别名
+ * @param groupCode 集团编码
+ * @param projectId 项目id
+ * @param majorCode 专业编码
+ * @param systemCode 系统编码
+ * @param parentCode 父编码
+ * @param equipmentCode 父编设备编码码
+ * @param m2d 正向交付设备类标注
+ * @param valid 有效标识: 0 无效, 1 有效
+ * @param version 版本
+ * @param sourceFrom
+ * @param creator 创建人
+ * @param creationTime 创建时间
+ * @param modifier 最后修改人
+ * @param modifiedTime 最后修改时间
  */
 @Entity(tableName = "equipment")
 data class EquipmentEntity(
-    @PrimaryKey val id: String,
+    @PrimaryKey @ColumnInfo(name = "id") val id: String,
+    @ColumnInfo(name = "code") val code: String?,
+    @ColumnInfo(name = "name") val name: String?,
+    @ColumnInfo(name = "obj_type") val objType: String?,
+    @ColumnInfo(name = "alias_code") val aliasCode: String?,
+    @ColumnInfo(name = "alias_name") val aliasName: String?,
+    @ColumnInfo(name = "group_code") val groupCode: String?,
     @ColumnInfo(name = "project_id") val projectId: String?,         // 项目 id
-    @ColumnInfo(name = "code") val code: String?,                    // 设备编码
-    @ColumnInfo(name = "name") val name: String?,                    // 设备名称
-    @ColumnInfo(name = "obj_type") val objType: String?,             // 对象类型
-    @ColumnInfo(name = "group_code") val groupCode: String?,         // 集团编码
     @ColumnInfo(name = "major_code") val majorCode: String?,         // 专业编码
     @ColumnInfo(name = "system_code") val systemCode: String?,       // 系统编码
     @ColumnInfo(name = "parent_code") val parentCode: String?,       // 父编码
     @ColumnInfo(name = "equipment_code") val equipmentCode: String?, // 设备编码
-    @ColumnInfo(name = "alias_code") val aliasCode: String?,         // 编码别名
-    @ColumnInfo(name = "alias_name") val aliasName: String?,         // 名称别名
-    @ColumnInfo(name = "version") val version: String?,              // 版本
-    @ColumnInfo(name = "system_name") var systemName: String?,       // 系统编码
+    @ColumnInfo(name = "m2d") var m2d: Boolean,
     @ColumnInfo(name = "valid") var valid: Int?,                     // 有效标识, // 1 正常 0 删除
-) : Serializable
+    @ColumnInfo(name = "version") val version: String?,              // 版本
+    @ColumnInfo(name = "source_from") var sourceFrom: Boolean,
+    @ColumnInfo(name = "creator") val creator: String,
+    @ColumnInfo(name = "creation_time") val creationTime: String,
+    @ColumnInfo(name = "modifier") val modifier: String,
+    @ColumnInfo(name = "modified_time") val modifiedTime: String,
+)

+ 26 - 13
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/dict/InfoEntity.kt

@@ -6,21 +6,37 @@ import androidx.room.PrimaryKey
 import com.google.gson.JsonElement
 
 /**
- * info 表
- * 通过 code 和 classCode 的各种组合来使用
- * code : Info 本身编码,
- * classCode : 设备编码,对应多个 info
- * 关系:一个 classCode 下有多个 code;不同 classCode 下的 code 可能相同
+ * 字典, 信息表
+ *
+ * @author bai
+ *
+ * @param id
+ * @param code 信息编码
+ * @param name 信息名称
+ * @param aliasCode 编码别名
+ * @param classCode 类型编码
+ * @param groupCode 集团编码
+ * @param projectId 项目id
+ * @param firstTag
+ * @param secondTag
+ * @param inputMode
+ * @param unit
+ * @param dataType
+ * @param dataSource
+ * @param showOrder
+ * @param version
+ *
  */
 @Entity(tableName = "info")
 data class InfoEntity(
-    @PrimaryKey(autoGenerate = true) val id: Int = 0,
-    @ColumnInfo(name = "group_code") val groupCode: String? = null,
-    @ColumnInfo(name = "project_id") val projectId: String? = null,
-    @ColumnInfo(name = "code") val code: String? = null,              // Info 编码
+    @PrimaryKey(autoGenerate = true)
+    @ColumnInfo(name = "id") val id: Int = 0,
+    @ColumnInfo(name = "code") val code: String? = null,
     @ColumnInfo(name = "name") val name: String? = null,
     @ColumnInfo(name = "alias_code") val aliasCode: String? = null,
-    @ColumnInfo(name = "class_code") val classCode: String? = null,   // 类型编码
+    @ColumnInfo(name = "class_code") val classCode: String? = null,
+    @ColumnInfo(name = "group_code") val groupCode: String? = null,
+    @ColumnInfo(name = "project_id") val projectId: String? = null,
     @ColumnInfo(name = "first_tag") val firstTag: String? = null,
     @ColumnInfo(name = "second_tag") val secondTag: String? = null,
     @ColumnInfo(name = "input_mode") val inputMode: String? = null,
@@ -29,7 +45,4 @@ data class InfoEntity(
     @ColumnInfo(name = "data_source") val dataSource: JsonElement? = null,
     @ColumnInfo(name = "show_order") val showOrder: Long? = null,
     @ColumnInfo(name = "version") val version: String? = null
-    // String aliasName;
-    // Boolean isMultiple = false;
-    // Boolean isRegion = false;
 )

+ 13 - 2
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/dict/MajorEntity.kt

@@ -5,11 +5,22 @@ import androidx.room.Entity
 import androidx.room.PrimaryKey
 
 /**
- * 专业字典表(远程无对应表)
+ * 字典, 专业表
+ *
+ * @author bai
+ *
+ * @param id
+ * @param label 专业标签
+ * @param code 专业编码
+ * @param type 专业类型
+ * @param orderNum 序号
+ * @param dictTypeId 字典类型id
+ * @param valid 有效标识: 0 无效, 1 有效
+ * @param remark 备注
  */
 @Entity(tableName = "major")
 data class MajorEntity(
-    @PrimaryKey val id: String,
+    @PrimaryKey @ColumnInfo(name = "id") val id: String,
     @ColumnInfo(name = "label") val label: String,             // 专业标签
     @ColumnInfo(name = "code") val code: String,               // 专业编码
     @ColumnInfo(name = "type") val type: String,               // 专业类型

+ 15 - 4
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/dict/RelationDictEntity.kt

@@ -5,7 +5,20 @@ import androidx.room.Entity
 import androidx.room.PrimaryKey
 
 /**
- * 关系字典表(关系定义)(远程无对应表)
+ * 字典, 关系表
+ *
+ * @author bai
+ *
+ * @param id
+ * @param code 关系编码
+ * @param name 关系名称
+ * @param graphCode 图编码
+ * @param directional 方向
+ * @param attribute 属性
+ * @param fromObjType 指出
+ * @param toObjType 指向
+ * @param remark 备注 * @param valid 有效标识: 0 无效, 1 有效
+ *
  */
 @Entity(tableName = "relation_dict")
 data class RelationDictEntity(
@@ -14,12 +27,10 @@ data class RelationDictEntity(
     @ColumnInfo(name = "name") val name: String,                  // 关系名
     @ColumnInfo(name = "graph_code") val graphCode: String,       // 图编码
     @ColumnInfo(name = "directional") val directional: Int?,      // 方向
-    @ColumnInfo(name = "target_Objs") val targetObjs: String?,    // 目标对象
+    @ColumnInfo(name = "target_objs") val targetObjs: String?,    // 目标对象
     @ColumnInfo(name = "attribute") val attribute: String?,       // 属性
     @ColumnInfo(name = "fromObjType") val fromObjType: String?,
     @ColumnInfo(name = "toObjType") val toObjType: String?,
     @ColumnInfo(name = "remark") val remark: String?,
     @ColumnInfo(name = "valid") var valid: Int?,                   // 有效标识, // 1 正常 0 删除
-    //@ColumnInfo(name = "before_cal_rels") val beforeCalRels: String?,
-    //@ColumnInfo(name = "calRules") val calRules: String?,
 )

+ 44 - 15
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/dict/SystemEntity.kt

@@ -5,22 +5,51 @@ import androidx.room.Entity
 import androidx.room.PrimaryKey
 
 /**
- * 系统字典表(远程无对应表)
+ * 字典, 系统表
+ *
+ * @author bai
+ *
+ * @param id
+ * @param code 系统编码
+ * @param name 系统名称
+ * @param objType 对象类型: "system"
+ * @param aliasCode 编码别名
+ * @param aliasName 名称别名
+ * @param groupCode 集团编码
+ * @param projectId 项目id
+ * @param majorCode 专业编码
+ * @param systemCode 系统编码
+ * @param parentCode 父编码
+ * @param equipmentCode 父编设备编码码
+ * @param m2d 正向交付设备类标注
+ * @param valid 有效标识: 0 无效, 1 有效
+ * @param version 版本
+ * @param sourceFrom
+ * @param creator 创建人
+ * @param creationTime 创建时间
+ * @param modifier 最后修改人
+ * @param modifiedTime 最后修改时间
  */
 @Entity(tableName = "system")
 data class SystemEntity(
-    @PrimaryKey val id: String,
-    @ColumnInfo(name = "code") val code: String,                     // 系统编码
-    @ColumnInfo(name = "name") val name: String,                     // 系统名称
-    @ColumnInfo(name = "alias_code") val aliasCode: String?,         // 编码别名
-    @ColumnInfo(name = "alias_name") val aliasName: String?,         // 名称别名
-    @ColumnInfo(name = "project_id") val projectId: String?,         // 项目 id
-    @ColumnInfo(name = "obj_type") val objType: String,              // 对象类型 "system"
-    @ColumnInfo(name = "group_code") val groupCode: String?,         // 集团编码
-    @ColumnInfo(name = "major_code") val majorCode: String?,         // 专业编码
-    @ColumnInfo(name = "system_code") val systemCode: String?,       // 系统编码
-    @ColumnInfo(name = "parent_code") val parentCode: String?,       // 父编码
-    @ColumnInfo(name = "equipment_code") val equipmentCode: String?, // 设备编码
-    @ColumnInfo(name = "version") val version: String?,              // 版本
-    @ColumnInfo(name = "valid") var valid: Int?,                     // 有效标识, // 1 正常 0 删除
+    @PrimaryKey @ColumnInfo(name = "id") val id: String,
+    @ColumnInfo(name = "code") val code: String,
+    @ColumnInfo(name = "name") val name: String,
+    @ColumnInfo(name = "obj_type") val objType: String,
+    @ColumnInfo(name = "alias_code") val aliasCode: String?,
+    @ColumnInfo(name = "alias_name") val aliasName: String?,
+    @ColumnInfo(name = "group_code") val groupCode: String?,
+    @ColumnInfo(name = "project_id") val projectId: String?,
+    @ColumnInfo(name = "major_code") val majorCode: String?,
+    @ColumnInfo(name = "system_code") val systemCode: String?,
+    @ColumnInfo(name = "parent_code") val parentCode: String?,
+    @ColumnInfo(name = "equipment_code") val equipmentCode: String?,
+    @ColumnInfo(name = "m2d") var m2d: Boolean,
+    @ColumnInfo(name = "valid") var valid: Int?,
+    @ColumnInfo(name = "version") val version: String?,
+    @ColumnInfo(name = "source_from") var sourceFrom: Boolean,
+    @ColumnInfo(name = "creator") val creator: String,
+    @ColumnInfo(name = "creation_time") val creationTime: String,
+    @ColumnInfo(name = "modifier") val modifier: String,
+    @ColumnInfo(name = "modified_time") val modifiedTime: String,
 )

+ 25 - 3
app/src/main/java/com/ys/bdtp/adm/mvvm/model/nt/Api.kt

@@ -1,8 +1,30 @@
 package com.ys.bdtp.adm.mvvm.model.nt
 
-import retrofit2.http.GET
+import com.ys.bdtp.adm.mvvm.model.Model
+import com.ys.bdtp.adm.mvvm.model.vo.request.Account
+import com.ys.bdtp.adm.mvvm.model.vo.request.Login
+import retrofit2.http.Body
+import retrofit2.http.POST
 
+/**
+ * 后端API
+ *
+ * @author bai
+ */
 interface Api {
-    @GET("")
-    fun login()
+    /**
+     * 登录接口,登录只获取token
+     *
+     * @param login 登录参数
+     * @return [Model] 返回token
+     */
+    @POST("auth/account/login")
+    suspend fun login(@Body login: Login): Model<String>
+
+    /**
+     *  获取账号信息
+     */
+    @POST("auth/login/loginInfo")
+    suspend fun getAccount(): Model<Account>
+
 }

+ 40 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/request/Account.kt

@@ -0,0 +1,40 @@
+package com.ys.bdtp.adm.mvvm.model.vo.request
+
+/**
+ * 账号信息
+ *
+ * @author bai
+ *
+ * @param account
+ * @param deptId
+ * @param email
+ * @param id
+ * @param name
+ * @param phone
+ * @param projects
+ */
+data class Account(
+    val account: String,
+    val deptId: String,
+    val email: String,
+    val id: String,
+    val name: String,
+    val phone: String,
+    val projects: List<Project>
+)
+
+/**
+ * 项目信息
+ *
+ * @author bai
+ * @param projectId 项目id
+ * @param projectName 项目名称
+ * @param groupCode 集团编码
+ * @param groupName 集团名称
+ */
+data class Project(
+    val groupCode: String,
+    val groupName: String,
+    val projectId: String,
+    val projectName: String
+)

+ 19 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/request/Login.kt

@@ -0,0 +1,19 @@
+package com.ys.bdtp.adm.mvvm.model.vo.request
+
+/**
+ * 登录参数
+ *
+ * @author bai
+ *
+ * @param phone 电话
+ * @param passWord 密码
+ * @param loginDeviceType 登录设备类型: 1-pc 2-Android 3-ios, 4-其他
+ * @param loginType 登录方式: 1-用户名密码, 2-手机号登录, 3-钉钉扫码登录
+ *
+ */
+data class Login(
+    val phone: String,
+    val passWord: String,
+    val loginDeviceType: String = "2",
+    val loginType: String = "2",
+)

+ 18 - 5
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/login/LoginScreen.kt

@@ -43,10 +43,13 @@ import androidx.constraintlayout.compose.ConstraintLayout
 import com.google.accompanist.insets.LocalWindowInsets
 import com.google.accompanist.insets.statusBarsHeight
 import com.ys.bdtp.adm.R
+import com.ys.bdtp.adm.mvvm.model.vo.request.Login
+import com.ys.bdtp.adm.mvvm.vm.login.LoginViewModel
+import org.kodein.di.compose.rememberViewModel
 
 @Composable
 fun LoginScreen() {
-    // val vm by rememberViewModel<LoginViewModel>()
+    val vm by rememberViewModel<LoginViewModel>()
     val insets = LocalWindowInsets.current
     println("insets: ${insets.statusBars.layoutInsets.left}")
     println("insets: ${insets.statusBars.layoutInsets.bottom}")
@@ -54,7 +57,7 @@ fun LoginScreen() {
     println("insets: $imeBottom")
 
     var isShowPassword by remember { mutableStateOf(false) }
-    var isLoginBtnEnable by remember { mutableStateOf(false) }
+    var isLoginBtnEnable by remember { mutableStateOf(true) }
 
     var username by remember { mutableStateOf("") }
     var password by remember { mutableStateOf("") }
@@ -251,9 +254,19 @@ fun LoginScreen() {
 
             Button(
                 onClick = {
-                    // TODO
-                    // 处理完后清空数据
-                    isLoginBtnEnable = username.isNotEmpty() && password.isNotEmpty()
+                    vm.login(
+                        login = Login(
+                            phone = "17337681032",
+                            passWord = "123456",
+                        ),
+                        success = {
+                            println("success::::$it")
+                        },
+                        failure = {
+                            println("failure::::$it")
+                        }
+                    )
+                    //isLoginBtnEnable = username.isNotEmpty() && password.isNotEmpty()
                     // TODO
                     // 返回登录结果进行处理
                 },

+ 26 - 1
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/login/LoginRepository.kt

@@ -1,5 +1,30 @@
 package com.ys.bdtp.adm.mvvm.vm.login
 
+import com.ys.bdtp.adm.mvvm.model.Response
+import com.ys.bdtp.adm.mvvm.model.db.AdmDatabase
 import com.ys.bdtp.adm.mvvm.model.nt.Api
+import com.ys.bdtp.adm.mvvm.model.request
+import com.ys.bdtp.adm.mvvm.model.vo.request.Login
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
 
-class LoginRepository(private val api: Api)
+/**
+ * Login 存储仓库
+ *
+ * @author bai
+ *
+ * @param api
+ */
+class LoginRepository(private val api: Api, private val db: AdmDatabase) {
+
+    /**
+     * 登录
+     */
+    suspend fun login(login: Login): Response<String> {
+        return withContext(Dispatchers.IO) {
+            request {
+                api.login(login)
+            }
+        }
+    }
+}

+ 19 - 1
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/login/LoginViewModel.kt

@@ -1,5 +1,23 @@
 package com.ys.bdtp.adm.mvvm.vm.login
 
 import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.ys.bdtp.adm.mvvm.model.FailureResponse
+import com.ys.bdtp.adm.mvvm.model.SuccessResponse
+import com.ys.bdtp.adm.mvvm.model.vo.request.Login
+import kotlinx.coroutines.launch
 
-class LoginViewModel(private val repo: LoginRepository) : ViewModel()
+class LoginViewModel(private val repo: LoginRepository) : ViewModel() {
+    fun login(login: Login, success: (String) -> Unit, failure: (String) -> Unit) {
+        viewModelScope.launch {
+            when (val response = repo.login(login)) {
+                is SuccessResponse -> {
+                    success(response.data)
+                }
+                is FailureResponse -> {
+                    failure(response.message)
+                }
+            }
+        }
+    }
+}