From 5c73f167603693d5e015193730bf16f3b6bb2bf5 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期二, 25 三月 2025 13:47:54 +0800 Subject: [PATCH] fix 1111 --- /dev/null | 0 app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | 14 +-- app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt | 91 +++++++++++++++++++--- app/src/main/res/values/strings.xml | 2 app/src/main/res/layout/activity_edit_profile.xml | 4 app/src/main/java/com/example/firstapp/model/UpdateProfileRequest.kt | 1 app/src/main/java/com/example/firstapp/database/service/ApiService.kt | 11 ++ app/src/main/res/drawable/me_ai_assistant.xml | 21 +++++ app/src/main/res/layout/fragment_notifications.xml | 38 +++++++-- app/src/main/res/values/colors.xml | 2 app/build.gradle | 2 app/src/main/java/com/example/firstapp/database/response/UserInfo.kt | 1 12 files changed, 152 insertions(+), 35 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5dbd017..6ae6903 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -277,4 +277,6 @@ implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' + implementation 'com.squareup.okhttp3:okhttp:4.9.0' + } \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt b/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt index a9c0cec..3e5c46c 100644 --- a/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt +++ b/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt @@ -7,5 +7,6 @@ val cover: String, val contactTel: String, val passTime: String, + val overTime: String, val showed: Boolean ) \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt index b563cd2..691f7ab 100644 --- a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt +++ b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt @@ -7,10 +7,14 @@ import com.example.firstapp.database.response.LoginResponse import com.example.firstapp.database.response.SecurityResponse import com.example.firstapp.database.response.UserInfo +import okhttp3.MultipartBody +import okhttp3.RequestBody import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import retrofit2.http.GET +import retrofit2.http.Multipart import retrofit2.http.POST +import retrofit2.http.Part import retrofit2.http.Path import retrofit2.http.Query @@ -39,6 +43,13 @@ @GET("flower/api/supplier/info/{phone}") suspend fun getUserInfo(@Path("phone") phone: String): ApiResponse<UserInfo> + + @Multipart + @POST("api/supplier/operation/update") + suspend fun updateProfile( + @Part("nickname") nickname: RequestBody, + @Part avatar: MultipartBody.Part? + ): ApiResponse<Unit> } // 创建Retrofit实例(单例) diff --git a/app/src/main/java/com/example/firstapp/model/UpdateProfileRequest.kt b/app/src/main/java/com/example/firstapp/model/UpdateProfileRequest.kt new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/app/src/main/java/com/example/firstapp/model/UpdateProfileRequest.kt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt index 4f3ba17..ea75a47 100644 --- a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt +++ b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt @@ -13,6 +13,7 @@ import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController @@ -178,14 +179,6 @@ } // 头像点击老的处理逻辑 -// binding.layoutUserInfo.setOnClickListener { -// val intent = Intent(requireContext(), EditProfileActivity::class.java).apply { -// putExtra("nickname", binding.tvNickname.text.toString()) -// putExtra("avatar_url", binding.ivAvatar.toString()) -// } -// editProfileLauncher.launch(intent) -// } - binding.layoutUserInfo.setOnClickListener { currentUserInfo?.let { user -> val intent = Intent(requireContext(), EditProfileActivity::class.java).apply { @@ -286,8 +279,11 @@ if (userInfo.showed) { binding.ivVip.visibility = View.VISIBLE binding.cardVip.visibility = View.VISIBLE - binding.tvVipExpire.text = "${userInfo.passTime} 到期" + binding.tvVipExpire.text = "${userInfo.overTime} 到期" } else { + //非会员信息 + binding.btnRenew.text = "立即开通" + binding.linearVipContainer.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.gray)) binding.cardVip.visibility = View.GONE } } diff --git a/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt b/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt index 45d4c18..49d435c 100644 --- a/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt +++ b/app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt @@ -9,17 +9,30 @@ import android.os.Bundle import android.provider.MediaStore import android.view.View +import android.widget.ProgressBar import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.example.firstapp.databinding.ActivityEditProfileBinding +import com.example.firstapp.database.service.ApiService +import kotlinx.coroutines.launch +import java.io.File +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.RequestBody.Companion.toRequestBody class EditProfileActivity : AppCompatActivity() { private lateinit var binding: ActivityEditProfileBinding private var selectedImageUri: Uri? = null + private lateinit var apiService: ApiService + private var loadingDialog: AlertDialog? = null private val pickImage = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { @@ -69,25 +82,53 @@ binding.btnSaveBottom.setOnClickListener { saveAndFinish() } - - binding.btnSaveBottom.setOnClickListener { - saveAndFinish() - } } private fun saveAndFinish() { - val newNickname = binding.etNickname.text.toString() - if (newNickname.isEmpty()) { - Toast.makeText(this, "昵称不能为空", Toast.LENGTH_SHORT).show() - return - } + lifecycleScope.launch { + try { + binding.btnSaveBottom.isEnabled = false + showLoading() - val resultIntent = Intent().apply { - putExtra("nickname", newNickname) - putExtra("avatar_uri", selectedImageUri?.toString()) + val newNickname = binding.etNickname.text.toString() + if (newNickname.isEmpty()) { + Toast.makeText(this@EditProfileActivity, "昵称不能为空", Toast.LENGTH_SHORT).show() + return@launch + } + + // 准备文件和参数 + val nicknameBody = newNickname.toRequestBody("text/plain".toMediaType()) + + // 如果选择了新头像,处理文件 + val avatarPart = selectedImageUri?.let { uri -> + val inputStream = contentResolver.openInputStream(uri) + val file = File(cacheDir, "avatar_temp") + inputStream?.use { input -> + file.outputStream().use { output -> + input.copyTo(output) + } + } + + val requestFile = file.asRequestBody("image/*".toMediaType()) + MultipartBody.Part.createFormData("avatar", file.name, requestFile) + } + + // 调用更新接口 + apiService.updateProfile( + nickname = nicknameBody, + avatar = avatarPart + ) + + Toast.makeText(this@EditProfileActivity, "保存成功", Toast.LENGTH_SHORT).show() + finish() + + } catch (e: Exception) { + Toast.makeText(this@EditProfileActivity, "保存失败: ${e.message}", Toast.LENGTH_SHORT).show() + } finally { + binding.btnSaveBottom.isEnabled = true + hideLoading() + } } - setResult(Activity.RESULT_OK, resultIntent) - finish() } private fun checkAndRequestPermission() { @@ -130,6 +171,28 @@ pickImage.launch(intent) } + private fun showLoading() { + if (loadingDialog == null) { + loadingDialog = AlertDialog.Builder(this) + .setView(ProgressBar(this)) + .setCancelable(false) + .create() + } + loadingDialog?.show() + } + + private fun hideLoading() { + loadingDialog?.dismiss() + } + + private fun String.toRequestBody(mediaType: String): RequestBody { + return this.toRequestBody(mediaType.toMediaType()) + } + + private fun File.asRequestBody(mediaType: String): RequestBody { + return this.asRequestBody(mediaType.toMediaType()) + } + companion object { private const val PERMISSION_REQUEST_CODE = 100 } diff --git a/app/src/main/res/drawable/bg_button_black.xml b/app/src/main/res/drawable/bg_button_black.xml deleted file mode 100644 index 55bcaa7..0000000 --- a/app/src/main/res/drawable/bg_button_black.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="@android:color/black"/> - <corners android:radius="4dp"/> -</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/me_ai_assistant.png b/app/src/main/res/drawable/me_ai_assistant.png deleted file mode 100644 index 4eaeba7..0000000 --- a/app/src/main/res/drawable/me_ai_assistant.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/drawable/me_ai_assistant.xml b/app/src/main/res/drawable/me_ai_assistant.xml new file mode 100644 index 0000000..9896f27 --- /dev/null +++ b/app/src/main/res/drawable/me_ai_assistant.xml @@ -0,0 +1,21 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="48dp" + android:height="48dp" + android:viewportWidth="1024" + android:viewportHeight="1024"> + <path + android:pathData="M512,512m-512,0a512,512 0,1 0,1024 0,512 512,0 1,0 -1024,0Z" + android:fillColor="#1A78EC"/> + <path + android:pathData="M515.5,181.1a334.5,334.5 0,0 1,325.9 259.2,49.3 49.3,0 0,1 12,-1.5c32.7,0 59.2,32.8 59.2,73.2s-26.5,73.1 -59.2,73.1a48.6,48.6 0,0 1,-10.5 -1.1,334.4 334.4,0 0,1 -651.3,14.5l-0.9,0.2 -6.1,0.4C151.9,599 125.4,566.3 125.4,525.9c0,-40.4 26.5,-73.2 59.2,-73.2l2.5,0.1A334.3,334.3 0,0 1,515.5 181.1z" + android:fillColor="#FCF6F6"/> + <path + android:pathData="M243.8,250.8m189.1,0l172.1,0q189.1,0 189.1,189.1l0,151.2q0,189.1 -189.1,189.1l-172.1,0q-189.1,0 -189.1,-189.1l0,-151.2q0,-189.1 189.1,-189.1Z" + android:fillColor="#182560"/> + <path + android:pathData="M365.7,402.3m19.9,0l33.3,0q19.9,0 19.9,19.9l0,179.6q0,19.9 -19.9,19.9l-33.3,0q-19.9,0 -19.9,-19.9l0,-179.6q0,-19.9 19.9,-19.9Z" + android:fillColor="#1A78EC"/> + <path + android:pathData="M621.7,402.3m19.9,0l33.3,0q19.9,0 19.9,19.9l0,179.6q0,19.9 -19.9,19.9l-33.3,0q-19.9,0 -19.9,-19.9l0,-179.6q0,-19.9 19.9,-19.9Z" + android:fillColor="#1A78EC"/> +</vector> diff --git a/app/src/main/res/layout/activity_edit_profile.xml b/app/src/main/res/layout/activity_edit_profile.xml index d5653b2..1a86398 100644 --- a/app/src/main/res/layout/activity_edit_profile.xml +++ b/app/src/main/res/layout/activity_edit_profile.xml @@ -120,8 +120,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" - android:background="@drawable/bg_button_black" + android:backgroundTint="@color/cardview_dark_background" android:text="保存" android:textColor="@android:color/white"/> + + </LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_notifications.xml b/app/src/main/res/layout/fragment_notifications.xml index 7a1cb46..d0b76ad 100644 --- a/app/src/main/res/layout/fragment_notifications.xml +++ b/app/src/main/res/layout/fragment_notifications.xml @@ -76,6 +76,7 @@ app:cardElevation="4dp"> <LinearLayout + android:id="@+id/linearVipContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/black" @@ -88,21 +89,40 @@ android:layout_weight="1" android:orientation="vertical"> - <TextView - android:layout_width="wrap_content" + <!-- 第一行:VIP标题 + 有效期 --> + <LinearLayout + android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="VIP会员" - android:textColor="#B8741A" - android:textSize="18sp" - android:textStyle="bold" /> + android:orientation="horizontal" + android:gravity="center_vertical"> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="VIP会员 " + android:textColor="#B8741A" + android:textSize="18sp" + android:textStyle="bold"/> + + <!-- 添加间隔 --> + + <TextView + android:id="@+id/tv_vip_expire" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="#FFD700" + android:textSize="14sp"/> + </LinearLayout> + + <!-- 第二行:续费提示(上移调整) --> <TextView - android:id="@+id/tv_vip_expire" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" - android:textColor="#FFD700" - android:textSize="14sp" /> + android:text="续费畅享更多会员权益" + android:textColor="#B8741A" + android:textSize="12sp" + android:textStyle="bold"/> </LinearLayout> <Button diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0c67673..9ea2a28 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -12,7 +12,7 @@ <color name="light_blue_A200">#FF40C4FF</color> <color name="light_blue_A400">#FF00B0FF</color> <color name="black_overlay">#66000000</color> - <color name="gray">#757575</color> + <color name="gray">#757575</color> <!-- 标准灰色 #808080 主要用到到会员模块--> <color name="light_blue_50">#E1F5FE</color> <color name="tab_selected">#FF039BE5</color> <color name="light_blue_new">#02A7F0</color> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 99924ef..feb8be6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,7 +2,7 @@ <string name="app_name">智信管家</string> <string name="title_home">首页</string> <string name="title_dashboard">数据统计</string> - <string name="title_notifications">设置</string> + <string name="title_notifications">我的</string> <string name="notification_content">智信管家APP</string> -- Gitblit v1.9.3