From c31be55fe6557797dd164f4d507f334b21b66dac Mon Sep 17 00:00:00 2001 From: maxinyu Date: Thu, 21 May 2026 09:49:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=AA=E4=BA=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../defenseapplication/bean/UpdateUserInfo.kt | 18 ++++ .../home/PersonalFragment.kt | 64 +++++++++++- .../personal/PersonalProfileActivity.kt | 99 ++++++++++++++++--- .../defenseapplication/utils/ApiService.kt | 15 +++ .../view/PhoneModifyDialogFragment.kt | 28 +++++- app/src/main/res/layout/personal_fragment.xml | 3 +- app/src/main/res/values/strings.xml | 2 + 7 files changed, 212 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/com/example/defenseapplication/bean/UpdateUserInfo.kt diff --git a/app/src/main/java/com/example/defenseapplication/bean/UpdateUserInfo.kt b/app/src/main/java/com/example/defenseapplication/bean/UpdateUserInfo.kt new file mode 100644 index 0000000..cfcdc5f --- /dev/null +++ b/app/src/main/java/com/example/defenseapplication/bean/UpdateUserInfo.kt @@ -0,0 +1,18 @@ +package com.example.defenseapplication.bean + +data class UpdateUserInfo( + val userId: String?=null, + val nickName: String?=null, + val idCard: String?=null, + val userType: String?=null, + val phonenumber: String?=null, + val avatar: String?=null, + val password: String?=null, + val status: String?=null, + val faceAddr: String?=null, + val mac: String?=null, + val remark: String?=null, + val smsCoode: String?=null, + val optionPassword: String?=null, + val optionStatus: String?=null, +) \ No newline at end of file diff --git a/app/src/main/java/com/example/defenseapplication/home/PersonalFragment.kt b/app/src/main/java/com/example/defenseapplication/home/PersonalFragment.kt index 6fe88e7..0e3626f 100644 --- a/app/src/main/java/com/example/defenseapplication/home/PersonalFragment.kt +++ b/app/src/main/java/com/example/defenseapplication/home/PersonalFragment.kt @@ -9,6 +9,7 @@ import android.view.ViewGroup import android.widget.Toast import com.bumptech.glide.Glide import com.example.defenseapplication.R +import com.example.defenseapplication.bean.UserInfoBean import com.example.defenseapplication.databinding.PersonalFragmentBinding import com.example.defenseapplication.liveVideo.LinkedUserActivity import com.example.defenseapplication.personal.PasswordManagementActivity @@ -44,8 +45,25 @@ class PersonalFragment : Fragment() { .circleCrop() .into(binding.ivAvatar) binding.headerLayout.setOnClickListener { - val intent= Intent(requireContext(), PersonalProfileActivity::class.java) - startActivity(intent) + CoroutineScope(Dispatchers.IO).launch { + try { + val response = RetrofitNetwork.getNetworkService().getUserInfo() + withContext(Dispatchers.Main) { + if (response.code == 200 && response.data != null) { + val intent = Intent(requireContext(), PersonalProfileActivity::class.java) + intent.putExtra("userInfo", response.data) + startActivity(intent) + } else { + val intent = Intent(requireContext(), PersonalProfileActivity::class.java) + startActivity(intent) + } + } + } catch (e: Exception) { + e.printStackTrace() + val intent = Intent(requireContext(), PersonalProfileActivity::class.java) + startActivity(intent) + } + } } // 更新当前语言显示 updateCurrentLanguageDisplay() @@ -157,6 +175,48 @@ class PersonalFragment : Fragment() { } } + override fun onResume() { + super.onResume() + fetchUserInfo() + } + + private fun fetchUserInfo() { + CoroutineScope(Dispatchers.IO).launch { + try { + val response = RetrofitNetwork.getNetworkService().getUserInfo() + withContext(Dispatchers.Main) { + if (response.code == 200 && response.data != null) { + updateUserUI(response.data) + } + } + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + private fun updateUserUI(userInfo: UserInfoBean) { + userInfo.nickName?.let { + binding.tvNickname.text = it + } + userInfo.phonenumber?.let { + binding.tvPhone.text = it + } + userInfo.avatar?.let { + Glide.with(this) + .load(it) + .circleCrop() + .into(binding.ivAvatar) + } + userInfo.role?.let { + binding.tvRoleTag.text = if (it == "appadmin") { + getString(R.string.admin) + } else { + getString(R.string.member) + } + } + } + override fun onDestroyView() { super.onDestroyView() _binding = null // 避免内存泄漏 diff --git a/app/src/main/java/com/example/defenseapplication/personal/PersonalProfileActivity.kt b/app/src/main/java/com/example/defenseapplication/personal/PersonalProfileActivity.kt index 3e3cddb..3f47b8b 100644 --- a/app/src/main/java/com/example/defenseapplication/personal/PersonalProfileActivity.kt +++ b/app/src/main/java/com/example/defenseapplication/personal/PersonalProfileActivity.kt @@ -6,16 +6,23 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import android.widget.Toast - import com.bumptech.glide.Glide import com.example.defenseapplication.R +import com.example.defenseapplication.bean.UpdateUserInfo +import com.example.defenseapplication.bean.UserInfoBean import com.example.defenseapplication.databinding.PersonalProfileActivityBinding +import com.example.defenseapplication.utils.RetrofitNetwork import com.example.defenseapplication.view.CustomDialogFragmentText import com.example.defenseapplication.view.PhoneModifyDialogFragment import com.gyf.immersionbar.ImmersionBar -//个人信息 +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + class PersonalProfileActivity : AppCompatActivity() { private lateinit var binding: PersonalProfileActivityBinding + private var userInfo: UserInfoBean? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -25,6 +32,7 @@ class PersonalProfileActivity : AppCompatActivity() { .statusBarDarkFont(true) .titleBar(binding.topBar) .init() + userInfo = intent.getParcelableExtra("userInfo", UserInfoBean::class.java) initView() } @@ -33,13 +41,29 @@ class PersonalProfileActivity : AppCompatActivity() { finish() } - Glide.with(this) - .load(R.drawable.img) - .circleCrop() - .into(binding.ivAvatar) + userInfo?.let { info -> + info.avatar?.let { avatarUrl -> + Glide.with(this) + .load(avatarUrl) + .circleCrop() + .into(binding.ivAvatar) + } ?: run { + Glide.with(this) + .load(R.drawable.img) + .circleCrop() + .into(binding.ivAvatar) + } - binding.tvNickname.text = getString(R.string.nickname_default) - binding.tvPhone.text = "13589898989" + binding.tvNickname.text = info.nickName ?: getString(R.string.nickname_default) + binding.tvPhone.text = info.phonenumber ?: "13589898989" + } ?: run { + Glide.with(this) + .load(R.drawable.img) + .circleCrop() + .into(binding.ivAvatar) + binding.tvNickname.text = getString(R.string.nickname_default) + binding.tvPhone.text = "13589898989" + } binding.itemNickname.setOnClickListener { showNicknameDialog() @@ -62,22 +86,73 @@ class PersonalProfileActivity : AppCompatActivity() { .setNegativeText("") .setOnConfirmListener { newNickname -> if (newNickname.isNotBlank()) { - binding.tvNickname.text = newNickname - Toast.makeText(this, getString(R.string.operation_success), Toast.LENGTH_SHORT).show() + updateNickname(newNickname) } } dialog.show(supportFragmentManager, "nickname_dialog") } + private fun updateNickname(newNickname: String) { + CoroutineScope(Dispatchers.IO).launch { + try { + val request = UpdateUserInfo( + userId = userInfo?.userId, + nickName = newNickname + ) + val response = RetrofitNetwork.getNetworkService().updateUserInfo(request) + withContext(Dispatchers.Main) { + if (response.code == 200) { + binding.tvNickname.text = newNickname + userInfo = userInfo?.copy(nickName = newNickname) + Toast.makeText(this@PersonalProfileActivity, getString(R.string.operation_success), Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(this@PersonalProfileActivity, getString(R.string.operation_failed), Toast.LENGTH_SHORT).show() + } + } + } catch (e: Exception) { + e.printStackTrace() + withContext(Dispatchers.Main) { + Toast.makeText(this@PersonalProfileActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show() + } + } + } + } + private fun showPhoneDialog() { val dialog = PhoneModifyDialogFragment() .setTitle(getString(R.string.modify_phone)) .setNegativeText(getString(R.string.cancel)) .setPositiveText(getString(R.string.verify_and_bind)) .setOnConfirmListener { phone, code -> - binding.tvPhone.text = phone - Toast.makeText(this, getString(R.string.operation_success), Toast.LENGTH_SHORT).show() + updatePhone(phone, code) } dialog.show(supportFragmentManager, "phone_dialog") } + + private fun updatePhone(phone: String, code: String) { + CoroutineScope(Dispatchers.IO).launch { + try { + val request = UpdateUserInfo( + userId = userInfo?.userId, + phonenumber = phone, + smsCoode = code + ) + val response = RetrofitNetwork.getNetworkService().updateUserInfo(request) + withContext(Dispatchers.Main) { + if (response.code == 200) { + binding.tvPhone.text = phone + userInfo = userInfo?.copy(phonenumber = phone) + Toast.makeText(this@PersonalProfileActivity, getString(R.string.operation_success), Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(this@PersonalProfileActivity, getString(R.string.operation_failed), Toast.LENGTH_SHORT).show() + } + } + } catch (e: Exception) { + e.printStackTrace() + withContext(Dispatchers.Main) { + Toast.makeText(this@PersonalProfileActivity, getString(R.string.network_error), Toast.LENGTH_SHORT).show() + } + } + } + } } diff --git a/app/src/main/java/com/example/defenseapplication/utils/ApiService.kt b/app/src/main/java/com/example/defenseapplication/utils/ApiService.kt index ed60bc4..cb693dd 100644 --- a/app/src/main/java/com/example/defenseapplication/utils/ApiService.kt +++ b/app/src/main/java/com/example/defenseapplication/utils/ApiService.kt @@ -14,6 +14,8 @@ import com.example.defenseapplication.bean.DeleteDeviceUserRequest import com.example.defenseapplication.bean.FamilyMembersBean import com.example.defenseapplication.bean.MessageGroup import com.example.defenseapplication.bean.SwitchFamilyRequest +import com.example.defenseapplication.bean.UpdateUserInfo +import com.example.defenseapplication.bean.UserInfoBean import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.POST @@ -130,5 +132,18 @@ interface ApiService { @POST("/app/addDeviceUser") suspend fun addDeviceUser(@Body request: AddDeviceUserRequest): GetCodeBean + /** + * 获取登录用户个人信息 + */ + @GET("/app/userInfo") + suspend fun getUserInfo(): GetCodeBean + /** + * 修改个人信息 + */ + @PUT("/app/updateUserInfo") + suspend fun updateUserInfo(@Body request: UpdateUserInfo): GetCodeBean + + + } diff --git a/app/src/main/java/com/example/defenseapplication/view/PhoneModifyDialogFragment.kt b/app/src/main/java/com/example/defenseapplication/view/PhoneModifyDialogFragment.kt index 190f022..9b2d65a 100644 --- a/app/src/main/java/com/example/defenseapplication/view/PhoneModifyDialogFragment.kt +++ b/app/src/main/java/com/example/defenseapplication/view/PhoneModifyDialogFragment.kt @@ -12,6 +12,11 @@ import android.view.WindowManager import androidx.fragment.app.DialogFragment import com.example.defenseapplication.R import com.example.defenseapplication.databinding.DialogPhoneModifyBinding +import com.example.defenseapplication.utils.RetrofitNetwork +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext //手机号弹窗 class PhoneModifyDialogFragment : DialogFragment() { @@ -86,7 +91,7 @@ class PhoneModifyDialogFragment : DialogFragment() { ToastUtils.showToast(requireContext(), getString(R.string.invalid_phone)) return@setOnClickListener } - startCountDown() + sendCode(phone) } binding.btnNegative.setOnClickListener { @@ -109,6 +114,27 @@ class PhoneModifyDialogFragment : DialogFragment() { } } + private fun sendCode(phone: String) { + CoroutineScope(Dispatchers.IO).launch { + try { + val response = RetrofitNetwork.getNetworkService().getCode(phone) + withContext(Dispatchers.Main) { + if (response.code == 200) { + ToastUtils.showToast(requireContext(), getString(R.string.code_sent_success)) + startCountDown() + } else { + ToastUtils.showToast(requireContext(), getString(R.string.code_send_failed)) + } + } + } catch (e: Exception) { + e.printStackTrace() + withContext(Dispatchers.Main) { + ToastUtils.showToast(requireContext(), getString(R.string.network_error)) + } + } + } + } + private fun startCountDown() { binding.tvSendCode.isEnabled = false countDownTimer = object : CountDownTimer(60000, 1000) { diff --git a/app/src/main/res/layout/personal_fragment.xml b/app/src/main/res/layout/personal_fragment.xml index 7ad70e8..68bc565 100644 --- a/app/src/main/res/layout/personal_fragment.xml +++ b/app/src/main/res/layout/personal_fragment.xml @@ -22,8 +22,7 @@ android:id="@+id/ivAvatar" android:layout_width="60dp" android:layout_height="60dp" - android:padding="2dp" - android:src="@mipmap/ic_launcher_round" /> + android:padding="2dp"/> Modified successfully Modification failed Network request failed + Verification code sent successfully + Failed to send verification code \ No newline at end of file