Browse Source

@fun: Flash

bai 3 years ago
parent
commit
885f11bf47

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

@@ -2,6 +2,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="com.ys.bdtp.adm">
 
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.INTERNET"/>
     <application
             android:allowBackup="true"

+ 3 - 1
app/src/main/java/com/ys/bdtp/adm/App.kt

@@ -10,6 +10,7 @@ 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.mvvm.ui.screen.login.LoginScreen
+import com.ys.bdtp.adm.mvvm.ui.screen.main.MainScreen
 import org.kodein.di.compose.onDIContext
 
 @Composable
@@ -31,7 +32,8 @@ fun App() = onDIContext(LocalContext.current) {
                         darkIcons = useDarkIcons,
                     )
                 }
-                LoginScreen()
+                //LoginScreen()
+                MainScreen()
             }
         }
     }

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

@@ -22,4 +22,6 @@ const val BDTP_TS = "bdtp_ts"
 
 const val ADM_TS = "adm_ts"
 
-const val CLIENT_ID = "client_id"
+const val CLIENT_ID = "client_id"
+
+const val Token = "token"

+ 13 - 0
app/src/main/java/com/ys/bdtp/adm/app/Tools.kt

@@ -0,0 +1,13 @@
+package com.ys.bdtp.adm.app
+
+import android.net.ConnectivityManager
+import android.net.NetworkCapabilities
+
+/**
+ * 判断是否联网
+ */
+fun isNet(cm: ConnectivityManager): Boolean {
+    val network = cm.activeNetwork
+    val networkCapabilities = cm.getNetworkCapabilities(network)
+    return networkCapabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) ?: false
+}

+ 6 - 4
app/src/main/java/com/ys/bdtp/adm/app/theme/Color.kt

@@ -14,10 +14,10 @@ val whiteColor = Color(0xFFFFFFFF)
 val disableColor = Color(0xFFD8D8D8)
 
 // 主色调
-val admColor = Color(0xFF0091FF)
+val blueColor = Color(0xFF0091FF)
 
 // 蓝色背景
-val bgBlueColor = admColor
+val bgBlueColor = blueColor
 
 // 分割线颜色
 val divColor = Color(0xFFEFF0F1)
@@ -26,7 +26,7 @@ val divColor = Color(0xFFEFF0F1)
 val textBlackColor = Color(0xFF1F2429)
 
 // 文本蓝色
-val textBlueColor = admColor
+val textBlueColor = blueColor
 
 // 表头背景颜色
 val thColor = Color(0xFFF8F9FA)
@@ -35,4 +35,6 @@ val thColor = Color(0xFFF8F9FA)
 val trBgColor = whiteColor
 
 // 表行分割线
-val trDivColor = Color(0xFFE4E6E7)
+val trDivColor = Color(0xFFE4E6E7)
+
+val grayColor = Color(0xFFC3C7CB)

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

@@ -74,7 +74,7 @@ val httpModule = DI.Module("httpModule") {
 }
 
 val repositoryModule = DI.Module("repository") {
-    bind { provider { FlashRepository(instance()) } }
+    bind { provider { FlashRepository(instance(), instance()) } }
     bind { provider { LoginRepository(instance(), instance()) } }
     bind { provider { MainRepository(instance()) } }
 }

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

@@ -10,6 +10,7 @@ import com.ys.bdtp.adm.mvvm.model.db.entity.UserEntity
 
 /**
  * user 表访问接口
+ *
  * @author bai
  */
 @Dao
@@ -20,8 +21,17 @@ interface UserDao {
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     fun insUsers(users: List<UserEntity>): List<Long>
 
+    /**
+     * 获取所有本地登陆过的用户
+     */
     @Query("select * from user")
-    fun getUsers(): List<UserEntity>
+    suspend fun getUsers(): List<UserEntity>
+
+    /**
+     * 获取当前登录用户
+     */
+    @Query("select * from user where state = 1")
+    suspend fun getCurrentUser(): UserEntity?
 
     @Query("select * from user where id = :id")
     fun getUserById(id: String): UserEntity

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

@@ -14,6 +14,7 @@ import androidx.room.PrimaryKey
  * @param email BOSS 邮箱
  * @param phone BOSS 手机
  * @param name BOSS 用户名
+ * @param state 本地登录状态: 0 未登录, 1 已登录
  *
  */
 @Entity(tableName = "user")
@@ -24,5 +25,6 @@ data class UserEntity(
     @ColumnInfo(name = "dept_id") val deptId: String,
     @ColumnInfo(name = "email") val email: String,
     @ColumnInfo(name = "phone") val phone: String,
-    @ColumnInfo(name = "name") val name: String
+    @ColumnInfo(name = "name") val name: String,
+    @ColumnInfo(name = "state") val state: Int,
 )

+ 3 - 3
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/cad/CadDrawingItem.kt

@@ -16,7 +16,7 @@ import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
-import com.ys.bdtp.adm.app.theme.admColor
+import com.ys.bdtp.adm.app.theme.blueColor
 import com.ys.bdtp.adm.app.theme.textBlackColor
 import com.ys.bdtp.adm.app.theme.textBlueColor
 import com.ys.bdtp.adm.app.theme.trBgColor
@@ -70,8 +70,8 @@ fun CadDrawingItem() {
             onCheckedChange = {},
             modifier = Modifier.weight(2f),
             colors = SwitchDefaults.colors(
-                checkedThumbColor = admColor,
-                checkedTrackColor = admColor,
+                checkedThumbColor = blueColor,
+                checkedTrackColor = blueColor,
                 uncheckedThumbColor = Color(0xFFE5E5E5),
                 uncheckedTrackColor = Color(0xFFE5E5E5)
             )

+ 73 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/flash/FlashScreen.kt

@@ -0,0 +1,73 @@
+package com.ys.bdtp.adm.mvvm.ui.screen.flash
+
+import android.content.SharedPreferences
+import android.net.ConnectivityManager
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+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.tooling.preview.Preview
+import androidx.compose.ui.unit.sp
+import com.ys.bdtp.adm.app.Token
+import com.ys.bdtp.adm.app.isNet
+import com.ys.bdtp.adm.mvvm.ui.screen.main.Zygote
+import com.ys.bdtp.adm.mvvm.vm.flash.FlashViewModel
+import kotlinx.coroutines.delay
+import org.kodein.di.compose.rememberInstance
+import org.kodein.di.compose.rememberViewModel
+
+
+@Composable
+fun FlashScreen(block: (Zygote) -> Unit) {
+    val vm by rememberViewModel<FlashViewModel>()
+    val cm by rememberInstance<ConnectivityManager>()
+    val zygote by rememberUpdatedState(block)
+    val sp by rememberInstance<SharedPreferences>()
+    LaunchedEffect(Unit) {
+        delay(5000)
+        val user = vm.getCurrentUser()
+        val isNet = isNet(cm)
+
+        when {
+            user == null -> { // 未登录
+                zygote(Zygote.Login)
+            }
+            !isNet -> { // 登录 && 未联网
+                zygote(Zygote.Project)
+            }
+            else -> {  // 未登录 && 未联网
+                val token = sp.getString(Token, "")
+                if (token == "")
+                    zygote(Zygote.Login)
+                else
+                    vm.getAccount(
+                        success = {
+                            zygote(Zygote.Project)
+                        },
+                        failure = {
+                            zygote(Zygote.Login)
+                        }
+                    )
+            }
+        }
+    }
+
+    Column(
+        modifier = Modifier.fillMaxSize().background(Color.White),
+        verticalArrangement = Arrangement.Center,
+        horizontalAlignment = Alignment.CenterHorizontally
+    ) {
+        Text(text = "Yushu", fontSize = 24.sp)
+    }
+}
+
+@Preview
+@Composable
+fun PreviewFlashScreen() {
+    FlashScreen(block = { })
+}

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

@@ -0,0 +1,242 @@
+package com.ys.bdtp.adm.mvvm.ui.screen.login
+
+import android.content.SharedPreferences
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.*
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.focus.FocusState
+import androidx.compose.ui.focus.onFocusChanged
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.input.PasswordVisualTransformation
+import androidx.compose.ui.text.input.VisualTransformation
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.core.content.edit
+import com.ys.bdtp.adm.R
+import com.ys.bdtp.adm.app.Token
+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.vm.login.LoginViewModel
+import kotlinx.coroutines.launch
+import org.kodein.di.compose.rememberInstance
+import org.kodein.di.compose.rememberViewModel
+
+@Composable
+fun LoginContent() {
+    val vm by rememberViewModel<LoginViewModel>()
+    val sp by rememberInstance<SharedPreferences>()
+
+    var isShowPassword by remember { mutableStateOf(false) }
+    var isLoginBtnEnable by remember { mutableStateOf(true) }
+
+    var username by remember { mutableStateOf("") }
+    var password by remember { mutableStateOf("") }
+
+    var visualState: VisualTransformation by remember { mutableStateOf(PasswordVisualTransformation()) }
+
+    var usernameLeadingIconColor by remember { mutableStateOf(Color(0xFFC3C7CB)) }
+    var passwordLeadingIconColor by remember { mutableStateOf(Color(0xFFC3C7CB)) }
+
+    val snackbarHostState by remember { mutableStateOf(SnackbarHostState()) }
+    val scope = rememberCoroutineScope()
+
+    Column(
+        modifier = Modifier.fillMaxSize()
+            .padding(start = 56.dp, end = 96.dp),
+        verticalArrangement = Arrangement.Center
+    ) {
+        Column(modifier = Modifier.wrapContentHeight()) {
+            Text(text = "登录", fontSize = 30.sp, color = textBlackColor)
+
+            Spacer(modifier = Modifier.height(32.dp))
+
+            OutlinedTextField(
+                value = username,
+                modifier = Modifier.fillMaxWidth().onFocusChanged { focusState: FocusState ->
+                    usernameLeadingIconColor = if (focusState.isFocused)
+                        blueColor
+                    else
+                        grayColor
+                },
+                onValueChange = {
+                    username = it
+                    isLoginBtnEnable = username.isNotEmpty() && password.isNotEmpty()
+                },
+                label = {
+                    Text(text = "请输入账号")
+                },
+                colors = TextFieldDefaults.outlinedTextFieldColors(
+                    textColor = textBlackColor,
+                    cursorColor = blueColor,
+                    focusedBorderColor = blueColor,
+                    unfocusedBorderColor = grayColor,
+                    focusedLabelColor = blueColor,
+                    unfocusedLabelColor = grayColor,
+                    backgroundColor = Color.Transparent
+                ),
+                leadingIcon = {
+                    Icon(
+                        painter = painterResource(R.drawable.login_user),
+                        contentDescription = "",
+                        tint = usernameLeadingIconColor
+                    )
+                },
+                trailingIcon = {
+                    if (username.isNotBlank()) {
+                        IconButton(
+                            onClick = { username = "" },
+                            enabled = username.isNotEmpty()
+                        ) {
+                            Icon(
+                                painter = painterResource(R.drawable.login_delete),
+                                contentDescription = "",
+                                modifier = Modifier.size(16.dp),
+                                tint = grayColor
+                            )
+                        }
+                    }
+                },
+                shape = RoundedCornerShape(4.dp)
+            )
+
+            Spacer(modifier = Modifier.height(32.dp))
+
+            OutlinedTextField(
+                value = password,
+                modifier = Modifier.fillMaxWidth()
+                    .onFocusChanged { focusState ->
+                        passwordLeadingIconColor = if (focusState.isFocused)
+                            blueColor
+                        else
+                            grayColor
+                    },
+                onValueChange = {
+                    password = it
+                    isLoginBtnEnable = username.isNotEmpty() && password.isNotEmpty()
+                },
+                label = { Text(text = "请输入密码") },
+                colors = TextFieldDefaults.outlinedTextFieldColors(
+                    textColor = textBlackColor,
+                    cursorColor = blueColor,
+                    focusedBorderColor = blueColor,
+                    unfocusedBorderColor = grayColor,
+                    focusedLabelColor = blueColor,
+                    unfocusedLabelColor = grayColor,
+                    backgroundColor = Color.Transparent
+                ),
+                visualTransformation = visualState,
+                leadingIcon = {
+                    Icon(
+                        painter = painterResource(R.drawable.login_lock),
+                        contentDescription = "",
+                        tint = passwordLeadingIconColor
+                    )
+                },
+                trailingIcon = {
+                    Row(
+                        horizontalArrangement = Arrangement.End,
+                        verticalAlignment = Alignment.CenterVertically
+                    ) {
+                        if (password.isNotBlank()) {
+                            IconButton(
+                                onClick = { isShowPassword = !isShowPassword }
+                            ) {
+                                val icon =
+                                    if (isShowPassword) R.drawable.login_eye_open else R.drawable.login_eye_close
+                                visualState =
+                                    if (isShowPassword) VisualTransformation.None else PasswordVisualTransformation()
+                                val description = if (isShowPassword) "Show password" else "Hide password"
+                                Icon(
+                                    painter = painterResource(icon),
+                                    contentDescription = description,
+                                    modifier = Modifier.size(18.dp).padding(0.dp),
+                                    tint = grayColor
+                                )
+                            }
+
+                            IconButton(
+                                onClick = {
+                                    password = ""
+                                    isShowPassword = false
+                                },
+                                enabled = password.isNotEmpty()
+                            ) {
+                                Icon(
+                                    painter = painterResource(R.drawable.login_delete),
+                                    contentDescription = "",
+                                    modifier = Modifier.size(18.dp),
+                                    tint = grayColor
+                                )
+                            }
+                        }
+                    }
+                }
+            )
+        }
+
+        Spacer(modifier = Modifier.height(32.dp))
+
+        Button(
+            onClick = {
+                vm.login(
+                    login = Login(
+                        phone = username,
+                        passWord = password,
+                    ),
+                    success = { token ->
+                        sp.edit {
+                            putString(Token, token)
+                        }
+                    },
+                    failure = { message ->
+                        scope.launch {
+                            snackbarHostState
+                                .showSnackbar(message = message)
+                        }
+                        println("failure::::$message")
+                    }
+                )
+            },
+            enabled = isLoginBtnEnable,
+            modifier = Modifier.fillMaxWidth().height(48.dp),
+            shape = RoundedCornerShape(4),
+            colors = ButtonDefaults.buttonColors(
+                backgroundColor = Color(0xFF0091FF),
+                disabledBackgroundColor = Color(0xFFEFF0F1)
+            )
+        ) {
+            Text(
+                text = "立即登录",
+                color = if (isLoginBtnEnable) Color(0xFFFFFFFF) else Color(0XFFC3C7CB),
+                fontSize = 16.sp
+            )
+        }
+
+        Spacer(modifier = Modifier.fillMaxWidth().height(16.dp))
+
+        SnackbarHost(
+            hostState = snackbarHostState
+        ) { data ->
+            Snackbar(
+                snackbarData = data,
+                shape = RoundedCornerShape(8.dp),
+                elevation = 0.dp
+            )
+        }
+    }
+}
+
+@Preview
+@Composable
+fun PreviewLoginContent() {
+    LoginContent()
+}

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

@@ -1,38 +1,18 @@
 package com.ys.bdtp.adm.mvvm.ui.screen.login
 
+import android.content.SharedPreferences
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
-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.size
-import androidx.compose.foundation.layout.wrapContentHeight
+import androidx.compose.foundation.layout.*
 import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.Button
-import androidx.compose.material.ButtonDefaults
-import androidx.compose.material.Icon
-import androidx.compose.material.IconButton
-import androidx.compose.material.OutlinedTextField
-import androidx.compose.material.Text
-import androidx.compose.material.TextFieldDefaults
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
+import androidx.compose.material.*
+import androidx.compose.runtime.*
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusState
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.layout.ContentScale
-import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.text.input.PasswordVisualTransformation
 import androidx.compose.ui.text.input.VisualTransformation
@@ -40,255 +20,36 @@ import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import androidx.constraintlayout.compose.ConstraintLayout
-import com.google.accompanist.insets.LocalWindowInsets
+import androidx.core.content.edit
 import com.google.accompanist.insets.statusBarsHeight
 import com.ys.bdtp.adm.R
+import com.ys.bdtp.adm.app.Token
 import com.ys.bdtp.adm.mvvm.model.vo.request.Login
 import com.ys.bdtp.adm.mvvm.vm.login.LoginViewModel
+import org.kodein.di.compose.rememberInstance
 import org.kodein.di.compose.rememberViewModel
 
 @Composable
 fun LoginScreen() {
-    val vm by rememberViewModel<LoginViewModel>()
-    val insets = LocalWindowInsets.current
-    println("insets: ${insets.statusBars.layoutInsets.left}")
-    println("insets: ${insets.statusBars.layoutInsets.bottom}")
-    val imeBottom = with(LocalDensity.current) { insets.ime.bottom.toDp() }
-    println("insets: $imeBottom")
 
-    var isShowPassword by remember { mutableStateOf(false) }
-    var isLoginBtnEnable by remember { mutableStateOf(true) }
-
-    var username by remember { mutableStateOf("") }
-    var password by remember { mutableStateOf("") }
-
-    var visualState: VisualTransformation by remember { mutableStateOf(PasswordVisualTransformation()) }
-
-    var usernameLeadingIconColor by remember { mutableStateOf(Color(0xFFC3C7CB)) }
-    var passwordLeadingIconColor by remember { mutableStateOf(Color(0xFFC3C7CB)) }
 
     Row(
         modifier = Modifier
             .fillMaxSize()
             .background(Color.White)
-
     ) {
-        ConstraintLayout(modifier = Modifier.weight(3.0f).fillMaxHeight()) {
-            val (statusBar, logo, background, title) = createRefs()
-
-            Image(
-                painter = painterResource(R.drawable.login_background),
-                contentDescription = "",
-                modifier = Modifier.fillMaxSize().constrainAs(background) {
-                    top.linkTo(parent.top)
-                    bottom.linkTo(parent.bottom)
-                    start.linkTo(parent.start)
-                    end.linkTo(parent.end)
-                },
-                contentScale = ContentScale.Crop
-            )
-
-            Spacer(Modifier.statusBarsHeight().fillMaxWidth().constrainAs(statusBar) {
-                top.linkTo(parent.top)
-                start.linkTo(parent.start)
-                end.linkTo(parent.end)
-            })
-
-            Image(
-                painter = painterResource(R.drawable.logo),
-                contentDescription = "",
-                modifier = Modifier.size(112.dp, 48.dp).constrainAs(logo) {
-                    top.linkTo(statusBar.bottom, margin = 12.dp)
-                    start.linkTo(parent.start, margin = 32.dp)
-                }
-            )
-            val guideline = createGuidelineFromBottom(0.1f)
-            Column(modifier = Modifier.constrainAs(title) {
-                top.linkTo(parent.top, margin = 32.dp)
-                start.linkTo(parent.start)
-                end.linkTo(parent.end)
-                bottom.linkTo(guideline)
-            }) {
-                Text(text = "Yushu", fontSize = 36.sp, color = Color(0XFF1F2429))
-                Text("智慧建筑运维平台", fontSize = 48.sp, color = Color(0XFF1F2429))
-                Text("为您提供什么服务,能够用一句话概括出来吧。", fontSize = 16.sp, color = Color(0XFF8D9399))
-            }
+        Column(modifier = Modifier.weight(3.0f)) {
+            LoginSide()
         }
         Column(
             modifier = Modifier.weight(2.0f)
-                .fillMaxHeight()
-                .padding(start = 56.dp, end = 96.dp),
-            verticalArrangement = Arrangement.Center
         ) {
-            Column(modifier = Modifier.wrapContentHeight()) {
-                Text(text = "登录", fontSize = 30.sp, color = Color(0XFF1F2429))
-                Spacer(modifier = Modifier.height(32.dp))
-
-                OutlinedTextField(
-                    value = username,
-                    modifier = Modifier.fillMaxWidth().onFocusChanged { focusState: FocusState ->
-                        if (focusState.isFocused)
-                            usernameLeadingIconColor = Color(0xFF0091FF)
-                        else
-                            usernameLeadingIconColor = Color(0xFFC3C7CB)
-                    },
-                    onValueChange = {
-                        username = it
-                        isLoginBtnEnable = username.isNotEmpty() && password.isNotEmpty()
-
-                    },
-                    label = {
-                        Text(text = "请输入账号")
-                    },
-                    colors = TextFieldDefaults.outlinedTextFieldColors(
-                        textColor = Color(0xFF1F2429),
-                        cursorColor = Color(0xFF0091FF),
-                        focusedBorderColor = Color(0xFF0091FF),
-                        unfocusedBorderColor = Color(0xFFC3C7CB),
-                        focusedLabelColor = Color(0xFF0091FF),
-                        unfocusedLabelColor = Color(0xFFC3C7CB),
-                        backgroundColor = Color.Transparent
-                    ),
-                    leadingIcon = {
-                        Icon(
-                            painter = painterResource(R.drawable.login_user),
-                            contentDescription = "",
-                            tint = usernameLeadingIconColor
-                        )
-                    },
-                    trailingIcon = {
-                        if (username.isNotBlank()) {
-                            IconButton(
-                                onClick = { username = "" },
-                                enabled = username.isNotEmpty()
-                            ) {
-
-                                Icon(
-                                    painter = painterResource(R.drawable.login_delete),
-                                    contentDescription = "",
-                                    modifier = Modifier.size(16.dp),
-                                    tint = Color(0xFFC3C6CB)
-                                )
-                            }
-                        }
-                    },
-                    shape = RoundedCornerShape(4.dp)
-                )
-
-                Spacer(modifier = Modifier.height(32.dp))
-
-                OutlinedTextField(
-                    value = password,
-                    modifier = Modifier.fillMaxWidth()
-                        .onFocusChanged { focusState ->
-                            if (focusState.isFocused)
-                                passwordLeadingIconColor = Color(0xFF0091FF)
-                            else
-                                passwordLeadingIconColor = Color(0xFFC3C7CB)
-                        },
-                    onValueChange = {
-                        password = it
-                        isLoginBtnEnable = username.isNotEmpty() && password.isNotEmpty()
-                    },
-                    label = { Text(text = "请输入密码") },
-                    colors = TextFieldDefaults.outlinedTextFieldColors(
-                        textColor = Color(0xFF1F2429),
-                        cursorColor = Color(0xFF0091FF),
-                        focusedBorderColor = Color(0xFF0091FF),
-                        unfocusedBorderColor = Color(0xFFC3C7CB),
-                        focusedLabelColor = Color(0xFF0091FF),
-                        unfocusedLabelColor = Color(0xFFC3C7CB),
-                        backgroundColor = Color.Transparent
-                    ),
-                    visualTransformation = visualState,
-                    leadingIcon = {
-                        Icon(
-                            painter = painterResource(R.drawable.login_lock),
-                            contentDescription = "",
-                            tint = passwordLeadingIconColor
-                        )
-                    },
-                    trailingIcon = {
-                        Row(
-                            horizontalArrangement = Arrangement.End,
-                            verticalAlignment = Alignment.CenterVertically
-                        ) {
-                            if (password.isNotBlank()) {
-                                IconButton(
-                                    onClick = { isShowPassword = !isShowPassword }
-                                ) {
-                                    val icon =
-                                        if (isShowPassword) R.drawable.login_eye_open else R.drawable.login_eye_close
-                                    visualState =
-                                        if (isShowPassword) VisualTransformation.None else PasswordVisualTransformation()
-                                    val description = if (isShowPassword) "Show password" else "Hide password"
-                                    Icon(
-                                        painter = painterResource(icon),
-                                        contentDescription = description,
-                                        modifier = Modifier.size(18.dp).padding(0.dp),
-                                        tint = Color(0xFFC3C6CB)
-                                    )
-                                }
-
-                                IconButton(
-                                    onClick = {
-                                        password = ""
-                                        isShowPassword = false
-                                    },
-                                    enabled = password.isNotEmpty()
-                                ) {
-                                    Icon(
-                                        painter = painterResource(R.drawable.login_delete),
-                                        contentDescription = "",
-                                        modifier = Modifier.size(18.dp),
-                                        tint = Color(0xFFC3C6CB)
-                                    )
-                                }
-                            }
-                        }
-                    }
-                )
-            }
-
-            Spacer(modifier = Modifier.height(48.dp))
-
-            Button(
-                onClick = {
-                    vm.login(
-                        login = Login(
-                            phone = "17337681032",
-                            passWord = "123456",
-                        ),
-                        success = {
-                            println("success::::$it")
-                        },
-                        failure = {
-                            println("failure::::$it")
-                        }
-                    )
-                    //isLoginBtnEnable = username.isNotEmpty() && password.isNotEmpty()
-                    // TODO
-                    // 返回登录结果进行处理
-                },
-                enabled = isLoginBtnEnable,
-                modifier = Modifier.fillMaxWidth().height(48.dp),
-                shape = RoundedCornerShape(4),
-                colors = ButtonDefaults.buttonColors(
-                    backgroundColor = Color(0xFF0091FF),
-                    disabledBackgroundColor = Color(0xFFEFF0F1)
-                )
-            ) {
-                Text(
-                    text = "立即登录",
-                    color = if (isLoginBtnEnable) Color(0xFFFFFFFF) else Color(0XFFC3C7CB),
-                    fontSize = 16.sp
-                )
-            }
+            LoginContent()
         }
     }
 }
 
-@Preview(widthDp = 1280, heightDp = 800)
+@Preview(widthDp = 1137, heightDp = 711)
 @Composable
 fun PreviewLoginScreen() {
     LoginScreen()

+ 70 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/login/LoginSide.kt

@@ -0,0 +1,70 @@
+package com.ys.bdtp.adm.mvvm.ui.screen.login
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.*
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.constraintlayout.compose.ConstraintLayout
+import com.google.accompanist.insets.statusBarsHeight
+import com.ys.bdtp.adm.R
+
+/**
+ * 登录页侧边
+ */
+@Composable
+fun LoginSide() {
+    ConstraintLayout(modifier = Modifier.fillMaxWidth()) {
+        val (statusBar, logo, background, title) = createRefs()
+
+        Image(
+            painter = painterResource(R.drawable.login_background),
+            contentDescription = "",
+            modifier = Modifier.fillMaxSize().constrainAs(background) {
+                top.linkTo(parent.top)
+                bottom.linkTo(parent.bottom)
+                start.linkTo(parent.start)
+                end.linkTo(parent.end)
+            },
+            contentScale = ContentScale.Crop
+        )
+
+        Spacer(Modifier.statusBarsHeight().fillMaxWidth().constrainAs(statusBar) {
+            top.linkTo(parent.top)
+            start.linkTo(parent.start)
+            end.linkTo(parent.end)
+        })
+
+        Image(
+            painter = painterResource(R.drawable.logo),
+            contentDescription = "",
+            modifier = Modifier.size(112.dp, 48.dp).constrainAs(logo) {
+                top.linkTo(statusBar.bottom, margin = 12.dp)
+                start.linkTo(parent.start, margin = 32.dp)
+            }
+        )
+        val guideline = createGuidelineFromBottom(0.1f)
+        Column(modifier = Modifier.constrainAs(title) {
+            top.linkTo(parent.top, margin = 32.dp)
+            start.linkTo(parent.start)
+            end.linkTo(parent.end)
+            bottom.linkTo(guideline)
+        }) {
+            Text(text = "Yushu", fontSize = 36.sp, color = Color(0XFF1F2429))
+            Text("智慧建筑运维平台", fontSize = 48.sp, color = Color(0XFF1F2429))
+            Text("为您提供什么服务,能够用一句话概括出来吧。", fontSize = 16.sp, color = Color(0XFF8D9399))
+        }
+    }
+}
+
+@Preview
+@Composable
+fun PreviewLoginSide() {
+    LoginSide()
+}

+ 28 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/main/MainScreen.kt

@@ -1,8 +1,36 @@
 package com.ys.bdtp.adm.mvvm.ui.screen.main
 
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
+import com.ys.bdtp.adm.mvvm.ui.screen.flash.FlashScreen
+import com.ys.bdtp.adm.mvvm.ui.screen.login.LoginScreen
+import com.ys.bdtp.adm.mvvm.ui.screen.project.ProjectScreen
+
+sealed interface Zygote {
+    object Flash : Zygote
+    object Login : Zygote
+    object Project : Zygote
+}
 
 @Composable
 fun MainScreen() {
+    var state by remember { mutableStateOf<Zygote>(Zygote.Flash) }
 
+    when (state) {
+        Zygote.Flash -> {
+            FlashScreen(
+                block = { new ->
+                    state = new
+                })
+        }
+        Zygote.Login -> {
+            LoginScreen()
+        }
+        Zygote.Project -> {
+            ProjectScreen()
+        }
+    }
 }

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

@@ -1,5 +1,38 @@
 package com.ys.bdtp.adm.mvvm.vm.flash
 
+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.UserEntity
 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
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
 
-class FlashRepository(private val api: Api)
+/**
+ * 闪屏页数据仓库
+ *
+ * @author bai
+ * @param api [Api]
+ * @param db [AdmDatabase]
+ */
+class FlashRepository(private val api: Api, private val db: AdmDatabase) {
+
+    /**
+     * 获取当前登录用户
+     */
+    suspend fun getCurrentUser(): UserEntity? {
+        return withContext(Dispatchers.IO) {
+            db.userDao().getCurrentUser()
+        }
+    }
+
+    suspend fun getAccount(): Response<Account> {
+        return withContext(Dispatchers.IO) {
+            request {
+                api.getAccount()
+            }
+        }
+    }
+
+}

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

@@ -1,5 +1,47 @@
 package com.ys.bdtp.adm.mvvm.vm.flash
 
 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.db.entity.UserEntity
+import com.ys.bdtp.adm.mvvm.model.vo.request.Account
+import kotlinx.coroutines.launch
 
-class FlashViewModel(private val repo: FlashRepository) : ViewModel()
+/**
+ * FlashViewModel
+ *
+ * @author bai
+ *
+ * @param repo [FlashRepository]
+ */
+class FlashViewModel(private val repo: FlashRepository) : ViewModel() {
+
+    /**
+     * 获取当前登录用户
+     */
+    suspend fun getCurrentUser(): UserEntity? {
+        return repo.getCurrentUser()
+    }
+
+    /**
+     * 获取账号信息
+     *  1,用户信息
+     *  2,项目信息
+     *
+     * @param success 获取成功回调
+     * @param failure 获取失败回调
+     */
+    suspend fun getAccount(success: (Account) -> Unit, failure: (String) -> Unit) {
+        viewModelScope.launch {
+            when (val response = repo.getAccount()) {
+                is SuccessResponse -> {
+                    success(response.data)
+                }
+                is FailureResponse -> {
+                    failure(response.message)
+                }
+            }
+        }
+    }
+}