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 |
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.network.RetrofitClient |
||||||
|
import com.project.survey.util.SPUtils |
||||||
|
|
||||||
class LoginViewModel : BaseViewModel(){ |
class LoginViewModel : BaseViewModel(){ |
||||||
|
|
||||||
val api = RetrofitClient.createApiService() |
val api = RetrofitClient.createApiService() |
||||||
|
|
||||||
fun test(){ |
|
||||||
|
val loginResponse: LiveData<String> |
||||||
|
get() = _loginResponse |
||||||
|
private val _loginResponse = MutableLiveData<String>() |
||||||
|
|
||||||
|
/** |
||||||
|
* 登录 |
||||||
|
*/ |
||||||
|
fun login(account: String, password: String){ |
||||||
launch { |
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 |
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 |
package com.project.survey.network |
||||||
|
|
||||||
|
import com.project.survey.model.ProjectBean |
||||||
|
import retrofit2.http.GET |
||||||
|
import retrofit2.http.Query |
||||||
|
|
||||||
interface Api { |
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