diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b6f9b2..099eb12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b6f9b2..099eb12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a4f3c46..1a844cd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -36,6 +36,15 @@ ): String /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b6f9b2..099eb12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a4f3c46..1a844cd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -36,6 +36,15 @@ ): String /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8bf4070..afa53cf 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -15,6 +15,7 @@ import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject import java.io.File @@ -88,6 +89,19 @@ } /** + * 修改密码 + */ + suspend fun changePassword(oldPwd: String, newPwd: String): String { + val paramObject = JSONObject() + paramObject.put("oldPwd", oldPwd) + paramObject.put("newPwd", newPwd) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.changePassword(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b6f9b2..099eb12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a4f3c46..1a844cd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -36,6 +36,15 @@ ): String /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8bf4070..afa53cf 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -15,6 +15,7 @@ import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject import java.io.File @@ -88,6 +89,19 @@ } /** + * 修改密码 + */ + suspend fun changePassword(oldPwd: String, newPwd: String): String { + val paramObject = JSONObject() + paramObject.put("oldPwd", oldPwd) + paramObject.put("newPwd", newPwd) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.changePassword(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt new file mode 100644 index 0000000..f68a025 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt @@ -0,0 +1,99 @@ +package com.casic.xz.meterage.view + +import android.content.Intent +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.AuthenticationHelper +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.utils.RSAUtils +import com.casic.xz.meterage.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_forget_password.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.nio.charset.StandardCharsets + +class ForgetPasswordActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + private lateinit var newPassword: String + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + val intent = Intent() + intent.putExtra("newPassword", newPassword) + setResult(RESULT_OK, intent) + finish() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + submitButton.setOnClickListener { + /** + * isEmpty 认为空格(无论单空格还是多空格)都是不是空. + * isBlank 认为空格,换行符号(\n),tab(\t)都是空. + * */ + val oldPassword: String = oldPasswordView.text.toString().trim() + if (oldPassword.isBlank()) { + "请先输入原密码".show(this) + return@setOnClickListener + } + val newPassword: String = newPasswordView.text.toString().trim() + if (newPassword.isBlank()) { + "请输入新密码".show(this) + return@setOnClickListener + } + val repeatPassword: String = repeatPasswordView.text.toString().trim() + if (repeatPassword.isBlank()) { + "请再次输入新密码".show(this) + return@setOnClickListener + } + if (newPassword != repeatPassword) { + "新密码和确认密码输入不一致,请重新输入".show(this) + return@setOnClickListener + } + if (newPassword.length < 6 || newPassword.length > 16) { + "新密码长度不正确,请重新输入".show(this) + return@setOnClickListener + } + this.newPassword = newPassword + + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + userViewModel.changePassword(oldPwd = oldPassKey, newPwd = newPassKey) + } + } + + override fun initLayoutView(): Int = R.layout.activity_forget_password + + override fun observeRequestState() { + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "修改密码" + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b6f9b2..099eb12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a4f3c46..1a844cd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -36,6 +36,15 @@ ): String /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8bf4070..afa53cf 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -15,6 +15,7 @@ import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject import java.io.File @@ -88,6 +89,19 @@ } /** + * 修改密码 + */ + suspend fun changePassword(oldPwd: String, newPwd: String): String { + val paramObject = JSONObject() + paramObject.put("oldPwd", oldPwd) + paramObject.put("newPwd", newPwd) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.changePassword(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt new file mode 100644 index 0000000..f68a025 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt @@ -0,0 +1,99 @@ +package com.casic.xz.meterage.view + +import android.content.Intent +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.AuthenticationHelper +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.utils.RSAUtils +import com.casic.xz.meterage.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_forget_password.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.nio.charset.StandardCharsets + +class ForgetPasswordActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + private lateinit var newPassword: String + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + val intent = Intent() + intent.putExtra("newPassword", newPassword) + setResult(RESULT_OK, intent) + finish() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + submitButton.setOnClickListener { + /** + * isEmpty 认为空格(无论单空格还是多空格)都是不是空. + * isBlank 认为空格,换行符号(\n),tab(\t)都是空. + * */ + val oldPassword: String = oldPasswordView.text.toString().trim() + if (oldPassword.isBlank()) { + "请先输入原密码".show(this) + return@setOnClickListener + } + val newPassword: String = newPasswordView.text.toString().trim() + if (newPassword.isBlank()) { + "请输入新密码".show(this) + return@setOnClickListener + } + val repeatPassword: String = repeatPasswordView.text.toString().trim() + if (repeatPassword.isBlank()) { + "请再次输入新密码".show(this) + return@setOnClickListener + } + if (newPassword != repeatPassword) { + "新密码和确认密码输入不一致,请重新输入".show(this) + return@setOnClickListener + } + if (newPassword.length < 6 || newPassword.length > 16) { + "新密码长度不正确,请重新输入".show(this) + return@setOnClickListener + } + this.newPassword = newPassword + + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + userViewModel.changePassword(oldPwd = oldPassKey, newPwd = newPassKey) + } + } + + override fun initLayoutView(): Int = R.layout.activity_forget_password + + override fun observeRequestState() { + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "修改密码" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt index e8100d2..f26d40e 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -1,5 +1,10 @@ package com.casic.xz.meterage.view +import android.app.Activity +import android.content.Intent +import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultCallback +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.extensions.initLayoutImmersionBar @@ -31,10 +36,24 @@ userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } + private val changePwdLauncher = + registerForActivityResult( + ActivityResultContracts.StartActivityForResult(), + object : ActivityResultCallback { + override fun onActivityResult(result: ActivityResult?) { + if (result?.resultCode == Activity.RESULT_OK) { + val data = result.data ?: return + + passwordView.setText(data.getStringExtra("newPassword")) + "修改成功,可直接登录".show(this@LoginActivity) + } + } + }) + override fun initEvent() { -// forgetPasswordView.setOnClickListener { -// navigatePageTo() -// } + forgetPasswordView.setOnClickListener { + changePwdLauncher.launch(Intent(this, ForgetPasswordActivity::class.java)) + } loginButton.setOnClickListener { val userPhone = userPhoneView.text.toString() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b6f9b2..099eb12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a4f3c46..1a844cd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -36,6 +36,15 @@ ): String /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8bf4070..afa53cf 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -15,6 +15,7 @@ import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject import java.io.File @@ -88,6 +89,19 @@ } /** + * 修改密码 + */ + suspend fun changePassword(oldPwd: String, newPwd: String): String { + val paramObject = JSONObject() + paramObject.put("oldPwd", oldPwd) + paramObject.put("newPwd", newPwd) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.changePassword(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt new file mode 100644 index 0000000..f68a025 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt @@ -0,0 +1,99 @@ +package com.casic.xz.meterage.view + +import android.content.Intent +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.AuthenticationHelper +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.utils.RSAUtils +import com.casic.xz.meterage.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_forget_password.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.nio.charset.StandardCharsets + +class ForgetPasswordActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + private lateinit var newPassword: String + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + val intent = Intent() + intent.putExtra("newPassword", newPassword) + setResult(RESULT_OK, intent) + finish() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + submitButton.setOnClickListener { + /** + * isEmpty 认为空格(无论单空格还是多空格)都是不是空. + * isBlank 认为空格,换行符号(\n),tab(\t)都是空. + * */ + val oldPassword: String = oldPasswordView.text.toString().trim() + if (oldPassword.isBlank()) { + "请先输入原密码".show(this) + return@setOnClickListener + } + val newPassword: String = newPasswordView.text.toString().trim() + if (newPassword.isBlank()) { + "请输入新密码".show(this) + return@setOnClickListener + } + val repeatPassword: String = repeatPasswordView.text.toString().trim() + if (repeatPassword.isBlank()) { + "请再次输入新密码".show(this) + return@setOnClickListener + } + if (newPassword != repeatPassword) { + "新密码和确认密码输入不一致,请重新输入".show(this) + return@setOnClickListener + } + if (newPassword.length < 6 || newPassword.length > 16) { + "新密码长度不正确,请重新输入".show(this) + return@setOnClickListener + } + this.newPassword = newPassword + + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + userViewModel.changePassword(oldPwd = oldPassKey, newPwd = newPassKey) + } + } + + override fun initLayoutView(): Int = R.layout.activity_forget_password + + override fun observeRequestState() { + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "修改密码" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt index e8100d2..f26d40e 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -1,5 +1,10 @@ package com.casic.xz.meterage.view +import android.app.Activity +import android.content.Intent +import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultCallback +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.extensions.initLayoutImmersionBar @@ -31,10 +36,24 @@ userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } + private val changePwdLauncher = + registerForActivityResult( + ActivityResultContracts.StartActivityForResult(), + object : ActivityResultCallback { + override fun onActivityResult(result: ActivityResult?) { + if (result?.resultCode == Activity.RESULT_OK) { + val data = result.data ?: return + + passwordView.setText(data.getStringExtra("newPassword")) + "修改成功,可直接登录".show(this@LoginActivity) + } + } + }) + override fun initEvent() { -// forgetPasswordView.setOnClickListener { -// navigatePageTo() -// } + forgetPasswordView.setOnClickListener { + changePwdLauncher.launch(Intent(this, ForgetPasswordActivity::class.java)) + } loginButton.setOnClickListener { val userPhone = userPhoneView.text.toString() diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index a628117..04be988 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val updateResult = MutableLiveData() + val changePwdResult = MutableLiveData() // val outResultModel = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ @@ -90,6 +91,25 @@ it.printStackTrace() }) + fun changePassword(oldPwd: String, newPwd: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.changePassword(oldPwd, newPwd) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + changePwdResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + // fun out() = launch({ // val response = RetrofitServiceManager.loginOut() // val responseCode = response.separateResponseCode() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b6f9b2..099eb12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a4f3c46..1a844cd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -36,6 +36,15 @@ ): String /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8bf4070..afa53cf 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -15,6 +15,7 @@ import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject import java.io.File @@ -88,6 +89,19 @@ } /** + * 修改密码 + */ + suspend fun changePassword(oldPwd: String, newPwd: String): String { + val paramObject = JSONObject() + paramObject.put("oldPwd", oldPwd) + paramObject.put("newPwd", newPwd) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.changePassword(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt new file mode 100644 index 0000000..f68a025 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt @@ -0,0 +1,99 @@ +package com.casic.xz.meterage.view + +import android.content.Intent +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.AuthenticationHelper +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.utils.RSAUtils +import com.casic.xz.meterage.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_forget_password.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.nio.charset.StandardCharsets + +class ForgetPasswordActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + private lateinit var newPassword: String + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + val intent = Intent() + intent.putExtra("newPassword", newPassword) + setResult(RESULT_OK, intent) + finish() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + submitButton.setOnClickListener { + /** + * isEmpty 认为空格(无论单空格还是多空格)都是不是空. + * isBlank 认为空格,换行符号(\n),tab(\t)都是空. + * */ + val oldPassword: String = oldPasswordView.text.toString().trim() + if (oldPassword.isBlank()) { + "请先输入原密码".show(this) + return@setOnClickListener + } + val newPassword: String = newPasswordView.text.toString().trim() + if (newPassword.isBlank()) { + "请输入新密码".show(this) + return@setOnClickListener + } + val repeatPassword: String = repeatPasswordView.text.toString().trim() + if (repeatPassword.isBlank()) { + "请再次输入新密码".show(this) + return@setOnClickListener + } + if (newPassword != repeatPassword) { + "新密码和确认密码输入不一致,请重新输入".show(this) + return@setOnClickListener + } + if (newPassword.length < 6 || newPassword.length > 16) { + "新密码长度不正确,请重新输入".show(this) + return@setOnClickListener + } + this.newPassword = newPassword + + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + userViewModel.changePassword(oldPwd = oldPassKey, newPwd = newPassKey) + } + } + + override fun initLayoutView(): Int = R.layout.activity_forget_password + + override fun observeRequestState() { + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "修改密码" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt index e8100d2..f26d40e 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -1,5 +1,10 @@ package com.casic.xz.meterage.view +import android.app.Activity +import android.content.Intent +import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultCallback +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.extensions.initLayoutImmersionBar @@ -31,10 +36,24 @@ userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } + private val changePwdLauncher = + registerForActivityResult( + ActivityResultContracts.StartActivityForResult(), + object : ActivityResultCallback { + override fun onActivityResult(result: ActivityResult?) { + if (result?.resultCode == Activity.RESULT_OK) { + val data = result.data ?: return + + passwordView.setText(data.getStringExtra("newPassword")) + "修改成功,可直接登录".show(this@LoginActivity) + } + } + }) + override fun initEvent() { -// forgetPasswordView.setOnClickListener { -// navigatePageTo() -// } + forgetPasswordView.setOnClickListener { + changePwdLauncher.launch(Intent(this, ForgetPasswordActivity::class.java)) + } loginButton.setOnClickListener { val userPhone = userPhoneView.text.toString() diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index a628117..04be988 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val updateResult = MutableLiveData() + val changePwdResult = MutableLiveData() // val outResultModel = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ @@ -90,6 +91,25 @@ it.printStackTrace() }) + fun changePassword(oldPwd: String, newPwd: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.changePassword(oldPwd, newPwd) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + changePwdResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + // fun out() = launch({ // val response = RetrofitServiceManager.loginOut() // val responseCode = response.separateResponseCode() diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml deleted file mode 100644 index 60d5b26..0000000 --- a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b6f9b2..099eb12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a4f3c46..1a844cd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -36,6 +36,15 @@ ): String /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8bf4070..afa53cf 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -15,6 +15,7 @@ import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject import java.io.File @@ -88,6 +89,19 @@ } /** + * 修改密码 + */ + suspend fun changePassword(oldPwd: String, newPwd: String): String { + val paramObject = JSONObject() + paramObject.put("oldPwd", oldPwd) + paramObject.put("newPwd", newPwd) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.changePassword(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt new file mode 100644 index 0000000..f68a025 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt @@ -0,0 +1,99 @@ +package com.casic.xz.meterage.view + +import android.content.Intent +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.AuthenticationHelper +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.utils.RSAUtils +import com.casic.xz.meterage.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_forget_password.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.nio.charset.StandardCharsets + +class ForgetPasswordActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + private lateinit var newPassword: String + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + val intent = Intent() + intent.putExtra("newPassword", newPassword) + setResult(RESULT_OK, intent) + finish() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + submitButton.setOnClickListener { + /** + * isEmpty 认为空格(无论单空格还是多空格)都是不是空. + * isBlank 认为空格,换行符号(\n),tab(\t)都是空. + * */ + val oldPassword: String = oldPasswordView.text.toString().trim() + if (oldPassword.isBlank()) { + "请先输入原密码".show(this) + return@setOnClickListener + } + val newPassword: String = newPasswordView.text.toString().trim() + if (newPassword.isBlank()) { + "请输入新密码".show(this) + return@setOnClickListener + } + val repeatPassword: String = repeatPasswordView.text.toString().trim() + if (repeatPassword.isBlank()) { + "请再次输入新密码".show(this) + return@setOnClickListener + } + if (newPassword != repeatPassword) { + "新密码和确认密码输入不一致,请重新输入".show(this) + return@setOnClickListener + } + if (newPassword.length < 6 || newPassword.length > 16) { + "新密码长度不正确,请重新输入".show(this) + return@setOnClickListener + } + this.newPassword = newPassword + + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + userViewModel.changePassword(oldPwd = oldPassKey, newPwd = newPassKey) + } + } + + override fun initLayoutView(): Int = R.layout.activity_forget_password + + override fun observeRequestState() { + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "修改密码" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt index e8100d2..f26d40e 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -1,5 +1,10 @@ package com.casic.xz.meterage.view +import android.app.Activity +import android.content.Intent +import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultCallback +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.extensions.initLayoutImmersionBar @@ -31,10 +36,24 @@ userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } + private val changePwdLauncher = + registerForActivityResult( + ActivityResultContracts.StartActivityForResult(), + object : ActivityResultCallback { + override fun onActivityResult(result: ActivityResult?) { + if (result?.resultCode == Activity.RESULT_OK) { + val data = result.data ?: return + + passwordView.setText(data.getStringExtra("newPassword")) + "修改成功,可直接登录".show(this@LoginActivity) + } + } + }) + override fun initEvent() { -// forgetPasswordView.setOnClickListener { -// navigatePageTo() -// } + forgetPasswordView.setOnClickListener { + changePwdLauncher.launch(Intent(this, ForgetPasswordActivity::class.java)) + } loginButton.setOnClickListener { val userPhone = userPhoneView.text.toString() diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index a628117..04be988 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val updateResult = MutableLiveData() + val changePwdResult = MutableLiveData() // val outResultModel = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ @@ -90,6 +91,25 @@ it.printStackTrace() }) + fun changePassword(oldPwd: String, newPwd: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.changePassword(oldPwd, newPwd) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + changePwdResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + // fun out() = launch({ // val response = RetrofitServiceManager.loginOut() // val responseCode = response.separateResponseCode() diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml deleted file mode 100644 index 60d5b26..0000000 --- a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_5.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_5.xml new file mode 100644 index 0000000..428e1a3 --- /dev/null +++ b/app/src/main/res/drawable/bg_edit_text_border_radius_5.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b6f9b2..099eb12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a4f3c46..1a844cd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -36,6 +36,15 @@ ): String /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8bf4070..afa53cf 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -15,6 +15,7 @@ import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject import java.io.File @@ -88,6 +89,19 @@ } /** + * 修改密码 + */ + suspend fun changePassword(oldPwd: String, newPwd: String): String { + val paramObject = JSONObject() + paramObject.put("oldPwd", oldPwd) + paramObject.put("newPwd", newPwd) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.changePassword(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt new file mode 100644 index 0000000..f68a025 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt @@ -0,0 +1,99 @@ +package com.casic.xz.meterage.view + +import android.content.Intent +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.AuthenticationHelper +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.utils.RSAUtils +import com.casic.xz.meterage.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_forget_password.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.nio.charset.StandardCharsets + +class ForgetPasswordActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + private lateinit var newPassword: String + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + val intent = Intent() + intent.putExtra("newPassword", newPassword) + setResult(RESULT_OK, intent) + finish() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + submitButton.setOnClickListener { + /** + * isEmpty 认为空格(无论单空格还是多空格)都是不是空. + * isBlank 认为空格,换行符号(\n),tab(\t)都是空. + * */ + val oldPassword: String = oldPasswordView.text.toString().trim() + if (oldPassword.isBlank()) { + "请先输入原密码".show(this) + return@setOnClickListener + } + val newPassword: String = newPasswordView.text.toString().trim() + if (newPassword.isBlank()) { + "请输入新密码".show(this) + return@setOnClickListener + } + val repeatPassword: String = repeatPasswordView.text.toString().trim() + if (repeatPassword.isBlank()) { + "请再次输入新密码".show(this) + return@setOnClickListener + } + if (newPassword != repeatPassword) { + "新密码和确认密码输入不一致,请重新输入".show(this) + return@setOnClickListener + } + if (newPassword.length < 6 || newPassword.length > 16) { + "新密码长度不正确,请重新输入".show(this) + return@setOnClickListener + } + this.newPassword = newPassword + + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + userViewModel.changePassword(oldPwd = oldPassKey, newPwd = newPassKey) + } + } + + override fun initLayoutView(): Int = R.layout.activity_forget_password + + override fun observeRequestState() { + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "修改密码" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt index e8100d2..f26d40e 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -1,5 +1,10 @@ package com.casic.xz.meterage.view +import android.app.Activity +import android.content.Intent +import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultCallback +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.extensions.initLayoutImmersionBar @@ -31,10 +36,24 @@ userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } + private val changePwdLauncher = + registerForActivityResult( + ActivityResultContracts.StartActivityForResult(), + object : ActivityResultCallback { + override fun onActivityResult(result: ActivityResult?) { + if (result?.resultCode == Activity.RESULT_OK) { + val data = result.data ?: return + + passwordView.setText(data.getStringExtra("newPassword")) + "修改成功,可直接登录".show(this@LoginActivity) + } + } + }) + override fun initEvent() { -// forgetPasswordView.setOnClickListener { -// navigatePageTo() -// } + forgetPasswordView.setOnClickListener { + changePwdLauncher.launch(Intent(this, ForgetPasswordActivity::class.java)) + } loginButton.setOnClickListener { val userPhone = userPhoneView.text.toString() diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index a628117..04be988 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val updateResult = MutableLiveData() + val changePwdResult = MutableLiveData() // val outResultModel = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ @@ -90,6 +91,25 @@ it.printStackTrace() }) + fun changePassword(oldPwd: String, newPwd: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.changePassword(oldPwd, newPwd) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + changePwdResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + // fun out() = launch({ // val response = RetrofitServiceManager.loginOut() // val responseCode = response.separateResponseCode() diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml deleted file mode 100644 index 60d5b26..0000000 --- a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_5.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_5.xml new file mode 100644 index 0000000..428e1a3 --- /dev/null +++ b/app/src/main/res/drawable/bg_edit_text_border_radius_5.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml index fe2dd30..ece8881 100644 --- a/app/src/main/res/drawable/button_main_selector.xml +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -3,14 +3,14 @@ - + - + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b6f9b2..099eb12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index a4f3c46..1a844cd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -36,6 +36,15 @@ ): String /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 8bf4070..afa53cf 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -15,6 +15,7 @@ import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject import java.io.File @@ -88,6 +89,19 @@ } /** + * 修改密码 + */ + suspend fun changePassword(oldPwd: String, newPwd: String): String { + val paramObject = JSONObject() + paramObject.put("oldPwd", oldPwd) + paramObject.put("newPwd", newPwd) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.changePassword(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt new file mode 100644 index 0000000..f68a025 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/ForgetPasswordActivity.kt @@ -0,0 +1,99 @@ +package com.casic.xz.meterage.view + +import android.content.Intent +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.AuthenticationHelper +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.utils.RSAUtils +import com.casic.xz.meterage.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_forget_password.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.nio.charset.StandardCharsets + +class ForgetPasswordActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + private lateinit var newPassword: String + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + val intent = Intent() + intent.putExtra("newPassword", newPassword) + setResult(RESULT_OK, intent) + finish() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + submitButton.setOnClickListener { + /** + * isEmpty 认为空格(无论单空格还是多空格)都是不是空. + * isBlank 认为空格,换行符号(\n),tab(\t)都是空. + * */ + val oldPassword: String = oldPasswordView.text.toString().trim() + if (oldPassword.isBlank()) { + "请先输入原密码".show(this) + return@setOnClickListener + } + val newPassword: String = newPasswordView.text.toString().trim() + if (newPassword.isBlank()) { + "请输入新密码".show(this) + return@setOnClickListener + } + val repeatPassword: String = repeatPasswordView.text.toString().trim() + if (repeatPassword.isBlank()) { + "请再次输入新密码".show(this) + return@setOnClickListener + } + if (newPassword != repeatPassword) { + "新密码和确认密码输入不一致,请重新输入".show(this) + return@setOnClickListener + } + if (newPassword.length < 6 || newPassword.length > 16) { + "新密码长度不正确,请重新输入".show(this) + return@setOnClickListener + } + this.newPassword = newPassword + + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPassword.toByteArray(StandardCharsets.UTF_8), + publicKey + ) + userViewModel.changePassword(oldPwd = oldPassKey, newPwd = newPassKey) + } + } + + override fun initLayoutView(): Int = R.layout.activity_forget_password + + override fun observeRequestState() { + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "修改密码" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt index e8100d2..f26d40e 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -1,5 +1,10 @@ package com.casic.xz.meterage.view +import android.app.Activity +import android.content.Intent +import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultCallback +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.extensions.initLayoutImmersionBar @@ -31,10 +36,24 @@ userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } + private val changePwdLauncher = + registerForActivityResult( + ActivityResultContracts.StartActivityForResult(), + object : ActivityResultCallback { + override fun onActivityResult(result: ActivityResult?) { + if (result?.resultCode == Activity.RESULT_OK) { + val data = result.data ?: return + + passwordView.setText(data.getStringExtra("newPassword")) + "修改成功,可直接登录".show(this@LoginActivity) + } + } + }) + override fun initEvent() { -// forgetPasswordView.setOnClickListener { -// navigatePageTo() -// } + forgetPasswordView.setOnClickListener { + changePwdLauncher.launch(Intent(this, ForgetPasswordActivity::class.java)) + } loginButton.setOnClickListener { val userPhone = userPhoneView.text.toString() diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index a628117..04be988 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val updateResult = MutableLiveData() + val changePwdResult = MutableLiveData() // val outResultModel = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ @@ -90,6 +91,25 @@ it.printStackTrace() }) + fun changePassword(oldPwd: String, newPwd: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.changePassword(oldPwd, newPwd) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + changePwdResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + // fun out() = launch({ // val response = RetrofitServiceManager.loginOut() // val responseCode = response.separateResponseCode() diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml deleted file mode 100644 index 60d5b26..0000000 --- a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_5.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_5.xml new file mode 100644 index 0000000..428e1a3 --- /dev/null +++ b/app/src/main/res/drawable/bg_edit_text_border_radius_5.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml index fe2dd30..ece8881 100644 --- a/app/src/main/res/drawable/button_main_selector.xml +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -3,14 +3,14 @@ - + - + diff --git a/app/src/main/res/layout/activity_forget_password.xml b/app/src/main/res/layout/activity_forget_password.xml new file mode 100644 index 0000000..6d8d42a --- /dev/null +++ b/app/src/main/res/layout/activity_forget_password.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +