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