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