From 6ad88e61ce700fa4329da64645a8b2695a8e9613 Mon Sep 17 00:00:00 2001 From: chenglifeng Date: Thu, 19 Sep 2024 13:38:15 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 11 ++- app/src/main/java/com/project/survey/App.java | 3 +- .../com/project/survey/constants/Constants.kt | 15 +++ .../com/project/survey/logic/event/LiveBus.kt | 99 +++++++++++++++++++ .../com/project/survey/logic/event/Message.kt | 13 +++ .../survey/logic/viewmodel/BaseViewModel.kt | 4 + .../survey/logic/viewmodel/LoginViewModel.kt | 30 +++++- .../logic/viewmodel/ProjectViewModel.kt | 28 ++++++ .../com/project/survey/model/ProjectBean.kt | 33 ++++++- .../java/com/project/survey/network/Api.kt | 21 ++++ .../com/project/survey/network/HttpResult.kt | 3 + .../project/survey/network/IBaseResponse.kt | 8 ++ .../project/survey/network/RetrofitClient.kt | 22 +++-- .../survey/ui/base/BaseBindingFragment.kt | 3 + .../com/project/survey/ui/home/MeFragment.kt | 43 +++++++- .../project/survey/ui/login/LoginActivity.kt | 45 ++++++--- .../survey/ui/project/ProjectListFragment.kt | 2 +- .../java/com/project/survey/util/SPUtils.kt | 86 ++++++++++++++++ app/src/main/res/drawable/bg_btn_login.xml | 2 +- .../main/res/drawable/bg_input_code_gray.xml | 2 +- .../main/res/layout/activity_forget_pwd.xml | 4 +- .../layout/activity_forget_pwd_input_code.xml | 2 +- app/src/main/res/layout/activity_login.xml | 40 ++++---- .../res/layout/activity_login_input_code.xml | 2 +- .../main/res/layout/activity_set_new_pwd.xml | 6 +- app/src/main/res/layout/fragment_me.xml | 48 ++------- app/src/main/res/layout/view_password.xml | 4 +- app/src/main/res/values/color.xml | 4 +- app/src/main/res/values/strings.xml | 2 +- 29 files changed, 488 insertions(+), 97 deletions(-) create mode 100644 app/src/main/java/com/project/survey/constants/Constants.kt create mode 100644 app/src/main/java/com/project/survey/logic/event/LiveBus.kt create mode 100644 app/src/main/java/com/project/survey/logic/event/Message.kt create mode 100644 app/src/main/java/com/project/survey/logic/viewmodel/ProjectViewModel.kt create mode 100644 app/src/main/java/com/project/survey/network/HttpResult.kt create mode 100644 app/src/main/java/com/project/survey/network/IBaseResponse.kt create mode 100644 app/src/main/java/com/project/survey/util/SPUtils.kt diff --git a/app/build.gradle b/app/build.gradle index 7d67553..147ef6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,7 @@ import com.bingce.AndroidSdk import com.bingce.AndroidX import com.bingce.Kotlin import com.bingce.Libs +import com.bingce.SurveyorVersionUtils apply plugin: 'com.android.application' apply plugin: 'org.jetbrains.kotlin.android' @@ -18,10 +19,17 @@ android { minSdkVersion AndroidSdk.minSdkVersion targetSdkVersion AndroidSdk.targetSdkVersion + + def versionUtils = new SurveyorVersionUtils(project) + versionCode = versionUtils.versionCode + 0 + versionName = versionUtils.versionName + ndk {} testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true + buildConfigField "String", "BASE_URL", "\"http://10.190.183.37\"" + javaCompileOptions { annotationProcessorOptions { arguments = [ @@ -184,7 +192,8 @@ dependencies { implementation 'com.sherlockshi.widget:sherlockspinner:1.0.2' implementation 'com.zhy:flowlayout-lib:1.0.3' implementation 'net.sourceforge.jexcelapi:jxl:2.6.12' - + // 腾讯 MMKV:https://github.com/Tencent/MMKV + implementation 'com.tencent:mmkv:1.3.9' } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/App.java b/app/src/main/java/com/project/survey/App.java index c3a8b04..fc21b56 100644 --- a/app/src/main/java/com/project/survey/App.java +++ b/app/src/main/java/com/project/survey/App.java @@ -22,6 +22,7 @@ import com.bingce.rtk.command.RTK; import com.bingce.utils.CoordinatorSystemNotifierImpl; import com.bingce.utils.SdkUtils; import com.bingce.utils.ThreadPoolUtil; +import com.tencent.mmkv.MMKV; import org.polaric.colorful.Colorful; @@ -57,7 +58,7 @@ public class App extends BaseApp { customChannel = AppChannel.CUSTOM_CONTROL_PRO;//AppChannel.CUSTOM_PUBLIC; super.onCreate(); app = this; - + MMKV.initialize(this); RxJavaPlugins.setErrorHandler(new Consumer() { @Override diff --git a/app/src/main/java/com/project/survey/constants/Constants.kt b/app/src/main/java/com/project/survey/constants/Constants.kt new file mode 100644 index 0000000..5f93945 --- /dev/null +++ b/app/src/main/java/com/project/survey/constants/Constants.kt @@ -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" +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/logic/event/LiveBus.kt b/app/src/main/java/com/project/survey/logic/event/LiveBus.kt new file mode 100644 index 0000000..2b578f8 --- /dev/null +++ b/app/src/main/java/com/project/survey/logic/event/LiveBus.kt @@ -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, BusLiveData<*>>() } + + private fun bus(clazz: Class) = busMap.getOrPut(clazz) { BusLiveData() } + + fun with(clazz: Class) = bus(clazz) as BusLiveData + + class BusLiveData : MutableLiveData() { + + var mVersion = START_VERSION + + var mStickyEvent: T? = null + override fun observe(owner: LifecycleOwner, observer: Observer) { + observe(owner, observer, false) + } + + + fun observe(owner: LifecycleOwner, observer: Observer, 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( + val observer: Observer, + val liveData: BusLiveData, + val sticky: Boolean + ) : Observer { + + // 通过标志位过滤旧数据 + 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 } + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/logic/event/Message.kt b/app/src/main/java/com/project/survey/logic/event/Message.kt new file mode 100644 index 0000000..1526945 --- /dev/null +++ b/app/src/main/java/com/project/survey/logic/event/Message.kt @@ -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()) +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/logic/viewmodel/BaseViewModel.kt b/app/src/main/java/com/project/survey/logic/viewmodel/BaseViewModel.kt index 5da15ab..c293d0e 100644 --- a/app/src/main/java/com/project/survey/logic/viewmodel/BaseViewModel.kt +++ b/app/src/main/java/com/project/survey/logic/viewmodel/BaseViewModel.kt @@ -3,6 +3,8 @@ package com.project.survey.logic.viewmodel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.project.survey.logic.event.LiveBus +import com.project.survey.logic.event.Message import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -10,6 +12,8 @@ import kotlinx.coroutines.withContext open class BaseViewModel : ViewModel() { + val msgEvent by lazy { LiveBus.getInstance().with(Message::class.java) } + val errorResponse = MutableLiveData() fun launch(block: suspend CoroutineScope.() -> Unit) { diff --git a/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt b/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt index 00414f3..7683b18 100644 --- a/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt +++ b/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt @@ -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 + get() = _loginResponse + private val _loginResponse = MutableLiveData() + + /** + * 登录 + */ + 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)) } } } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/logic/viewmodel/ProjectViewModel.kt b/app/src/main/java/com/project/survey/logic/viewmodel/ProjectViewModel.kt new file mode 100644 index 0000000..f987717 --- /dev/null +++ b/app/src/main/java/com/project/survey/logic/viewmodel/ProjectViewModel.kt @@ -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> + get() = _projectResponse + private val _projectResponse = MutableLiveData>() + + /** + * 获取用户在工作的所以项目的信息 + */ + fun getAllProjectIDByAccount(account: String) { + launch { + val res = api.getAllProjectIDByAccount(account) + if (res.success) { + _projectResponse.postValue(res.data) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/model/ProjectBean.kt b/app/src/main/java/com/project/survey/model/ProjectBean.kt index d7e373f..5696647 100644 --- a/app/src/main/java/com/project/survey/model/ProjectBean.kt +++ b/app/src/main/java/com/project/survey/model/ProjectBean.kt @@ -1,4 +1,33 @@ package com.project.survey.model -class ProjectBean { -} \ No newline at end of file +//{ +// "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 +) \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/network/Api.kt b/app/src/main/java/com/project/survey/network/Api.kt index 2ec4943..9e319b6 100644 --- a/app/src/main/java/com/project/survey/network/Api.kt +++ b/app/src/main/java/com/project/survey/network/Api.kt @@ -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 + + /** + * 获取用户在工作的所以项目的信息 + */ + @GET("/je/project/getAllProjectIDByAccount") + suspend fun getAllProjectIDByAccount( + @Query("account") account: String + ): HttpResult> } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/network/HttpResult.kt b/app/src/main/java/com/project/survey/network/HttpResult.kt new file mode 100644 index 0000000..8f411e3 --- /dev/null +++ b/app/src/main/java/com/project/survey/network/HttpResult.kt @@ -0,0 +1,3 @@ +package com.project.survey.network + +data class HttpResult(val code: String, val message: String, val data: T, val success: Boolean) diff --git a/app/src/main/java/com/project/survey/network/IBaseResponse.kt b/app/src/main/java/com/project/survey/network/IBaseResponse.kt new file mode 100644 index 0000000..afab29d --- /dev/null +++ b/app/src/main/java/com/project/survey/network/IBaseResponse.kt @@ -0,0 +1,8 @@ +package com.project.survey.network + +interface IBaseResponse { + fun code(): Int + fun msg(): String + fun data(): T + fun isSuccess(): Boolean +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/network/RetrofitClient.kt b/app/src/main/java/com/project/survey/network/RetrofitClient.kt index 81e0102..e0107c8 100644 --- a/app/src/main/java/com/project/survey/network/RetrofitClient.kt +++ b/app/src/main/java/com/project/survey/network/RetrofitClient.kt @@ -1,7 +1,10 @@ package com.project.survey.network +import blankj.utilcode.util.LogUtils import com.bingce.http.HttpsTrustUtil import com.project.survey.BuildConfig +import com.project.survey.constants.SPConstants +import com.project.survey.util.SPUtils import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit @@ -22,7 +25,7 @@ object RetrofitClient { fun createRetrofit(): Retrofit { return Retrofit.Builder() - .baseUrl("") + .baseUrl(BuildConfig.BASE_URL) .client(createOkHttpClient()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //retrofit默认支持Call返回类型,改为支持Observable返回类型 @@ -35,13 +38,18 @@ object RetrofitClient { .readTimeout(60L, TimeUnit.SECONDS) .writeTimeout(60L, TimeUnit.SECONDS) .addInterceptor { chain -> + val token = SPUtils.getString(SPConstants.TOKEN) ?: "" val originalRequest = chain.request() - val updateRequest = originalRequest.newBuilder() - .header("Content-Type", "application/json;charset=UTF-8") - .header("User-Agent", "ANDROID") - .header("System-Type", "APP_TOKEN") - .build() - return@addInterceptor chain.proceed(updateRequest) + val updateRequest = originalRequest.newBuilder().apply { + addHeader("pd", "jecloud-gcclzhglpt") + removeHeader("Authorization") + if (BuildConfig.DEBUG) + LogUtils.d(token) + if (token.isNotBlank()) { + addHeader("Authorization", token) + } + } + return@addInterceptor chain.proceed(updateRequest.build()) } .addInterceptor(HttpLoggingInterceptor().apply { level = if (BuildConfig.DEBUG) diff --git a/app/src/main/java/com/project/survey/ui/base/BaseBindingFragment.kt b/app/src/main/java/com/project/survey/ui/base/BaseBindingFragment.kt index 1bcfaaa..b6dfb36 100644 --- a/app/src/main/java/com/project/survey/ui/base/BaseBindingFragment.kt +++ b/app/src/main/java/com/project/survey/ui/base/BaseBindingFragment.kt @@ -15,6 +15,8 @@ abstract class BaseBindingFragment : Fragment() { protected val binding: VB get() = _binding + protected lateinit var mContext: Context + abstract fun getBinding(inflater: LayoutInflater, container: ViewGroup?): VB abstract fun initView() abstract fun initData() @@ -22,6 +24,7 @@ abstract class BaseBindingFragment : Fragment() { override fun onAttach(context: Context) { super.onAttach(context) + mContext = context ParamUtil.initParam(this) } diff --git a/app/src/main/java/com/project/survey/ui/home/MeFragment.kt b/app/src/main/java/com/project/survey/ui/home/MeFragment.kt index 0f83490..196d1a4 100644 --- a/app/src/main/java/com/project/survey/ui/home/MeFragment.kt +++ b/app/src/main/java/com/project/survey/ui/home/MeFragment.kt @@ -2,33 +2,72 @@ package com.project.survey.ui.home import android.view.LayoutInflater import android.view.ViewGroup +import androidx.activity.viewModels +import androidx.fragment.app.viewModels +import com.afollestad.materialdialogs.MaterialDialog +import com.project.survey.R +import com.project.survey.constants.EventConstants +import com.project.survey.constants.SPConstants import com.project.survey.databinding.FragmentMeBinding import com.project.survey.extend.setOnClickNoRepeatListener +import com.project.survey.logic.event.Message +import com.project.survey.logic.viewmodel.LoginViewModel import com.project.survey.ui.base.BaseBindingFragment import com.project.survey.ui.login.LoginActivity import com.project.survey.ui.project.ProjectListActivity +import com.project.survey.util.SPUtils /** * 我的 */ class MeFragment : BaseBindingFragment() { + private val viewModel: LoginViewModel by viewModels() + + private val account by lazy { SPUtils.getString(SPConstants.ACCOUNT) } + override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentMeBinding { return FragmentMeBinding.inflate(inflater, container, false) } override fun initView() { + } override fun initData() { + viewModel.msgEvent.observe(this) { + binding.tvLoginOrOut.text = + if (SPUtils.getBoolean(SPConstants.LOGIN) == true) getString(R.string.login_out) else getString(R.string.login) + binding.tvName.text = if (SPUtils.getBoolean(SPConstants.LOGIN) == true) account else "请登录" + } } override fun initListener() { - binding.llLogin.setOnClickNoRepeatListener { - LoginActivity.start() + binding.tvLoginOrOut.setOnClickNoRepeatListener { + if (SPUtils.getBoolean(SPConstants.LOGIN) == true){ + // 退出登录 + MaterialDialog.Builder(mContext) + .title("确定退出吗?") + .negativeText("取消") + .positiveText("退出") + .onPositive { _, _ -> + SPUtils.removeKey(SPConstants.TOKEN) + SPUtils.put(SPConstants.LOGIN, false) + SPUtils.removeKey(SPConstants.ACCOUNT) + viewModel.msgEvent.postValue(Message(EventConstants.LOGIN_STATUS)) + } + .show() + } else { + // 登录 + LoginActivity.start() + } } binding.llSwitchProject.setOnClickNoRepeatListener { ProjectListActivity.start() } + // TODO: + binding.llAbout.setOnClickNoRepeatListener { + SPUtils.put(SPConstants.LOGIN, false) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt b/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt index 576be9c..9e866fc 100644 --- a/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt @@ -2,23 +2,33 @@ package com.project.survey.ui.login import android.content.Intent import android.view.View +import androidx.activity.viewModels import com.gyf.immersionbar.ImmersionBar import com.project.survey.R +import com.project.survey.constants.SPConstants import com.project.survey.ui.base.BaseBindingActivity import com.project.survey.databinding.ActivityLoginBinding +import com.project.survey.extend.isVisibleOrGone +import com.project.survey.extend.isVisibleOrInvisible +import com.project.survey.extend.setOnClickNoRepeatListener +import com.project.survey.extend.toast +import com.project.survey.logic.viewmodel.LoginViewModel import com.project.survey.util.ActivityNavUtil +import com.project.survey.util.SPUtils import com.project.survey.util.Tools class LoginActivity : BaseBindingActivity() { - companion object{ - fun start(){ - ActivityNavUtil.startActivity { } + companion object { + fun start() { + ActivityNavUtil.startActivity { } } } override fun getBinding(): ActivityLoginBinding = ActivityLoginBinding.inflate(layoutInflater) + private val viewModel: LoginViewModel by viewModels() + private var isOutLogin = false//默认集团登录 override fun initView() { @@ -36,11 +46,18 @@ class LoginActivity : BaseBindingActivity() { refreshInnerOutUi() } - mBinding.btnLogin.setOnClickListener { + // 登录 + mBinding.btnLogin.setOnClickNoRepeatListener { if (isOutLogin) { loginByOut() } else { - loginByInner() + val account = mBinding.etAccount.text.toString() + val password = mBinding.passwordView.getText() + if (account.isBlank() || password.isNullOrBlank()) { + toast("账号或密码不能为空") + return@setOnClickNoRepeatListener + } + viewModel.login(account, password) } } @@ -51,12 +68,22 @@ class LoginActivity : BaseBindingActivity() { } + override fun initData() { + viewModel.errorResponse.observe(this) { + mBinding.tvError.text = it + mBinding.tvError.isVisibleOrInvisible(true) + } + // 登录成功 + viewModel.loginResponse.observe(this) { + finish() + } + } + /** * 内部登录 */ private fun loginByInner() { startActivity(Intent(this, LoginInputCodeActivity::class.java)) - } /** @@ -86,11 +113,5 @@ class LoginActivity : BaseBindingActivity() { // mBinding.ilPwd.etPwd.text = null } - override fun initData() { - - } - - - } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/ui/project/ProjectListFragment.kt b/app/src/main/java/com/project/survey/ui/project/ProjectListFragment.kt index 4e1fcef..72ed230 100644 --- a/app/src/main/java/com/project/survey/ui/project/ProjectListFragment.kt +++ b/app/src/main/java/com/project/survey/ui/project/ProjectListFragment.kt @@ -50,7 +50,7 @@ class ProjectListFragment : BaseFragmentBinding() { val dataList = mutableListOf() for (i in 0 until num) { - dataList.add(ProjectBean()) + dataList.add(ProjectBean("","")) } adapter.refreshData(dataList) diff --git a/app/src/main/java/com/project/survey/util/SPUtils.kt b/app/src/main/java/com/project/survey/util/SPUtils.kt new file mode 100644 index 0000000..546726b --- /dev/null +++ b/app/src/main/java/com/project/survey/util/SPUtils.kt @@ -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 put(key: String, t: T?): Boolean { + if (t == null) { + return false + } + return mmkv?.encode(key, t)!! + } + + fun put(key: String, sets: Set?): 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 getParcelable(key: String, tClass: Class): T? { + return mmkv?.decodeParcelable(key, tClass) + } + + fun getStringSet(key: String): Set? { + return mmkv?.decodeStringSet(key, Collections.emptySet()) + } + + fun removeKey(key: String) { + mmkv?.removeValueForKey(key) + } + + fun clearAll() { + mmkv?.clearAll() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_btn_login.xml b/app/src/main/res/drawable/bg_btn_login.xml index ddbf5b9..c4bea67 100644 --- a/app/src/main/res/drawable/bg_btn_login.xml +++ b/app/src/main/res/drawable/bg_btn_login.xml @@ -5,5 +5,5 @@ android:angle="0" android:endColor="#396BD0" android:startColor="#3F79F0" /> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_input_code_gray.xml b/app/src/main/res/drawable/bg_input_code_gray.xml index 2ae091b..519a2cd 100644 --- a/app/src/main/res/drawable/bg_input_code_gray.xml +++ b/app/src/main/res/drawable/bg_input_code_gray.xml @@ -8,7 +8,7 @@ + android:color="@color/text_color_727778" /> diff --git a/app/src/main/res/layout/activity_forget_pwd.xml b/app/src/main/res/layout/activity_forget_pwd.xml index e6d65d4..9434ea1 100644 --- a/app/src/main/res/layout/activity_forget_pwd.xml +++ b/app/src/main/res/layout/activity_forget_pwd.xml @@ -22,7 +22,7 @@ android:layout_marginHorizontal="@dimen/sw_22dp" android:layout_marginTop="@dimen/sw_6dp" android:text="@string/please_input_username" - android:textColor="@color/c_727778" + android:textColor="@color/text_color_727778" android:textSize="@dimen/sw_14sp" /> + android:text="@string/sh_account" + android:textColor="@color/text_color_727778" + android:textSize="11sp" /> + android:textColor="@color/text_color_20" + android:textSize="14sp" /> + android:textColor="@color/text_color_727778" + android:textSize="11sp" /> + app:drawableStartCompat="@drawable/login_error" + tools:text="ddddd" + tools:visibility="visible" />