parent
7d57e01bfe
commit
6ad88e61ce
29 changed files with 488 additions and 97 deletions
@ -0,0 +1,15 @@ |
||||
package com.project.survey.constants |
||||
|
||||
object Constants { |
||||
} |
||||
|
||||
|
||||
object SPConstants { |
||||
const val TOKEN = "token" |
||||
const val ACCOUNT = "account" |
||||
const val LOGIN = "login" //登录状态 |
||||
} |
||||
|
||||
object EventConstants{ |
||||
const val LOGIN_STATUS = "loginStatus" |
||||
} |
@ -0,0 +1,99 @@ |
||||
package com.project.survey.logic.event |
||||
|
||||
import androidx.lifecycle.LifecycleOwner |
||||
import androidx.lifecycle.MutableLiveData |
||||
import androidx.lifecycle.Observer |
||||
import com.project.survey.logic.event.LiveBus.ObserverWrapper |
||||
import java.util.concurrent.ConcurrentHashMap |
||||
|
||||
/** |
||||
* 使用LiveData实现的事件总线 |
||||
*/ |
||||
class LiveBus private constructor() { |
||||
|
||||
private val busMap by lazy { ConcurrentHashMap<Class<*>, BusLiveData<*>>() } |
||||
|
||||
private fun <T> bus(clazz: Class<T>) = busMap.getOrPut(clazz) { BusLiveData<T>() } |
||||
|
||||
fun <T> with(clazz: Class<T>) = bus(clazz) as BusLiveData<T> |
||||
|
||||
class BusLiveData<T> : MutableLiveData<T>() { |
||||
|
||||
var mVersion = START_VERSION |
||||
|
||||
var mStickyEvent: T? = null |
||||
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) { |
||||
observe(owner, observer, false) |
||||
} |
||||
|
||||
|
||||
fun observe(owner: LifecycleOwner, observer: Observer<in T>, sticky: Boolean) { |
||||
super.observe(owner, ObserverWrapper(observer, this, sticky)) |
||||
} |
||||
|
||||
override fun setValue(value: T) { |
||||
mVersion++ |
||||
super.setValue(value) |
||||
} |
||||
|
||||
override fun postValue(value: T) { |
||||
mVersion++ |
||||
super.postValue(value) |
||||
} |
||||
|
||||
fun setValueSticky(value: T) { |
||||
mStickyEvent = value |
||||
setValue(value) |
||||
} |
||||
|
||||
fun postValueSticky(value: T) { |
||||
mStickyEvent = value |
||||
postValue(value) |
||||
} |
||||
|
||||
fun removeSticky() { |
||||
mStickyEvent = null |
||||
} |
||||
} |
||||
|
||||
private class ObserverWrapper<T>( |
||||
val observer: Observer<in T>, |
||||
val liveData: BusLiveData<T>, |
||||
val sticky: Boolean |
||||
) : Observer<T> { |
||||
|
||||
// 通过标志位过滤旧数据 |
||||
private var mLastVersion = liveData.mVersion |
||||
|
||||
override fun onChanged(t: T) { |
||||
|
||||
if (mLastVersion >= liveData.mVersion) { |
||||
// 回调粘性事件 |
||||
if (sticky && liveData.mStickyEvent != null) { |
||||
liveData.mStickyEvent?.let { v -> |
||||
observer.onChanged(v) |
||||
} |
||||
} |
||||
return |
||||
} |
||||
mLastVersion = liveData.mVersion |
||||
|
||||
observer.onChanged(t) |
||||
} |
||||
} |
||||
|
||||
companion object { |
||||
|
||||
private const val START_VERSION = -1 |
||||
|
||||
@Volatile |
||||
private var instance: LiveBus? = null |
||||
|
||||
@JvmStatic |
||||
fun getInstance() = instance ?: synchronized(this) { |
||||
instance ?: LiveBus().also { instance = it } |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,13 @@ |
||||
package com.project.survey.logic.event |
||||
|
||||
import java.text.SimpleDateFormat |
||||
import java.util.* |
||||
|
||||
data class Message @JvmOverloads constructor( |
||||
var msg: String = "", |
||||
var arg1: Int = 0, |
||||
var arg2: Int = 0, |
||||
var obj: Any? = null |
||||
) { |
||||
var time: String = SimpleDateFormat.getTimeInstance().format(Date()) |
||||
} |
@ -1,14 +1,42 @@ |
||||
package com.project.survey.logic.viewmodel |
||||
|
||||
import androidx.lifecycle.LiveData |
||||
import androidx.lifecycle.MutableLiveData |
||||
import com.project.survey.constants.EventConstants |
||||
import com.project.survey.constants.SPConstants |
||||
import com.project.survey.logic.event.Message |
||||
import com.project.survey.network.RetrofitClient |
||||
import com.project.survey.util.SPUtils |
||||
|
||||
class LoginViewModel : BaseViewModel(){ |
||||
|
||||
val api = RetrofitClient.createApiService() |
||||
|
||||
fun test(){ |
||||
|
||||
val loginResponse: LiveData<String> |
||||
get() = _loginResponse |
||||
private val _loginResponse = MutableLiveData<String>() |
||||
|
||||
/** |
||||
* 登录 |
||||
*/ |
||||
fun login(account: String, password: String){ |
||||
launch { |
||||
// TODO: |
||||
// val res = api.login(account, password) |
||||
// if (res.success){ |
||||
// _loginResponse.postValue(res.data) |
||||
// SPUtils.put(SPConstants.TOKEN, res.data) |
||||
// SPUtils.put(SPConstants.LOGIN, true) |
||||
// SPUtils.put(SPConstants.ACCOUNT, account) |
||||
// msgEvent.postValue(Message(EventConstants.LOGIN_STATUS)) |
||||
// } |
||||
|
||||
_loginResponse.postValue("res.data") |
||||
SPUtils.put(SPConstants.TOKEN, "res.data") |
||||
SPUtils.put(SPConstants.LOGIN, true) |
||||
SPUtils.put(SPConstants.ACCOUNT, account) |
||||
msgEvent.postValue(Message(EventConstants.LOGIN_STATUS)) |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,28 @@ |
||||
package com.project.survey.logic.viewmodel |
||||
|
||||
import androidx.lifecycle.LiveData |
||||
import androidx.lifecycle.MutableLiveData |
||||
import com.project.survey.model.ProjectBean |
||||
import com.project.survey.network.RetrofitClient |
||||
|
||||
class ProjectViewModel : BaseViewModel() { |
||||
|
||||
val api = RetrofitClient.createApiService() |
||||
|
||||
|
||||
val projectResponse: LiveData<List<ProjectBean>> |
||||
get() = _projectResponse |
||||
private val _projectResponse = MutableLiveData<List<ProjectBean>>() |
||||
|
||||
/** |
||||
* 获取用户在工作的所以项目的信息 |
||||
*/ |
||||
fun getAllProjectIDByAccount(account: String) { |
||||
launch { |
||||
val res = api.getAllProjectIDByAccount(account) |
||||
if (res.success) { |
||||
_projectResponse.postValue(res.data) |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,4 +1,33 @@ |
||||
package com.project.survey.model |
||||
|
||||
class ProjectBean { |
||||
} |
||||
//{ |
||||
// "XMXX_PILENO": "20221111", |
||||
// "XMXX_INDUSTRYTYPE": "水电工程", |
||||
// "SY_COMPANY_ID": null, |
||||
// "$TABLE_CODE$": null, |
||||
// "SY_CREATEUSERNAME": null, |
||||
// "XMXX_STATUS": "完工", |
||||
// "XMXX_LEVEL": "A类", |
||||
// "SY_ORDERINDEX": null, |
||||
// "SY_GROUP_COMPANY_NAME": null, |
||||
// "SY_COMPANY_NAME": null, |
||||
// "XMXX_CODE": "202109[101]", |
||||
// "BD_XMXX_ID": "f5b09f04f26d4d0e99591c01a5dedeeb", |
||||
// "SY_CREATEORGID": null, |
||||
// "SY_STATUS": "1", |
||||
// "SY_CREATEUSERID": null, |
||||
// "SY_GROUP_COMPANY_ID": null, |
||||
// "XMXX_CONTACTNAME": "何嘉能", |
||||
// "XMXX_LOCATIONXY": "122;39", |
||||
// "XMXX_FILE": null, |
||||
// "XMXX_CONTACTNAMEID": "", |
||||
// "XMXX_DESCRIPTION": "测试项目", |
||||
// "SY_CREATEORGNAME": null, |
||||
// "SY_CREATETIME": null, |
||||
// "SY_ORG_ID": null, |
||||
// "XMXX_NAME": "测试项目" |
||||
//} |
||||
data class ProjectBean( |
||||
val XMXX_PILENO: String, |
||||
val XMXX_INDUSTRYTYPE: String |
||||
) |
@ -1,4 +1,25 @@ |
||||
package com.project.survey.network |
||||
|
||||
import com.project.survey.model.ProjectBean |
||||
import retrofit2.http.GET |
||||
import retrofit2.http.Query |
||||
|
||||
interface Api { |
||||
|
||||
/** |
||||
* 登录 |
||||
*/ |
||||
@GET("/je/project/login") |
||||
suspend fun login( |
||||
@Query("account") account: String, |
||||
@Query("password") password: String |
||||
): HttpResult<String> |
||||
|
||||
/** |
||||
* 获取用户在工作的所以项目的信息 |
||||
*/ |
||||
@GET("/je/project/getAllProjectIDByAccount") |
||||
suspend fun getAllProjectIDByAccount( |
||||
@Query("account") account: String |
||||
): HttpResult<List<ProjectBean>> |
||||
} |
@ -0,0 +1,3 @@ |
||||
package com.project.survey.network |
||||
|
||||
data class HttpResult<T>(val code: String, val message: String, val data: T, val success: Boolean) |
@ -0,0 +1,8 @@ |
||||
package com.project.survey.network |
||||
|
||||
interface IBaseResponse<T> { |
||||
fun code(): Int |
||||
fun msg(): String |
||||
fun data(): T |
||||
fun isSuccess(): Boolean |
||||
} |
@ -0,0 +1,86 @@ |
||||
package com.project.survey.util |
||||
|
||||
import android.os.Parcelable |
||||
import com.tencent.mmkv.MMKV |
||||
import java.util.* |
||||
|
||||
object SPUtils { |
||||
var mmkv: MMKV? = null |
||||
init { |
||||
mmkv = MMKV.defaultMMKV() |
||||
} |
||||
|
||||
fun put(key: String, value: Any?): Boolean { |
||||
return when (value) { |
||||
is String -> mmkv?.encode(key, value)!! |
||||
is Float -> mmkv?.encode(key, value)!! |
||||
is Boolean -> mmkv?.encode(key, value)!! |
||||
is Int -> mmkv?.encode(key, value)!! |
||||
is Long -> mmkv?.encode(key, value)!! |
||||
is Double -> mmkv?.encode(key, value)!! |
||||
is ByteArray -> mmkv?.encode(key, value)!! |
||||
else -> false |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 这里使用安卓自带的Parcelable序列化,它比java支持的Serializer序列化性能好些 |
||||
*/ |
||||
fun <T : Parcelable> put(key: String, t: T?): Boolean { |
||||
if (t == null) { |
||||
return false |
||||
} |
||||
return mmkv?.encode(key, t)!! |
||||
} |
||||
|
||||
fun put(key: String, sets: Set<String>?): Boolean { |
||||
if (sets == null) { |
||||
return false |
||||
} |
||||
return mmkv?.encode(key, sets)!! |
||||
} |
||||
|
||||
fun getInt(key: String): Int? { |
||||
return mmkv?.decodeInt(key, 0) |
||||
} |
||||
|
||||
fun getDouble(key: String): Double? { |
||||
return mmkv?.decodeDouble(key, 0.00) |
||||
} |
||||
|
||||
fun getLong(key: String): Long? { |
||||
return mmkv?.decodeLong(key, 0L) |
||||
} |
||||
|
||||
fun getBoolean(key: String): Boolean? { |
||||
return mmkv?.decodeBool(key, false) |
||||
} |
||||
|
||||
fun getFloat(key: String): Float? { |
||||
return mmkv?.decodeFloat(key, 0F) |
||||
} |
||||
|
||||
fun getByteArray(key: String): ByteArray? { |
||||
return mmkv?.decodeBytes(key) |
||||
} |
||||
|
||||
fun getString(key: String): String? { |
||||
return mmkv?.decodeString(key, "") |
||||
} |
||||
|
||||
fun <T : Parcelable> getParcelable(key: String, tClass: Class<T>): T? { |
||||
return mmkv?.decodeParcelable(key, tClass) |
||||
} |
||||
|
||||
fun getStringSet(key: String): Set<String>? { |
||||
return mmkv?.decodeStringSet(key, Collections.emptySet()) |
||||
} |
||||
|
||||
fun removeKey(key: String) { |
||||
mmkv?.removeValueForKey(key) |
||||
} |
||||
|
||||
fun clearAll() { |
||||
mmkv?.clearAll() |
||||
} |
||||
} |
Loading…
Reference in new issue