diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/app/model/LoginResultModel.java b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java new file mode 100644 index 0000000..ef1ea32 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.app.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/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/app/model/LoginResultModel.java b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java new file mode 100644 index 0000000..ef1ea32 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.app.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/app/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java new file mode 100644 index 0000000..543bf8a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.app.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/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/app/model/LoginResultModel.java b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java new file mode 100644 index 0000000..ef1ea32 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.app.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/app/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java new file mode 100644 index 0000000..543bf8a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.app.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/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 5eeb511..0b768f5 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -2,6 +2,7 @@ import okhttp3.RequestBody import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.Multipart import retrofit2.http.POST @@ -11,6 +12,24 @@ 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("/meter/file/listPage") diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/app/model/LoginResultModel.java b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java new file mode 100644 index 0000000..ef1ea32 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.app.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/app/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java new file mode 100644 index 0000000..543bf8a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.app.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/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 5eeb511..0b768f5 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -2,6 +2,7 @@ import okhttp3.RequestBody import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.Multipart import retrofit2.http.POST @@ -11,6 +12,24 @@ 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("/meter/file/listPage") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 26b2c8a..e1a3ed9 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -27,6 +27,34 @@ } /** + * 验证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 getCheckHistoryByPage(keywords: String, offset: Int): String { diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/app/model/LoginResultModel.java b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java new file mode 100644 index 0000000..ef1ea32 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.app.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/app/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java new file mode 100644 index 0000000..543bf8a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.app.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/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 5eeb511..0b768f5 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -2,6 +2,7 @@ import okhttp3.RequestBody import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.Multipart import retrofit2.http.POST @@ -11,6 +12,24 @@ 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("/meter/file/listPage") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 26b2c8a..e1a3ed9 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -27,6 +27,34 @@ } /** + * 验证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 getCheckHistoryByPage(keywords: String, offset: Int): String { diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index 4b82f2d..b5b58d9 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -55,7 +55,7 @@ const val ACCOUNT = "account" const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://192.168.137.213:8080" + const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" const val AI_BASE_URL = "http://192.168.206.248:5000" } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/app/model/LoginResultModel.java b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java new file mode 100644 index 0000000..ef1ea32 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.app.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/app/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java new file mode 100644 index 0000000..543bf8a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.app.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/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 5eeb511..0b768f5 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -2,6 +2,7 @@ import okhttp3.RequestBody import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.Multipart import retrofit2.http.POST @@ -11,6 +12,24 @@ 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("/meter/file/listPage") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 26b2c8a..e1a3ed9 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -27,6 +27,34 @@ } /** + * 验证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 getCheckHistoryByPage(keywords: String, offset: Int): String { diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index 4b82f2d..b5b58d9 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -55,7 +55,7 @@ const val ACCOUNT = "account" const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://192.168.137.213:8080" + const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" const val AI_BASE_URL = "http://192.168.206.248:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt b/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt new file mode 100644 index 0000000..778c8e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt @@ -0,0 +1,59 @@ +package com.casic.br.app.utils + +import android.util.Base64 +import java.security.InvalidKeyException +import java.security.Key +import java.security.KeyFactory +import java.security.NoSuchAlgorithmException +import java.security.PublicKey +import java.security.spec.InvalidKeySpecException +import java.security.spec.X509EncodedKeySpec +import javax.crypto.BadPaddingException +import javax.crypto.Cipher +import javax.crypto.IllegalBlockSizeException +import javax.crypto.NoSuchPaddingException + +object RSAUtil { + //构建Cipher实例时所传入的的字符串,默认为"RSA/NONE/PKCS1Padding" + private fun processData(srcData: ByteArray, key: Key): ByteArray? { //用来保存处理结果 + var resultBytes: ByteArray? = null + try { //获取Cipher实例 + val cipher = Cipher.getInstance("RSA/None/PKCS1Padding") + //初始化Cipher,mode指定是加密还是解密,key为公钥或私钥 + cipher.init(Cipher.ENCRYPT_MODE, key) + //处理数据 + resultBytes = cipher.doFinal(srcData) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } catch (e: NoSuchPaddingException) { + e.printStackTrace() + } catch (e: InvalidKeyException) { + e.printStackTrace() + } catch (e: BadPaddingException) { + e.printStackTrace() + } catch (e: IllegalBlockSizeException) { + e.printStackTrace() + } + return resultBytes + } + + fun encryptDataByPublicKey(srcData: ByteArray, publicKey: PublicKey): String { + val resultBytes = processData(srcData, publicKey) + return Base64.encodeToString(resultBytes, Base64.DEFAULT) + } + + fun keyStrToPublicKey(publicKeyStr: String?): PublicKey? { + var publicKey: PublicKey? = null + val keyBytes = Base64.decode(publicKeyStr, Base64.DEFAULT) + val keySpec = X509EncodedKeySpec(keyBytes) + try { + val keyFactory = KeyFactory.getInstance("RSA") + publicKey = keyFactory.generatePublic(keySpec) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } catch (e: InvalidKeySpecException) { + e.printStackTrace() + } + return publicKey + } +} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/app/model/LoginResultModel.java b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java new file mode 100644 index 0000000..ef1ea32 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.app.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/app/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java new file mode 100644 index 0000000..543bf8a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.app.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/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 5eeb511..0b768f5 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -2,6 +2,7 @@ import okhttp3.RequestBody import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.Multipart import retrofit2.http.POST @@ -11,6 +12,24 @@ 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("/meter/file/listPage") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 26b2c8a..e1a3ed9 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -27,6 +27,34 @@ } /** + * 验证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 getCheckHistoryByPage(keywords: String, offset: Int): String { diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index 4b82f2d..b5b58d9 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -55,7 +55,7 @@ const val ACCOUNT = "account" const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://192.168.137.213:8080" + const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" const val AI_BASE_URL = "http://192.168.206.248:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt b/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt new file mode 100644 index 0000000..778c8e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt @@ -0,0 +1,59 @@ +package com.casic.br.app.utils + +import android.util.Base64 +import java.security.InvalidKeyException +import java.security.Key +import java.security.KeyFactory +import java.security.NoSuchAlgorithmException +import java.security.PublicKey +import java.security.spec.InvalidKeySpecException +import java.security.spec.X509EncodedKeySpec +import javax.crypto.BadPaddingException +import javax.crypto.Cipher +import javax.crypto.IllegalBlockSizeException +import javax.crypto.NoSuchPaddingException + +object RSAUtil { + //构建Cipher实例时所传入的的字符串,默认为"RSA/NONE/PKCS1Padding" + private fun processData(srcData: ByteArray, key: Key): ByteArray? { //用来保存处理结果 + var resultBytes: ByteArray? = null + try { //获取Cipher实例 + val cipher = Cipher.getInstance("RSA/None/PKCS1Padding") + //初始化Cipher,mode指定是加密还是解密,key为公钥或私钥 + cipher.init(Cipher.ENCRYPT_MODE, key) + //处理数据 + resultBytes = cipher.doFinal(srcData) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } catch (e: NoSuchPaddingException) { + e.printStackTrace() + } catch (e: InvalidKeyException) { + e.printStackTrace() + } catch (e: BadPaddingException) { + e.printStackTrace() + } catch (e: IllegalBlockSizeException) { + e.printStackTrace() + } + return resultBytes + } + + fun encryptDataByPublicKey(srcData: ByteArray, publicKey: PublicKey): String { + val resultBytes = processData(srcData, publicKey) + return Base64.encodeToString(resultBytes, Base64.DEFAULT) + } + + fun keyStrToPublicKey(publicKeyStr: String?): PublicKey? { + var publicKey: PublicKey? = null + val keyBytes = Base64.decode(publicKeyStr, Base64.DEFAULT) + val keySpec = X509EncodedKeySpec(keyBytes) + try { + val keyFactory = KeyFactory.getInstance("RSA") + publicKey = keyFactory.generatePublic(keySpec) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } catch (e: InvalidKeySpecException) { + e.printStackTrace() + } + return publicKey + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 9b5624b..1b01993 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -1,23 +1,35 @@ package com.casic.br.app.view import android.os.Bundle +import androidx.lifecycle.ViewModelProvider import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding +import com.casic.br.app.utils.AuthenticationHelper import com.casic.br.app.utils.LocaleConstant +import com.casic.br.app.utils.RSAUtil +import com.casic.br.app.vm.AuthenticateViewModel +import com.casic.br.app.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.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import pub.devrel.easypermissions.EasyPermissions class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + private val context = this private lateinit var userName: String private lateinit var userPassword: String + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var userViewModel: UserViewModel override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) if (!EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { EasyPermissions.requestPermissions( this, resources.getString(R.string.app_name) + "需要获取必要权限", @@ -27,6 +39,32 @@ binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) binding.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 = RSAUtil.keyStrToPublicKey(keyString) + + val dataByPublicKey = RSAUtil.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + userViewModel.login(context, 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() + ActivityStackManager.finishCurrentActivity() + } + } } override fun initViewBinding(): ActivityLoginBinding { @@ -34,7 +72,12 @@ } override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { @@ -55,8 +98,7 @@ this.userName = userPhone this.userPassword = userPassword - navigatePageTo() - finish() + authenticateViewModel.getPublicKey(this) } } diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/app/model/LoginResultModel.java b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java new file mode 100644 index 0000000..ef1ea32 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.app.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/app/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java new file mode 100644 index 0000000..543bf8a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.app.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/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 5eeb511..0b768f5 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -2,6 +2,7 @@ import okhttp3.RequestBody import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.Multipart import retrofit2.http.POST @@ -11,6 +12,24 @@ 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("/meter/file/listPage") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 26b2c8a..e1a3ed9 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -27,6 +27,34 @@ } /** + * 验证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 getCheckHistoryByPage(keywords: String, offset: Int): String { diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index 4b82f2d..b5b58d9 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -55,7 +55,7 @@ const val ACCOUNT = "account" const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://192.168.137.213:8080" + const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" const val AI_BASE_URL = "http://192.168.206.248:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt b/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt new file mode 100644 index 0000000..778c8e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt @@ -0,0 +1,59 @@ +package com.casic.br.app.utils + +import android.util.Base64 +import java.security.InvalidKeyException +import java.security.Key +import java.security.KeyFactory +import java.security.NoSuchAlgorithmException +import java.security.PublicKey +import java.security.spec.InvalidKeySpecException +import java.security.spec.X509EncodedKeySpec +import javax.crypto.BadPaddingException +import javax.crypto.Cipher +import javax.crypto.IllegalBlockSizeException +import javax.crypto.NoSuchPaddingException + +object RSAUtil { + //构建Cipher实例时所传入的的字符串,默认为"RSA/NONE/PKCS1Padding" + private fun processData(srcData: ByteArray, key: Key): ByteArray? { //用来保存处理结果 + var resultBytes: ByteArray? = null + try { //获取Cipher实例 + val cipher = Cipher.getInstance("RSA/None/PKCS1Padding") + //初始化Cipher,mode指定是加密还是解密,key为公钥或私钥 + cipher.init(Cipher.ENCRYPT_MODE, key) + //处理数据 + resultBytes = cipher.doFinal(srcData) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } catch (e: NoSuchPaddingException) { + e.printStackTrace() + } catch (e: InvalidKeyException) { + e.printStackTrace() + } catch (e: BadPaddingException) { + e.printStackTrace() + } catch (e: IllegalBlockSizeException) { + e.printStackTrace() + } + return resultBytes + } + + fun encryptDataByPublicKey(srcData: ByteArray, publicKey: PublicKey): String { + val resultBytes = processData(srcData, publicKey) + return Base64.encodeToString(resultBytes, Base64.DEFAULT) + } + + fun keyStrToPublicKey(publicKeyStr: String?): PublicKey? { + var publicKey: PublicKey? = null + val keyBytes = Base64.decode(publicKeyStr, Base64.DEFAULT) + val keySpec = X509EncodedKeySpec(keyBytes) + try { + val keyFactory = KeyFactory.getInstance("RSA") + publicKey = keyFactory.generatePublic(keySpec) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } catch (e: InvalidKeySpecException) { + e.printStackTrace() + } + return publicKey + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 9b5624b..1b01993 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -1,23 +1,35 @@ package com.casic.br.app.view import android.os.Bundle +import androidx.lifecycle.ViewModelProvider import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding +import com.casic.br.app.utils.AuthenticationHelper import com.casic.br.app.utils.LocaleConstant +import com.casic.br.app.utils.RSAUtil +import com.casic.br.app.vm.AuthenticateViewModel +import com.casic.br.app.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.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import pub.devrel.easypermissions.EasyPermissions class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + private val context = this private lateinit var userName: String private lateinit var userPassword: String + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var userViewModel: UserViewModel override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) if (!EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { EasyPermissions.requestPermissions( this, resources.getString(R.string.app_name) + "需要获取必要权限", @@ -27,6 +39,32 @@ binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) binding.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 = RSAUtil.keyStrToPublicKey(keyString) + + val dataByPublicKey = RSAUtil.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + userViewModel.login(context, 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() + ActivityStackManager.finishCurrentActivity() + } + } } override fun initViewBinding(): ActivityLoginBinding { @@ -34,7 +72,12 @@ } override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { @@ -55,8 +98,7 @@ this.userName = userPhone this.userPassword = userPassword - navigatePageTo() - finish() + authenticateViewModel.getPublicKey(this) } } diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 4b6dabf..0d7828f 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -139,7 +139,7 @@ camera.cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(cameraExecutor, faceImageAnalyzer) + imageAnalysis.setAnalyzer(cameraExecutor, imageAnalyzer) } } } catch (e: Exception) { @@ -148,7 +148,7 @@ } @androidx.camera.core.ExperimentalGetImage - private val faceImageAnalyzer = ImageAnalysis.Analyzer { imageProxy -> + private val imageAnalyzer = ImageAnalysis.Analyzer { imageProxy -> if (imageProxy.format == ImageFormat.YUV_420_888) { executor.execute { val image = imageProxy.image @@ -257,12 +257,12 @@ override fun onRightClick() { SelectSceneDialog.Builder() - .setContext(this@StartCheckActivity) + .setContext(context) .setPositiveButton("保存") .setOnDialogButtonClickListener(object : SelectSceneDialog.OnDialogButtonClickListener { override fun onConfirmClick(value: String) { - Log.d(kTag, "onConfirmClick => $value") + binding.titleView.setTitle(value) } }).build().show() } diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/app/model/LoginResultModel.java b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java new file mode 100644 index 0000000..ef1ea32 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.app.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/app/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java new file mode 100644 index 0000000..543bf8a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.app.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/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 5eeb511..0b768f5 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -2,6 +2,7 @@ import okhttp3.RequestBody import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.Multipart import retrofit2.http.POST @@ -11,6 +12,24 @@ 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("/meter/file/listPage") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 26b2c8a..e1a3ed9 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -27,6 +27,34 @@ } /** + * 验证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 getCheckHistoryByPage(keywords: String, offset: Int): String { diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index 4b82f2d..b5b58d9 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -55,7 +55,7 @@ const val ACCOUNT = "account" const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://192.168.137.213:8080" + const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" const val AI_BASE_URL = "http://192.168.206.248:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt b/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt new file mode 100644 index 0000000..778c8e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt @@ -0,0 +1,59 @@ +package com.casic.br.app.utils + +import android.util.Base64 +import java.security.InvalidKeyException +import java.security.Key +import java.security.KeyFactory +import java.security.NoSuchAlgorithmException +import java.security.PublicKey +import java.security.spec.InvalidKeySpecException +import java.security.spec.X509EncodedKeySpec +import javax.crypto.BadPaddingException +import javax.crypto.Cipher +import javax.crypto.IllegalBlockSizeException +import javax.crypto.NoSuchPaddingException + +object RSAUtil { + //构建Cipher实例时所传入的的字符串,默认为"RSA/NONE/PKCS1Padding" + private fun processData(srcData: ByteArray, key: Key): ByteArray? { //用来保存处理结果 + var resultBytes: ByteArray? = null + try { //获取Cipher实例 + val cipher = Cipher.getInstance("RSA/None/PKCS1Padding") + //初始化Cipher,mode指定是加密还是解密,key为公钥或私钥 + cipher.init(Cipher.ENCRYPT_MODE, key) + //处理数据 + resultBytes = cipher.doFinal(srcData) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } catch (e: NoSuchPaddingException) { + e.printStackTrace() + } catch (e: InvalidKeyException) { + e.printStackTrace() + } catch (e: BadPaddingException) { + e.printStackTrace() + } catch (e: IllegalBlockSizeException) { + e.printStackTrace() + } + return resultBytes + } + + fun encryptDataByPublicKey(srcData: ByteArray, publicKey: PublicKey): String { + val resultBytes = processData(srcData, publicKey) + return Base64.encodeToString(resultBytes, Base64.DEFAULT) + } + + fun keyStrToPublicKey(publicKeyStr: String?): PublicKey? { + var publicKey: PublicKey? = null + val keyBytes = Base64.decode(publicKeyStr, Base64.DEFAULT) + val keySpec = X509EncodedKeySpec(keyBytes) + try { + val keyFactory = KeyFactory.getInstance("RSA") + publicKey = keyFactory.generatePublic(keySpec) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } catch (e: InvalidKeySpecException) { + e.printStackTrace() + } + return publicKey + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 9b5624b..1b01993 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -1,23 +1,35 @@ package com.casic.br.app.view import android.os.Bundle +import androidx.lifecycle.ViewModelProvider import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding +import com.casic.br.app.utils.AuthenticationHelper import com.casic.br.app.utils.LocaleConstant +import com.casic.br.app.utils.RSAUtil +import com.casic.br.app.vm.AuthenticateViewModel +import com.casic.br.app.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.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import pub.devrel.easypermissions.EasyPermissions class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + private val context = this private lateinit var userName: String private lateinit var userPassword: String + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var userViewModel: UserViewModel override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) if (!EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { EasyPermissions.requestPermissions( this, resources.getString(R.string.app_name) + "需要获取必要权限", @@ -27,6 +39,32 @@ binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) binding.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 = RSAUtil.keyStrToPublicKey(keyString) + + val dataByPublicKey = RSAUtil.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + userViewModel.login(context, 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() + ActivityStackManager.finishCurrentActivity() + } + } } override fun initViewBinding(): ActivityLoginBinding { @@ -34,7 +72,12 @@ } override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { @@ -55,8 +98,7 @@ this.userName = userPhone this.userPassword = userPassword - navigatePageTo() - finish() + authenticateViewModel.getPublicKey(this) } } diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 4b6dabf..0d7828f 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -139,7 +139,7 @@ camera.cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(cameraExecutor, faceImageAnalyzer) + imageAnalysis.setAnalyzer(cameraExecutor, imageAnalyzer) } } } catch (e: Exception) { @@ -148,7 +148,7 @@ } @androidx.camera.core.ExperimentalGetImage - private val faceImageAnalyzer = ImageAnalysis.Analyzer { imageProxy -> + private val imageAnalyzer = ImageAnalysis.Analyzer { imageProxy -> if (imageProxy.format == ImageFormat.YUV_420_888) { executor.execute { val image = imageProxy.image @@ -257,12 +257,12 @@ override fun onRightClick() { SelectSceneDialog.Builder() - .setContext(this@StartCheckActivity) + .setContext(context) .setPositiveButton("保存") .setOnDialogButtonClickListener(object : SelectSceneDialog.OnDialogButtonClickListener { override fun onConfirmClick(value: String) { - Log.d(kTag, "onConfirmClick => $value") + binding.titleView.setTitle(value) } }).build().show() } diff --git a/app/src/main/java/com/casic/br/app/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/app/vm/AuthenticateViewModel.kt new file mode 100644 index 0000000..8a00139 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/vm/AuthenticateViewModel.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.vm + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.casic.br.app.extensions.getResponseCode +import com.casic.br.app.extensions.getResponseMessage +import com.casic.br.app.model.PublicKeyModel +import com.casic.br.app.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.isNetworkConnected +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show + +/** + * PublicKey VM + * */ +class AuthenticateViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val keyModel = MutableLiveData() + + fun getPublicKey(context: Context) = launch({ + val response = RetrofitServiceManager.getPublicKey() + val responseCode = response.getResponseCode() + if (responseCode == 200) { + keyModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.getResponseMessage().show(context) + } + }, { + if (!context.isNetworkConnected()) { + "网络连接失败,请检查网络".show(context) + } else { + "无法连接到服务器,请联系管理员".show(context) + } + }) +} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 167cf0c..93ec3d6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,21 +1,21 @@ - - - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/ActionResultModel.java b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java new file mode 100644 index 0000000..6875328 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/ActionResultModel.java @@ -0,0 +1,32 @@ +package com.casic.br.app.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/app/model/LoginResultModel.java b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java new file mode 100644 index 0000000..ef1ea32 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/LoginResultModel.java @@ -0,0 +1,62 @@ +package com.casic.br.app.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/app/model/PublicKeyModel.java b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java new file mode 100644 index 0000000..543bf8a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/PublicKeyModel.java @@ -0,0 +1,80 @@ +package com.casic.br.app.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/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 5eeb511..0b768f5 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -2,6 +2,7 @@ import okhttp3.RequestBody import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.Multipart import retrofit2.http.POST @@ -11,6 +12,24 @@ 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("/meter/file/listPage") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 26b2c8a..e1a3ed9 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -27,6 +27,34 @@ } /** + * 验证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 getCheckHistoryByPage(keywords: String, offset: Int): String { diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index 4b82f2d..b5b58d9 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -55,7 +55,7 @@ const val ACCOUNT = "account" const val PASSWORD = "password" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" - const val SERVER_BASE_URL = "http://192.168.137.213:8080" + const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" const val AI_BASE_URL = "http://192.168.206.248:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt b/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt new file mode 100644 index 0000000..778c8e5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/RSAUtil.kt @@ -0,0 +1,59 @@ +package com.casic.br.app.utils + +import android.util.Base64 +import java.security.InvalidKeyException +import java.security.Key +import java.security.KeyFactory +import java.security.NoSuchAlgorithmException +import java.security.PublicKey +import java.security.spec.InvalidKeySpecException +import java.security.spec.X509EncodedKeySpec +import javax.crypto.BadPaddingException +import javax.crypto.Cipher +import javax.crypto.IllegalBlockSizeException +import javax.crypto.NoSuchPaddingException + +object RSAUtil { + //构建Cipher实例时所传入的的字符串,默认为"RSA/NONE/PKCS1Padding" + private fun processData(srcData: ByteArray, key: Key): ByteArray? { //用来保存处理结果 + var resultBytes: ByteArray? = null + try { //获取Cipher实例 + val cipher = Cipher.getInstance("RSA/None/PKCS1Padding") + //初始化Cipher,mode指定是加密还是解密,key为公钥或私钥 + cipher.init(Cipher.ENCRYPT_MODE, key) + //处理数据 + resultBytes = cipher.doFinal(srcData) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } catch (e: NoSuchPaddingException) { + e.printStackTrace() + } catch (e: InvalidKeyException) { + e.printStackTrace() + } catch (e: BadPaddingException) { + e.printStackTrace() + } catch (e: IllegalBlockSizeException) { + e.printStackTrace() + } + return resultBytes + } + + fun encryptDataByPublicKey(srcData: ByteArray, publicKey: PublicKey): String { + val resultBytes = processData(srcData, publicKey) + return Base64.encodeToString(resultBytes, Base64.DEFAULT) + } + + fun keyStrToPublicKey(publicKeyStr: String?): PublicKey? { + var publicKey: PublicKey? = null + val keyBytes = Base64.decode(publicKeyStr, Base64.DEFAULT) + val keySpec = X509EncodedKeySpec(keyBytes) + try { + val keyFactory = KeyFactory.getInstance("RSA") + publicKey = keyFactory.generatePublic(keySpec) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } catch (e: InvalidKeySpecException) { + e.printStackTrace() + } + return publicKey + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 9b5624b..1b01993 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -1,23 +1,35 @@ package com.casic.br.app.view import android.os.Bundle +import androidx.lifecycle.ViewModelProvider import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding +import com.casic.br.app.utils.AuthenticationHelper import com.casic.br.app.utils.LocaleConstant +import com.casic.br.app.utils.RSAUtil +import com.casic.br.app.vm.AuthenticateViewModel +import com.casic.br.app.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.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import pub.devrel.easypermissions.EasyPermissions class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + private val context = this private lateinit var userName: String private lateinit var userPassword: String + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var userViewModel: UserViewModel override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) if (!EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { EasyPermissions.requestPermissions( this, resources.getString(R.string.app_name) + "需要获取必要权限", @@ -27,6 +39,32 @@ binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) binding.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 = RSAUtil.keyStrToPublicKey(keyString) + + val dataByPublicKey = RSAUtil.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + userViewModel.login(context, 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() + ActivityStackManager.finishCurrentActivity() + } + } } override fun initViewBinding(): ActivityLoginBinding { @@ -34,7 +72,12 @@ } override fun observeRequestState() { - + userViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { @@ -55,8 +98,7 @@ this.userName = userPhone this.userPassword = userPassword - navigatePageTo() - finish() + authenticateViewModel.getPublicKey(this) } } diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 4b6dabf..0d7828f 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -139,7 +139,7 @@ camera.cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(cameraExecutor, faceImageAnalyzer) + imageAnalysis.setAnalyzer(cameraExecutor, imageAnalyzer) } } } catch (e: Exception) { @@ -148,7 +148,7 @@ } @androidx.camera.core.ExperimentalGetImage - private val faceImageAnalyzer = ImageAnalysis.Analyzer { imageProxy -> + private val imageAnalyzer = ImageAnalysis.Analyzer { imageProxy -> if (imageProxy.format == ImageFormat.YUV_420_888) { executor.execute { val image = imageProxy.image @@ -257,12 +257,12 @@ override fun onRightClick() { SelectSceneDialog.Builder() - .setContext(this@StartCheckActivity) + .setContext(context) .setPositiveButton("保存") .setOnDialogButtonClickListener(object : SelectSceneDialog.OnDialogButtonClickListener { override fun onConfirmClick(value: String) { - Log.d(kTag, "onConfirmClick => $value") + binding.titleView.setTitle(value) } }).build().show() } diff --git a/app/src/main/java/com/casic/br/app/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/app/vm/AuthenticateViewModel.kt new file mode 100644 index 0000000..8a00139 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/vm/AuthenticateViewModel.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.vm + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.casic.br.app.extensions.getResponseCode +import com.casic.br.app.extensions.getResponseMessage +import com.casic.br.app.model.PublicKeyModel +import com.casic.br.app.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.isNetworkConnected +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show + +/** + * PublicKey VM + * */ +class AuthenticateViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val keyModel = MutableLiveData() + + fun getPublicKey(context: Context) = launch({ + val response = RetrofitServiceManager.getPublicKey() + val responseCode = response.getResponseCode() + if (responseCode == 200) { + keyModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.getResponseMessage().show(context) + } + }, { + if (!context.isNetworkConnected()) { + "网络连接失败,请检查网络".show(context) + } else { + "无法连接到服务器,请联系管理员".show(context) + } + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/app/vm/UserViewModel.kt new file mode 100644 index 0000000..68c6764 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/vm/UserViewModel.kt @@ -0,0 +1,54 @@ +package com.casic.br.app.vm + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.casic.br.app.extensions.getResponseCode +import com.casic.br.app.extensions.getResponseMessage +import com.casic.br.app.model.ActionResultModel +import com.casic.br.app.model.LoginResultModel +import com.casic.br.app.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadState + +class UserViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val loginResult = MutableLiveData() + val outResult = MutableLiveData() + + fun login(context: Context, sid: String, account: String, secretKey: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.login(sid, account, secretKey) + val responseCode = response.getResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + loginResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun loginOut(context: Context) = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.getResponseCode() + if (responseCode == 200) { + outResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.getResponseMessage().show(context) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file