From f980c833f832c42094cf78005aab5d0eb014c8ec Mon Sep 17 00:00:00 2001
From: zhujie <leon.zhu@cloudroam.com.cn>
Date: 星期五, 18 四月 2025 15:23:58 +0800
Subject: [PATCH] 邀请有礼

---
 app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt                |    6 
 app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt |    2 
 app/src/main/res/drawable/table_border.xml                                       |    7 
 app/src/main/res/xml/file_paths.xml                                              |    5 
 app/src/main/res/layout/activity_invitation_main.xml                             |  289 ++++++++++++++-----------
 app/src/main/AndroidManifest.xml                                                 |    9 
 app/src/main/res/xml/network_security_config.xml                                 |    1 
 app/src/main/java/com/example/firstapp/database/service/ApiService.kt            |    9 
 app/src/main/res/drawable/table_cell_border.xml                                  |    4 
 app/src/main/res/layout/dialog_image_preview.xml                                 |   24 ++
 app/src/main/res/drawable/invite.png                                             |    0 
 app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt       |  250 +++++++++++++++-------
 12 files changed, 396 insertions(+), 210 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4004bcd..a5aca2e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -158,6 +158,15 @@
             android:name=".activity.ReminderSettingsActivity"
             android:exported="false"
             android:label="设置提醒" />
+        <provider
+            android:name="androidx.core.content.FileProvider"
+            android:authorities="${applicationId}.fileprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths" />
+        </provider>
     </application>
 
 </manifest>
\ 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 989348b..68a299b 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
@@ -14,6 +14,8 @@
 import com.example.firstapp.database.response.LoginResponse
 import com.example.firstapp.database.response.SecurityResponse
 import com.example.firstapp.database.response.UserInfo
+import com.example.firstapp.entity.InvitationRecord
+import com.example.firstapp.entity.InvitationRecords
 import com.example.firstapp.model.CategoryConfig
 import com.example.firstapp.model.CategoryConfigSync
 import com.example.firstapp.network.AuthInterceptor
@@ -81,13 +83,16 @@
     @POST("api/categoryConfig/saveOrUpdate/")
     suspend fun saveUserCategories(@Body categoryConfigSync: CategoryConfigSync)
 
+    @GET("api/customer/center/invitereward")
+    suspend fun getInvitereward(): ApiResponse<InvitationRecords>
+
 }
 
 // 创建Retrofit实例(单例)
 object RetrofitClient{
 
- //   private const val BASE_URL ="http://192.168.1.213:8080/flower/"
-    private const val BASE_URL ="http://14.103.144.28:8080/flower/"
+    private const val BASE_URL ="http://192.168.1.127:8080/flower/"
+    //private const val BASE_URL ="http://14.103.144.28:8080/flower/"
 
     private lateinit var appContext: Context
 
diff --git a/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
index d131854..eb514c9 100644
--- a/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
+++ b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
@@ -1,7 +1,13 @@
 package com.example.firstapp.entity
 
 data class InvitationRecord(
+    val userId: String,
     val userName: String,
     val reward: String,
     val status: String
+)
+
+data class InvitationRecords(
+    val successInvite: List<InvitationRecord>,
+    val myInvite: List<InvitationRecord>
 )
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
index 353707d..2bc9633 100644
--- a/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
+++ b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
@@ -1,9 +1,14 @@
 package com.example.firstapp.ui.invitation
 
+import android.app.Dialog
 import android.content.ClipData
 import android.content.ClipboardManager
 import android.content.Context
 import android.content.Intent
+import android.graphics.Bitmap
+import android.graphics.Color
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.ColorDrawable
 import android.net.Uri
 import android.os.Bundle
 import android.os.Handler
@@ -11,18 +16,32 @@
 import android.text.Html
 import android.util.TypedValue
 import android.view.View
+import android.view.ViewGroup
 import android.widget.Button
+import android.widget.ImageView
 import android.widget.TextView
 import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.core.content.FileProvider
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.LinearSmoothScroller
 import androidx.recyclerview.widget.RecyclerView
+import com.example.firstapp.App.Companion.context
 import com.example.firstapp.R
 import com.example.firstapp.adapter.InvitationAdapter
 import com.example.firstapp.adapter.InvitationRecordAdapter
+import com.example.firstapp.database.request.SmsLoginRequest
+import com.example.firstapp.database.service.RetrofitClient
 import com.example.firstapp.entity.InvitationRecord
+import com.example.firstapp.utils.Log
 import com.example.firstapp.utils.PreferencesManager
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import java.io.File
+import java.io.FileOutputStream
 import kotlin.math.abs
 
 class InvitationActivity : AppCompatActivity() {
@@ -31,8 +50,8 @@
     private lateinit var recyclerRecordView: RecyclerView
     private lateinit var adapter: InvitationAdapter
     private lateinit var recordadapter: InvitationRecordAdapter
-    private val data = mutableListOf<InvitationRecord>()
-    private val recorddata = mutableListOf<InvitationRecord>()
+    private var data = mutableListOf<InvitationRecord>()
+    private var recorddata = mutableListOf<InvitationRecord>()
     private val handler = Handler(Looper.getMainLooper())
     private val scrollInterval = 3000L
     private var currentScrollPosition = 0
@@ -52,9 +71,10 @@
         initRecorddapter()
 
         //加载数据
-        loadData()
+        getInvitereward()
+        //loadData()
 
-        loadRecordData()
+        //loadRecordData()
 
         //启动轮播
         startAutoScroll()
@@ -62,13 +82,13 @@
         //分享
         val btnInvite = findViewById<Button>(R.id.btnInvite)
         btnInvite.setOnClickListener {
-            shareImageToWechat()
+            showImagePreviewDialog()
         }
 
         //邀请码
         val invitationCodeText = findViewById<TextView>(R.id.invitationCodeText)
-        invitationCodeText.text = "A1B2"
-        //invitationCodeText.text = formatInvitationCode(PreferencesManager.getInviteCode());
+        //invitationCodeText.text = "A1B2"
+        invitationCodeText.text = formatInvitationCode(PreferencesManager.getInviteCode());
         findViewById<Button>(R.id.copyButton).setOnClickListener {
             val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
             val clip = ClipData.newPlainText(
@@ -207,52 +227,132 @@
         recyclerRecordView.adapter = recordadapter
     }
 
-    private fun loadData() {
-        data.clear()
-        data.addAll(
-            listOf(
-                InvitationRecord("H****e", "获得了1天会员", "已注册"),
-                InvitationRecord("U****r", "获得了2天会员", "已注册"),
-                InvitationRecord("A****e", "获得了免广告特权", "已注册"),
-                InvitationRecord("B****e", "获得了3天会员", "已注册"),
-                InvitationRecord("C****o", "获得了4天会员", "已注册")
-            )
-        )
-        adapter.notifyDataSetChanged()
+    private fun getInvitereward() {
+        lifecycleScope.launch {
+            try {
+                val response = RetrofitClient.apiService.getInvitereward()
+                if (response.code == "0") {
+                    response.data?.let { records ->
+                        // 正确更新现有列表(保持原有引用)
+                        data.apply {
+                            clear()
+                            addAll(records.successInvite ?: emptyList())
+                        }
+
+                        recorddata.apply {
+                            clear()
+                            addAll(records.myInvite ?: emptyList())  // 注意这里使用myInvite
+                        }
+
+                        // 在UI线程更新适配器
+                        withContext(Dispatchers.Main) {
+                            adapter.notifyDataSetChanged()
+                            recordadapter.notifyDataSetChanged()
+                        }
+                    } ?: run {
+                        Log.w("API", "Response data is null")
+                    }
+                } else {
+                    Log.w("API", "Server error: ${response.msg}")
+                }
+            } catch (e: Exception) {
+                Log.e("getinviterewardError", "message: ${e.message}", e)
+                withContext(Dispatchers.Main) {
+                    Toast.makeText(context, "请求失败: ${e.message}", Toast.LENGTH_SHORT).show()
+                }
+            }
+        }
     }
 
-    private fun loadRecordData() {
-        recorddata.clear()
-        recorddata.addAll(
-            listOf(
-                InvitationRecord("M****e", "", "未注册"),
-                InvitationRecord("Q****r", "", "已注册"),
-                InvitationRecord("W****e", "", "未注册"),
-                InvitationRecord("E****e", "", "未注册"),
-                InvitationRecord("R****o", "", "已注册")
-            )
-        )
-        recordadapter.notifyDataSetChanged()
+//    private fun loadData() {
+//        data.clear()
+//        data.addAll(
+//            listOf(
+//                InvitationRecord("H****e", "获得了1天会员", "已注册"),
+//                InvitationRecord("U****r", "获得了2天会员", "已注册"),
+//                InvitationRecord("A****e", "获得了免广告特权", "已注册"),
+//                InvitationRecord("B****e", "获得了3天会员", "已注册"),
+//                InvitationRecord("C****o", "获得了4天会员", "已注册")
+//            )
+//        )
+//        adapter.notifyDataSetChanged()
+//    }
+
+//    private fun loadRecordData() {
+//        recorddata.clear()
+//        recorddata.addAll(
+//            listOf(
+//                InvitationRecord("M****e", "", "未注册"),
+//                InvitationRecord("Q****r", "", "已注册"),
+//                InvitationRecord("W****e", "", "未注册"),
+//                InvitationRecord("E****e", "", "未注册"),
+//                InvitationRecord("R****o", "", "已注册")
+//            )
+//        )
+//        recordadapter.notifyDataSetChanged()
+//    }
+
+    private fun showImagePreviewDialog() {
+        val dialog = Dialog(this, android.R.style.Theme_Translucent_NoTitleBar).apply {
+            // 设置全屏+透明背景
+            window?.apply {
+                setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
+                setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+            }
+
+            setContentView(R.layout.dialog_image_preview)
+            setCancelable(true) // 点击空白处可关闭
+
+            val imageView = findViewById<ImageView>(R.id.ivPreview)
+
+            // 长按分享(不关闭对话框)
+            imageView.setOnLongClickListener {
+                shareImageToWechat()
+                true
+            }
+
+            // 点击图片关闭(可选)
+            imageView.setOnClickListener {
+                dismiss()
+            }
+        }
+
+        dialog.show()
     }
+
 
     // 分享资源图片到微信
     private fun shareImageToWechat() {
         try {
-            // 获取资源图片的URI
-            val imageUri = Uri.parse("android.resource://${packageName}/${R.drawable.location}")
+            // 1. 将 drawable 图片保存到缓存目录
+            val drawable = ContextCompat.getDrawable(this, R.drawable.invite)!!
+            val bitmap = (drawable as BitmapDrawable).bitmap
 
+            // 2. 创建临时图片文件
+            val cacheDir = File(cacheDir, "shared_images").apply { mkdirs() }
+            val imageFile = File(cacheDir, "invite.jpg")  // 指定文件名
+            FileOutputStream(imageFile).use { out ->
+                bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)
+            }
+
+            // 3. 使用 FileProvider 获取 URI
+            val imageUri = FileProvider.getUriForFile(
+                this,
+                "${packageName}.fileprovider",
+                imageFile
+            )
+
+            // 4. 创建分享 Intent
             val intent = Intent().apply {
                 action = Intent.ACTION_SEND
-                type = "image/*"
+                type = "image/jpeg"
                 putExtra(Intent.EXTRA_STREAM, imageUri)
                 flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
                 setPackage("com.tencent.mm") // 指定微信包名
             }
 
-            // 创建选择器,即使微信不可用也能选择其他应用
+            // 5. 启动分享选择器
             val chooserIntent = Intent.createChooser(intent, "分享邀请图片")
-
-            // 检查是否有应用能处理这个Intent
             if (intent.resolveActivity(packageManager) != null) {
                 startActivity(chooserIntent)
             } else {
@@ -264,8 +364,8 @@
     }
 
     private fun formatInvitationCode(code: String): String {
-        return if (code.length > 2) {
-            code.chunked(2).joinToString(" ")
+        return if (code.length > 1) {
+            code.chunked(1).joinToString(" ")
         } else {
             code
         }
@@ -280,7 +380,7 @@
 
             // 使用取模运算确保位置在有效范围内
             currentScrollPosition++
-            currentRecordScrollPosition++
+            //currentRecordScrollPosition++
 
             // 创建自定义平滑滚动器
             val smoothScroller = object : LinearSmoothScroller(this@InvitationActivity) {
@@ -305,32 +405,32 @@
                 targetPosition = currentScrollPosition
             }
 
-            val smoothRecordScroller = object : LinearSmoothScroller(this@InvitationActivity) {
-                override fun getVerticalSnapPreference(): Int = SNAP_TO_START
-
-                override fun calculateDyToMakeVisible(view: View, snapPreference: Int): Int {
-                    // 计算需要滚动的距离,确保完整显示下一个item
-                    val top = view.top
-                    val height = view.height
-                    return when {
-                        snapPreference == SNAP_TO_START -> -top
-                        snapPreference == SNAP_TO_END -> -(top - (recyclerRecordView.height - height))
-                        else -> -(top - (recyclerRecordView.height / 2 - height / 2))
-                    }
-                }
-
-                override fun calculateTimeForScrolling(dx: Int): Int {
-                    // 根据滚动距离动态计算时间,保持匀速
-                    return maxOf((500f * abs(dx) / itemHeight).toInt(), 200)
-                }
-            }.apply {
-                targetPosition = currentRecordScrollPosition
-            }
+//            val smoothRecordScroller = object : LinearSmoothScroller(this@InvitationActivity) {
+//                override fun getVerticalSnapPreference(): Int = SNAP_TO_START
+//
+//                override fun calculateDyToMakeVisible(view: View, snapPreference: Int): Int {
+//                    // 计算需要滚动的距离,确保完整显示下一个item
+//                    val top = view.top
+//                    val height = view.height
+//                    return when {
+//                        snapPreference == SNAP_TO_START -> -top
+//                        snapPreference == SNAP_TO_END -> -(top - (recyclerRecordView.height - height))
+//                        else -> -(top - (recyclerRecordView.height / 2 - height / 2))
+//                    }
+//                }
+//
+//                override fun calculateTimeForScrolling(dx: Int): Int {
+//                    // 根据滚动距离动态计算时间,保持匀速
+//                    return maxOf((500f * abs(dx) / itemHeight).toInt(), 200)
+//                }
+//            }.apply {
+//                targetPosition = currentRecordScrollPosition
+//            }
 
             // 启动平滑滚动
             recyclerSuccessView.layoutManager?.startSmoothScroll(smoothScroller)
 
-            recyclerRecordView.layoutManager?.startSmoothScroll(smoothRecordScroller)
+            //recyclerRecordView.layoutManager?.startSmoothScroll(smoothRecordScroller)
 
             // 更智能的边界检测
             (recyclerSuccessView.layoutManager as? LinearLayoutManager)?.let { lm ->
@@ -345,24 +445,20 @@
                 }
             }
 
-            (recyclerRecordView.layoutManager as? LinearLayoutManager)?.let { lm ->
-                val lastVisible = lm.findLastVisibleItemPosition()
-                val totalItems = recordadapter.itemCount
-
-                // 当接近"虚拟列表"末尾时,跳转到中间位置
-                if (lastVisible >= totalItems - 3) {
-                    val jumpPosition = (totalItems / 2) * (Int.MAX_VALUE / totalItems)
-                    currentRecordScrollPosition = jumpPosition
-                    recyclerRecordView.scrollToPosition(jumpPosition)
-                }
-            }
+//            (recyclerRecordView.layoutManager as? LinearLayoutManager)?.let { lm ->
+//                val lastVisible = lm.findLastVisibleItemPosition()
+//                val totalItems = recordadapter.itemCount
+//
+//                // 当接近"虚拟列表"末尾时,跳转到中间位置
+//                if (lastVisible >= totalItems - 3) {
+//                    val jumpPosition = (totalItems / 2) * (Int.MAX_VALUE / totalItems)
+//                    currentRecordScrollPosition = jumpPosition
+//                    recyclerRecordView.scrollToPosition(jumpPosition)
+//                }
+//            }
 
             handler.postDelayed(this, scrollInterval)
         }
-    }
-
-    private fun pxToDp(px: Int, context: Context): Int {
-        return (px / (context.resources.displayMetrics.density)).toInt()
     }
 
     private fun dpToPx(dp: Float): Int {
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 09bd8da..1d26709 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
@@ -327,7 +327,7 @@
                 val userInfo = response.data
 
                 // 本地保存我的邀请码
-//                PreferencesManager.setInviteCode(userInfo.intervialcode);
+                PreferencesManager.setInviteCode(userInfo.intervialcode);
                 // 设置头像
                 Glide.with(this)
                     .load(userInfo.cover)
diff --git a/app/src/main/res/drawable/invite.png b/app/src/main/res/drawable/invite.png
new file mode 100644
index 0000000..80eab74
--- /dev/null
+++ b/app/src/main/res/drawable/invite.png
Binary files differ
diff --git a/app/src/main/res/drawable/table_border.xml b/app/src/main/res/drawable/table_border.xml
index af40445..61fed64 100644
--- a/app/src/main/res/drawable/table_border.xml
+++ b/app/src/main/res/drawable/table_border.xml
@@ -1,7 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <stroke
-        android:width="1dp"
-        android:color="#CCCCCC" />
-    <solid android:color="#FFFFFF" />
+    <stroke android:width="1dp" android:color="#DDDDDD"/>
+    <corners android:radius="4dp"/>
 </shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/table_cell_border.xml b/app/src/main/res/drawable/table_cell_border.xml
new file mode 100644
index 0000000..e589ce8
--- /dev/null
+++ b/app/src/main/res/drawable/table_cell_border.xml
@@ -0,0 +1,4 @@
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke android:width="0.5dp" android:color="#DDDDDD"/>
+    <padding android:left="1dp" android:top="1dp" android:right="1dp" android:bottom="1dp"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_invitation_main.xml b/app/src/main/res/layout/activity_invitation_main.xml
index 88a6273..40b98d9 100644
--- a/app/src/main/res/layout/activity_invitation_main.xml
+++ b/app/src/main/res/layout/activity_invitation_main.xml
@@ -63,7 +63,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginBottom="20dp"
-                    app:cardCornerRadius="18dp">
+                    app:cardCornerRadius="38dp">
 
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/invitationsuccessRecyclerView"
@@ -93,39 +93,40 @@
                     android:layout_width="match_parent"
                     android:layout_height="50dp"
                     android:layout_marginBottom="8dp"
+                    app:cardBackgroundColor="#FFFFFF"
                     app:cardCornerRadius="8dp"
-                    app:cardPreventCornerOverlap="true"
                     app:cardElevation="0dp"
-                    app:cardBackgroundColor="#FFFFFF">
+                    app:cardPreventCornerOverlap="true">
 
                     <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="match_parent"
+                        android:gravity="center_vertical"
                         android:orientation="horizontal"
                         android:paddingStart="16dp"
-                        android:paddingEnd="16dp"
-                        android:gravity="center_vertical">
+                        android:paddingEnd="16dp">
 
                         <TextView
                             android:id="@+id/invitationCodeText"
                             android:layout_width="0dp"
                             android:layout_height="wrap_content"
                             android:layout_weight="1"
-                            android:text="A1B2"
                             android:textAlignment="center"
                             android:textColor="#000000"
                             android:textSize="30sp" />
 
                         <Button
                             android:id="@+id/copyButton"
+                            style="?android:attr/borderlessButtonStyle"
                             android:layout_width="wrap_content"
                             android:layout_height="40dp"
-                            android:text="复制邀请码"
-                            android:textColor="#FF0000"
-                            android:backgroundTint="#FFFFFF"
-                            android:textSize="12sp"
+                            android:background="@android:color/transparent"
                             android:paddingStart="12dp"
-                            android:paddingEnd="12dp"/>
+                            android:paddingEnd="12dp"
+                            android:stateListAnimator="@null"
+                            android:text="复制邀请码"
+                            android:textColor="#FF0000FF"
+                            android:textSize="13sp" />
                     </LinearLayout>
                 </androidx.cardview.widget.CardView>
 
@@ -137,136 +138,155 @@
                     app:cardCornerRadius="6dp"
                     app:cardPreventCornerOverlap="true">
 
-                    <TableLayout
-                        android:id="@+id/tableLayout"
+                    <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:background="@drawable/table_border"
-                        android:shrinkColumns="*"
-                        android:stretchColumns="*">
+                        android:orientation="vertical">
 
-                        <TableRow>
+                        <!-- 添加"邀请任务"标题 -->
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:paddingLeft="16dp"
+                            android:paddingBottom="8dp"
+                            android:text="邀请任务"
+                            android:textColor="#333333"
+                            android:textSize="16sp"
+                            android:textStyle="bold" />
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="邀请人数"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
+                        <!-- 表格区域 -->
+                        <TableLayout
+                            android:id="@+id/tableLayout"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:background="@drawable/table_border"
+                            android:paddingLeft="16dp"
+                            android:paddingRight="16dp"
+                            android:paddingBottom="16dp"
+                            android:shrinkColumns="*"
+                            android:stretchColumns="*">
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="邀请奖励"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
+                            <TableRow android:background="@drawable/table_cell_border">
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="被邀请人奖励"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
-                        </TableRow>
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="邀请人数"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
 
-                        <TableRow>
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="邀请奖励"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="1人"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="被邀请人奖励"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
+                            </TableRow>
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="3天会员"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
+                            <TableRow android:background="@drawable/table_cell_border">
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="1天会员"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
-                        </TableRow>
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="1人"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
 
-                        <TableRow>
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="3天会员"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="3人"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="1天会员"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
+                            </TableRow>
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="15天会员"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
+                            <TableRow android:background="@drawable/table_cell_border">
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="1天会员"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
-                        </TableRow>
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="3人"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
 
-                        <TableRow>
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="15天会员"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="5人"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="1天会员"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
+                            </TableRow>
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="30天会员"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
+                            <TableRow android:background="@drawable/table_cell_border">
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:padding="6dp"
-                                android:text="1天会员"
-                                android:textAlignment="center"
-                                android:textColor="#333333"
-                                android:textSize="12sp" />
-                        </TableRow>
-                    </TableLayout>
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="5人"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
 
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="30天会员"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
 
+                                <TextView
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:background="@drawable/table_cell_border"
+                                    android:text="1天会员"
+                                    android:textAlignment="center"
+                                    android:textColor="#333333"
+                                    android:textSize="12sp" />
+                            </TableRow>
+                        </TableLayout>
+                    </LinearLayout>
                 </androidx.cardview.widget.CardView>
 
                 <!-- 邀请记录区域 -->
@@ -276,12 +296,31 @@
                     android:layout_marginBottom="20dp"
                     app:cardCornerRadius="6dp"
                     app:cardPreventCornerOverlap="true">
-                    <androidx.recyclerview.widget.RecyclerView
-                        android:id="@+id/invitationrecordRecyclerView"
+
+                    <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:nestedScrollingEnabled="false"
-                        android:overScrollMode="never" />
+                        android:orientation="vertical">
+
+                        <!-- 添加"我的邀请记录"标题 -->
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:paddingLeft="16dp"
+                            android:paddingBottom="8dp"
+                            android:text="我的邀请记录"
+                            android:textColor="#333333"
+                            android:textSize="16sp"
+                            android:textStyle="bold"
+                            android:gravity="center" />
+
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/invitationrecordRecyclerView"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:nestedScrollingEnabled="false"
+                            android:overScrollMode="never" />
+                    </LinearLayout>
                 </androidx.cardview.widget.CardView>
 
                 <!-- 添加一个权重为1的View,用于填充剩余空间 -->
diff --git a/app/src/main/res/layout/dialog_image_preview.xml b/app/src/main/res/layout/dialog_image_preview.xml
new file mode 100644
index 0000000..dd911f6
--- /dev/null
+++ b/app/src/main/res/layout/dialog_image_preview.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#80000000">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:orientation="vertical"
+        android:padding="16dp">
+
+        <ImageView
+            android:id="@+id/ivPreview"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:adjustViewBounds="true"
+            android:maxWidth="1000dp"
+            android:maxHeight="1000dp"
+            android:scaleType="fitCenter"
+            android:src="@drawable/invite" />
+    </LinearLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml
new file mode 100644
index 0000000..a5d2e93
--- /dev/null
+++ b/app/src/main/res/xml/file_paths.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths>
+    <!-- 缓存目录 -->
+    <cache-path name="shared_images" path="shared_images/" />
+</paths>
\ No newline at end of file
diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml
index ba135d2..bac7af5 100644
--- a/app/src/main/res/xml/network_security_config.xml
+++ b/app/src/main/res/xml/network_security_config.xml
@@ -7,6 +7,7 @@
         <domain includeSubdomains="true">192.168.1.199</domain>
         <domain includeSubdomains="true">192.168.1.201</domain>
         <domain includeSubdomains="true">14.103.144.28</domain>
+        <domain includeSubdomains="true">192.168.1.127</domain>
         <!-- 可添加其他域名或IP(如192.168.0.101) -->
 <!--        如果本地服务使用自签名证书,需在 network_security_config.xml 中信任该证书:-->
 <!--        <trust-anchors>-->

--
Gitblit v1.9.3