diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java new file mode 100644 index 0000000..a576b9e --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.ktd.model; + +public class PublicKeyModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private boolean appKaptcha; + private boolean kaptcha; + private String publicKey; + private String sid; + + public boolean isAppKaptcha() { + return appKaptcha; + } + + public void setAppKaptcha(boolean appKaptcha) { + this.appKaptcha = appKaptcha; + } + + public boolean isKaptcha() { + return kaptcha; + } + + public void setKaptcha(boolean kaptcha) { + this.kaptcha = kaptcha; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java new file mode 100644 index 0000000..a576b9e --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.ktd.model; + +public class PublicKeyModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private boolean appKaptcha; + private boolean kaptcha; + private String publicKey; + private String sid; + + public boolean isAppKaptcha() { + return appKaptcha; + } + + public void setAppKaptcha(boolean appKaptcha) { + this.appKaptcha = appKaptcha; + } + + public boolean isKaptcha() { + return kaptcha; + } + + public void setKaptcha(boolean kaptcha) { + this.kaptcha = kaptcha; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index 7460ea7..d3548bb 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,4 +1,36 @@ package com.casic.br.ktd.retrofit +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST + interface RetrofitService { + /** + * PublicKey校验 + */ + @GET("/sys/config/baseConfig") + suspend fun getPublicKey(): String + + /** + * 登录并获取Token + */ + @POST("/sys/user/login") + suspend fun login(@Body requestBody: RequestBody): String + + /** + * 退出登录 + */ + @GET("/sys/user/logout") + suspend fun loginOut(@Header("token") token: String): String + + /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java new file mode 100644 index 0000000..a576b9e --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.ktd.model; + +public class PublicKeyModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private boolean appKaptcha; + private boolean kaptcha; + private String publicKey; + private String sid; + + public boolean isAppKaptcha() { + return appKaptcha; + } + + public void setAppKaptcha(boolean appKaptcha) { + this.appKaptcha = appKaptcha; + } + + public boolean isKaptcha() { + return kaptcha; + } + + public void setKaptcha(boolean kaptcha) { + this.kaptcha = kaptcha; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index 7460ea7..d3548bb 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,4 +1,36 @@ package com.casic.br.ktd.retrofit +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST + interface RetrofitService { + /** + * PublicKey校验 + */ + @GET("/sys/config/baseConfig") + suspend fun getPublicKey(): String + + /** + * 登录并获取Token + */ + @POST("/sys/user/login") + suspend fun login(@Body requestBody: RequestBody): String + + /** + * 退出登录 + */ + @GET("/sys/user/logout") + suspend fun loginOut(@Header("token") token: String): String + + /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 16a22b9..073260a 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,15 @@ package com.casic.br.ktd.retrofit import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.utils.AuthenticationHelper import com.casic.br.ktd.utils.LocaleConstant +import com.google.gson.JsonObject import com.pengxh.kt.lite.extensions.readAssetsFile import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject object RetrofitServiceManager { private val api by lazy { @@ -15,6 +20,47 @@ } /** + * 验证PublicKey + */ + suspend fun getPublicKey(): String { + return api.getPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(sid: String, account: String, secretKey: String): String { + val param = JsonObject() + param.addProperty("sid", sid) + param.addProperty("username", account) + param.addProperty("password", secretKey) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.login(requestBody) + } + + /** + * 退出登录 + */ + suspend fun loginOut(): String { + return api.loginOut(AuthenticationHelper.token) + } + + /** + * 修改密码 + */ + 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 getTaskList( diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java new file mode 100644 index 0000000..a576b9e --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.ktd.model; + +public class PublicKeyModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private boolean appKaptcha; + private boolean kaptcha; + private String publicKey; + private String sid; + + public boolean isAppKaptcha() { + return appKaptcha; + } + + public void setAppKaptcha(boolean appKaptcha) { + this.appKaptcha = appKaptcha; + } + + public boolean isKaptcha() { + return kaptcha; + } + + public void setKaptcha(boolean kaptcha) { + this.kaptcha = kaptcha; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index 7460ea7..d3548bb 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,4 +1,36 @@ package com.casic.br.ktd.retrofit +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST + interface RetrofitService { + /** + * PublicKey校验 + */ + @GET("/sys/config/baseConfig") + suspend fun getPublicKey(): String + + /** + * 登录并获取Token + */ + @POST("/sys/user/login") + suspend fun login(@Body requestBody: RequestBody): String + + /** + * 退出登录 + */ + @GET("/sys/user/logout") + suspend fun loginOut(@Header("token") token: String): String + + /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 16a22b9..073260a 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,15 @@ package com.casic.br.ktd.retrofit import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.utils.AuthenticationHelper import com.casic.br.ktd.utils.LocaleConstant +import com.google.gson.JsonObject import com.pengxh.kt.lite.extensions.readAssetsFile import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject object RetrofitServiceManager { private val api by lazy { @@ -15,6 +20,47 @@ } /** + * 验证PublicKey + */ + suspend fun getPublicKey(): String { + return api.getPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(sid: String, account: String, secretKey: String): String { + val param = JsonObject() + param.addProperty("sid", sid) + param.addProperty("username", account) + param.addProperty("password", secretKey) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.login(requestBody) + } + + /** + * 退出登录 + */ + suspend fun loginOut(): String { + return api.loginOut(AuthenticationHelper.token) + } + + /** + * 修改密码 + */ + 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 getTaskList( diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt index 4c675df..bd323dd 100644 --- a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt @@ -37,8 +37,10 @@ * String * ============================================================================================= * */ + const val ACCOUNT = "account" + const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://111.198.10.15:21609" + const val SERVER_BASE_URL = "http://111.198.10.15:11646" //海康摄像头参数 const val HK_NET_IP = "192.168.1.64" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java new file mode 100644 index 0000000..a576b9e --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.ktd.model; + +public class PublicKeyModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private boolean appKaptcha; + private boolean kaptcha; + private String publicKey; + private String sid; + + public boolean isAppKaptcha() { + return appKaptcha; + } + + public void setAppKaptcha(boolean appKaptcha) { + this.appKaptcha = appKaptcha; + } + + public boolean isKaptcha() { + return kaptcha; + } + + public void setKaptcha(boolean kaptcha) { + this.kaptcha = kaptcha; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index 7460ea7..d3548bb 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,4 +1,36 @@ package com.casic.br.ktd.retrofit +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST + interface RetrofitService { + /** + * PublicKey校验 + */ + @GET("/sys/config/baseConfig") + suspend fun getPublicKey(): String + + /** + * 登录并获取Token + */ + @POST("/sys/user/login") + suspend fun login(@Body requestBody: RequestBody): String + + /** + * 退出登录 + */ + @GET("/sys/user/logout") + suspend fun loginOut(@Header("token") token: String): String + + /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 16a22b9..073260a 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,15 @@ package com.casic.br.ktd.retrofit import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.utils.AuthenticationHelper import com.casic.br.ktd.utils.LocaleConstant +import com.google.gson.JsonObject import com.pengxh.kt.lite.extensions.readAssetsFile import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject object RetrofitServiceManager { private val api by lazy { @@ -15,6 +20,47 @@ } /** + * 验证PublicKey + */ + suspend fun getPublicKey(): String { + return api.getPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(sid: String, account: String, secretKey: String): String { + val param = JsonObject() + param.addProperty("sid", sid) + param.addProperty("username", account) + param.addProperty("password", secretKey) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.login(requestBody) + } + + /** + * 退出登录 + */ + suspend fun loginOut(): String { + return api.loginOut(AuthenticationHelper.token) + } + + /** + * 修改密码 + */ + 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 getTaskList( diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt index 4c675df..bd323dd 100644 --- a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt @@ -37,8 +37,10 @@ * String * ============================================================================================= * */ + const val ACCOUNT = "account" + const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://111.198.10.15:21609" + const val SERVER_BASE_URL = "http://111.198.10.15:11646" //海康摄像头参数 const val HK_NET_IP = "192.168.1.64" diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index ad234aa..0888ab3 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -47,10 +47,7 @@ import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.utils.BroadcastManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues -import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.* import hcnetsdk.sdkhub.MessageCodeHub import hcnetsdk.sdkhub.SDKGuider import kotlinx.android.synthetic.main.activity_inspection.* @@ -142,6 +139,7 @@ } override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) /** * 配置云台设备 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java new file mode 100644 index 0000000..a576b9e --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.ktd.model; + +public class PublicKeyModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private boolean appKaptcha; + private boolean kaptcha; + private String publicKey; + private String sid; + + public boolean isAppKaptcha() { + return appKaptcha; + } + + public void setAppKaptcha(boolean appKaptcha) { + this.appKaptcha = appKaptcha; + } + + public boolean isKaptcha() { + return kaptcha; + } + + public void setKaptcha(boolean kaptcha) { + this.kaptcha = kaptcha; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index 7460ea7..d3548bb 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,4 +1,36 @@ package com.casic.br.ktd.retrofit +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST + interface RetrofitService { + /** + * PublicKey校验 + */ + @GET("/sys/config/baseConfig") + suspend fun getPublicKey(): String + + /** + * 登录并获取Token + */ + @POST("/sys/user/login") + suspend fun login(@Body requestBody: RequestBody): String + + /** + * 退出登录 + */ + @GET("/sys/user/logout") + suspend fun loginOut(@Header("token") token: String): String + + /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 16a22b9..073260a 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,15 @@ package com.casic.br.ktd.retrofit import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.utils.AuthenticationHelper import com.casic.br.ktd.utils.LocaleConstant +import com.google.gson.JsonObject import com.pengxh.kt.lite.extensions.readAssetsFile import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject object RetrofitServiceManager { private val api by lazy { @@ -15,6 +20,47 @@ } /** + * 验证PublicKey + */ + suspend fun getPublicKey(): String { + return api.getPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(sid: String, account: String, secretKey: String): String { + val param = JsonObject() + param.addProperty("sid", sid) + param.addProperty("username", account) + param.addProperty("password", secretKey) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.login(requestBody) + } + + /** + * 退出登录 + */ + suspend fun loginOut(): String { + return api.loginOut(AuthenticationHelper.token) + } + + /** + * 修改密码 + */ + 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 getTaskList( diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt index 4c675df..bd323dd 100644 --- a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt @@ -37,8 +37,10 @@ * String * ============================================================================================= * */ + const val ACCOUNT = "account" + const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://111.198.10.15:21609" + const val SERVER_BASE_URL = "http://111.198.10.15:11646" //海康摄像头参数 const val HK_NET_IP = "192.168.1.64" diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index ad234aa..0888ab3 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -47,10 +47,7 @@ import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.utils.BroadcastManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues -import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.* import hcnetsdk.sdkhub.MessageCodeHub import hcnetsdk.sdkhub.SDKGuider import kotlinx.android.synthetic.main.activity_inspection.* @@ -142,6 +139,7 @@ } override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) /** * 配置云台设备 diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt index 76874bd..ce1e9a2 100644 --- a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt @@ -1,32 +1,99 @@ package com.casic.br.ktd.view import android.os.Bundle +import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.MapsInitializer import com.casic.br.ktd.R +import com.casic.br.ktd.utils.AuthenticationHelper +import com.casic.br.ktd.utils.LoadingDialogHub import com.casic.br.ktd.utils.LocaleConstant +import com.casic.br.ktd.utils.RSAUtils +import com.casic.br.ktd.vm.AuthenticateViewModel +import com.casic.br.ktd.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.activity_login.* import pub.devrel.easypermissions.EasyPermissions class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var userName: String + private lateinit var userPassword: String + override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) EasyPermissions.requestPermissions( this, resources.getString(R.string.app_name) + "需要获取必要权限", LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS ) + + userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + authenticateViewModel.keyModel.observe(this) { keyModel -> + if (keyModel.code == 200) { + val keyString = keyModel.data!!.publicKey!! + /** + * 修改密码需要用到key,先存着 + * */ + AuthenticationHelper.savePublicKey(keyString) + val publicKey = RSAUtils.keyStrToPublicKey(keyString) + + val dataByPublicKey = RSAUtils.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + userViewModel.enter(keyModel.data!!.sid!!, userName, dataByPublicKey) + } + } + + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.loginResult.observe(this) { + if (it.code == 200) { + AuthenticationHelper.saveToken(it.data!!.token!!) + navigatePageTo() + PageNavigationManager.finishCurrentActivity() + } + } } override fun initEvent() { - loginButton.setOnClickListener { navigatePageTo() } + loginButton.setOnClickListener { + val userPhone = userNameView.text.toString() + if (userPhone.isBlank()) { + "请输入用户名称".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) + + this.userName = userPhone + this.userPassword = userPassword + authenticateViewModel.obtainPublicKey() + } } override fun initLayoutView(): Int = R.layout.activity_login override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java new file mode 100644 index 0000000..a576b9e --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.ktd.model; + +public class PublicKeyModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private boolean appKaptcha; + private boolean kaptcha; + private String publicKey; + private String sid; + + public boolean isAppKaptcha() { + return appKaptcha; + } + + public void setAppKaptcha(boolean appKaptcha) { + this.appKaptcha = appKaptcha; + } + + public boolean isKaptcha() { + return kaptcha; + } + + public void setKaptcha(boolean kaptcha) { + this.kaptcha = kaptcha; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index 7460ea7..d3548bb 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,4 +1,36 @@ package com.casic.br.ktd.retrofit +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST + interface RetrofitService { + /** + * PublicKey校验 + */ + @GET("/sys/config/baseConfig") + suspend fun getPublicKey(): String + + /** + * 登录并获取Token + */ + @POST("/sys/user/login") + suspend fun login(@Body requestBody: RequestBody): String + + /** + * 退出登录 + */ + @GET("/sys/user/logout") + suspend fun loginOut(@Header("token") token: String): String + + /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 16a22b9..073260a 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,15 @@ package com.casic.br.ktd.retrofit import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.utils.AuthenticationHelper import com.casic.br.ktd.utils.LocaleConstant +import com.google.gson.JsonObject import com.pengxh.kt.lite.extensions.readAssetsFile import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject object RetrofitServiceManager { private val api by lazy { @@ -15,6 +20,47 @@ } /** + * 验证PublicKey + */ + suspend fun getPublicKey(): String { + return api.getPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(sid: String, account: String, secretKey: String): String { + val param = JsonObject() + param.addProperty("sid", sid) + param.addProperty("username", account) + param.addProperty("password", secretKey) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.login(requestBody) + } + + /** + * 退出登录 + */ + suspend fun loginOut(): String { + return api.loginOut(AuthenticationHelper.token) + } + + /** + * 修改密码 + */ + 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 getTaskList( diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt index 4c675df..bd323dd 100644 --- a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt @@ -37,8 +37,10 @@ * String * ============================================================================================= * */ + const val ACCOUNT = "account" + const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://111.198.10.15:21609" + const val SERVER_BASE_URL = "http://111.198.10.15:11646" //海康摄像头参数 const val HK_NET_IP = "192.168.1.64" diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index ad234aa..0888ab3 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -47,10 +47,7 @@ import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.utils.BroadcastManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues -import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.* import hcnetsdk.sdkhub.MessageCodeHub import hcnetsdk.sdkhub.SDKGuider import kotlinx.android.synthetic.main.activity_inspection.* @@ -142,6 +139,7 @@ } override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) /** * 配置云台设备 diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt index 76874bd..ce1e9a2 100644 --- a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt @@ -1,32 +1,99 @@ package com.casic.br.ktd.view import android.os.Bundle +import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.MapsInitializer import com.casic.br.ktd.R +import com.casic.br.ktd.utils.AuthenticationHelper +import com.casic.br.ktd.utils.LoadingDialogHub import com.casic.br.ktd.utils.LocaleConstant +import com.casic.br.ktd.utils.RSAUtils +import com.casic.br.ktd.vm.AuthenticateViewModel +import com.casic.br.ktd.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.activity_login.* import pub.devrel.easypermissions.EasyPermissions class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var userName: String + private lateinit var userPassword: String + override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) EasyPermissions.requestPermissions( this, resources.getString(R.string.app_name) + "需要获取必要权限", LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS ) + + userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + authenticateViewModel.keyModel.observe(this) { keyModel -> + if (keyModel.code == 200) { + val keyString = keyModel.data!!.publicKey!! + /** + * 修改密码需要用到key,先存着 + * */ + AuthenticationHelper.savePublicKey(keyString) + val publicKey = RSAUtils.keyStrToPublicKey(keyString) + + val dataByPublicKey = RSAUtils.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + userViewModel.enter(keyModel.data!!.sid!!, userName, dataByPublicKey) + } + } + + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.loginResult.observe(this) { + if (it.code == 200) { + AuthenticationHelper.saveToken(it.data!!.token!!) + navigatePageTo() + PageNavigationManager.finishCurrentActivity() + } + } } override fun initEvent() { - loginButton.setOnClickListener { navigatePageTo() } + loginButton.setOnClickListener { + val userPhone = userNameView.text.toString() + if (userPhone.isBlank()) { + "请输入用户名称".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) + + this.userName = userPhone + this.userPassword = userPassword + authenticateViewModel.obtainPublicKey() + } } override fun initLayoutView(): Int = R.layout.activity_login override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt index 06094f5..0540655 100644 --- a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt @@ -2,6 +2,7 @@ import android.content.Context import android.os.Bundle +import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -17,6 +18,8 @@ import com.casic.br.ktd.fragment.TaskPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -25,6 +28,7 @@ private val slideSelectedItems = ArrayList() private val fragmentPages = ArrayList() private val slideAdapter by lazy { SlideAdapter(this) } + private var clickTime: Long = 0 init { slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页")) @@ -44,6 +48,7 @@ } override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) slideListView.adapter = slideAdapter //默认选中第一个 @@ -80,6 +85,19 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() } + override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出应用".show(this) + clickTime = System.currentTimeMillis() + return true + } else { + super.onKeyDown(keyCode, event) + } + } + return super.onKeyDown(keyCode, event) + } + /** * 侧边导航栏数据模型 * */ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java new file mode 100644 index 0000000..a576b9e --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.ktd.model; + +public class PublicKeyModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private boolean appKaptcha; + private boolean kaptcha; + private String publicKey; + private String sid; + + public boolean isAppKaptcha() { + return appKaptcha; + } + + public void setAppKaptcha(boolean appKaptcha) { + this.appKaptcha = appKaptcha; + } + + public boolean isKaptcha() { + return kaptcha; + } + + public void setKaptcha(boolean kaptcha) { + this.kaptcha = kaptcha; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index 7460ea7..d3548bb 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,4 +1,36 @@ package com.casic.br.ktd.retrofit +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST + interface RetrofitService { + /** + * PublicKey校验 + */ + @GET("/sys/config/baseConfig") + suspend fun getPublicKey(): String + + /** + * 登录并获取Token + */ + @POST("/sys/user/login") + suspend fun login(@Body requestBody: RequestBody): String + + /** + * 退出登录 + */ + @GET("/sys/user/logout") + suspend fun loginOut(@Header("token") token: String): String + + /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 16a22b9..073260a 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,15 @@ package com.casic.br.ktd.retrofit import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.utils.AuthenticationHelper import com.casic.br.ktd.utils.LocaleConstant +import com.google.gson.JsonObject import com.pengxh.kt.lite.extensions.readAssetsFile import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject object RetrofitServiceManager { private val api by lazy { @@ -15,6 +20,47 @@ } /** + * 验证PublicKey + */ + suspend fun getPublicKey(): String { + return api.getPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(sid: String, account: String, secretKey: String): String { + val param = JsonObject() + param.addProperty("sid", sid) + param.addProperty("username", account) + param.addProperty("password", secretKey) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.login(requestBody) + } + + /** + * 退出登录 + */ + suspend fun loginOut(): String { + return api.loginOut(AuthenticationHelper.token) + } + + /** + * 修改密码 + */ + 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 getTaskList( diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt index 4c675df..bd323dd 100644 --- a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt @@ -37,8 +37,10 @@ * String * ============================================================================================= * */ + const val ACCOUNT = "account" + const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://111.198.10.15:21609" + const val SERVER_BASE_URL = "http://111.198.10.15:11646" //海康摄像头参数 const val HK_NET_IP = "192.168.1.64" diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index ad234aa..0888ab3 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -47,10 +47,7 @@ import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.utils.BroadcastManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues -import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.* import hcnetsdk.sdkhub.MessageCodeHub import hcnetsdk.sdkhub.SDKGuider import kotlinx.android.synthetic.main.activity_inspection.* @@ -142,6 +139,7 @@ } override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) /** * 配置云台设备 diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt index 76874bd..ce1e9a2 100644 --- a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt @@ -1,32 +1,99 @@ package com.casic.br.ktd.view import android.os.Bundle +import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.MapsInitializer import com.casic.br.ktd.R +import com.casic.br.ktd.utils.AuthenticationHelper +import com.casic.br.ktd.utils.LoadingDialogHub import com.casic.br.ktd.utils.LocaleConstant +import com.casic.br.ktd.utils.RSAUtils +import com.casic.br.ktd.vm.AuthenticateViewModel +import com.casic.br.ktd.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.activity_login.* import pub.devrel.easypermissions.EasyPermissions class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var userName: String + private lateinit var userPassword: String + override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) EasyPermissions.requestPermissions( this, resources.getString(R.string.app_name) + "需要获取必要权限", LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS ) + + userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + authenticateViewModel.keyModel.observe(this) { keyModel -> + if (keyModel.code == 200) { + val keyString = keyModel.data!!.publicKey!! + /** + * 修改密码需要用到key,先存着 + * */ + AuthenticationHelper.savePublicKey(keyString) + val publicKey = RSAUtils.keyStrToPublicKey(keyString) + + val dataByPublicKey = RSAUtils.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + userViewModel.enter(keyModel.data!!.sid!!, userName, dataByPublicKey) + } + } + + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.loginResult.observe(this) { + if (it.code == 200) { + AuthenticationHelper.saveToken(it.data!!.token!!) + navigatePageTo() + PageNavigationManager.finishCurrentActivity() + } + } } override fun initEvent() { - loginButton.setOnClickListener { navigatePageTo() } + loginButton.setOnClickListener { + val userPhone = userNameView.text.toString() + if (userPhone.isBlank()) { + "请输入用户名称".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) + + this.userName = userPhone + this.userPassword = userPassword + authenticateViewModel.obtainPublicKey() + } } override fun initLayoutView(): Int = R.layout.activity_login override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt index 06094f5..0540655 100644 --- a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt @@ -2,6 +2,7 @@ import android.content.Context import android.os.Bundle +import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -17,6 +18,8 @@ import com.casic.br.ktd.fragment.TaskPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -25,6 +28,7 @@ private val slideSelectedItems = ArrayList() private val fragmentPages = ArrayList() private val slideAdapter by lazy { SlideAdapter(this) } + private var clickTime: Long = 0 init { slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页")) @@ -44,6 +48,7 @@ } override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) slideListView.adapter = slideAdapter //默认选中第一个 @@ -80,6 +85,19 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() } + override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出应用".show(this) + clickTime = System.currentTimeMillis() + return true + } else { + super.onKeyDown(keyCode, event) + } + } + return super.onKeyDown(keyCode, event) + } + /** * 侧边导航栏数据模型 * */ diff --git a/app/src/main/java/com/casic/br/ktd/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/ktd/vm/AuthenticateViewModel.kt new file mode 100644 index 0000000..e4bd2b4 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/vm/AuthenticateViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.br.ktd.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.extensions.separateResponseCode +import com.casic.br.ktd.extensions.toErrorMessage +import com.casic.br.ktd.model.PublicKeyModel +import com.casic.br.ktd.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +/** + * PublicKey VM + * */ +class AuthenticateViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val keyModel = MutableLiveData() + + fun obtainPublicKey() = launch({ + val response = RetrofitServiceManager.getPublicKey() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + keyModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + "网络连接失败,请检查网络".show(BaseApplication.get()) + }) +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java new file mode 100644 index 0000000..a576b9e --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.ktd.model; + +public class PublicKeyModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private boolean appKaptcha; + private boolean kaptcha; + private String publicKey; + private String sid; + + public boolean isAppKaptcha() { + return appKaptcha; + } + + public void setAppKaptcha(boolean appKaptcha) { + this.appKaptcha = appKaptcha; + } + + public boolean isKaptcha() { + return kaptcha; + } + + public void setKaptcha(boolean kaptcha) { + this.kaptcha = kaptcha; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index 7460ea7..d3548bb 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,4 +1,36 @@ package com.casic.br.ktd.retrofit +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST + interface RetrofitService { + /** + * PublicKey校验 + */ + @GET("/sys/config/baseConfig") + suspend fun getPublicKey(): String + + /** + * 登录并获取Token + */ + @POST("/sys/user/login") + suspend fun login(@Body requestBody: RequestBody): String + + /** + * 退出登录 + */ + @GET("/sys/user/logout") + suspend fun loginOut(@Header("token") token: String): String + + /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 16a22b9..073260a 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,15 @@ package com.casic.br.ktd.retrofit import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.utils.AuthenticationHelper import com.casic.br.ktd.utils.LocaleConstant +import com.google.gson.JsonObject import com.pengxh.kt.lite.extensions.readAssetsFile import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject object RetrofitServiceManager { private val api by lazy { @@ -15,6 +20,47 @@ } /** + * 验证PublicKey + */ + suspend fun getPublicKey(): String { + return api.getPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(sid: String, account: String, secretKey: String): String { + val param = JsonObject() + param.addProperty("sid", sid) + param.addProperty("username", account) + param.addProperty("password", secretKey) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.login(requestBody) + } + + /** + * 退出登录 + */ + suspend fun loginOut(): String { + return api.loginOut(AuthenticationHelper.token) + } + + /** + * 修改密码 + */ + 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 getTaskList( diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt index 4c675df..bd323dd 100644 --- a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt @@ -37,8 +37,10 @@ * String * ============================================================================================= * */ + const val ACCOUNT = "account" + const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://111.198.10.15:21609" + const val SERVER_BASE_URL = "http://111.198.10.15:11646" //海康摄像头参数 const val HK_NET_IP = "192.168.1.64" diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index ad234aa..0888ab3 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -47,10 +47,7 @@ import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.utils.BroadcastManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues -import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.* import hcnetsdk.sdkhub.MessageCodeHub import hcnetsdk.sdkhub.SDKGuider import kotlinx.android.synthetic.main.activity_inspection.* @@ -142,6 +139,7 @@ } override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) /** * 配置云台设备 diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt index 76874bd..ce1e9a2 100644 --- a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt @@ -1,32 +1,99 @@ package com.casic.br.ktd.view import android.os.Bundle +import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.MapsInitializer import com.casic.br.ktd.R +import com.casic.br.ktd.utils.AuthenticationHelper +import com.casic.br.ktd.utils.LoadingDialogHub import com.casic.br.ktd.utils.LocaleConstant +import com.casic.br.ktd.utils.RSAUtils +import com.casic.br.ktd.vm.AuthenticateViewModel +import com.casic.br.ktd.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.activity_login.* import pub.devrel.easypermissions.EasyPermissions class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var userName: String + private lateinit var userPassword: String + override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) EasyPermissions.requestPermissions( this, resources.getString(R.string.app_name) + "需要获取必要权限", LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS ) + + userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + authenticateViewModel.keyModel.observe(this) { keyModel -> + if (keyModel.code == 200) { + val keyString = keyModel.data!!.publicKey!! + /** + * 修改密码需要用到key,先存着 + * */ + AuthenticationHelper.savePublicKey(keyString) + val publicKey = RSAUtils.keyStrToPublicKey(keyString) + + val dataByPublicKey = RSAUtils.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + userViewModel.enter(keyModel.data!!.sid!!, userName, dataByPublicKey) + } + } + + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.loginResult.observe(this) { + if (it.code == 200) { + AuthenticationHelper.saveToken(it.data!!.token!!) + navigatePageTo() + PageNavigationManager.finishCurrentActivity() + } + } } override fun initEvent() { - loginButton.setOnClickListener { navigatePageTo() } + loginButton.setOnClickListener { + val userPhone = userNameView.text.toString() + if (userPhone.isBlank()) { + "请输入用户名称".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) + + this.userName = userPhone + this.userPassword = userPassword + authenticateViewModel.obtainPublicKey() + } } override fun initLayoutView(): Int = R.layout.activity_login override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt index 06094f5..0540655 100644 --- a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt @@ -2,6 +2,7 @@ import android.content.Context import android.os.Bundle +import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -17,6 +18,8 @@ import com.casic.br.ktd.fragment.TaskPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -25,6 +28,7 @@ private val slideSelectedItems = ArrayList() private val fragmentPages = ArrayList() private val slideAdapter by lazy { SlideAdapter(this) } + private var clickTime: Long = 0 init { slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页")) @@ -44,6 +48,7 @@ } override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) slideListView.adapter = slideAdapter //默认选中第一个 @@ -80,6 +85,19 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() } + override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出应用".show(this) + clickTime = System.currentTimeMillis() + return true + } else { + super.onKeyDown(keyCode, event) + } + } + return super.onKeyDown(keyCode, event) + } + /** * 侧边导航栏数据模型 * */ diff --git a/app/src/main/java/com/casic/br/ktd/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/ktd/vm/AuthenticateViewModel.kt new file mode 100644 index 0000000..e4bd2b4 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/vm/AuthenticateViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.br.ktd.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.extensions.separateResponseCode +import com.casic.br.ktd.extensions.toErrorMessage +import com.casic.br.ktd.model.PublicKeyModel +import com.casic.br.ktd.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +/** + * PublicKey VM + * */ +class AuthenticateViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val keyModel = MutableLiveData() + + fun obtainPublicKey() = launch({ + val response = RetrofitServiceManager.getPublicKey() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + keyModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + "网络连接失败,请检查网络".show(BaseApplication.get()) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/ktd/vm/UserViewModel.kt new file mode 100644 index 0000000..6683c20 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/vm/UserViewModel.kt @@ -0,0 +1,77 @@ +package com.casic.br.ktd.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.extensions.separateResponseCode +import com.casic.br.ktd.extensions.toErrorMessage +import com.casic.br.ktd.model.ActionResultModel +import com.casic.br.ktd.model.LoginResultModel +import com.casic.br.ktd.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +/** + * 用户相关 VM + * */ +class UserViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + + val loginResult = MutableLiveData() + val outResult = MutableLiveData() + val changePwdResult = MutableLiveData() + + fun enter(sid: String, account: String, secretKey: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.login(sid, account, secretKey) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + loginResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + 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.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d72c1a5..e3b4346 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.AirSpaceGround"> + android:theme="@style/Theme.AirSpaceGround" + android:usesCleartextTraffic="true"> () + } + } + userViewModel.changePwdResult.observe(this) { + if (it.code == 200) { + AlertMessageDialog.Builder() + .setContext(requireContext()) + .setTitle("温馨提示") + .setMessage("密码修改成功,需要重新登录") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + PageNavigationManager.finishAllActivity() + requireContext().navigatePageTo() + } + }).build().show() + } + } } override fun initEvent() { + bv.loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + userViewModel.out() + } + override fun onCancelClick() {} + }).build().show() + } + + bv.changePwdView.setOnClickListener { + val oldPwd = SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String + ChangePasswordDialog.Builder() + .setContext(requireContext()) + .setOldPassword(oldPwd) + .setOnDialogButtonClickListener(object : + ChangePasswordDialog.OnDialogButtonClickListener { + override fun onConfirmClick(newPwd: String) { + //数据校验OK,可以修改密码 + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val oldPassKey = RSAUtils.encryptDataByPublicKey( + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + val newPassKey = RSAUtils.encryptDataByPublicKey( + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey + ) + userViewModel.changePassword(oldPassKey, newPassKey) + } + }).build().show() + } } override fun initLayoutRes(): Int = R.layout.fragment_mine override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java new file mode 100644 index 0000000..c529cc8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.ktd.model; + +public class ActionResultModel { + + private int code; + private Object data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java new file mode 100644 index 0000000..02867e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.ktd.model; + +public class LoginResultModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String kaptcha; + private String token; + + public String getKaptcha() { + return kaptcha; + } + + public void setKaptcha(String kaptcha) { + this.kaptcha = kaptcha; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java new file mode 100644 index 0000000..a576b9e --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.ktd.model; + +public class PublicKeyModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private boolean appKaptcha; + private boolean kaptcha; + private String publicKey; + private String sid; + + public boolean isAppKaptcha() { + return appKaptcha; + } + + public void setAppKaptcha(boolean appKaptcha) { + this.appKaptcha = appKaptcha; + } + + public boolean isKaptcha() { + return kaptcha; + } + + public void setKaptcha(boolean kaptcha) { + this.kaptcha = kaptcha; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + } +} diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt index 7460ea7..d3548bb 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitService.kt @@ -1,4 +1,36 @@ package com.casic.br.ktd.retrofit +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST + interface RetrofitService { + /** + * PublicKey校验 + */ + @GET("/sys/config/baseConfig") + suspend fun getPublicKey(): String + + /** + * 登录并获取Token + */ + @POST("/sys/user/login") + suspend fun login(@Body requestBody: RequestBody): String + + /** + * 退出登录 + */ + @GET("/sys/user/logout") + suspend fun loginOut(@Header("token") token: String): String + + /** + * 修改密码 + */ + @POST("/sys/mgr/changePwd") + suspend fun changePassword( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt index 16a22b9..073260a 100644 --- a/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/ktd/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,15 @@ package com.casic.br.ktd.retrofit import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.utils.AuthenticationHelper import com.casic.br.ktd.utils.LocaleConstant +import com.google.gson.JsonObject import com.pengxh.kt.lite.extensions.readAssetsFile import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject object RetrofitServiceManager { private val api by lazy { @@ -15,6 +20,47 @@ } /** + * 验证PublicKey + */ + suspend fun getPublicKey(): String { + return api.getPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(sid: String, account: String, secretKey: String): String { + val param = JsonObject() + param.addProperty("sid", sid) + param.addProperty("username", account) + param.addProperty("password", secretKey) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.login(requestBody) + } + + /** + * 退出登录 + */ + suspend fun loginOut(): String { + return api.loginOut(AuthenticationHelper.token) + } + + /** + * 修改密码 + */ + 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 getTaskList( diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt index 4c675df..bd323dd 100644 --- a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt @@ -37,8 +37,10 @@ * String * ============================================================================================= * */ + const val ACCOUNT = "account" + const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://111.198.10.15:21609" + const val SERVER_BASE_URL = "http://111.198.10.15:11646" //海康摄像头参数 const val HK_NET_IP = "192.168.1.64" diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index ad234aa..0888ab3 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -47,10 +47,7 @@ import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.utils.BroadcastManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues -import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.* import hcnetsdk.sdkhub.MessageCodeHub import hcnetsdk.sdkhub.SDKGuider import kotlinx.android.synthetic.main.activity_inspection.* @@ -142,6 +139,7 @@ } override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) weakReferenceHandler = WeakReferenceHandler(this) /** * 配置云台设备 diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt index 76874bd..ce1e9a2 100644 --- a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt @@ -1,32 +1,99 @@ package com.casic.br.ktd.view import android.os.Bundle +import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.MapsInitializer import com.casic.br.ktd.R +import com.casic.br.ktd.utils.AuthenticationHelper +import com.casic.br.ktd.utils.LoadingDialogHub import com.casic.br.ktd.utils.LocaleConstant +import com.casic.br.ktd.utils.RSAUtils +import com.casic.br.ktd.vm.AuthenticateViewModel +import com.casic.br.ktd.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.activity_login.* import pub.devrel.easypermissions.EasyPermissions class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var userName: String + private lateinit var userPassword: String + override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) EasyPermissions.requestPermissions( this, resources.getString(R.string.app_name) + "需要获取必要权限", LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS ) + + userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + authenticateViewModel.keyModel.observe(this) { keyModel -> + if (keyModel.code == 200) { + val keyString = keyModel.data!!.publicKey!! + /** + * 修改密码需要用到key,先存着 + * */ + AuthenticationHelper.savePublicKey(keyString) + val publicKey = RSAUtils.keyStrToPublicKey(keyString) + + val dataByPublicKey = RSAUtils.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + userViewModel.enter(keyModel.data!!.sid!!, userName, dataByPublicKey) + } + } + + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.loginResult.observe(this) { + if (it.code == 200) { + AuthenticationHelper.saveToken(it.data!!.token!!) + navigatePageTo() + PageNavigationManager.finishCurrentActivity() + } + } } override fun initEvent() { - loginButton.setOnClickListener { navigatePageTo() } + loginButton.setOnClickListener { + val userPhone = userNameView.text.toString() + if (userPhone.isBlank()) { + "请输入用户名称".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) + + this.userName = userPhone + this.userPassword = userPassword + authenticateViewModel.obtainPublicKey() + } } override fun initLayoutView(): Int = R.layout.activity_login override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt index 06094f5..0540655 100644 --- a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt @@ -2,6 +2,7 @@ import android.content.Context import android.os.Bundle +import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -17,6 +18,8 @@ import com.casic.br.ktd.fragment.TaskPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -25,6 +28,7 @@ private val slideSelectedItems = ArrayList() private val fragmentPages = ArrayList() private val slideAdapter by lazy { SlideAdapter(this) } + private var clickTime: Long = 0 init { slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页")) @@ -44,6 +48,7 @@ } override fun initData(savedInstanceState: Bundle?) { + PageNavigationManager.addActivity(this) slideListView.adapter = slideAdapter //默认选中第一个 @@ -80,6 +85,19 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() } + override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出应用".show(this) + clickTime = System.currentTimeMillis() + return true + } else { + super.onKeyDown(keyCode, event) + } + } + return super.onKeyDown(keyCode, event) + } + /** * 侧边导航栏数据模型 * */ diff --git a/app/src/main/java/com/casic/br/ktd/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/ktd/vm/AuthenticateViewModel.kt new file mode 100644 index 0000000..e4bd2b4 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/vm/AuthenticateViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.br.ktd.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.extensions.separateResponseCode +import com.casic.br.ktd.extensions.toErrorMessage +import com.casic.br.ktd.model.PublicKeyModel +import com.casic.br.ktd.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +/** + * PublicKey VM + * */ +class AuthenticateViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val keyModel = MutableLiveData() + + fun obtainPublicKey() = launch({ + val response = RetrofitServiceManager.getPublicKey() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + keyModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + "网络连接失败,请检查网络".show(BaseApplication.get()) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/ktd/vm/UserViewModel.kt new file mode 100644 index 0000000..6683c20 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/vm/UserViewModel.kt @@ -0,0 +1,77 @@ +package com.casic.br.ktd.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.ktd.base.BaseApplication +import com.casic.br.ktd.extensions.separateResponseCode +import com.casic.br.ktd.extensions.toErrorMessage +import com.casic.br.ktd.model.ActionResultModel +import com.casic.br.ktd.model.LoginResultModel +import com.casic.br.ktd.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +/** + * 用户相关 VM + * */ +class UserViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + + val loginResult = MutableLiveData() + val outResult = MutableLiveData() + val changePwdResult = MutableLiveData() + + fun enter(sid: String, account: String, secretKey: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.login(sid, account, secretKey) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + loginResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + 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.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/widgets/AlertMessageDialog.kt b/app/src/main/java/com/casic/br/ktd/widgets/AlertMessageDialog.kt new file mode 100644 index 0000000..e83c793 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/widgets/AlertMessageDialog.kt @@ -0,0 +1,87 @@ +package com.casic.br.ktd.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.text.TextUtils +import android.widget.Button +import android.widget.TextView +import com.casic.br.ktd.R +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class AlertMessageDialog private constructor(builder: Builder) : Dialog( + builder.context, R.style.UserDefinedDialogStyle +) { + private val title = builder.title + private val message = builder.message + private val positiveBtn = builder.positiveBtn + private val listener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var title: String + lateinit var message: String + lateinit var positiveBtn: String + lateinit var listener: OnDialogButtonClickListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setTitle(title: String): Builder { + this.title = title + return this + } + + fun setMessage(message: String): Builder { + this.message = message + return this + } + + fun setPositiveButton(name: String): Builder { + this.positiveBtn = name + return this + } + + fun setOnDialogButtonClickListener(listener: OnDialogButtonClickListener): Builder { + this.listener = listener + return this + } + + fun build(): AlertMessageDialog { + return AlertMessageDialog(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(0.3f) + setContentView(R.layout.dialog_message) + setCanceledOnTouchOutside(false) + initView() + } + + private fun initView() { + val dialogTitleView: TextView = findViewById(R.id.dialogTitleView) + val dialogMessageView: TextView = findViewById(R.id.dialogMessageView) + val dialogConfirmButton = findViewById