浏览代码

@fun: logout

bai 3 年之前
父节点
当前提交
91c49f392b
共有 20 个文件被更改,包括 326 次插入85 次删除
  1. 4 0
      app/src/main/java/com/ys/bdtp/adm/di/Di.kt
  2. 12 7
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/dao/UserDao.kt
  3. 1 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/ProjectEntity.kt
  4. 19 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/relation/UserWithProjects.kt
  5. 67 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/compose/LogoutPopup.kt
  6. 12 14
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/flash/Flash.kt
  7. 3 4
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/login/LoginContent.kt
  8. 9 6
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/main/Main.kt
  9. 63 25
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/project/Project.kt
  10. 4 1
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/project/ProjectItem.kt
  11. 20 12
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/task/TaskScreen.kt
  12. 20 12
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/task/TaskHeadLeft.kt
  13. 2 2
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/flash/FlashRepository.kt
  14. 2 2
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/flash/FlashViewModel.kt
  15. 27 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/project/ProjectRepository.kt
  16. 17 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/project/ProjectViewModel.kt
  17. 24 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/task/TaskRepository.kt
  18. 20 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/task/TaskViewModel.kt
  19. 二进制
      app/src/main/res/drawable-hdpi/logout.png
  20. 二进制
      app/src/main/res/drawable-xhdpi/logout.png

+ 4 - 0
app/src/main/java/com/ys/bdtp/adm/di/Di.kt

@@ -16,6 +16,8 @@ import com.ys.bdtp.adm.mvvm.vm.main.MainRepository
 import com.ys.bdtp.adm.mvvm.vm.main.MainViewModel
 import com.ys.bdtp.adm.mvvm.vm.project.ProjectRepository
 import com.ys.bdtp.adm.mvvm.vm.project.ProjectViewModel
+import com.ys.bdtp.adm.mvvm.vm.task.TaskRepository
+import com.ys.bdtp.adm.mvvm.vm.task.TaskViewModel
 import okhttp3.OkHttpClient
 import okhttp3.logging.HttpLoggingInterceptor
 import org.kodein.di.*
@@ -90,6 +92,7 @@ val repositoryModule = DI.Module("repository") {
     bind { provider { LoginRepository(instance(), instance()) } }
     bind { provider { MainRepository(instance()) } }
     bind { provider { ProjectRepository(instance(), instance()) } }
+    bind { provider { TaskRepository(instance(), instance()) } }
 }
 
 val viewModelModule = DI.Module("viewModel") {
@@ -97,6 +100,7 @@ val viewModelModule = DI.Module("viewModel") {
     bind { provider { LoginViewModel(instance()) } }
     bind { provider { MainViewModel(instance()) } }
     bind { provider { ProjectViewModel(instance()) } }
+    bind { provider { TaskViewModel(instance()) } }
 }
 
 val dbModule = DI.Module("dbModule") {

+ 12 - 7
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/dao/UserDao.kt

@@ -1,12 +1,8 @@
 package com.ys.bdtp.adm.mvvm.model.db.dao
 
-import androidx.room.Dao
-import androidx.room.Delete
-import androidx.room.Insert
-import androidx.room.OnConflictStrategy
-import androidx.room.Query
-import androidx.room.Update
+import androidx.room.*
 import com.ys.bdtp.adm.mvvm.model.db.entity.UserEntity
+import com.ys.bdtp.adm.mvvm.model.db.entity.relation.UserWithProjects
 
 /**
  * user 表访问接口
@@ -31,7 +27,7 @@ interface UserDao {
      * 获取当前登录用户
      */
     @Query("select * from user where state = 1")
-    suspend fun getCurrentUser(): UserEntity?
+    suspend fun currentUser(): UserEntity?
 
     @Query("select * from user where id = :id")
     fun getUserById(id: String): UserEntity
@@ -44,4 +40,13 @@ interface UserDao {
 
     @Delete
     fun delUser(user: UserEntity)
+
+    @Transaction
+    @Query("select * from user")
+    fun getUserWithProjects(): List<UserWithProjects>
+
+    @Transaction
+    @Query("select * from user where id = :id")
+    suspend fun getUserWithProjectsById(id: String): UserWithProjects
+
 }

+ 1 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/ProjectEntity.kt

@@ -18,4 +18,5 @@ data class ProjectEntity(
     @ColumnInfo(name = "name") val projectName: String,
     @ColumnInfo(name = "group_code") val groupCode: String,
     @ColumnInfo(name = "group_name") val groupName: String,
+    @ColumnInfo(name = "user_id") var userId: String = "",
 )

+ 19 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/relation/UserWithProjects.kt

@@ -0,0 +1,19 @@
+package com.ys.bdtp.adm.mvvm.model.db.entity.relation
+
+import androidx.room.Embedded
+import androidx.room.Relation
+import com.ys.bdtp.adm.mvvm.model.db.entity.ProjectEntity
+import com.ys.bdtp.adm.mvvm.model.db.entity.UserEntity
+
+/**
+ * User 与 Project 一对多关系
+ *
+ */
+data class UserWithProjects(
+    @Embedded val user: UserEntity,
+    @Relation(
+        parentColumn = "id",
+        entityColumn = "user_id"
+    )
+    val projects: List<ProjectEntity>
+)

+ 67 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/compose/LogoutPopup.kt

@@ -0,0 +1,67 @@
+package com.ys.bdtp.adm.mvvm.ui.compose
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.Icon
+import androidx.compose.material.Text
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.compose.ui.window.Popup
+import com.google.accompanist.insets.LocalWindowInsets
+import com.google.accompanist.insets.rememberInsetsPaddingValues
+import com.ys.bdtp.adm.R
+import com.ys.bdtp.adm.app.theme.textBlackColor
+import com.ys.bdtp.adm.app.theme.whiteColor
+
+@Composable
+fun LogoutPopup(click: () -> Unit) {
+    val inset = rememberInsetsPaddingValues(
+        LocalWindowInsets.current.statusBars,
+        additionalTop = 68.dp
+    )
+    val y = with(LocalDensity.current) {
+        inset.calculateTopPadding().toPx().toInt()
+    }
+    Popup(
+        alignment = Alignment.TopEnd,
+        offset = IntOffset(-24, y),
+    ) {
+        Row(
+            modifier = Modifier
+                .size(116.dp, 50.dp)
+                .background(color = whiteColor, shape = RoundedCornerShape(4.dp))
+                .clickable {
+                    click()
+                },
+            verticalAlignment = Alignment.CenterVertically,
+            horizontalArrangement = Arrangement.Center
+        ) {
+            Icon(
+                modifier = Modifier.size(16.dp),
+                painter = painterResource(R.drawable.logout),
+                contentDescription = "",
+                tint = Color(0xFF1F2429)
+            )
+
+            Spacer(modifier = Modifier.width(12.dp))
+
+            Text(text = "退出登录", fontSize = 14.sp, color = textBlackColor)
+        }
+    }
+}
+
+@Preview
+@Composable
+fun PreviewLogoutPopup() {
+    LogoutPopup(click = {})
+}

+ 12 - 14
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/flash/Flash.kt

@@ -8,8 +8,6 @@ import androidx.compose.foundation.layout.*
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -22,7 +20,7 @@ import com.ys.bdtp.adm.app.Token
 import com.ys.bdtp.adm.app.isNet
 import com.ys.bdtp.adm.app.theme.textBlackColor
 import com.ys.bdtp.adm.mvvm.ui.screen.main.LocalNavHostController
-import com.ys.bdtp.adm.mvvm.ui.screen.main.Zygote
+import com.ys.bdtp.adm.mvvm.ui.screen.main.Main
 import com.ys.bdtp.adm.mvvm.vm.flash.FlashViewModel
 import org.kodein.di.compose.rememberInstance
 import org.kodein.di.compose.rememberViewModel
@@ -36,20 +34,20 @@ fun Flash() {
     val nav = LocalNavHostController.current!!
 
     LaunchedEffect(Unit) {
-        val user = vm.getCurrentUser()
+        val user = vm.currentUser()
         val isNet = isNet(cm)
 
         when {
             user == null -> { // 未登录
-                nav.navigate(Zygote.Login) {
-                    popUpTo(Zygote.Flash) {
+                nav.navigate(Main.Login) {
+                    popUpTo(Main.Flash) {
                         inclusive = true
                     }
                 }
             }
             !isNet -> { // 登录 && 未联网
-                nav.navigate(Zygote.Project) {
-                    popUpTo(Zygote.Flash) {
+                nav.navigate(Main.Project) {
+                    popUpTo(Main.Flash) {
                         inclusive = true
                     }
                 }
@@ -57,23 +55,23 @@ fun Flash() {
             else -> {  // 登录 && 联网
                 val token = sp.getString(Token, "")
                 if (token == "") {
-                    nav.navigate(Zygote.Login) {
-                        popUpTo(Zygote.Flash) {
+                    nav.navigate(Main.Login) {
+                        popUpTo(Main.Flash) {
                             inclusive = true
                         }
                     }
                 } else {
                     vm.getAccount(
                         success = {
-                            nav.navigate(Zygote.Project) {
-                                popUpTo(Zygote.Flash) {
+                            nav.navigate(Main.Project) {
+                                popUpTo(Main.Flash) {
                                     inclusive = true
                                 }
                             }
                         },
                         failure = {
-                            nav.navigate(Zygote.Login) {
-                                popUpTo(Zygote.Flash) {
+                            nav.navigate(Main.Login) {
+                                popUpTo(Main.Flash) {
                                     inclusive = true
                                 }
                             }

+ 3 - 4
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/login/LoginContent.kt

@@ -23,9 +23,8 @@ import com.ys.bdtp.adm.app.theme.blueColor
 import com.ys.bdtp.adm.app.theme.grayColor
 import com.ys.bdtp.adm.app.theme.textBlackColor
 import com.ys.bdtp.adm.mvvm.model.vo.request.Login
-import com.ys.bdtp.adm.mvvm.ui.compose.Alert
 import com.ys.bdtp.adm.mvvm.ui.screen.main.LocalNavHostController
-import com.ys.bdtp.adm.mvvm.ui.screen.main.Zygote
+import com.ys.bdtp.adm.mvvm.ui.screen.main.Main
 import com.ys.bdtp.adm.mvvm.vm.login.LoginViewModel
 import kotlinx.coroutines.launch
 import org.kodein.di.compose.rememberInstance
@@ -201,8 +200,8 @@ fun LoginContent() {
                     ),
                     success = { token ->
                         sp.edit { putString(Token, token) }
-                        nav.navigate(Zygote.Project) {
-                            popUpTo(Zygote.Login) {
+                        nav.navigate(Main.Project) {
+                            popUpTo(Main.Login) {
                                 inclusive = true
                             }
                         }

+ 9 - 6
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/main/Main.kt

@@ -10,10 +10,10 @@ import androidx.navigation.compose.rememberNavController
 import com.ys.bdtp.adm.mvvm.ui.screen.flash.Flash
 import com.ys.bdtp.adm.mvvm.ui.screen.login.LoginScreen
 import com.ys.bdtp.adm.mvvm.ui.screen.project.Project
+import com.ys.bdtp.adm.mvvm.ui.screen.task.Task
 
 
-
-object Zygote {
+object Main {
     const val Flash = "flash"
     const val Login = "login"
     const val Project = "project"
@@ -26,16 +26,19 @@ val LocalNavHostController = compositionLocalOf<NavHostController?> { null }
 fun Main() {
     val navController = rememberNavController()
     CompositionLocalProvider(LocalNavHostController provides navController) {
-        NavHost(navController = navController, startDestination = Zygote.Flash) {
-            composable(Zygote.Flash) {
+        NavHost(navController = navController, startDestination = Main.Flash) {
+            composable(Main.Flash) {
                 Flash()
             }
-            composable(Zygote.Login) {
+            composable(Main.Login) {
                 LoginScreen()
             }
-            composable(Zygote.Project) {
+            composable(Main.Project) {
                 Project()
             }
+            composable("${Main.Task}/{projectId}") { backStackEntry ->
+                Task(backStackEntry.arguments?.getString("projectId")!!)
+            }
         }
 
     }

+ 63 - 25
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/project/Project.kt

@@ -12,11 +12,11 @@ import com.ys.bdtp.adm.app.isNet
 import com.ys.bdtp.adm.app.theme.underColor
 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.Account
-import com.ys.bdtp.adm.mvvm.ui.compose.Blank
-import com.ys.bdtp.adm.mvvm.ui.compose.Div
-import com.ys.bdtp.adm.mvvm.ui.compose.Head
-import com.ys.bdtp.adm.mvvm.ui.compose.HeadRight
+import com.ys.bdtp.adm.mvvm.model.db.entity.ProjectEntity
+import com.ys.bdtp.adm.mvvm.model.db.entity.UserEntity
+import com.ys.bdtp.adm.mvvm.ui.compose.*
+import com.ys.bdtp.adm.mvvm.ui.screen.main.LocalNavHostController
+import com.ys.bdtp.adm.mvvm.ui.screen.main.Main
 import com.ys.bdtp.adm.mvvm.vm.project.ProjectViewModel
 import kotlinx.coroutines.launch
 import org.kodein.di.compose.rememberInstance
@@ -28,25 +28,46 @@ import org.kodein.di.compose.rememberViewModel
 fun Project() {
     val vm by rememberViewModel<ProjectViewModel>()
     val cm by rememberInstance<ConnectivityManager>()
-
-    var account by remember { mutableStateOf<Account?>(null) }
+    val nav = LocalNavHostController.current!!
     val scope = rememberCoroutineScope()
+    var user by remember { mutableStateOf<UserEntity?>(null) }
+    var projects by remember { mutableStateOf<List<ProjectEntity>>(emptyList()) }
 
+    var popupState by remember { mutableStateOf(false) }
     LaunchedEffect(Unit) {
         // isNet 联网,进行网络通信,获取账号信息也判断 token是否能用
         if (isNet(cm)) {
-            scope.launch {
-                when (val response = vm.getAccount()) {
-                    is SuccessResponse -> {
-                        val a = response.data
-                        account = a
-                        vm.setCurrentAccount(a)
-                    }
+            when (val response = vm.getAccount()) {
+                is SuccessResponse -> {
+                    val account = response.data
+                    vm.setCurrentAccount(account)
+                    val up = vm.getUserWithProjectsById(account.id)
+                    user = up.user
+                    projects = up.projects
+                }
 
-                    is FailureResponse -> {
-                        // TODO 根据消息 进行跳转
+                is FailureResponse -> {
+                    val fail = response.fail
+                    if (fail.code == "catch") {
+                        // 提示网络问题
+                    } else {
+                        // 根据不同 code 进行不同操作
+                    }
+                }
+            }
+        } else {
+            // 离线
+            val u = vm.currentUser()
+            if (u == null) {
+                nav.navigate(Main.Login) {
+                    popUpTo(Main.Project) {
+                        inclusive = true
                     }
                 }
+            } else {
+                val up = vm.getUserWithProjectsById(u.id)
+                user = up.user
+                projects = up.projects
             }
         }
     }
@@ -61,25 +82,42 @@ fun Project() {
             right = {
                 HeadRight(
                     role = { "项目管家" },
-                    click = {}
+                    click = {
+                        popupState = !popupState
+                    }
                 )
             }
         )
+
+        if (popupState) {
+            LogoutPopup(
+                click = {
+                    scope.launch {
+                        vm.logout()
+                    }
+                    popupState = false
+                    nav.navigate(Main.Login) {
+                        popUpTo(Main.Project) {
+                            inclusive = true
+                        }
+                    }
+                }
+            )
+        }
+
         Div(Div.Row)
         Column(
             modifier = Modifier
-                .fillMaxHeight()
+                .fillMaxSize()
                 .wrapContentWidth()
                 .background(underColor)
                 .padding(horizontal = 32.dp, vertical = 40.dp)
         ) {
-            account?.let {
-                if (it.projects.isEmpty()) {
-                    Blank()
-                } else {
-                    ProjectContent(it.projects)
-                }
-            }
+            if (projects.isEmpty())
+                Blank()
+            else
+                ProjectContent(projects)
+
         }
     }
 }

+ 4 - 1
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/project/ProjectItem.kt

@@ -17,9 +17,12 @@ import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import com.ys.bdtp.adm.R
 import com.ys.bdtp.adm.mvvm.model.db.entity.ProjectEntity
+import com.ys.bdtp.adm.mvvm.ui.screen.main.LocalNavHostController
+import com.ys.bdtp.adm.mvvm.ui.screen.main.Main
 
 @Composable
 fun ProjectItem(project: ProjectEntity) {
+    val nav = LocalNavHostController.current!!
     Card(
         modifier = Modifier
             .fillMaxWidth()
@@ -32,7 +35,7 @@ fun ProjectItem(project: ProjectEntity) {
         Row(
             modifier = Modifier
                 .clickable {
-
+                    nav.navigate("${Main.Task}/${project.projectId}")
                 }
                 .padding(20.dp),
             verticalAlignment = Alignment.CenterVertically

+ 20 - 12
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/task/TaskScreen.kt

@@ -13,6 +13,11 @@ import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.layout.wrapContentWidth
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -22,18 +27,28 @@ import com.ys.bdtp.adm.R
 import com.ys.bdtp.adm.mvvm.model.db.entity.ProjectEntity
 import com.ys.bdtp.adm.mvvm.ui.compose.Head
 import com.ys.bdtp.adm.mvvm.ui.compose.TaskType
-import com.ys.bdtp.adm.mvvm.ui.compose.HeadLeft
 import com.ys.bdtp.adm.mvvm.ui.compose.HeadRight
+import com.ys.bdtp.adm.mvvm.ui.screen.main.LocalNavHostController
+import com.ys.bdtp.adm.mvvm.vm.task.TaskViewModel
+import org.kodein.di.compose.rememberViewModel
 
 @Composable
-fun TaskScreen(project: ProjectEntity) {
+fun Task(projectId: String) {
+    val nav = LocalNavHostController.current!!
+    val vm by rememberViewModel<TaskViewModel>()
+    var project by remember { mutableStateOf<ProjectEntity?>(null) }
+
+    LaunchedEffect(Unit) {
+        project = vm.getProject(projectId)
+    }
+
     Column(modifier = Modifier.fillMaxSize().background(Color.White)) {
         Head(
             left = {
                 TaskHeadLeft(
-                    title = project.projectName,
+                    title = "${project?.projectName}",
                     click = {
-
+                        nav.navigateUp()
                     })
             },
             right = {
@@ -97,12 +112,5 @@ fun TaskScreen(project: ProjectEntity) {
 )
 @Composable
 fun PreviewProjectScreen() {
-    TaskScreen(
-        ProjectEntity(
-            projectId = "111",
-            projectName = "京东",
-            groupCode = "GD",
-            groupName = "京东"
-        )
-    )
+    Task("111")
 }

+ 20 - 12
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/task/TaskHeadLeft.kt

@@ -4,6 +4,7 @@ import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.*
+import androidx.compose.material.IconButton
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
@@ -28,11 +29,18 @@ fun TaskHeadLeft(
 
         Spacer(modifier = Modifier.width(32.dp))
 
-        Image(
-            painter = painterResource(R.drawable.arrow_back),
-            contentDescription = "",
-            modifier = Modifier.size(24.dp)
-        )
+        IconButton(
+            modifier = Modifier.height(56.dp),
+            onClick = {
+                click()
+            }
+        ) {
+            Image(
+                painter = painterResource(R.drawable.arrow_back),
+                contentDescription = "",
+                modifier = Modifier.size(24.dp)
+            )
+        }
 
         Spacer(
             modifier = Modifier.width(16.dp)
@@ -45,14 +53,14 @@ fun TaskHeadLeft(
                 .background(Color(0xFFD8D8D8))
         )
 
-        Spacer(
-            modifier = Modifier.width(16.dp)
-        )
-
         Row(
-            modifier = Modifier.clickable {
-                click()
-            }
+            modifier = Modifier
+                .fillMaxHeight()
+                .clickable {
+                    //click()
+                }
+                .padding(16.dp),
+            verticalAlignment = Alignment.CenterVertically
         ) {
             Text(text = title, fontSize = 16.sp, fontWeight = FontWeight.Bold, color = Color(0xFF1F2329))
 

+ 2 - 2
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/flash/FlashRepository.kt

@@ -21,9 +21,9 @@ class FlashRepository(private val api: Api, private val db: AdmDatabase) {
     /**
      * 获取当前登录用户
      */
-    suspend fun getCurrentUser(): UserEntity? {
+    suspend fun currentUser(): UserEntity? {
         return withContext(Dispatchers.IO) {
-            db.userDao().getCurrentUser()
+            db.userDao().currentUser()
         }
     }
 

+ 2 - 2
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/flash/FlashViewModel.kt

@@ -21,8 +21,8 @@ class FlashViewModel(private val repo: FlashRepository) : ViewModel() {
     /**
      * 获取当前登录用户
      */
-    suspend fun getCurrentUser(): UserEntity? {
-        return repo.getCurrentUser()
+    suspend fun currentUser(): UserEntity? {
+        return repo.currentUser()
     }
 
     /**

+ 27 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/project/ProjectRepository.kt

@@ -4,6 +4,7 @@ import com.ys.bdtp.adm.mvvm.model.Response
 import com.ys.bdtp.adm.mvvm.model.db.AdmDatabase
 import com.ys.bdtp.adm.mvvm.model.db.entity.ProjectEntity
 import com.ys.bdtp.adm.mvvm.model.db.entity.UserEntity
+import com.ys.bdtp.adm.mvvm.model.db.entity.relation.UserWithProjects
 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.Account
@@ -57,7 +58,33 @@ class ProjectRepository(private val api: Api, private val db: AdmDatabase) {
             val users = db.userDao().getUsers().onEach { u -> u.state = 0 }
             db.userDao().insUsers(users)
             db.userDao().insUser(user)
+            account.projects.forEach { it.userId = user.id }
             db.projectDao().insProjects(account.projects)
         }
     }
+
+    suspend fun getUserWithProjectsById(id: String): UserWithProjects {
+        return withContext(Dispatchers.IO) {
+            db.userDao().getUserWithProjectsById(id)
+        }
+    }
+
+    /**
+     * 获取当前登录的用户
+     */
+    suspend fun getCurrentUser(): UserEntity? {
+        return withContext(Dispatchers.IO) {
+            db.userDao().currentUser()
+        }
+    }
+
+    suspend fun logout() {
+        withContext(Dispatchers.IO) {
+            val user = db.userDao().currentUser()
+            if (user != null) {
+                user.state = 0
+                db.userDao().updUser(user)
+            }
+        }
+    }
 }

+ 17 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/project/ProjectViewModel.kt

@@ -7,6 +7,8 @@ import com.ys.bdtp.adm.mvvm.model.FailureResponse
 import com.ys.bdtp.adm.mvvm.model.Response
 import com.ys.bdtp.adm.mvvm.model.SuccessResponse
 import com.ys.bdtp.adm.mvvm.model.db.entity.ProjectEntity
+import com.ys.bdtp.adm.mvvm.model.db.entity.UserEntity
+import com.ys.bdtp.adm.mvvm.model.db.entity.relation.UserWithProjects
 import com.ys.bdtp.adm.mvvm.model.vo.request.Account
 import kotlinx.coroutines.launch
 
@@ -52,4 +54,19 @@ class ProjectViewModel(private val repo: ProjectRepository) : ViewModel() {
     suspend fun setCurrentAccount(account: Account) {
         repo.setCurrentAccount(account)
     }
+
+    /**
+     * 获取用户与项目一对多关系
+     */
+    suspend fun getUserWithProjectsById(id: String): UserWithProjects {
+        return repo.getUserWithProjectsById(id)
+    }
+
+    suspend fun currentUser(): UserEntity? {
+        return repo.getCurrentUser()
+    }
+
+    suspend fun logout() {
+        repo.logout()
+    }
 }

+ 24 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/task/TaskRepository.kt

@@ -0,0 +1,24 @@
+package com.ys.bdtp.adm.mvvm.vm.task
+
+import com.ys.bdtp.adm.mvvm.model.db.AdmDatabase
+import com.ys.bdtp.adm.mvvm.model.db.entity.ProjectEntity
+import com.ys.bdtp.adm.mvvm.model.nt.Api
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
+
+/**
+ * TaskRepository
+ */
+class TaskRepository(private val api: Api, private val db: AdmDatabase) {
+    /**
+     * 获取项目实例
+     *
+     * @author bai
+     * @param id 项目id
+     */
+    suspend fun getProject(id: String): ProjectEntity {
+        return withContext(Dispatchers.IO) {
+            db.projectDao().getProjectById(id)
+        }
+    }
+}

+ 20 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/task/TaskViewModel.kt

@@ -0,0 +1,20 @@
+package com.ys.bdtp.adm.mvvm.vm.task
+
+import androidx.lifecycle.ViewModel
+import com.ys.bdtp.adm.mvvm.model.db.AdmDatabase
+import com.ys.bdtp.adm.mvvm.model.db.entity.ProjectEntity
+
+/**
+ * TaskViewModel
+ */
+class TaskViewModel(private val repo: TaskRepository) : ViewModel() {
+    /**
+     * 获取项目实例
+     *
+     * @author bai
+     * @param id 项目id
+     */
+   suspend fun getProject(id: String): ProjectEntity {
+        return repo.getProject(id)
+    }
+}

二进制
app/src/main/res/drawable-hdpi/logout.png


二进制
app/src/main/res/drawable-xhdpi/logout.png