From 495e43f017bf26a4d92f36341cd19ed282915998 Mon Sep 17 00:00:00 2001 From: fengjignqi <15192412330@163.com> Date: Wed, 23 Sep 2026 17:41:17 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9A=90=E7=A7=81=E6=94=BF=E7=AD=96=EF=BC=8C?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=8D=8F=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 5 + .../main/java/com/juhabi/birds/AppConfig.kt | 2 + .../juhabi/birds/login/ForgetPsdActivity.kt | 44 +++++- .../juhabi/birds/login/RegisterActivity.kt | 3 + .../com/juhabi/birds/mine/MineFragment.kt | 22 ++- .../juhabi/birds/mine/UpdateUserAccount.kt | 87 +++++++--- .../com/juhabi/birds/mine/WebviewActivity.kt | 148 ++++++++++++++++++ .../juhabi/birds/mine/model/MineUserInfo.kt | 3 +- .../com/juhabi/birds/mine/mvp/MineContract.kt | 7 + .../com/juhabi/birds/mine/mvp/MineImpl.kt | 46 ++++++ .../juhabi/birds/mine/mvp/MinePresenter.kt | 135 ++++++++++++++-- .../com/juhabi/birds/network/ApiService.kt | 38 +++++ .../birds/util/manager/UserInfoManager.kt | 8 +- .../layout/activity_serivce_web_layout.xml | 37 +++++ app/src/main/res/layout/forget_psd_layout.xml | 2 + .../main/res/layout/mine_center_layout.xml | 3 +- app/src/main/res/layout/register_layout.xml | 1 + .../res/layout/update_user_phone_layout.xml | 3 +- 18 files changed, 548 insertions(+), 46 deletions(-) create mode 100644 app/src/main/java/com/juhabi/birds/mine/WebviewActivity.kt create mode 100644 app/src/main/res/layout/activity_serivce_web_layout.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1051641..e1da272 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -85,6 +85,11 @@ android:name=".mine.UpdateUserAccount" android:exported="false" /> + + + () LoginContract.LoginView, View.OnClickListener { private var codeCountDownTimer: CountDownTimer? = null + private var resetByPhone = true private var isPasswordVisible = false private var isConfirmPasswordVisible = false @@ -52,6 +53,7 @@ class ForgetPsdActivity : BaseActivity() binding.passwordVisibilityButton, binding.confirmPasswordVisibilityButton, binding.confirmButton, + binding.tvChangeLoginType, ).forEach { view -> view.setOnClickListener(this) } @@ -63,13 +65,35 @@ class ForgetPsdActivity : BaseActivity() finish() } + R.id.tv_change_login_type ->{ + resetByPhone = !resetByPhone + binding.linearCountry.visibility = if (resetByPhone) View.VISIBLE else View.GONE + binding.imgLoginType.setImageResource( + if (resetByPhone) R.mipmap.icon_login_phone else R.mipmap.icon_login_email + ) + binding.tvChangeLoginType.text = if (resetByPhone) "邮箱" else "手机" + binding.phoneEditText.apply { + text?.clear() + hint = if (resetByPhone) "请输入手机号" else "请输入邮箱" + inputType = if (resetByPhone) { + InputType.TYPE_CLASS_PHONE + } else { + InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS + } + } + } + R.id.getCodeButton -> {//获取验证码 - val phone = binding.phoneEditText.text.toString().trim() - if (phone.isBlank()) { - ToastUtil.showShort(mContext, "手机号不能为空") + val account = binding.phoneEditText.text.toString().trim() + if (account.isBlank()) { + ToastUtil.showShort(mContext, if (resetByPhone) "手机号不能为空" else "邮箱不能为空") return } - presenter?.getPhoneSmsCode(phone, AppConfig.SEND_CODE_SCENE_RESET) + if (resetByPhone) { + presenter?.getPhoneSmsCode(account, AppConfig.SEND_CODE_SCENE_RESET) + } else { + presenter?.getEmailSmsCode(account, AppConfig.SEND_CODE_SCENE_RESET) + } } R.id.passwordVisibilityButton -> { @@ -83,13 +107,13 @@ class ForgetPsdActivity : BaseActivity() } R.id.confirmButton -> {//修改密码 - val phone = binding.phoneEditText.text.toString().trim() + val account = binding.phoneEditText.text.toString().trim() val code = binding.codeEditText.text.toString().trim() val password = binding.passwordEditText.text.toString() val confirmPassword = binding.confirmPasswordEditText.text.toString() - if (phone.isBlank()) { - ToastUtil.showShort(mContext, "手机号不能为空") + if (account.isBlank()) { + ToastUtil.showShort(mContext, if (resetByPhone) "手机号不能为空" else "邮箱不能为空") return } if (code.isBlank()) { @@ -116,7 +140,11 @@ class ForgetPsdActivity : BaseActivity() return } - presenter?.forgetPsdByPhone(phone, code, password) + if (resetByPhone) { + presenter?.forgetPsdByPhone(account, code, password) + } else { + presenter?.forgetPsdByEmail(account, code, password) + } } } } diff --git a/app/src/main/java/com/juhabi/birds/login/RegisterActivity.kt b/app/src/main/java/com/juhabi/birds/login/RegisterActivity.kt index 04b2983..7a104f0 100644 --- a/app/src/main/java/com/juhabi/birds/login/RegisterActivity.kt +++ b/app/src/main/java/com/juhabi/birds/login/RegisterActivity.kt @@ -74,6 +74,9 @@ class RegisterActivity : BaseActivity(), R.id.tv_change_login_type ->{ registerByPhone = !registerByPhone binding.linearCountry.visibility = if (registerByPhone) View.VISIBLE else View.GONE + binding.imgLoginType.setImageResource( + if (registerByPhone) R.mipmap.icon_login_phone else R.mipmap.icon_login_email + ) binding.tvChangeLoginType.text = if (registerByPhone) "邮箱" else "手机" binding.phoneEditText.apply { text?.clear() diff --git a/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt b/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt index 719f49e..1828191 100644 --- a/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt +++ b/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt @@ -68,6 +68,14 @@ class MineFragment : BaseFragment(), goTo(UpdateUserAccount::class.java, null) } + R.id.linear_ysxy -> { + openAgreementPage(WebviewActivity.PAGE_PRIVACY, AppConfig.PRIVACY_POLICY_URL) + } + + R.id.linear_yhxy -> { + openAgreementPage(WebviewActivity.PAGE_AGREEMENT, AppConfig.USER_AGREEMENT_URL) + } + R.id.linear_qchc -> { showDialogtext( "提示", @@ -130,14 +138,26 @@ class MineFragment : BaseFragment(), } } + private fun openAgreementPage(page: Int, url: String) { + goTo( + WebviewActivity::class.java, + Bundle().apply { + putInt(WebviewActivity.EXTRA_PAGE, page) + putString(WebviewActivity.EXTRA_URL, url) + } + ) + } + /** 将个人信息请求结果更新到个人中心页面。 */ override fun getUserInfoSuccess(userInfo: MineUserInfo) { val displayName = userInfo.userName.ifBlank { "未设置用户名" } - val displayAccount = userInfo.phoneNumber + val displayAccount = userInfo.nickName ?.ifBlank { null } ?: "未绑定手机号" binding.tvUserName.text = displayName binding.tvUserAccount.text = displayAccount + binding.tvChangeBindAccount.text = if (userInfo.phoneBound == true) "换绑手机号" else "换绑邮箱" + if (userInfo.avatar.isNullOrBlank()) { binding.imgAvatar.setImageResource(R.mipmap.icon_mine_user_head_defaul) } diff --git a/app/src/main/java/com/juhabi/birds/mine/UpdateUserAccount.kt b/app/src/main/java/com/juhabi/birds/mine/UpdateUserAccount.kt index 92c7db8..47c4801 100644 --- a/app/src/main/java/com/juhabi/birds/mine/UpdateUserAccount.kt +++ b/app/src/main/java/com/juhabi/birds/mine/UpdateUserAccount.kt @@ -2,6 +2,7 @@ package com.juhabi.birds.mine import android.os.Bundle import android.os.CountDownTimer +import android.text.InputType import android.view.LayoutInflater import android.view.View import com.gyf.immersionbar.ImmersionBar @@ -24,6 +25,7 @@ class UpdateUserAccount : BaseActivity{ - // 新接口根据登录态识别当前手机号,不需要传手机号或验证码场景。 - presenter?.getCurrentPhoneCode() + if (userLoginByPhone) presenter?.getCurrentPhoneCode() + else presenter?.getCurrentEmailCode() } R.id.tv_confirmAccount ->{ @@ -76,25 +84,27 @@ class UpdateUserAccount : BaseActivity{ - // 新手机号不能为空,校验通过后使用 rebind 场景发送验证码。 - val newPhone = binding.etNewPhone.text.toString().trim() - if (newPhone.isBlank()) { - ToastUtil.showShort(mContext, "新手机号不能为空") + // 新账号不能为空,按手机号或邮箱模式发送 rebind 验证码。 + val newAccount = binding.etNewPhone.text.toString().trim() + if (newAccount.isBlank()) { + ToastUtil.showShort(mContext, if (userLoginByPhone) "新手机号不能为空" else "新邮箱不能为空") return } - presenter?.sendNewPhoneCode(newPhone) + if (userLoginByPhone) presenter?.sendNewPhoneCode(newAccount) + else presenter?.sendNewEmailCode(newAccount) } R.id.tv_submit_new_account ->{ - //绑定新的手机号码 - val newPhone = binding.etNewPhone.text.toString().trim() + // 根据当前换绑类型提交新手机号或新邮箱。 + val newAccount = binding.etNewPhone.text.toString().trim() val code = binding.etNewPhoneCode.text.toString().trim() - if (newPhone.isBlank()) { - ToastUtil.showShort(mContext, "新手机号不能为空") + if (newAccount.isBlank()) { + ToastUtil.showShort(mContext, if (userLoginByPhone) "新手机号不能为空" else "新邮箱不能为空") return } if (code.isBlank()) { @@ -102,8 +112,8 @@ class UpdateUserAccount : BaseActivity() { + + override fun showError(message: String) { + showMessage(message) + } + + override fun initWindows() { + supportActionBar?.hide() + ImmersionBar.with(this) + .transparentStatusBar() + .statusBarColor(com.juhabi.birds.R.color.color_zhu) + .statusBarDarkFont(true) + .navigationBarColor(com.juhabi.birds.R.color.color_zhu) + .navigationBarDarkIcon(true) + .titleBar(binding.rlTitle) + .init() + } + + override fun createBinding(inflater: LayoutInflater): ActivitySerivceWebLayoutBinding { + return ActivitySerivceWebLayoutBinding.inflate(inflater) + } + + override fun createPresenter(): MinePresenter? = null + + override fun initView(savedInstanceState: Bundle?) { + val pageCode = intent.getIntExtra( + EXTRA_PAGE, + intent.getIntExtra(LEGACY_EXTRA_PAGE, PAGE_AGREEMENT) + ) + val page = when (pageCode) { + PAGE_PRIVACY -> "隐私政策" to "privacy_policy.html" + PAGE_AGREEMENT -> "用户协议" to "user_agreement.html" + else -> null + } + if (page == null) { + showMessage("页面参数无效") + finish() + return + } + + binding.includeTitle.tvTitle.text = page.first + binding.includeTitle.imgBack.setOnClickListener { finish() } + val pageUrl = intent.getStringExtra(EXTRA_URL) + + binding.webview.apply { + visibility = View.VISIBLE + setBackgroundColor(Color.WHITE) + settings.javaScriptEnabled = false + settings.domStorageEnabled = false + settings.allowFileAccess = false + settings.allowContentAccess = false + settings.setSupportZoom(false) + settings.builtInZoomControls = false + settings.displayZoomControls = false + settings.allowFileAccessFromFileURLs = false + settings.allowUniversalAccessFromFileURLs = false + addJavascriptInterface(PageBridge(), "Android") + webViewClient = AgreementWebViewClient() + loadUrl(pageUrl?.takeIf(String::isNotBlank) ?: "file:///android_asset/${page.second}") + } + } + + override fun onBackPressed() { + if (binding.webview.canGoBack()) { + binding.webview.goBack() + } else { + super.onBackPressed() + } + } + + override fun onDestroy() { + binding.webview.apply { + stopLoading() + removeJavascriptInterface("Android") + webViewClient = WebViewClient() + destroy() + } + super.onDestroy() + } + + private inner class AgreementWebViewClient : WebViewClient() { + override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { + return handleUrl(view, request.url) + } + + @Suppress("DEPRECATION") + override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { + return handleUrl(view, Uri.parse(url)) + } + + private fun handleUrl(view: WebView, uri: Uri): Boolean { + if (uri.scheme == "file" && uri.host == "android_asset") return false + if (uri.scheme == "http" || uri.scheme == "https" || uri.scheme == "mailto") { + return try { + startActivity(Intent(Intent.ACTION_VIEW, uri)) + true + } catch (_: Exception) { + showMessage("无法打开此链接") + true + } + } + return true + } + + override fun onReceivedError( + view: WebView, + request: WebResourceRequest, + error: WebResourceError + ) { + super.onReceivedError(view, request, error) + if (request.isForMainFrame) showMessage("页面加载失败,请稍后重试") + } + } + + private inner class PageBridge { + @JavascriptInterface + fun finishActivity() { + runOnUiThread { finish() } + } + } + + companion object { + const val EXTRA_PAGE = "from_request_code" + const val EXTRA_URL = "webview_url" + const val LEGACY_EXTRA_PAGE = "from_requse_code" + const val PAGE_AGREEMENT = 10001 + const val PAGE_PRIVACY = 10002 + } +} diff --git a/app/src/main/java/com/juhabi/birds/mine/model/MineUserInfo.kt b/app/src/main/java/com/juhabi/birds/mine/model/MineUserInfo.kt index e072ce1..5b9ec19 100644 --- a/app/src/main/java/com/juhabi/birds/mine/model/MineUserInfo.kt +++ b/app/src/main/java/com/juhabi/birds/mine/model/MineUserInfo.kt @@ -11,5 +11,6 @@ data class MineUserInfo( val phoneBound: Boolean = false, val userType: String = "", val createTime: String = "", - val avatar: String? = null + val avatar: String? = null, + val userLoginByPhone : Boolean = false ) diff --git a/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt b/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt index 22afa3d..898fcc5 100644 --- a/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt +++ b/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt @@ -21,13 +21,17 @@ interface MineContract { ) fun modifyPassword(oldPassword: String, newPassword: String, callback: Callback) fun getCurrentPhoneCode(callback: Callback>) + fun getCurrentEmailCode(callback: Callback>) fun sendPhoneCode(request: JSONObject, callback: Callback>) + fun sendEmailCode(request: JSONObject, callback: Callback>) fun verifyOldPhone(oldCode: String, callback: Callback>) + fun verifyOldEmail(oldCode: String, callback: Callback>) fun updateBindNewPhone( newPhoneNumber: String, code: String, callback: Callback> ) + fun updateBindNewEmail(newEmail: String, code: String, callback: Callback>) fun userLogout(callback: Callback>) fun userLogoff(callback: Callback>) fun cancel() @@ -46,6 +50,9 @@ interface MineContract { fun onVerifyOldPhoneSuccess(message: String) {} /** 新手机号绑定成功回调。 */ fun onUpdateBindNewPhoneSuccess(message: String) {} + fun onUpdateBindNewEmailSuccess(message: String) {} + fun onVerifyOldEmailSuccess(message: String) {} + fun newEmailCodeSuccess(message: String) {} /** 退出登录成功回调。 */ fun onLogoutSuccess(message: String) {} /** 注销账号成功回调。 */ diff --git a/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt b/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt index 522bbd6..3033a06 100644 --- a/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt +++ b/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt @@ -55,6 +55,17 @@ class MineImpl : MineContract.DataModel { } } + override fun getCurrentEmailCode(callback: MineContract.Callback>) { + ApiClient.apiService.getCurrentEmailCode(NetworkManager.getToken()).enqueue(object : Callback> { + override fun onResponse(call: Call>, response: Response>) { + mainHandler.post { response.body()?.let(callback::success) ?: callback.fail("验证码发送失败") } + } + override fun onFailure(call: Call>, error: Throwable) { + if (!call.isCanceled) mainHandler.post { callback.fail(error.message ?: "网络请求失败") } + } + }) + } + override fun sendPhoneCode( request: JSONObject, callback: MineContract.Callback> @@ -86,6 +97,17 @@ class MineImpl : MineContract.DataModel { } } + override fun sendEmailCode(request: JSONObject, callback: MineContract.Callback>) { + ApiClient.apiService.sendEmailCode(NetworkManager.getToken(), NetworkManager.toRequestBody(request)).enqueue(object : Callback> { + override fun onResponse(call: Call>, response: Response>) { + mainHandler.post { response.body()?.let(callback::success) ?: callback.fail("验证码发送失败") } + } + override fun onFailure(call: Call>, error: Throwable) { + if (!call.isCanceled) mainHandler.post { callback.fail(error.message ?: "网络请求失败") } + } + }) + } + override fun verifyOldPhone( oldCode: String, callback: MineContract.Callback> @@ -119,6 +141,18 @@ class MineImpl : MineContract.DataModel { } } + override fun verifyOldEmail(oldCode: String, callback: MineContract.Callback>) { + val body = JSONObject().apply { put("oldCode", oldCode.trim()) } + ApiClient.apiService.verifyOldEmail(NetworkManager.getToken(), NetworkManager.toRequestBody(body)).enqueue(object : Callback> { + override fun onResponse(call: Call>, response: Response>) { + mainHandler.post { response.body()?.let(callback::success) ?: callback.fail("当前邮箱验证失败") } + } + override fun onFailure(call: Call>, error: Throwable) { + if (!call.isCanceled) mainHandler.post { callback.fail(error.message ?: "网络请求失败") } + } + }) + } + override fun updateBindNewPhone( newPhoneNumber: String, code: String, @@ -157,6 +191,18 @@ class MineImpl : MineContract.DataModel { } } + override fun updateBindNewEmail(newEmail: String, code: String, callback: MineContract.Callback>) { + val body = JSONObject().apply { put("newEmail", newEmail.trim()); put("code", code.trim()) } + ApiClient.apiService.updateBindNewEmail(NetworkManager.getToken(), NetworkManager.toRequestBody(body)).enqueue(object : Callback> { + override fun onResponse(call: Call>, response: Response>) { + mainHandler.post { response.body()?.let(callback::success) ?: callback.fail("邮箱更换失败") } + } + override fun onFailure(call: Call>, error: Throwable) { + if (!call.isCanceled) mainHandler.post { callback.fail(error.message ?: "网络请求失败") } + } + }) + } + override fun userLogout(callback: MineContract.Callback>) { logoutCall?.cancel() logoutCall = ApiClient.apiService diff --git a/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt b/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt index ce5a24c..ad1c49f 100644 --- a/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt +++ b/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt @@ -3,8 +3,8 @@ package com.juhabi.birds.mine.mvp import com.juhabi.birds.base.BasePresenter import com.juhabi.birds.main.model.AppVersionInfo import com.juhabi.birds.mine.model.MineUserInfo -import com.juhabi.birds.network.BaseBean import com.juhabi.birds.login.model.SendCodeEntity +import com.juhabi.birds.network.BaseBean import org.json.JSONObject class MinePresenter(private val mineImpl: MineImpl) : BasePresenter() { @@ -34,6 +34,31 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter> { + override fun success(data: BaseBean) { + view?.apply { + hideLoading() + if (data.code == 0 || data.code == 200) { + sendCodeSuccess(data.message.ifBlank { "验证码已发送" }) + } else { + showError(data.message.ifBlank { "验证码发送失败" }) + } + } + } + + override fun fail(message: String) { + view?.apply { + hideLoading() + showError(message) + } + } + }) + } + /** 向新手机号发送 rebind 场景验证码。 */ fun sendNewPhoneCode(phoneNumber: String) { val currentView = view ?: return @@ -63,6 +88,35 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter> { + override fun success(data: BaseBean) { + view?.apply { + hideLoading() + if (data.code == 0 || data.code == 200) { + newEmailCodeSuccess(data.message.ifBlank { "验证码已发送" }) + } else { + showError(data.message.ifBlank { "验证码发送失败" }) + } + } + } + + override fun fail(message: String) { + view?.apply { + hideLoading() + showError(message) + } + } + }) + } + /** 校验当前手机号收到的验证码。 */ fun verifyOldPhone(oldCode: String) { val currentView = view ?: return @@ -90,6 +144,33 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter> { + override fun success(data: BaseBean) { + view?.apply { + hideLoading() + if (data.code == 0 || data.code == 200) { + onVerifyOldEmailSuccess( + data.message.ifBlank { "当前邮箱验证成功" } + ) + } else { + showError(data.message.ifBlank { "当前邮箱验证失败" }) + } + } + } + + override fun fail(message: String) { + view?.apply { + hideLoading() + showError(message) + } + } + }) + } + /** 提交新手机号和验证码,完成手机号换绑。 */ fun updateBindNewPhone(newPhoneNumber: String, code: String) { val currentView = view ?: return @@ -121,6 +202,33 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter> { + override fun success(data: BaseBean) { + view?.apply { + hideLoading() + if (data.code == 0 || data.code == 200) { + onUpdateBindNewEmailSuccess( + data.message.ifBlank { "邮箱更换成功" } + ) + } else { + showError(data.message.ifBlank { "邮箱更换失败" }) + } + } + } + + override fun fail(message: String) { + view?.apply { + hideLoading() + showError(message) + } + } + }) + } + /** 调用服务端退出登录接口,并统一分发成功或失败结果。 */ fun userLogout() { val currentView = view ?: return @@ -175,21 +283,20 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter { - override fun success(data: MineUserInfo) { - view?.apply { - hideLoading() - getUserInfoSuccess(data) - } - } - - override fun fail(message: String) { - view?.apply { - hideLoading() - showError(message) - } + override fun success(data: MineUserInfo) { + view?.apply { + hideLoading() + getUserInfoSuccess(data) } } - ) + + override fun fail(message: String) { + view?.apply { + hideLoading() + showError(message) + } + } + }) } fun checkVersion(currentVersion: String) { diff --git a/app/src/main/java/com/juhabi/birds/network/ApiService.kt b/app/src/main/java/com/juhabi/birds/network/ApiService.kt index 1b82c0d..7078b68 100644 --- a/app/src/main/java/com/juhabi/birds/network/ApiService.kt +++ b/app/src/main/java/com/juhabi/birds/network/ApiService.kt @@ -235,6 +235,44 @@ interface ApiService { fun updateBindNewPhone(@HeaderMap headers: Map, @Body requestBody: RequestBody): Call> + /*****************************************************************************************************************************************/ + + + + /** + * 验证原邮箱号--发送短信 + * + * 不需要任何入参, + */ + @POST("app/user/email/old-code") + fun getCurrentEmailCode(@HeaderMap headers: Map): Call> + + + /** + * 验证原邮箱号--验证邮箱号 + * + * 入参 + *{ + * "oldCode": "123456" + * } + * + */ + @POST("app/user/email/verify-old") + fun verifyOldEmail(@HeaderMap headers: Map, @Body requestBody: RequestBody): Call> + + + /** + * 更换新的绑定邮箱号 + { + "newEmail": "string", + "code": "string" + } + */ + @PUT("app/user/email") + fun updateBindNewEmail(@HeaderMap headers: Map, @Body requestBody: RequestBody): Call> + + + /*****************************************************************************************************************************************/ /** * 退出登录 * diff --git a/app/src/main/java/com/juhabi/birds/util/manager/UserInfoManager.kt b/app/src/main/java/com/juhabi/birds/util/manager/UserInfoManager.kt index e6ef07c..4896049 100644 --- a/app/src/main/java/com/juhabi/birds/util/manager/UserInfoManager.kt +++ b/app/src/main/java/com/juhabi/birds/util/manager/UserInfoManager.kt @@ -40,7 +40,13 @@ object UserInfoManager { @JvmStatic fun setUserInfo(userInfo: MineUserInfo) { - setUserInfo(MyApplication.appContext, userInfo) + val loginByPhone = userInfo.email.isNullOrBlank() + val normalizedUserInfo = userInfo.copy( + email = if (loginByPhone) "" else userInfo.email, + phoneNumber = if (loginByPhone) userInfo.phoneNumber else "", + userLoginByPhone = loginByPhone + ) + setUserInfo(MyApplication.appContext, normalizedUserInfo) } @JvmStatic diff --git a/app/src/main/res/layout/activity_serivce_web_layout.xml b/app/src/main/res/layout/activity_serivce_web_layout.xml new file mode 100644 index 0000000..e388ff4 --- /dev/null +++ b/app/src/main/res/layout/activity_serivce_web_layout.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/forget_psd_layout.xml b/app/src/main/res/layout/forget_psd_layout.xml index 9e0b28f..44b87e3 100644 --- a/app/src/main/res/layout/forget_psd_layout.xml +++ b/app/src/main/res/layout/forget_psd_layout.xml @@ -43,11 +43,13 @@ android:paddingStart="14dp"> + android:text="换绑"/> @@ -135,6 +135,7 @@ android:paddingStart="14dp">