diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt index 9c83224..a3069e2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt @@ -4,19 +4,19 @@ * 加载状态 * sealed 关键字表示此类仅内部继承 */ -sealed class LoadState(val msg: String) { +sealed class LoadState { /** * 加载中 */ - class Loading(msg: String = "") : LoadState(msg) + object Loading : LoadState() /** * 成功 */ - class Success(msg: String = "") : LoadState(msg) + object Success : LoadState() /** * 失败 */ - class Fail(msg: String = "") : LoadState(msg) + object Fail : LoadState() } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt index 9c83224..a3069e2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt @@ -4,19 +4,19 @@ * 加载状态 * sealed 关键字表示此类仅内部继承 */ -sealed class LoadState(val msg: String) { +sealed class LoadState { /** * 加载中 */ - class Loading(msg: String = "") : LoadState(msg) + object Loading : LoadState() /** * 成功 */ - class Success(msg: String = "") : LoadState(msg) + object Success : LoadState() /** * 失败 */ - class Fail(msg: String = "") : LoadState(msg) + object Fail : LoadState() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt new file mode 100644 index 0000000..95ecbbd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt @@ -0,0 +1,46 @@ +package com.casic.birmm.inspect.utils + +import android.text.TextUtils +import java.util.regex.Pattern + +object StringHelper { + + fun isLetterAndDigit(str: String): Boolean { + var isDigit = false + var isLetter = false + for (i in str.indices) { + if (Character.isDigit(str[i])) { + isDigit = true + } else if (Character.isLetter(str[i])) { + isLetter = true + } + } + return isDigit && isLetter + } + + fun isPhoneNumber(number: String): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (number.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(number).matches() + } + } + + /** + * 过滤空格,回车 + */ + fun filterString(str: String): String { + if (TextUtils.isEmpty(str)) { + return str + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(str) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt index 9c83224..a3069e2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt @@ -4,19 +4,19 @@ * 加载状态 * sealed 关键字表示此类仅内部继承 */ -sealed class LoadState(val msg: String) { +sealed class LoadState { /** * 加载中 */ - class Loading(msg: String = "") : LoadState(msg) + object Loading : LoadState() /** * 成功 */ - class Success(msg: String = "") : LoadState(msg) + object Success : LoadState() /** * 失败 */ - class Fail(msg: String = "") : LoadState(msg) + object Fail : LoadState() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt new file mode 100644 index 0000000..95ecbbd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt @@ -0,0 +1,46 @@ +package com.casic.birmm.inspect.utils + +import android.text.TextUtils +import java.util.regex.Pattern + +object StringHelper { + + fun isLetterAndDigit(str: String): Boolean { + var isDigit = false + var isLetter = false + for (i in str.indices) { + if (Character.isDigit(str[i])) { + isDigit = true + } else if (Character.isLetter(str[i])) { + isLetter = true + } + } + return isDigit && isLetter + } + + fun isPhoneNumber(number: String): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (number.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(number).matches() + } + } + + /** + * 过滤空格,回车 + */ + fun filterString(str: String): String { + if (TextUtils.isEmpty(str)) { + return str + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(str) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 63a1b8d..ea45d68 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,7 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean -import retrofit2.http.GET +import com.casic.birmm.inspect.model.UserInfoBean +import retrofit2.http.* /** * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符? @@ -12,5 +14,18 @@ * PublicKey校验 */ @GET("/config/baseConfig") - suspend fun obtainPublicKeyAsync(): PublicKeyBean + suspend fun obtainPublicKey(): PublicKeyBean + + /** + * 登录并获取Token + */ + @FormUrlEncoded + @POST("/user/appLogin") + suspend fun obtainLoginResult(@Field("username") account: String, @Field("password") secretKey: String): LoginResultBean + + /** + * 获取用户信息 + */ + @GET("/user/info") + suspend fun obtainUserInfo(@Header("token") token: String): UserInfoBean } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt index 9c83224..a3069e2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt @@ -4,19 +4,19 @@ * 加载状态 * sealed 关键字表示此类仅内部继承 */ -sealed class LoadState(val msg: String) { +sealed class LoadState { /** * 加载中 */ - class Loading(msg: String = "") : LoadState(msg) + object Loading : LoadState() /** * 成功 */ - class Success(msg: String = "") : LoadState(msg) + object Success : LoadState() /** * 失败 */ - class Fail(msg: String = "") : LoadState(msg) + object Fail : LoadState() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt new file mode 100644 index 0000000..95ecbbd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt @@ -0,0 +1,46 @@ +package com.casic.birmm.inspect.utils + +import android.text.TextUtils +import java.util.regex.Pattern + +object StringHelper { + + fun isLetterAndDigit(str: String): Boolean { + var isDigit = false + var isLetter = false + for (i in str.indices) { + if (Character.isDigit(str[i])) { + isDigit = true + } else if (Character.isLetter(str[i])) { + isLetter = true + } + } + return isDigit && isLetter + } + + fun isPhoneNumber(number: String): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (number.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(number).matches() + } + } + + /** + * 过滤空格,回车 + */ + fun filterString(str: String): String { + if (TextUtils.isEmpty(str)) { + return str + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(str) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 63a1b8d..ea45d68 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,7 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean -import retrofit2.http.GET +import com.casic.birmm.inspect.model.UserInfoBean +import retrofit2.http.* /** * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符? @@ -12,5 +14,18 @@ * PublicKey校验 */ @GET("/config/baseConfig") - suspend fun obtainPublicKeyAsync(): PublicKeyBean + suspend fun obtainPublicKey(): PublicKeyBean + + /** + * 登录并获取Token + */ + @FormUrlEncoded + @POST("/user/appLogin") + suspend fun obtainLoginResult(@Field("username") account: String, @Field("password") secretKey: String): LoginResultBean + + /** + * 获取用户信息 + */ + @GET("/user/info") + suspend fun obtainUserInfo(@Header("token") token: String): UserInfoBean } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index fe9869b..ec0a4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,6 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean +import com.casic.birmm.inspect.model.UserInfoBean +import com.casic.birmm.inspect.utils.AuthenticationHelper object RetrofitServiceManager { @@ -11,6 +14,20 @@ * 验证PublicKey */ suspend fun authenticate(): PublicKeyBean { - return api.obtainPublicKeyAsync() + return api.obtainPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(account: String, secretKey: String): LoginResultBean { + return api.obtainLoginResult(account, secretKey) + } + + /** + * 获取用户信息 + */ + suspend fun getUserInfo(): UserInfoBean { + return api.obtainUserInfo(AuthenticationHelper.token!!) } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt index 9c83224..a3069e2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt @@ -4,19 +4,19 @@ * 加载状态 * sealed 关键字表示此类仅内部继承 */ -sealed class LoadState(val msg: String) { +sealed class LoadState { /** * 加载中 */ - class Loading(msg: String = "") : LoadState(msg) + object Loading : LoadState() /** * 成功 */ - class Success(msg: String = "") : LoadState(msg) + object Success : LoadState() /** * 失败 */ - class Fail(msg: String = "") : LoadState(msg) + object Fail : LoadState() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt new file mode 100644 index 0000000..95ecbbd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt @@ -0,0 +1,46 @@ +package com.casic.birmm.inspect.utils + +import android.text.TextUtils +import java.util.regex.Pattern + +object StringHelper { + + fun isLetterAndDigit(str: String): Boolean { + var isDigit = false + var isLetter = false + for (i in str.indices) { + if (Character.isDigit(str[i])) { + isDigit = true + } else if (Character.isLetter(str[i])) { + isLetter = true + } + } + return isDigit && isLetter + } + + fun isPhoneNumber(number: String): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (number.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(number).matches() + } + } + + /** + * 过滤空格,回车 + */ + fun filterString(str: String): String { + if (TextUtils.isEmpty(str)) { + return str + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(str) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 63a1b8d..ea45d68 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,7 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean -import retrofit2.http.GET +import com.casic.birmm.inspect.model.UserInfoBean +import retrofit2.http.* /** * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符? @@ -12,5 +14,18 @@ * PublicKey校验 */ @GET("/config/baseConfig") - suspend fun obtainPublicKeyAsync(): PublicKeyBean + suspend fun obtainPublicKey(): PublicKeyBean + + /** + * 登录并获取Token + */ + @FormUrlEncoded + @POST("/user/appLogin") + suspend fun obtainLoginResult(@Field("username") account: String, @Field("password") secretKey: String): LoginResultBean + + /** + * 获取用户信息 + */ + @GET("/user/info") + suspend fun obtainUserInfo(@Header("token") token: String): UserInfoBean } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index fe9869b..ec0a4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,6 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean +import com.casic.birmm.inspect.model.UserInfoBean +import com.casic.birmm.inspect.utils.AuthenticationHelper object RetrofitServiceManager { @@ -11,6 +14,20 @@ * 验证PublicKey */ suspend fun authenticate(): PublicKeyBean { - return api.obtainPublicKeyAsync() + return api.obtainPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(account: String, secretKey: String): LoginResultBean { + return api.obtainLoginResult(account, secretKey) + } + + /** + * 获取用户信息 + */ + suspend fun getUserInfo(): UserInfoBean { + return api.obtainUserInfo(AuthenticationHelper.token!!) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 1587c84..d0d42e8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -3,9 +3,16 @@ import android.annotation.SuppressLint import android.content.Intent import android.os.CountDownTimer +import android.text.TextUtils import android.view.ViewGroup.MarginLayoutParams +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.vm.UserViewModel import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* @@ -51,7 +58,18 @@ } fun startLoginActivity() { - startActivity(Intent(this, LoginActivity::class.java)) - finish() + // 判断是否已登录,已登录跳转到主页,否则去登录页 + if (TextUtils.isEmpty(AuthenticationHelper.token)) { + startActivity(Intent(this, LoginActivity::class.java)) + finish() + } else { + val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + userViewModel.getUserInfo() + userViewModel.resultBean.observe(this, Observer { + SaveKeyValues.putValue(Constant.USER_OBJECT, it)//保存用户对象 + startActivity(Intent(this, MainActivity::class.java)) + finish() + }) + } } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt index 9c83224..a3069e2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt @@ -4,19 +4,19 @@ * 加载状态 * sealed 关键字表示此类仅内部继承 */ -sealed class LoadState(val msg: String) { +sealed class LoadState { /** * 加载中 */ - class Loading(msg: String = "") : LoadState(msg) + object Loading : LoadState() /** * 成功 */ - class Success(msg: String = "") : LoadState(msg) + object Success : LoadState() /** * 失败 */ - class Fail(msg: String = "") : LoadState(msg) + object Fail : LoadState() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt new file mode 100644 index 0000000..95ecbbd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt @@ -0,0 +1,46 @@ +package com.casic.birmm.inspect.utils + +import android.text.TextUtils +import java.util.regex.Pattern + +object StringHelper { + + fun isLetterAndDigit(str: String): Boolean { + var isDigit = false + var isLetter = false + for (i in str.indices) { + if (Character.isDigit(str[i])) { + isDigit = true + } else if (Character.isLetter(str[i])) { + isLetter = true + } + } + return isDigit && isLetter + } + + fun isPhoneNumber(number: String): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (number.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(number).matches() + } + } + + /** + * 过滤空格,回车 + */ + fun filterString(str: String): String { + if (TextUtils.isEmpty(str)) { + return str + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(str) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 63a1b8d..ea45d68 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,7 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean -import retrofit2.http.GET +import com.casic.birmm.inspect.model.UserInfoBean +import retrofit2.http.* /** * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符? @@ -12,5 +14,18 @@ * PublicKey校验 */ @GET("/config/baseConfig") - suspend fun obtainPublicKeyAsync(): PublicKeyBean + suspend fun obtainPublicKey(): PublicKeyBean + + /** + * 登录并获取Token + */ + @FormUrlEncoded + @POST("/user/appLogin") + suspend fun obtainLoginResult(@Field("username") account: String, @Field("password") secretKey: String): LoginResultBean + + /** + * 获取用户信息 + */ + @GET("/user/info") + suspend fun obtainUserInfo(@Header("token") token: String): UserInfoBean } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index fe9869b..ec0a4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,6 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean +import com.casic.birmm.inspect.model.UserInfoBean +import com.casic.birmm.inspect.utils.AuthenticationHelper object RetrofitServiceManager { @@ -11,6 +14,20 @@ * 验证PublicKey */ suspend fun authenticate(): PublicKeyBean { - return api.obtainPublicKeyAsync() + return api.obtainPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(account: String, secretKey: String): LoginResultBean { + return api.obtainLoginResult(account, secretKey) + } + + /** + * 获取用户信息 + */ + suspend fun getUserInfo(): UserInfoBean { + return api.obtainUserInfo(AuthenticationHelper.token!!) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 1587c84..d0d42e8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -3,9 +3,16 @@ import android.annotation.SuppressLint import android.content.Intent import android.os.CountDownTimer +import android.text.TextUtils import android.view.ViewGroup.MarginLayoutParams +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.vm.UserViewModel import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* @@ -51,7 +58,18 @@ } fun startLoginActivity() { - startActivity(Intent(this, LoginActivity::class.java)) - finish() + // 判断是否已登录,已登录跳转到主页,否则去登录页 + if (TextUtils.isEmpty(AuthenticationHelper.token)) { + startActivity(Intent(this, LoginActivity::class.java)) + finish() + } else { + val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + userViewModel.getUserInfo() + userViewModel.resultBean.observe(this, Observer { + SaveKeyValues.putValue(Constant.USER_OBJECT, it)//保存用户对象 + startActivity(Intent(this, MainActivity::class.java)) + finish() + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 2dc5b76..82c765c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -1,5 +1,6 @@ package com.casic.birmm.inspect.view +import android.content.Intent import android.text.Editable import android.text.TextUtils import android.text.TextWatcher @@ -13,17 +14,14 @@ import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel +import com.casic.birmm.inspect.vm.LoginInViewModel import com.casic.birmm.inspect.widgets.InputDialog import kotlinx.android.synthetic.main.activity_login.* class LoginActivity : BaseActivity() { - companion object { - private const val Tag = "LoginActivity" - } - - private lateinit var viewModel: AuthenticateViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel override fun initLayoutView(): Int = R.layout.activity_login @@ -32,42 +30,52 @@ } override fun initData() { - // 实例化ViewModel - viewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - // 监听数据变化,从而显示数据在页面 - viewModel.keyBean.observe(this, Observer { - if (it.isSuccess) { - val publicKey = RSAUtils.keyStrToPublicKey(it.data!!.publicKey) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + authenticateViewModel.keyBean.observe(this, Observer { + if (it.code == 200) {//用code判断,别的判断可能有坑 + val keyString = it.data!!.publicKey!! + /** + * 修改密码需要用到key,先存着,以备不时之需 + * */ + AuthenticationHelper.savePublicKey(keyString) + val publicKey = RSAUtils.keyStrToPublicKey(keyString) val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() - if (TextUtils.isEmpty(account)) { - OtherUtils.showTipsDialog(this, "用户名不能为空", userNameView) - return@Observer - } - if (TextUtils.isEmpty(userPassword)) { - OtherUtils.showTipsDialog(this, "密码不能为空", userPasswordView) - return@Observer - } val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 -// loginPresenter.onReadyRetrofitRequest(account, dataByPublicKey) + val loginInViewModel = ViewModelProvider(this).get(LoginInViewModel::class.java) + loginInViewModel.login(account, dataByPublicKey) + loginInViewModel.resultBean.observe(this, Observer { loginResultBean -> + if (loginResultBean.code == 200) { + AuthenticationHelper.saveToken(loginResultBean.data!!.token!!) + //验证成功登录 + startActivity(Intent(this, MainActivity::class.java)) + finish() + } + }) + loginInViewModel.loadState.observe(this, Observer { loginState -> + changeLoadStatus(loginState) + }) } else { OtherUtils.showTipsDialog(this, it.message!!, loginButton) } }) - // 监听加载状态变化 从而改变页面 - viewModel.loadState.observe(this, Observer { - when (it) { - is LoadState.Loading -> { - OtherUtils.showLoadingDialog(this, "登录中,请稍后") - } - else -> OtherUtils.dismissLoadingDialog() - } + authenticateViewModel.loadState.observe(this, Observer { + changeLoadStatus(it) }) } + private fun changeLoadStatus(status: LoadState) { + when (status) { + is LoadState.Loading -> { + OtherUtils.showLoadingDialog(this, "登录中,请稍后") + } + else -> OtherUtils.dismissLoadingDialog() + } + } + override fun initEvent() { val editText: EditText? = inputLayout.editText editText?.addTextChangedListener(object : TextWatcher { @@ -90,7 +98,7 @@ //点击输入法键盘"完成" editText?.setOnEditorActionListener { _: TextView?, actionId: Int, _: KeyEvent? -> if (actionId == EditorInfo.IME_ACTION_DONE) { - viewModel.obtainPublicKey() + authenticateViewModel.obtainPublicKey() return@setOnEditorActionListener true } false @@ -98,7 +106,17 @@ loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { - viewModel.obtainPublicKey() + val account = userNameView.text.toString() + val userPassword = userPasswordView.text.toString() + if (TextUtils.isEmpty(account)) { + OtherUtils.showTipsDialog(this, "用户名不能为空", userNameView) + return@setOnClickListener + } + if (TextUtils.isEmpty(userPassword)) { + OtherUtils.showTipsDialog(this, "密码不能为空", userPasswordView) + return@setOnClickListener + } + authenticateViewModel.obtainPublicKey() } //修改服务器配置 diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt index 9c83224..a3069e2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt @@ -4,19 +4,19 @@ * 加载状态 * sealed 关键字表示此类仅内部继承 */ -sealed class LoadState(val msg: String) { +sealed class LoadState { /** * 加载中 */ - class Loading(msg: String = "") : LoadState(msg) + object Loading : LoadState() /** * 成功 */ - class Success(msg: String = "") : LoadState(msg) + object Success : LoadState() /** * 失败 */ - class Fail(msg: String = "") : LoadState(msg) + object Fail : LoadState() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt new file mode 100644 index 0000000..95ecbbd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt @@ -0,0 +1,46 @@ +package com.casic.birmm.inspect.utils + +import android.text.TextUtils +import java.util.regex.Pattern + +object StringHelper { + + fun isLetterAndDigit(str: String): Boolean { + var isDigit = false + var isLetter = false + for (i in str.indices) { + if (Character.isDigit(str[i])) { + isDigit = true + } else if (Character.isLetter(str[i])) { + isLetter = true + } + } + return isDigit && isLetter + } + + fun isPhoneNumber(number: String): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (number.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(number).matches() + } + } + + /** + * 过滤空格,回车 + */ + fun filterString(str: String): String { + if (TextUtils.isEmpty(str)) { + return str + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(str) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 63a1b8d..ea45d68 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,7 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean -import retrofit2.http.GET +import com.casic.birmm.inspect.model.UserInfoBean +import retrofit2.http.* /** * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符? @@ -12,5 +14,18 @@ * PublicKey校验 */ @GET("/config/baseConfig") - suspend fun obtainPublicKeyAsync(): PublicKeyBean + suspend fun obtainPublicKey(): PublicKeyBean + + /** + * 登录并获取Token + */ + @FormUrlEncoded + @POST("/user/appLogin") + suspend fun obtainLoginResult(@Field("username") account: String, @Field("password") secretKey: String): LoginResultBean + + /** + * 获取用户信息 + */ + @GET("/user/info") + suspend fun obtainUserInfo(@Header("token") token: String): UserInfoBean } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index fe9869b..ec0a4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,6 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean +import com.casic.birmm.inspect.model.UserInfoBean +import com.casic.birmm.inspect.utils.AuthenticationHelper object RetrofitServiceManager { @@ -11,6 +14,20 @@ * 验证PublicKey */ suspend fun authenticate(): PublicKeyBean { - return api.obtainPublicKeyAsync() + return api.obtainPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(account: String, secretKey: String): LoginResultBean { + return api.obtainLoginResult(account, secretKey) + } + + /** + * 获取用户信息 + */ + suspend fun getUserInfo(): UserInfoBean { + return api.obtainUserInfo(AuthenticationHelper.token!!) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 1587c84..d0d42e8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -3,9 +3,16 @@ import android.annotation.SuppressLint import android.content.Intent import android.os.CountDownTimer +import android.text.TextUtils import android.view.ViewGroup.MarginLayoutParams +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.vm.UserViewModel import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* @@ -51,7 +58,18 @@ } fun startLoginActivity() { - startActivity(Intent(this, LoginActivity::class.java)) - finish() + // 判断是否已登录,已登录跳转到主页,否则去登录页 + if (TextUtils.isEmpty(AuthenticationHelper.token)) { + startActivity(Intent(this, LoginActivity::class.java)) + finish() + } else { + val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + userViewModel.getUserInfo() + userViewModel.resultBean.observe(this, Observer { + SaveKeyValues.putValue(Constant.USER_OBJECT, it)//保存用户对象 + startActivity(Intent(this, MainActivity::class.java)) + finish() + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 2dc5b76..82c765c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -1,5 +1,6 @@ package com.casic.birmm.inspect.view +import android.content.Intent import android.text.Editable import android.text.TextUtils import android.text.TextWatcher @@ -13,17 +14,14 @@ import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel +import com.casic.birmm.inspect.vm.LoginInViewModel import com.casic.birmm.inspect.widgets.InputDialog import kotlinx.android.synthetic.main.activity_login.* class LoginActivity : BaseActivity() { - companion object { - private const val Tag = "LoginActivity" - } - - private lateinit var viewModel: AuthenticateViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel override fun initLayoutView(): Int = R.layout.activity_login @@ -32,42 +30,52 @@ } override fun initData() { - // 实例化ViewModel - viewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - // 监听数据变化,从而显示数据在页面 - viewModel.keyBean.observe(this, Observer { - if (it.isSuccess) { - val publicKey = RSAUtils.keyStrToPublicKey(it.data!!.publicKey) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + authenticateViewModel.keyBean.observe(this, Observer { + if (it.code == 200) {//用code判断,别的判断可能有坑 + val keyString = it.data!!.publicKey!! + /** + * 修改密码需要用到key,先存着,以备不时之需 + * */ + AuthenticationHelper.savePublicKey(keyString) + val publicKey = RSAUtils.keyStrToPublicKey(keyString) val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() - if (TextUtils.isEmpty(account)) { - OtherUtils.showTipsDialog(this, "用户名不能为空", userNameView) - return@Observer - } - if (TextUtils.isEmpty(userPassword)) { - OtherUtils.showTipsDialog(this, "密码不能为空", userPasswordView) - return@Observer - } val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 -// loginPresenter.onReadyRetrofitRequest(account, dataByPublicKey) + val loginInViewModel = ViewModelProvider(this).get(LoginInViewModel::class.java) + loginInViewModel.login(account, dataByPublicKey) + loginInViewModel.resultBean.observe(this, Observer { loginResultBean -> + if (loginResultBean.code == 200) { + AuthenticationHelper.saveToken(loginResultBean.data!!.token!!) + //验证成功登录 + startActivity(Intent(this, MainActivity::class.java)) + finish() + } + }) + loginInViewModel.loadState.observe(this, Observer { loginState -> + changeLoadStatus(loginState) + }) } else { OtherUtils.showTipsDialog(this, it.message!!, loginButton) } }) - // 监听加载状态变化 从而改变页面 - viewModel.loadState.observe(this, Observer { - when (it) { - is LoadState.Loading -> { - OtherUtils.showLoadingDialog(this, "登录中,请稍后") - } - else -> OtherUtils.dismissLoadingDialog() - } + authenticateViewModel.loadState.observe(this, Observer { + changeLoadStatus(it) }) } + private fun changeLoadStatus(status: LoadState) { + when (status) { + is LoadState.Loading -> { + OtherUtils.showLoadingDialog(this, "登录中,请稍后") + } + else -> OtherUtils.dismissLoadingDialog() + } + } + override fun initEvent() { val editText: EditText? = inputLayout.editText editText?.addTextChangedListener(object : TextWatcher { @@ -90,7 +98,7 @@ //点击输入法键盘"完成" editText?.setOnEditorActionListener { _: TextView?, actionId: Int, _: KeyEvent? -> if (actionId == EditorInfo.IME_ACTION_DONE) { - viewModel.obtainPublicKey() + authenticateViewModel.obtainPublicKey() return@setOnEditorActionListener true } false @@ -98,7 +106,17 @@ loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { - viewModel.obtainPublicKey() + val account = userNameView.text.toString() + val userPassword = userPasswordView.text.toString() + if (TextUtils.isEmpty(account)) { + OtherUtils.showTipsDialog(this, "用户名不能为空", userNameView) + return@setOnClickListener + } + if (TextUtils.isEmpty(userPassword)) { + OtherUtils.showTipsDialog(this, "密码不能为空", userPasswordView) + return@setOnClickListener + } + authenticateViewModel.obtainPublicKey() } //修改服务器配置 diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 7a64c46..bc9161d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -11,10 +11,9 @@ val keyBean = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading() + loadState.value = LoadState.Loading keyBean.value = RetrofitServiceManager.authenticate() - loadState.value = LoadState.Success() }, { - loadState.value = LoadState.Fail() + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt index 9c83224..a3069e2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt @@ -4,19 +4,19 @@ * 加载状态 * sealed 关键字表示此类仅内部继承 */ -sealed class LoadState(val msg: String) { +sealed class LoadState { /** * 加载中 */ - class Loading(msg: String = "") : LoadState(msg) + object Loading : LoadState() /** * 成功 */ - class Success(msg: String = "") : LoadState(msg) + object Success : LoadState() /** * 失败 */ - class Fail(msg: String = "") : LoadState(msg) + object Fail : LoadState() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt new file mode 100644 index 0000000..95ecbbd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt @@ -0,0 +1,46 @@ +package com.casic.birmm.inspect.utils + +import android.text.TextUtils +import java.util.regex.Pattern + +object StringHelper { + + fun isLetterAndDigit(str: String): Boolean { + var isDigit = false + var isLetter = false + for (i in str.indices) { + if (Character.isDigit(str[i])) { + isDigit = true + } else if (Character.isLetter(str[i])) { + isLetter = true + } + } + return isDigit && isLetter + } + + fun isPhoneNumber(number: String): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (number.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(number).matches() + } + } + + /** + * 过滤空格,回车 + */ + fun filterString(str: String): String { + if (TextUtils.isEmpty(str)) { + return str + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(str) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 63a1b8d..ea45d68 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,7 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean -import retrofit2.http.GET +import com.casic.birmm.inspect.model.UserInfoBean +import retrofit2.http.* /** * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符? @@ -12,5 +14,18 @@ * PublicKey校验 */ @GET("/config/baseConfig") - suspend fun obtainPublicKeyAsync(): PublicKeyBean + suspend fun obtainPublicKey(): PublicKeyBean + + /** + * 登录并获取Token + */ + @FormUrlEncoded + @POST("/user/appLogin") + suspend fun obtainLoginResult(@Field("username") account: String, @Field("password") secretKey: String): LoginResultBean + + /** + * 获取用户信息 + */ + @GET("/user/info") + suspend fun obtainUserInfo(@Header("token") token: String): UserInfoBean } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index fe9869b..ec0a4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,6 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean +import com.casic.birmm.inspect.model.UserInfoBean +import com.casic.birmm.inspect.utils.AuthenticationHelper object RetrofitServiceManager { @@ -11,6 +14,20 @@ * 验证PublicKey */ suspend fun authenticate(): PublicKeyBean { - return api.obtainPublicKeyAsync() + return api.obtainPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(account: String, secretKey: String): LoginResultBean { + return api.obtainLoginResult(account, secretKey) + } + + /** + * 获取用户信息 + */ + suspend fun getUserInfo(): UserInfoBean { + return api.obtainUserInfo(AuthenticationHelper.token!!) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 1587c84..d0d42e8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -3,9 +3,16 @@ import android.annotation.SuppressLint import android.content.Intent import android.os.CountDownTimer +import android.text.TextUtils import android.view.ViewGroup.MarginLayoutParams +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.vm.UserViewModel import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* @@ -51,7 +58,18 @@ } fun startLoginActivity() { - startActivity(Intent(this, LoginActivity::class.java)) - finish() + // 判断是否已登录,已登录跳转到主页,否则去登录页 + if (TextUtils.isEmpty(AuthenticationHelper.token)) { + startActivity(Intent(this, LoginActivity::class.java)) + finish() + } else { + val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + userViewModel.getUserInfo() + userViewModel.resultBean.observe(this, Observer { + SaveKeyValues.putValue(Constant.USER_OBJECT, it)//保存用户对象 + startActivity(Intent(this, MainActivity::class.java)) + finish() + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 2dc5b76..82c765c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -1,5 +1,6 @@ package com.casic.birmm.inspect.view +import android.content.Intent import android.text.Editable import android.text.TextUtils import android.text.TextWatcher @@ -13,17 +14,14 @@ import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel +import com.casic.birmm.inspect.vm.LoginInViewModel import com.casic.birmm.inspect.widgets.InputDialog import kotlinx.android.synthetic.main.activity_login.* class LoginActivity : BaseActivity() { - companion object { - private const val Tag = "LoginActivity" - } - - private lateinit var viewModel: AuthenticateViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel override fun initLayoutView(): Int = R.layout.activity_login @@ -32,42 +30,52 @@ } override fun initData() { - // 实例化ViewModel - viewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - // 监听数据变化,从而显示数据在页面 - viewModel.keyBean.observe(this, Observer { - if (it.isSuccess) { - val publicKey = RSAUtils.keyStrToPublicKey(it.data!!.publicKey) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + authenticateViewModel.keyBean.observe(this, Observer { + if (it.code == 200) {//用code判断,别的判断可能有坑 + val keyString = it.data!!.publicKey!! + /** + * 修改密码需要用到key,先存着,以备不时之需 + * */ + AuthenticationHelper.savePublicKey(keyString) + val publicKey = RSAUtils.keyStrToPublicKey(keyString) val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() - if (TextUtils.isEmpty(account)) { - OtherUtils.showTipsDialog(this, "用户名不能为空", userNameView) - return@Observer - } - if (TextUtils.isEmpty(userPassword)) { - OtherUtils.showTipsDialog(this, "密码不能为空", userPasswordView) - return@Observer - } val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 -// loginPresenter.onReadyRetrofitRequest(account, dataByPublicKey) + val loginInViewModel = ViewModelProvider(this).get(LoginInViewModel::class.java) + loginInViewModel.login(account, dataByPublicKey) + loginInViewModel.resultBean.observe(this, Observer { loginResultBean -> + if (loginResultBean.code == 200) { + AuthenticationHelper.saveToken(loginResultBean.data!!.token!!) + //验证成功登录 + startActivity(Intent(this, MainActivity::class.java)) + finish() + } + }) + loginInViewModel.loadState.observe(this, Observer { loginState -> + changeLoadStatus(loginState) + }) } else { OtherUtils.showTipsDialog(this, it.message!!, loginButton) } }) - // 监听加载状态变化 从而改变页面 - viewModel.loadState.observe(this, Observer { - when (it) { - is LoadState.Loading -> { - OtherUtils.showLoadingDialog(this, "登录中,请稍后") - } - else -> OtherUtils.dismissLoadingDialog() - } + authenticateViewModel.loadState.observe(this, Observer { + changeLoadStatus(it) }) } + private fun changeLoadStatus(status: LoadState) { + when (status) { + is LoadState.Loading -> { + OtherUtils.showLoadingDialog(this, "登录中,请稍后") + } + else -> OtherUtils.dismissLoadingDialog() + } + } + override fun initEvent() { val editText: EditText? = inputLayout.editText editText?.addTextChangedListener(object : TextWatcher { @@ -90,7 +98,7 @@ //点击输入法键盘"完成" editText?.setOnEditorActionListener { _: TextView?, actionId: Int, _: KeyEvent? -> if (actionId == EditorInfo.IME_ACTION_DONE) { - viewModel.obtainPublicKey() + authenticateViewModel.obtainPublicKey() return@setOnEditorActionListener true } false @@ -98,7 +106,17 @@ loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { - viewModel.obtainPublicKey() + val account = userNameView.text.toString() + val userPassword = userPasswordView.text.toString() + if (TextUtils.isEmpty(account)) { + OtherUtils.showTipsDialog(this, "用户名不能为空", userNameView) + return@setOnClickListener + } + if (TextUtils.isEmpty(userPassword)) { + OtherUtils.showTipsDialog(this, "密码不能为空", userPasswordView) + return@setOnClickListener + } + authenticateViewModel.obtainPublicKey() } //修改服务器配置 diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 7a64c46..bc9161d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -11,10 +11,9 @@ val keyBean = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading() + loadState.value = LoadState.Loading keyBean.value = RetrofitServiceManager.authenticate() - loadState.value = LoadState.Success() }, { - loadState.value = LoadState.Fail() + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt new file mode 100644 index 0000000..b1b34de --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -0,0 +1,19 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.LoginResultBean +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class LoginInViewModel : BaseViewModel() { + val resultBean = MutableLiveData() + + fun login(account: String, secretKey: String) = launch({ + resultBean.value = RetrofitServiceManager.login(account, secretKey) + loadState.value = LoadState.Success + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt index 9c83224..a3069e2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt @@ -4,19 +4,19 @@ * 加载状态 * sealed 关键字表示此类仅内部继承 */ -sealed class LoadState(val msg: String) { +sealed class LoadState { /** * 加载中 */ - class Loading(msg: String = "") : LoadState(msg) + object Loading : LoadState() /** * 成功 */ - class Success(msg: String = "") : LoadState(msg) + object Success : LoadState() /** * 失败 */ - class Fail(msg: String = "") : LoadState(msg) + object Fail : LoadState() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt new file mode 100644 index 0000000..95ecbbd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt @@ -0,0 +1,46 @@ +package com.casic.birmm.inspect.utils + +import android.text.TextUtils +import java.util.regex.Pattern + +object StringHelper { + + fun isLetterAndDigit(str: String): Boolean { + var isDigit = false + var isLetter = false + for (i in str.indices) { + if (Character.isDigit(str[i])) { + isDigit = true + } else if (Character.isLetter(str[i])) { + isLetter = true + } + } + return isDigit && isLetter + } + + fun isPhoneNumber(number: String): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (number.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(number).matches() + } + } + + /** + * 过滤空格,回车 + */ + fun filterString(str: String): String { + if (TextUtils.isEmpty(str)) { + return str + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(str) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 63a1b8d..ea45d68 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,7 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean -import retrofit2.http.GET +import com.casic.birmm.inspect.model.UserInfoBean +import retrofit2.http.* /** * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符? @@ -12,5 +14,18 @@ * PublicKey校验 */ @GET("/config/baseConfig") - suspend fun obtainPublicKeyAsync(): PublicKeyBean + suspend fun obtainPublicKey(): PublicKeyBean + + /** + * 登录并获取Token + */ + @FormUrlEncoded + @POST("/user/appLogin") + suspend fun obtainLoginResult(@Field("username") account: String, @Field("password") secretKey: String): LoginResultBean + + /** + * 获取用户信息 + */ + @GET("/user/info") + suspend fun obtainUserInfo(@Header("token") token: String): UserInfoBean } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index fe9869b..ec0a4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,6 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean +import com.casic.birmm.inspect.model.UserInfoBean +import com.casic.birmm.inspect.utils.AuthenticationHelper object RetrofitServiceManager { @@ -11,6 +14,20 @@ * 验证PublicKey */ suspend fun authenticate(): PublicKeyBean { - return api.obtainPublicKeyAsync() + return api.obtainPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(account: String, secretKey: String): LoginResultBean { + return api.obtainLoginResult(account, secretKey) + } + + /** + * 获取用户信息 + */ + suspend fun getUserInfo(): UserInfoBean { + return api.obtainUserInfo(AuthenticationHelper.token!!) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 1587c84..d0d42e8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -3,9 +3,16 @@ import android.annotation.SuppressLint import android.content.Intent import android.os.CountDownTimer +import android.text.TextUtils import android.view.ViewGroup.MarginLayoutParams +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.vm.UserViewModel import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* @@ -51,7 +58,18 @@ } fun startLoginActivity() { - startActivity(Intent(this, LoginActivity::class.java)) - finish() + // 判断是否已登录,已登录跳转到主页,否则去登录页 + if (TextUtils.isEmpty(AuthenticationHelper.token)) { + startActivity(Intent(this, LoginActivity::class.java)) + finish() + } else { + val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + userViewModel.getUserInfo() + userViewModel.resultBean.observe(this, Observer { + SaveKeyValues.putValue(Constant.USER_OBJECT, it)//保存用户对象 + startActivity(Intent(this, MainActivity::class.java)) + finish() + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 2dc5b76..82c765c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -1,5 +1,6 @@ package com.casic.birmm.inspect.view +import android.content.Intent import android.text.Editable import android.text.TextUtils import android.text.TextWatcher @@ -13,17 +14,14 @@ import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel +import com.casic.birmm.inspect.vm.LoginInViewModel import com.casic.birmm.inspect.widgets.InputDialog import kotlinx.android.synthetic.main.activity_login.* class LoginActivity : BaseActivity() { - companion object { - private const val Tag = "LoginActivity" - } - - private lateinit var viewModel: AuthenticateViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel override fun initLayoutView(): Int = R.layout.activity_login @@ -32,42 +30,52 @@ } override fun initData() { - // 实例化ViewModel - viewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - // 监听数据变化,从而显示数据在页面 - viewModel.keyBean.observe(this, Observer { - if (it.isSuccess) { - val publicKey = RSAUtils.keyStrToPublicKey(it.data!!.publicKey) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + authenticateViewModel.keyBean.observe(this, Observer { + if (it.code == 200) {//用code判断,别的判断可能有坑 + val keyString = it.data!!.publicKey!! + /** + * 修改密码需要用到key,先存着,以备不时之需 + * */ + AuthenticationHelper.savePublicKey(keyString) + val publicKey = RSAUtils.keyStrToPublicKey(keyString) val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() - if (TextUtils.isEmpty(account)) { - OtherUtils.showTipsDialog(this, "用户名不能为空", userNameView) - return@Observer - } - if (TextUtils.isEmpty(userPassword)) { - OtherUtils.showTipsDialog(this, "密码不能为空", userPasswordView) - return@Observer - } val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 -// loginPresenter.onReadyRetrofitRequest(account, dataByPublicKey) + val loginInViewModel = ViewModelProvider(this).get(LoginInViewModel::class.java) + loginInViewModel.login(account, dataByPublicKey) + loginInViewModel.resultBean.observe(this, Observer { loginResultBean -> + if (loginResultBean.code == 200) { + AuthenticationHelper.saveToken(loginResultBean.data!!.token!!) + //验证成功登录 + startActivity(Intent(this, MainActivity::class.java)) + finish() + } + }) + loginInViewModel.loadState.observe(this, Observer { loginState -> + changeLoadStatus(loginState) + }) } else { OtherUtils.showTipsDialog(this, it.message!!, loginButton) } }) - // 监听加载状态变化 从而改变页面 - viewModel.loadState.observe(this, Observer { - when (it) { - is LoadState.Loading -> { - OtherUtils.showLoadingDialog(this, "登录中,请稍后") - } - else -> OtherUtils.dismissLoadingDialog() - } + authenticateViewModel.loadState.observe(this, Observer { + changeLoadStatus(it) }) } + private fun changeLoadStatus(status: LoadState) { + when (status) { + is LoadState.Loading -> { + OtherUtils.showLoadingDialog(this, "登录中,请稍后") + } + else -> OtherUtils.dismissLoadingDialog() + } + } + override fun initEvent() { val editText: EditText? = inputLayout.editText editText?.addTextChangedListener(object : TextWatcher { @@ -90,7 +98,7 @@ //点击输入法键盘"完成" editText?.setOnEditorActionListener { _: TextView?, actionId: Int, _: KeyEvent? -> if (actionId == EditorInfo.IME_ACTION_DONE) { - viewModel.obtainPublicKey() + authenticateViewModel.obtainPublicKey() return@setOnEditorActionListener true } false @@ -98,7 +106,17 @@ loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { - viewModel.obtainPublicKey() + val account = userNameView.text.toString() + val userPassword = userPasswordView.text.toString() + if (TextUtils.isEmpty(account)) { + OtherUtils.showTipsDialog(this, "用户名不能为空", userNameView) + return@setOnClickListener + } + if (TextUtils.isEmpty(userPassword)) { + OtherUtils.showTipsDialog(this, "密码不能为空", userPasswordView) + return@setOnClickListener + } + authenticateViewModel.obtainPublicKey() } //修改服务器配置 diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 7a64c46..bc9161d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -11,10 +11,9 @@ val keyBean = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading() + loadState.value = LoadState.Loading keyBean.value = RetrofitServiceManager.authenticate() - loadState.value = LoadState.Success() }, { - loadState.value = LoadState.Fail() + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt new file mode 100644 index 0000000..b1b34de --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -0,0 +1,19 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.LoginResultBean +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class LoginInViewModel : BaseViewModel() { + val resultBean = MutableLiveData() + + fun login(account: String, secretKey: String) = launch({ + resultBean.value = RetrofitServiceManager.login(account, secretKey) + loadState.value = LoadState.Success + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt new file mode 100644 index 0000000..c410715 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -0,0 +1,22 @@ +package com.casic.birmm.inspect.vm + +import android.util.Log +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.UserInfoBean +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class UserViewModel : BaseViewModel() { + companion object { + private const val Tag = "UserViewModel" + } + + val resultBean = MutableLiveData() + + fun getUserInfo() = launch({ + resultBean.value = RetrofitServiceManager.getUserInfo() + }, { + Log.d(Tag, it.stackTrace.toString()) + }) +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0002b4a..dd8fa19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,6 @@ targetSdkVersion 30 versionCode 1 versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -41,9 +39,6 @@ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:1.3.0' //腾讯Android UI框架 @@ -53,7 +48,7 @@ implementation 'com.gyf.immersionbar:immersionbar:3.0.0' //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' - //MVVM + //MVVM+LiveData implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" @@ -66,13 +61,13 @@ implementation 'com.squareup.retrofit2:converter-gson:2.8.1' //okhttp3日志拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' - + //网络请求和接口封装 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' +// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //上拉加载下拉刷新 - implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt deleted file mode 100644 index ea03309..0000000 --- a/app/src/androidTest/java/com/casic/birmm/inspect/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.casic.birmm.inspect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.casic.birmm.inspect", appContext.packageName) - } -} diff --git a/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt new file mode 100644 index 0000000..abe817a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/LoginResultBean.kt @@ -0,0 +1,13 @@ +package com.casic.birmm.inspect.model + +class LoginResultBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var kaptcha: String? = null + var token: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt new file mode 100644 index 0000000..7d31d42 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/UserInfoBean.kt @@ -0,0 +1,51 @@ +package com.casic.birmm.inspect.model + +class UserInfoBean { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + /** + * account : wxy + * attr1 : + * avatar : + * bizData : + * dataScope : ["1236854643826184194"] + * deptId : 1236854643826184194 + * deptName : A公司 + * devices : [] + * id : 1281045327302316033 + * ipAddr : 223.104.40.162 + * name : 王晓颖 + * phone : + * roleList : ["1268776836310409218"] + * roleNames : ["普通用户"] + * roleTips : ["普通用户"] + * scopeType : 3 + * targetId : + * targetName : + * tenantId : + */ + var account: String? = null + var attr1: String? = null + var avatar: String? = null + var bizData: String? = null + var deptId: String? = null + var deptName: String? = null + var id: String? = null + var ipAddr: String? = null + var name: String? = null + var phone: String? = null + var scopeType: String? = null + var targetId: String? = null + var targetName: String? = null + var tenantId: String? = null + var dataScope: List? = null + var devices: List<*>? = null + var roleList: List? = null + var roleNames: List? = null + var roleTips: List? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt new file mode 100644 index 0000000..78a633a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/AuthenticationHelper.kt @@ -0,0 +1,21 @@ +package com.casic.birmm.inspect.utils + +import com.casic.birmm.inspect.utils.SaveKeyValues.getValue +import com.casic.birmm.inspect.utils.SaveKeyValues.putValue + +object AuthenticationHelper { + + fun savePublicKey(key: String) { + putValue("keyString", key) + } + + val publicKey: String? + get() = getValue("keyString", "") as String? + + fun saveToken(token: String?) { + putValue("token", token!!) + } + + val token: String? + get() = getValue("token", "") as String? +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 53df6e1..44c3514 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -12,4 +12,5 @@ const val PERMISSIONS_CODE = 999 const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val USER_OBJECT = "userObject" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt index 9c83224..a3069e2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LoadState.kt @@ -4,19 +4,19 @@ * 加载状态 * sealed 关键字表示此类仅内部继承 */ -sealed class LoadState(val msg: String) { +sealed class LoadState { /** * 加载中 */ - class Loading(msg: String = "") : LoadState(msg) + object Loading : LoadState() /** * 成功 */ - class Success(msg: String = "") : LoadState(msg) + object Success : LoadState() /** * 失败 */ - class Fail(msg: String = "") : LoadState(msg) + object Fail : LoadState() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt new file mode 100644 index 0000000..95ecbbd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt @@ -0,0 +1,46 @@ +package com.casic.birmm.inspect.utils + +import android.text.TextUtils +import java.util.regex.Pattern + +object StringHelper { + + fun isLetterAndDigit(str: String): Boolean { + var isDigit = false + var isLetter = false + for (i in str.indices) { + if (Character.isDigit(str[i])) { + isDigit = true + } else if (Character.isLetter(str[i])) { + isLetter = true + } + } + return isDigit && isLetter + } + + fun isPhoneNumber(number: String): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (number.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(number).matches() + } + } + + /** + * 过滤空格,回车 + */ + fun filterString(str: String): String { + if (TextUtils.isEmpty(str)) { + return str + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(str) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 63a1b8d..ea45d68 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,7 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean -import retrofit2.http.GET +import com.casic.birmm.inspect.model.UserInfoBean +import retrofit2.http.* /** * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符? @@ -12,5 +14,18 @@ * PublicKey校验 */ @GET("/config/baseConfig") - suspend fun obtainPublicKeyAsync(): PublicKeyBean + suspend fun obtainPublicKey(): PublicKeyBean + + /** + * 登录并获取Token + */ + @FormUrlEncoded + @POST("/user/appLogin") + suspend fun obtainLoginResult(@Field("username") account: String, @Field("password") secretKey: String): LoginResultBean + + /** + * 获取用户信息 + */ + @GET("/user/info") + suspend fun obtainUserInfo(@Header("token") token: String): UserInfoBean } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index fe9869b..ec0a4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,6 +1,9 @@ package com.casic.birmm.inspect.utils.retrofit +import com.casic.birmm.inspect.model.LoginResultBean import com.casic.birmm.inspect.model.PublicKeyBean +import com.casic.birmm.inspect.model.UserInfoBean +import com.casic.birmm.inspect.utils.AuthenticationHelper object RetrofitServiceManager { @@ -11,6 +14,20 @@ * 验证PublicKey */ suspend fun authenticate(): PublicKeyBean { - return api.obtainPublicKeyAsync() + return api.obtainPublicKey() + } + + /** + * 登录并获取Token + */ + suspend fun login(account: String, secretKey: String): LoginResultBean { + return api.obtainLoginResult(account, secretKey) + } + + /** + * 获取用户信息 + */ + suspend fun getUserInfo(): UserInfoBean { + return api.obtainUserInfo(AuthenticationHelper.token!!) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 1587c84..d0d42e8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -3,9 +3,16 @@ import android.annotation.SuppressLint import android.content.Intent import android.os.CountDownTimer +import android.text.TextUtils import android.view.ViewGroup.MarginLayoutParams +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.vm.UserViewModel import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* @@ -51,7 +58,18 @@ } fun startLoginActivity() { - startActivity(Intent(this, LoginActivity::class.java)) - finish() + // 判断是否已登录,已登录跳转到主页,否则去登录页 + if (TextUtils.isEmpty(AuthenticationHelper.token)) { + startActivity(Intent(this, LoginActivity::class.java)) + finish() + } else { + val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + userViewModel.getUserInfo() + userViewModel.resultBean.observe(this, Observer { + SaveKeyValues.putValue(Constant.USER_OBJECT, it)//保存用户对象 + startActivity(Intent(this, MainActivity::class.java)) + finish() + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 2dc5b76..82c765c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -1,5 +1,6 @@ package com.casic.birmm.inspect.view +import android.content.Intent import android.text.Editable import android.text.TextUtils import android.text.TextWatcher @@ -13,17 +14,14 @@ import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel +import com.casic.birmm.inspect.vm.LoginInViewModel import com.casic.birmm.inspect.widgets.InputDialog import kotlinx.android.synthetic.main.activity_login.* class LoginActivity : BaseActivity() { - companion object { - private const val Tag = "LoginActivity" - } - - private lateinit var viewModel: AuthenticateViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel override fun initLayoutView(): Int = R.layout.activity_login @@ -32,42 +30,52 @@ } override fun initData() { - // 实例化ViewModel - viewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - // 监听数据变化,从而显示数据在页面 - viewModel.keyBean.observe(this, Observer { - if (it.isSuccess) { - val publicKey = RSAUtils.keyStrToPublicKey(it.data!!.publicKey) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + authenticateViewModel.keyBean.observe(this, Observer { + if (it.code == 200) {//用code判断,别的判断可能有坑 + val keyString = it.data!!.publicKey!! + /** + * 修改密码需要用到key,先存着,以备不时之需 + * */ + AuthenticationHelper.savePublicKey(keyString) + val publicKey = RSAUtils.keyStrToPublicKey(keyString) val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() - if (TextUtils.isEmpty(account)) { - OtherUtils.showTipsDialog(this, "用户名不能为空", userNameView) - return@Observer - } - if (TextUtils.isEmpty(userPassword)) { - OtherUtils.showTipsDialog(this, "密码不能为空", userPasswordView) - return@Observer - } val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 -// loginPresenter.onReadyRetrofitRequest(account, dataByPublicKey) + val loginInViewModel = ViewModelProvider(this).get(LoginInViewModel::class.java) + loginInViewModel.login(account, dataByPublicKey) + loginInViewModel.resultBean.observe(this, Observer { loginResultBean -> + if (loginResultBean.code == 200) { + AuthenticationHelper.saveToken(loginResultBean.data!!.token!!) + //验证成功登录 + startActivity(Intent(this, MainActivity::class.java)) + finish() + } + }) + loginInViewModel.loadState.observe(this, Observer { loginState -> + changeLoadStatus(loginState) + }) } else { OtherUtils.showTipsDialog(this, it.message!!, loginButton) } }) - // 监听加载状态变化 从而改变页面 - viewModel.loadState.observe(this, Observer { - when (it) { - is LoadState.Loading -> { - OtherUtils.showLoadingDialog(this, "登录中,请稍后") - } - else -> OtherUtils.dismissLoadingDialog() - } + authenticateViewModel.loadState.observe(this, Observer { + changeLoadStatus(it) }) } + private fun changeLoadStatus(status: LoadState) { + when (status) { + is LoadState.Loading -> { + OtherUtils.showLoadingDialog(this, "登录中,请稍后") + } + else -> OtherUtils.dismissLoadingDialog() + } + } + override fun initEvent() { val editText: EditText? = inputLayout.editText editText?.addTextChangedListener(object : TextWatcher { @@ -90,7 +98,7 @@ //点击输入法键盘"完成" editText?.setOnEditorActionListener { _: TextView?, actionId: Int, _: KeyEvent? -> if (actionId == EditorInfo.IME_ACTION_DONE) { - viewModel.obtainPublicKey() + authenticateViewModel.obtainPublicKey() return@setOnEditorActionListener true } false @@ -98,7 +106,17 @@ loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { - viewModel.obtainPublicKey() + val account = userNameView.text.toString() + val userPassword = userPasswordView.text.toString() + if (TextUtils.isEmpty(account)) { + OtherUtils.showTipsDialog(this, "用户名不能为空", userNameView) + return@setOnClickListener + } + if (TextUtils.isEmpty(userPassword)) { + OtherUtils.showTipsDialog(this, "密码不能为空", userPasswordView) + return@setOnClickListener + } + authenticateViewModel.obtainPublicKey() } //修改服务器配置 diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 7a64c46..bc9161d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -11,10 +11,9 @@ val keyBean = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading() + loadState.value = LoadState.Loading keyBean.value = RetrofitServiceManager.authenticate() - loadState.value = LoadState.Success() }, { - loadState.value = LoadState.Fail() + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt new file mode 100644 index 0000000..b1b34de --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -0,0 +1,19 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.LoginResultBean +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class LoginInViewModel : BaseViewModel() { + val resultBean = MutableLiveData() + + fun login(account: String, secretKey: String) = launch({ + resultBean.value = RetrofitServiceManager.login(account, secretKey) + loadState.value = LoadState.Success + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt new file mode 100644 index 0000000..c410715 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -0,0 +1,22 @@ +package com.casic.birmm.inspect.vm + +import android.util.Log +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.UserInfoBean +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class UserViewModel : BaseViewModel() { + companion object { + private const val Tag = "UserViewModel" + } + + val resultBean = MutableLiveData() + + fun getUserInfo() = launch({ + resultBean.value = RetrofitServiceManager.getUserInfo() + }, { + Log.d(Tag, it.stackTrace.toString()) + }) +} \ No newline at end of file diff --git a/app/src/test/java/com/casic/birmm/inspect/ExampleUnitTest.kt b/app/src/test/java/com/casic/birmm/inspect/ExampleUnitTest.kt deleted file mode 100644 index 21e44ca..0000000 --- a/app/src/test/java/com/casic/birmm/inspect/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.casic.birmm.inspect - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -}