Prechádzať zdrojové kódy

refactor(更新)
- 重置密码完成
- 个人信息完成

周文健 5 mesiacov pred
rodič
commit
902035bcb0

+ 1 - 2
app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt

@@ -47,7 +47,6 @@ class LoginDialog(
 
     override fun onBind(customDialog: CustomDialog, contentView: View) {
         mBinding = DialogLoginBinding.bind(contentView)
-        customDialog.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
         mBinding.tvLogin.setOnClickListener {
             if (mBinding.etAccount.text.toString().isEmpty()) {
                 PopTip.tip(CommonUtils.getStr(com.grkj.ui_base.R.string.please_input_account))
@@ -59,7 +58,7 @@ class LoginDialog(
             }
             LoadingEvent.sendLoadingEvent(CommonUtils.getStr(com.grkj.ui_base.R.string.doing_login),true)
             val username = if (mBinding.etAccount.text.toString()=="1")"罗成" else "zwj"
-            val password = if (mBinding.etAccount.text.toString()=="1")"123456" else "zwj"
+            val password = if (mBinding.etAccount.text.toString()=="1")"123456" else "123456"
             viewModel.loginWithAccount(
                 username,
                 password,

+ 16 - 0
app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt

@@ -1,5 +1,6 @@
 package com.grkj.iscs.features.main.activity
 
+import android.content.Intent
 import android.view.InputDevice
 import android.view.KeyEvent
 import android.view.Menu
@@ -17,6 +18,7 @@ import com.grkj.iscs.features.main.viewmodel.MainViewModel
 import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseActivity
 import com.grkj.data.data.EventConstants
+import com.grkj.iscs.features.login.activity.LoginActivity
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
 import com.grkj.ui_base.utils.extension.toByteArrays
 import com.grkj.ui_base.utils.extension.toHexStrings
@@ -107,6 +109,10 @@ class MainActivity() : BaseActivity<ActivityMainBinding>() {
             EventConstants.EVENT_BOTTOM_NAV_VISIBILITY -> {
                 binding.bottomNav.isVisible = (event.data as BottomNavVisibilityEvent).show
             }
+
+            EventConstants.EVENT_LOGOUT -> {
+                logout()
+            }
         }
     }
 
@@ -131,4 +137,14 @@ class MainActivity() : BaseActivity<ActivityMainBinding>() {
         }
         return super.dispatchKeyEvent(event)
     }
+
+    /**
+     * 退出登录
+     */
+    private fun logout() {
+        startActivity(Intent(this, LoginActivity::class.java).apply {
+            flags = Intent.FLAG_ACTIVITY_NEW_TASK
+        })
+        finish()
+    }
 }

+ 85 - 0
app/src/main/java/com/grkj/iscs/features/main/fragment/user_info/ResetPasswordFragment.kt

@@ -0,0 +1,85 @@
+package com.grkj.iscs.features.main.fragment.user_info
+
+import androidx.fragment.app.viewModels
+import com.grkj.data.data.MainDomainData
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.FragmentResetPasswordBinding
+import com.grkj.iscs.features.main.viewmodel.user_info.UserInfoViewModel
+import com.grkj.shared.utils.BCryptUtils
+import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.dialog.TipDialog
+import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.event.LogoutEvent
+import com.kongzue.dialogx.dialogs.PopTip
+import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * 重置密码
+ */
+@AndroidEntryPoint
+class ResetPasswordFragment : BaseFragment<FragmentResetPasswordBinding>() {
+    private val viewModel: UserInfoViewModel by viewModels()
+
+    override fun getLayoutId(): Int {
+        return R.layout.fragment_reset_password
+    }
+
+    override fun initView() {
+        binding.back.setDebouncedClickListener {
+            navController.popBackStack()
+        }
+        binding.cancel.setDebouncedClickListener {
+            navController.popBackStack()
+        }
+        binding.confirm.setDebouncedClickListener {
+            if (checkData()) {
+                viewModel.updatePassword(
+                    binding.newPasswordEt.text.toString()
+                ).observe(this) {
+                    if (it) {
+                        TipDialog.showSuccess(
+                            CommonUtils.getStr(R.string.reset_user_password_succeed).toString(),
+                            onConfirmClick = {
+                                LogoutEvent.sendLogoutEvent()
+                            }, onCancelClick = {
+                                LogoutEvent.sendLogoutEvent()
+                            })
+                    } else {
+                        TipDialog.showError(
+                            CommonUtils.getStr(R.string.reset_user_password_failed).toString()
+                        )
+                    }
+                }
+            }
+        }
+    }
+
+    private fun checkData(): Boolean {
+        if (!BCryptUtils.matchPassword(binding.oldPasswordEt.text.toString(), MainDomainData.userInfo?.password?:"")){
+            PopTip.tip(R.string.old_password_error)
+            return false
+        }
+        if (binding.oldPasswordEt.text.toString().isEmpty()) {
+            PopTip.tip(R.string.please_input_old_password)
+            return false
+        }
+        if (binding.newPasswordEt.text.toString().isEmpty()) {
+            PopTip.tip(R.string.please_input_new_password)
+            return false
+        }
+        if (binding.repeatNewPasswordEt.text.toString().isEmpty()) {
+            PopTip.tip(R.string.please_input_repeat_new_password)
+            return false
+        }
+        if (binding.newPasswordEt.text.toString() != binding.repeatNewPasswordEt.text.toString()) {
+            PopTip.tip(R.string.new_password_and_repeat_new_password_not_same)
+            return false
+        }
+        if (binding.newPasswordEt.text.toString() == binding.oldPasswordEt.text.toString()) {
+            PopTip.tip(R.string.new_password_cannot_be_the_same_as_the_old_password)
+            return false
+        }
+        return true
+    }
+}

+ 59 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/user_info/UserInfoFragment.kt

@@ -1,18 +1,76 @@
 package com.grkj.iscs.features.main.fragment.user_info
 
+import androidx.fragment.app.viewModels
+import com.grkj.data.data.MainDomainData
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentUserInfoBinding
+import com.grkj.iscs.features.main.viewmodel.user_info.UserInfoViewModel
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.dialog.TipDialog
+import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.event.LogoutEvent
+import com.kongzue.dialogx.dialogs.PopTip
+import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 个人信息
  */
+@AndroidEntryPoint
 class UserInfoFragment : BaseFragment<FragmentUserInfoBinding>() {
+    private val viewModel: UserInfoViewModel by viewModels()
+
     override fun getLayoutId(): Int {
         return R.layout.fragment_user_info
     }
 
     override fun initView() {
-        TODO("Not yet implemented")
+        binding.back.setDebouncedClickListener {
+            navController.popBackStack()
+        }
+        binding.cancel.setDebouncedClickListener {
+            navController.popBackStack()
+        }
+        binding.confirm.setDebouncedClickListener {
+            if (checkData()) {
+                viewModel.saveUserInfo(
+                    binding.nicknameEt.text.toString(),
+                    binding.phoneEt.text.toString()
+                ).observe(this) {
+                    if (it) {
+                        TipDialog.showSuccess(
+                            CommonUtils.getStr(R.string.update_user_succeed).toString(),
+                            onConfirmClick = {
+                                LogoutEvent.sendLogoutEvent()
+                            }, onCancelClick = {
+                                LogoutEvent.sendLogoutEvent()
+                            })
+                    } else {
+                        TipDialog.showError(
+                            CommonUtils.getStr(R.string.update_user_failed).toString()
+                        )
+                    }
+                }
+            }
+        }
+    }
+
+    override fun initData() {
+        super.initData()
+        binding.username.text = MainDomainData.userInfo?.userName
+        binding.nicknameEt.setText(MainDomainData.userInfo?.nickName)
+        binding.phoneEt.setText(MainDomainData.userInfo?.phoneNumber)
+    }
+
+    private fun checkData(): Boolean {
+        if (binding.nicknameEt.text.toString().isEmpty()) {
+            PopTip.tip(R.string.please_input_nickname)
+            return false
+        }
+        if (binding.phoneEt.text.toString().isEmpty()) {
+            PopTip.tip(R.string.please_input_phone)
+            return false
+        }
+        return true
     }
 }

+ 4 - 16
app/src/main/java/com/grkj/iscs/features/main/fragment/user_info/UserInfoHomeFragment.kt

@@ -1,6 +1,5 @@
 package com.grkj.iscs.features.main.fragment.user_info
 
-import android.content.Intent
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
 import com.drake.brv.utils.dividerSpace
@@ -13,10 +12,9 @@ import com.grkj.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentUserInfoHomeBinding
 import com.grkj.iscs.databinding.ItemHomeMenuBinding
-import com.grkj.iscs.features.login.activity.LoginActivity
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.ui_base.base.BaseFragment
-import com.sik.sikcore.activity.ActivityTracker
+import com.grkj.ui_base.utils.event.LogoutEvent
 import dagger.hilt.android.AndroidEntryPoint
 
 /**
@@ -109,11 +107,11 @@ class UserInfoHomeFragment : BaseFragment<FragmentUserInfoHomeBinding>() {
     private fun onMenuClick(menuType: Int) {
         when (menuType) {
             0 -> {
-
+                navController.navigate(R.id.action_userInfoHomeFragment_to_userInfoFragment)
             }
 
             1 -> {
-
+                navController.navigate(R.id.action_userInfoHomeFragment_to_resetPasswordFragment)
             }
 
             2 -> {
@@ -133,18 +131,8 @@ class UserInfoHomeFragment : BaseFragment<FragmentUserInfoHomeBinding>() {
             }
 
             6 -> {
-                logout()
+                LogoutEvent.sendLogoutEvent()
             }
         }
     }
-
-    /**
-     * 退出登录
-     */
-    private fun logout() {
-        startActivity(Intent(requireActivity(), LoginActivity::class.java).apply {
-            flags = Intent.FLAG_ACTIVITY_NEW_TASK
-        })
-        requireActivity().finish()
-    }
 }

+ 41 - 0
app/src/main/java/com/grkj/iscs/features/main/viewmodel/user_info/UserInfoViewModel.kt

@@ -0,0 +1,41 @@
+package com.grkj.iscs.features.main.viewmodel.user_info
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.liveData
+import com.grkj.data.data.MainDomainData
+import com.grkj.data.repository.IUserRepository
+import com.grkj.shared.utils.BCryptUtils
+import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import javax.inject.Inject
+
+@HiltViewModel
+class UserInfoViewModel @Inject constructor(val userRepository: IUserRepository) : BaseViewModel() {
+    /**
+     * 保存用户信息
+     */
+    fun saveUserInfo(nickName: String, phone: String): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            MainDomainData.userInfo?.apply {
+                this.nickName = nickName
+                this.phoneNumber = phone
+                userRepository.updateUser(this)
+                emit(true)
+            } ?: emit(false)
+        }
+    }
+
+    /**
+     * 更新密码
+     */
+    fun updatePassword(newPassword: String): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            MainDomainData.userInfo?.apply {
+                this.password = BCryptUtils.encryptPassword(newPassword)
+                userRepository.updateUser(this)
+                emit(true)
+            } ?: emit(false)
+        }
+    }
+}

+ 21 - 15
app/src/main/res/layout-land/dialog_login.xml

@@ -3,16 +3,16 @@
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <com.google.android.material.card.MaterialCardView
-        android:layout_width="150dp"
-        android:layout_height="200dp"
+        android:layout_width="248.5dp"
+        android:layout_height="219dp"
         android:gravity="center"
         app:cardBackgroundColor="@color/dialog_card_login_bg"
         app:strokeColor="@color/common_transparent">
 
         <LinearLayout
             android:id="@+id/ll_easy_container"
-            android:layout_width="165dp"
-            android:layout_height="146dp"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
             android:layout_gravity="center"
             android:gravity="center"
             android:orientation="vertical"
@@ -20,8 +20,8 @@
 
             <ImageView
                 android:id="@+id/iv_icon"
-                android:layout_width="100dp"
-                android:layout_height="100dp"
+                android:layout_width="150dp"
+                android:layout_height="150dp"
                 android:layout_marginBottom="2.5dp"
                 android:adjustViewBounds="false" />
 
@@ -32,8 +32,8 @@
         </LinearLayout>
 
         <FrameLayout
-            android:layout_width="150dp"
-            android:layout_height="200dp">
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
 
             <TextureView
                 android:id="@+id/preview"
@@ -44,7 +44,7 @@
 
         <LinearLayout
             android:id="@+id/ll_account_container"
-            android:layout_width="150dp"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_gravity="center"
             android:gravity="center"
@@ -55,32 +55,38 @@
                 android:id="@+id/et_account"
                 style="@style/CommonEdit_land"
                 android:layout_width="match_parent"
+                android:layout_height="34dp"
                 android:layout_marginBottom="5dp"
-                android:hint="@string/please_input_account" />
+                android:hint="@string/please_input_account"
+                android:textSize="12.5sp" />
 
             <EditText
                 android:id="@+id/et_password"
                 style="@style/CommonEdit_land"
                 android:layout_width="match_parent"
+                android:layout_height="34dp"
                 android:layout_marginBottom="5dp"
                 android:hint="@string/please_input_password"
-                android:inputType="textPassword" />
+                android:inputType="textPassword"
+                android:textSize="12.5sp" />
 
             <TextView
                 android:id="@+id/tv_login"
                 style="@style/CommonBtn_land"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="30dp"
                 android:layout_marginBottom="5dp"
-                android:text="@string/login" />
+                android:text="@string/login"
+                android:textSize="12.5sp" />
 
             <TextView
                 android:id="@+id/tv_cancel"
                 style="@style/CommonBtn_land"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="30dp"
                 android:background="@drawable/white_stroke_bg"
-                android:text="@string/cancel" />
+                android:text="@string/cancel"
+                android:textSize="12.5sp" />
         </LinearLayout>
     </com.google.android.material.card.MaterialCardView>
 </layout>

+ 21 - 15
app/src/main/res/layout/dialog_login.xml

@@ -3,16 +3,16 @@
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <com.google.android.material.card.MaterialCardView
-        android:layout_width="300dp"
-        android:layout_height="400dp"
+        android:layout_width="497dp"
+        android:layout_height="438dp"
         android:gravity="center"
         app:cardBackgroundColor="@color/dialog_card_login_bg"
         app:strokeColor="@color/common_transparent">
 
         <LinearLayout
             android:id="@+id/ll_easy_container"
-            android:layout_width="330dp"
-            android:layout_height="292dp"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
             android:layout_gravity="center"
             android:gravity="center"
             android:orientation="vertical"
@@ -20,8 +20,8 @@
 
             <ImageView
                 android:id="@+id/iv_icon"
-                android:layout_width="200dp"
-                android:layout_height="200dp"
+                android:layout_width="300dp"
+                android:layout_height="300dp"
                 android:layout_marginBottom="5dp" />
 
             <TextView
@@ -31,8 +31,8 @@
         </LinearLayout>
 
         <FrameLayout
-            android:layout_width="300dp"
-            android:layout_height="400dp">
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
 
             <TextureView
                 android:id="@+id/preview"
@@ -43,7 +43,7 @@
 
         <LinearLayout
             android:id="@+id/ll_account_container"
-            android:layout_width="300dp"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_gravity="center"
             android:gravity="center"
@@ -54,32 +54,38 @@
                 android:id="@+id/et_account"
                 style="@style/CommonEdit"
                 android:layout_width="match_parent"
+                android:layout_height="68dp"
                 android:layout_marginBottom="10dp"
-                android:hint="@string/please_input_account" />
+                android:hint="@string/please_input_account"
+                android:textSize="25sp" />
 
             <EditText
                 android:id="@+id/et_password"
                 style="@style/CommonEdit"
                 android:layout_width="match_parent"
+                android:layout_height="68dp"
                 android:layout_marginBottom="10dp"
                 android:hint="@string/please_input_password"
-                android:inputType="textPassword" />
+                android:inputType="textPassword"
+                android:textSize="25sp" />
 
             <TextView
                 android:id="@+id/tv_login"
                 style="@style/CommonBtn"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="60dp"
                 android:layout_marginBottom="10dp"
-                android:text="@string/login" />
+                android:text="@string/login"
+                android:textSize="25sp" />
 
             <TextView
                 android:id="@+id/tv_cancel"
                 style="@style/CommonBtn"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="60dp"
                 android:background="@drawable/white_stroke_bg"
-                android:text="@string/cancel" />
+                android:text="@string/cancel"
+                android:textSize="25sp" />
         </LinearLayout>
     </com.google.android.material.card.MaterialCardView>
 </layout>

+ 188 - 0
app/src/main/res/layout/fragment_reset_password.xml

@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="20dp"
+        android:background="@drawable/home_card_bg"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/title_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="5dp">
+
+            <ImageView
+                android:layout_width="20dp"
+                android:layout_height="20dp"
+                android:src="@mipmap/icon_data_manage_menu_user_manage" />
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:layout_weight="1"
+                android:text="@string/reset_password_title"
+                android:textColor="@color/black"
+                android:textSize="24sp" />
+
+            <TextView
+                android:id="@+id/back"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/back"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/black" />
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingHorizontal="100dp">
+
+            <TextView
+                android:id="@+id/old_password_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/old_password"
+                android:textColor="@color/black"
+                android:textSize="18sp"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <EditText
+                android:id="@+id/old_password_et"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/bg_common_input"
+                android:hint="@string/please_input_old_password"
+                android:inputType="textPassword"
+                android:maxLines="1"
+                android:paddingHorizontal="10dp"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="@color/black"
+                android:textSize="18sp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/old_password_tv"
+                app:layout_constraintTop_toTopOf="@+id/old_password_tv" />
+
+            <TextView
+                android:id="@+id/new_password_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:text="@string/new_password"
+                android:textColor="@color/black"
+                android:textSize="18sp"
+                app:layout_constraintEnd_toEndOf="@+id/old_password_tv"
+                app:layout_constraintTop_toBottomOf="@+id/old_password_tv" />
+
+            <EditText
+                android:id="@+id/new_password_et"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/bg_common_input"
+                android:hint="@string/please_input_new_password"
+                android:inputType="textPassword"
+                android:maxLines="1"
+                android:paddingHorizontal="10dp"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="@color/black"
+                android:textSize="18sp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/new_password_tv"
+                app:layout_constraintTop_toTopOf="@+id/new_password_tv" />
+
+
+            <TextView
+                android:id="@+id/repeat_new_password_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:text="@string/repeat_new_password"
+                android:textColor="@color/black"
+                android:textSize="18sp"
+                app:layout_constraintEnd_toEndOf="@+id/new_password_tv"
+                app:layout_constraintTop_toBottomOf="@+id/new_password_tv" />
+
+            <EditText
+                android:id="@+id/repeat_new_password_et"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/bg_common_input"
+                android:hint="@string/please_input_repeat_new_password"
+                android:inputType="textPassword"
+                android:maxLines="1"
+                android:paddingHorizontal="10dp"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="@color/black"
+                android:textSize="18sp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/repeat_new_password_tv"
+                app:layout_constraintTop_toTopOf="@+id/repeat_new_password_tv" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+        <View
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_weight="1" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:padding="10dp">
+
+            <View
+                android:layout_width="0dp"
+                android:layout_height="1dp"
+                android:layout_weight="1" />
+
+            <TextView
+                android:id="@+id/confirm"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/confirm"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <TextView
+                android:id="@+id/cancel"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/cancel"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+    </LinearLayout>
+</layout>

+ 16 - 1
app/src/main/res/navigation/nav_user_info.xml

@@ -7,5 +7,20 @@
     <fragment
         android:id="@+id/userInfoHomeFragment"
         android:name="com.grkj.iscs.features.main.fragment.user_info.UserInfoHomeFragment"
-        android:label="UserInfoHomeFragment" />
+        android:label="UserInfoHomeFragment" >
+        <action
+            android:id="@+id/action_userInfoHomeFragment_to_userInfoFragment"
+            app:destination="@id/userInfoFragment" />
+        <action
+            android:id="@+id/action_userInfoHomeFragment_to_resetPasswordFragment"
+            app:destination="@id/resetPasswordFragment" />
+    </fragment>
+    <fragment
+        android:id="@+id/userInfoFragment"
+        android:name="com.grkj.iscs.features.main.fragment.user_info.UserInfoFragment"
+        android:label="UserInfoFragment" />
+    <fragment
+        android:id="@+id/resetPasswordFragment"
+        android:name="com.grkj.iscs.features.main.fragment.user_info.ResetPasswordFragment"
+        android:label="ResetPasswordFragment" />
 </navigation>

+ 12 - 0
app/src/main/res/values-en/strings.xml

@@ -174,4 +174,16 @@
     <string name="user_name">Login name</string>
     <string name="please_input_phone">please input phone</string>
     <string name="phone">phone</string>
+    <string name="reset_password_title">Reset password</string>
+    <string name="old_password">Old password</string>
+    <string name="please_input_old_password">please input old password</string>
+    <string name="new_password">New password</string>
+    <string name="please_input_new_password">please input new password</string>
+    <string name="please_input_repeat_new_password">please input repeat new password</string>
+    <string name="repeat_new_password">Repeat new password</string>
+    <string name="new_password_and_repeat_new_password_not_same">The new password does not match the repeated new password</string>
+    <string name="new_password_cannot_be_the_same_as_the_old_password">The new password cannot be the same as the old password</string>
+    <string name="reset_user_password_succeed">reset user password succeed</string>
+    <string name="reset_user_password_failed">reset user password failed</string>
+    <string name="old_password_error">old password error</string>
 </resources>

+ 12 - 0
app/src/main/res/values-zh/strings.xml

@@ -174,4 +174,16 @@
     <string name="user_name">登录名</string>
     <string name="please_input_phone">请输入电话</string>
     <string name="phone">电话</string>
+    <string name="reset_password_title">密码重置</string>
+    <string name="old_password">旧密码</string>
+    <string name="please_input_old_password">请输入旧密码</string>
+    <string name="new_password">新密码</string>
+    <string name="please_input_new_password">请输入新密码</string>
+    <string name="please_input_repeat_new_password">请重复新密码</string>
+    <string name="repeat_new_password">重复新密码</string>
+    <string name="new_password_and_repeat_new_password_not_same">新密码与重复新密码不一致</string>
+    <string name="new_password_cannot_be_the_same_as_the_old_password">新密码与旧密码不能相同</string>
+    <string name="reset_user_password_succeed">用户密码重置成功</string>
+    <string name="reset_user_password_failed">用户密码重置失败</string>
+    <string name="old_password_error">旧密码错误</string>
 </resources>

+ 12 - 0
app/src/main/res/values/strings.xml

@@ -173,4 +173,16 @@
     <string name="user_name">登录名</string>
     <string name="please_input_phone">请输入电话</string>
     <string name="phone">电话</string>
+    <string name="reset_password_title">密码重置</string>
+    <string name="old_password">旧密码</string>
+    <string name="please_input_old_password">请输入旧密码</string>
+    <string name="new_password">新密码</string>
+    <string name="please_input_new_password">请输入新密码</string>
+    <string name="please_input_repeat_new_password">请重复新密码</string>
+    <string name="repeat_new_password">重复新密码</string>
+    <string name="new_password_and_repeat_new_password_not_same">新密码与重复新密码不一致</string>
+    <string name="new_password_cannot_be_the_same_as_the_old_password">新密码与旧密码不能相同</string>
+    <string name="reset_user_password_succeed">用户密码重置成功</string>
+    <string name="reset_user_password_failed">用户密码重置失败</string>
+    <string name="old_password_error">旧密码错误</string>
 </resources>

+ 5 - 0
data/src/main/java/com/grkj/data/data/EventConstants.kt

@@ -31,6 +31,11 @@ object EventConstants {
      */
     const val EVENT_TICKET_FINISHED = 100_000_005
 
+    /**
+     * 退出登录
+     */
+    const val EVENT_LOGOUT = 100_000_006
+
     //---------------------------作业票------------------------
     const val EVENT_GET_TICKET_STATUS: Int = 100_001_001
 

+ 6 - 0
data/src/main/java/com/grkj/data/repository/IUserRepository.kt

@@ -1,5 +1,6 @@
 package com.grkj.data.repository
 
+import com.grkj.data.model.dos.SysUserDo
 import com.grkj.data.model.vo.AddUserDataVo
 import com.grkj.data.model.vo.UpdateUserDataVo
 import com.grkj.data.model.vo.UserManageVo
@@ -62,4 +63,9 @@ interface IUserRepository {
      * 更新用户数据
      */
     fun updateUserData(userDataVo: UpdateUserDataVo)
+
+    /**
+     * 更新用户信息
+     */
+    fun updateUser(sysUserDo: SysUserDo)
 }

+ 7 - 5
data/src/main/java/com/grkj/data/repository/impl/UserRepository.kt

@@ -15,6 +15,7 @@ import com.grkj.data.repository.IUserRepository
 import com.grkj.shared.utils.BCryptUtils
 import com.grkj.shared.utils.BiometricVerifier
 import com.grkj.shared.utils.Pinyin4jUtil
+import com.sik.sikcore.log.LogUtils
 import javax.inject.Inject
 import javax.inject.Singleton
 
@@ -32,15 +33,12 @@ class UserRepository @Inject constructor(
     override fun loginWithAccount(
         username: String, password: String
     ): Boolean {
-//        MainDomainData.userInfo = SysUserDo().apply {
-//            nickName = "罗成"
-//        }
-//        return true
         var sysUserDo = userDao.getUserInfoByUsername(username)
         if (sysUserDo == null) {
             return false
         }
-        val matched = BCryptUtils.matchPassword(password, sysUserDo?.password ?: "")
+        val matched = BCryptUtils.matchPassword(password, sysUserDo.password ?: "")
+        logger.info("密码是否匹配:${password},${sysUserDo.password},${matched}")
         if (matched) {
             MainDomainData.userInfo = sysUserDo
             val roleDatas = roleDao.getRoleDataByUserId(sysUserDo.userId)
@@ -193,6 +191,10 @@ class UserRepository @Inject constructor(
         userDao.updateUserData(sysUserDo)
     }
 
+    override fun updateUser(sysUserDo: SysUserDo) {
+        userDao.updateUserData(sysUserDo)
+    }
+
     override fun deleteUserById(userIds: List<Long>) {
         userDao.deleteUserByIds(userIds)
     }

+ 78 - 0
ui-base/src/main/java/com/grkj/ui_base/dialog/TipDialog.kt

@@ -183,5 +183,83 @@ class TipDialog : OnBindView<CustomDialog>(R.layout.dialog_tip) {
                 }, CustomDialog.ALIGN.CENTER)
             }
         }
+
+        /**
+         * 显示成功
+         */
+        @JvmStatic
+        fun showSuccess(
+            msg: String,
+            showCancel: Boolean = true,
+            showConfirm: Boolean = true,
+            countDownTime: Int = 10,
+            onConfirmClick: () -> Unit = {},
+            onCancelClick: () -> Unit = {}
+        ) {
+            ThreadUtils.runOnMain {
+                CustomDialog.show(TipDialog().apply {
+                    setTitle(CommonUtils.getStr(R.string.action_succeed).toString())
+                    setMessage(msg)
+                    setDialogType(DialogType.SUCCESS)
+                    showConfirm(showConfirm)
+                    showCancel(showCancel)
+                    setCountDownTime(countDownTime)
+                    setOnConfirmClickListener(onConfirmClick)
+                    setOnCancelClickListener(onCancelClick)
+                }, CustomDialog.ALIGN.CENTER)
+            }
+        }
+
+        /**
+         * 显示错误
+         */
+        @JvmStatic
+        fun showError(
+            msg: String,
+            showCancel: Boolean = true,
+            showConfirm: Boolean = true,
+            countDownTime: Int = 10,
+            onConfirmClick: () -> Unit = {},
+            onCancelClick: () -> Unit = {}
+        ) {
+            ThreadUtils.runOnMain {
+                CustomDialog.show(TipDialog().apply {
+                    setTitle(CommonUtils.getStr(R.string.action_failed).toString())
+                    setMessage(msg)
+                    setDialogType(DialogType.ERROR)
+                    showConfirm(showConfirm)
+                    showCancel(showCancel)
+                    setCountDownTime(countDownTime)
+                    setOnConfirmClickListener(onConfirmClick)
+                    setOnCancelClickListener(onCancelClick)
+                }, CustomDialog.ALIGN.CENTER)
+            }
+        }
+
+        /**
+         * 显示通知
+         */
+        @JvmStatic
+        fun showInfo(
+            msg: String,
+            showCancel: Boolean = true,
+            showConfirm: Boolean = true,
+            countDownTime: Int = 10,
+            onConfirmClick: () -> Unit = {},
+            onCancelClick: () -> Unit = {}
+        ) {
+            ThreadUtils.runOnMain {
+                CustomDialog.show(TipDialog().apply {
+                    setTitle(CommonUtils.getStr(R.string.action_confirm).toString())
+                    setMessage(msg)
+                    setDialogType(DialogType.INFO)
+                    showConfirm(showConfirm)
+                    showCancel(showCancel)
+                    setCountDownTime(countDownTime)
+                    setOnConfirmClickListener(onConfirmClick)
+                    setOnCancelClickListener(onCancelClick)
+                }, CustomDialog.ALIGN.CENTER)
+            }
+        }
     }
 }

+ 24 - 0
ui-base/src/main/java/com/grkj/ui_base/utils/event/LogoutEvent.kt

@@ -0,0 +1,24 @@
+package com.grkj.ui_base.utils.event
+
+import com.grkj.shared.model.EventBean
+import com.grkj.data.data.EventConstants
+
+/**
+ * 退出登录
+ */
+class LogoutEvent() {
+
+    companion object {
+        /**
+         * 发送退出登录事件
+         */
+        @JvmStatic
+        fun sendLogoutEvent() {
+            val logoutEvent = LogoutEvent()
+            val logoutEventBean = EventBean<LogoutEvent>(
+                EventConstants.EVENT_LOGOUT, logoutEvent
+            )
+            EventHelper.sendEvent(logoutEventBean)
+        }
+    }
+}

+ 1 - 1
ui-base/src/main/res/values/colors.xml

@@ -30,7 +30,7 @@
     <color name="selectable_input_prefix">#bd3124</color>
     <color name="switch_track_on">#298EFF</color>
     <color name="switch_track_off">#E9E9E9</color>
-    <color name="dialog_card_login_bg">#990E57EA</color>
+    <color name="dialog_card_login_bg">#CC0E57EA</color>
     <color name="home_menu_bg">#4D2B7AE9</color>
     <color name="common_btn_red_bg">#80FF0000</color>
     <color name="common_btn_green_bg">#047b0f</color>