You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
4.5 KiB
127 lines
4.5 KiB
package com.gyf.lib.model
|
|
|
|
import android.app.Activity
|
|
import android.app.Application
|
|
import android.content.Intent
|
|
import androidx.lifecycle.AndroidViewModel
|
|
import androidx.lifecycle.LiveData
|
|
import androidx.lifecycle.MutableLiveData
|
|
import androidx.lifecycle.viewModelScope
|
|
import com.google.gson.reflect.TypeToken
|
|
import com.gyf.lib.R
|
|
import com.gyf.lib.uikit.ValidStringForm
|
|
import com.gyf.lib.util.*
|
|
import com.orhanobut.logger.Logger
|
|
import kotlinx.coroutines.launch
|
|
|
|
abstract class AbstractLoginViewModel(application: Application) : AndroidViewModel(application) {
|
|
|
|
protected val loginDesc = application.getString(R.string.login_btn)
|
|
|
|
abstract val id: ValidStringForm
|
|
abstract val password: ValidStringForm
|
|
|
|
|
|
//注册按钮
|
|
protected val _isValidForm = MutableLiveData<Boolean>()
|
|
|
|
val isValidForm: LiveData<Boolean> = _isValidForm
|
|
|
|
/**
|
|
* 完成登录状态
|
|
*/
|
|
private val _finishLogin = MutableLiveData<Boolean>()
|
|
val finishLogin: LiveData<Boolean> = _finishLogin
|
|
|
|
abstract fun checkForm(): Boolean
|
|
|
|
abstract fun loginParam(): Any
|
|
|
|
abstract val clientType: ClientType
|
|
|
|
abstract val api: AccountApi
|
|
|
|
abstract val loginClass: Class<out Activity>
|
|
|
|
/**
|
|
* 登录
|
|
*
|
|
*/
|
|
fun login(callback: (message: String) -> Unit) {
|
|
viewModelScope.launch {
|
|
if (checkForm()) {
|
|
val url = Api.buildUrl(api)
|
|
Logger.i("开始$loginDesc,请求接口:$url")
|
|
val id = "${id.formValue.value}"
|
|
val password = "${password.formValue.value}"
|
|
Logger.i("使用账号:$id,密码:$password 进行登录")
|
|
HttpClient.post(
|
|
url,
|
|
HttpCallback<Token>(
|
|
action = loginDesc,
|
|
onSuccess = {
|
|
Logger.i(it.message)
|
|
callback(it.message)
|
|
val context = getApplication<Application>().applicationContext
|
|
it.body?.let {
|
|
val db = AppDatabase.getInstance(context)
|
|
viewModelScope.launch {
|
|
TokenManager.token = it
|
|
db?.tokenDao()?.save(token = it)
|
|
}.invokeOnCompletion {
|
|
_finishLogin.postValue(true)
|
|
}
|
|
}
|
|
},
|
|
onFail = { callback(it) },
|
|
type = object : TypeToken<ApiResponse<Token>>() {}.type
|
|
),
|
|
jsonParam = loginParam()
|
|
)
|
|
} else {
|
|
Logger.wtf("表单校验失败,无法$loginDesc!!!")
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 退出登录
|
|
*
|
|
* @param context
|
|
* @param callback
|
|
*/
|
|
fun logout(context: Activity, callback: (message: String) -> Unit) {
|
|
TokenManager.token?.let {
|
|
Logger.i("帐号${it.id}将要退出登录")
|
|
viewModelScope.launch {
|
|
HttpClient.post(
|
|
Api.buildUrl(AccountApi.Logout),
|
|
HttpCallback<Boolean>(
|
|
action = "登出", onSuccess = { it ->
|
|
it.body?.let {
|
|
if (it) {
|
|
viewModelScope.launch {
|
|
val db = AppDatabase.getInstance(context = context)
|
|
db?.tokenDao()?.deleteAll()
|
|
Logger.i("退出登陆成功")
|
|
context.finish()
|
|
context.startActivity(
|
|
Intent(
|
|
context,
|
|
loginClass
|
|
)
|
|
)
|
|
}
|
|
TokenManager.token = null
|
|
}
|
|
}
|
|
callback(it.message)
|
|
}, onFail = { callback("退出登陆失败") },
|
|
type = object : TypeToken<ApiResponse<Boolean>>() {}.type
|
|
),
|
|
jsonParam = OnlyToken(token = it, clientType = clientType)
|
|
)
|
|
}
|
|
}
|
|
}
|
|
} |