From 2b446a5fd5d8f9b8c0f1e3acef1eef7ad9adb6f9 Mon Sep 17 00:00:00 2001
From: tj <1378534974@qq.com>
Date: 星期三, 09 四月 2025 10:25:27 +0800
Subject: [PATCH] 1.1

---
 app/src/main/res/values-v23/themes.xml                                           |   19 
 .gitignore                                                                       |    2 
 app/src/main/res/values/styles.xml                                               |    8 
 app/src/main/res/layout/activity_wxpay_entry.xml                                 |   10 
 app/src/main/res/values/themes.xml                                               |    6 
 keystore/sms-manager.jks                                                         |    0 
 app/src/main/java/com/example/firstapp/activity/VipActivity.kt                   |   22 +
 gradle/libs.versions.toml                                                        |    2 
 app/src/main/res/values/colors.xml                                               |    3 
 app/src/main/res/layout/activity_setting.xml                                     |   61 ++++
 app/src/main/res/values-night/themes.xml                                         |   12 
 app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt |   16 +
 app/src/main/java/com/example/firstapp/ui/profile/EditProfileActivity.kt         |   32 ++
 app/src/main/java/com/example/firstapp/activity/LoginActivity.kt                 |  116 ++++++++
 keystore/keystore.jks                                                            |    0 
 app/build.gradle                                                                 |   32 ++
 app/src/main/java/com/example/firstapp/activity/SettingActivity.kt               |  141 ++++++++++
 app/src/main/res/layout/fragment_member_info_card.xml                            |   17 +
 app/src/main/res/values/strings.xml                                              |    1 
 app/src/main/AndroidManifest.xml                                                 |   24 +
 app/src/main/java/com/example/firstapp/ui/vip/MemberInfoCardFragment.kt          |    3 
 app/src/main/res/layout/login_protocol_dialog_custom.xml                         |   89 ++++++
 app/src/main/res/mipmap/setting.png                                              |    0 
 app/src/main/java/com/example/firstapp/database/service/ApiService.kt            |    6 
 app/src/main/java/com/example/firstapp/pay/alipay/PayResult.kt                   |    0 
 app/src/main/res/navigation/nav_graph2.xml                                       |   28 ++
 app/src/main/java/com/example/firstapp/pay/alipay/AliPayHelper.kt                |    0 
 app/src/main/res/layout/fragment_notifications.xml                               |   21 +
 README.md                                                                        |    5 
 app/src/main/java/com/example/firstapp/pay/alipay/PayAbility.kt                  |   35 ++
 app/src/main/java/com/example/firstapp/pay/wxpay/WxPayHelper.kt                  |   42 +++
 gradle.properties                                                                |    5 
 /dev/null                                                                        |    0 
 app/src/main/java/com/example/firstapp/utils/AppGlobals.kt                       |   29 ++
 app/src/main/java/com/example/firstapp/pay/wxpay/WXPayEntryActivity.java         |   44 +++
 35 files changed, 802 insertions(+), 29 deletions(-)

diff --git a/.gitignore b/.gitignore
index 8654057..cc3f079 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,5 @@
 .externalNativeBuild
 .cxx
 local.properties
+
+.idea/
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 26d3352..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
deleted file mode 100644
index 7643783..0000000
--- a/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<component name="ProjectCodeStyleConfiguration">
-  <code_scheme name="Project" version="173">
-    <JetCodeStyleSettings>
-      <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
-    </JetCodeStyleSettings>
-    <codeStyleSettings language="XML">
-      <option name="FORCE_REARRANGE_MODE" value="1" />
-      <indentOptions>
-        <option name="CONTINUATION_INDENT_SIZE" value="4" />
-      </indentOptions>
-      <arrangement>
-        <rules>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>xmlns:android</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>^$</XML_NAMESPACE>
-                </AND>
-              </match>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>xmlns:.*</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>^$</XML_NAMESPACE>
-                </AND>
-              </match>
-              <order>BY_NAME</order>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>.*:id</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
-                </AND>
-              </match>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>.*:name</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
-                </AND>
-              </match>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>name</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>^$</XML_NAMESPACE>
-                </AND>
-              </match>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>style</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>^$</XML_NAMESPACE>
-                </AND>
-              </match>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>.*</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>^$</XML_NAMESPACE>
-                </AND>
-              </match>
-              <order>BY_NAME</order>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>.*</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
-                </AND>
-              </match>
-              <order>ANDROID_ATTRIBUTE_ORDER</order>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>.*</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>.*</XML_NAMESPACE>
-                </AND>
-              </match>
-              <order>BY_NAME</order>
-            </rule>
-          </section>
-        </rules>
-      </arrangement>
-    </codeStyleSettings>
-    <codeStyleSettings language="kotlin">
-      <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
-    </codeStyleSettings>
-  </code_scheme>
-</component>
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index 79ee123..0000000
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<component name="ProjectCodeStyleConfiguration">
-  <state>
-    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
-  </state>
-</component>
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index b589d56..0000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="CompilerConfiguration">
-    <bytecodeTargetLevel target="17" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
deleted file mode 100644
index e918287..0000000
--- a/.idea/deploymentTargetSelector.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="deploymentTargetSelector">
-    <selectionStates>
-      <SelectionState runConfigName="app">
-        <option name="selectionMode" value="DROPDOWN" />
-        <DropdownSelection timestamp="2025-03-28T01:17:48.834725500Z">
-          <Target type="DEFAULT_BOOT">
-            <handle>
-              <DeviceId pluginId="PhysicalDevice" identifier="serial=HMQNW19A24001406" />
-            </handle>
-          </Target>
-        </DropdownSelection>
-        <DialogSelection />
-      </SelectionState>
-    </selectionStates>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
deleted file mode 100644
index cb865f6..0000000
--- a/.idea/gradle.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="GradleMigrationSettings" migrationVersion="1" />
-  <component name="GradleSettings">
-    <option name="linkedExternalProjectsSettings">
-      <GradleProjectSettings>
-        <option name="externalProjectPath" value="$PROJECT_DIR$" />
-        <option name="gradleJvm" value="jbr-17" />
-        <option name="modules">
-          <set>
-            <option value="$PROJECT_DIR$" />
-            <option value="$PROJECT_DIR$/app" />
-          </set>
-        </option>
-        <option name="resolveExternalAnnotations" value="false" />
-      </GradleProjectSettings>
-    </option>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
deleted file mode 100644
index fdf8d99..0000000
--- a/.idea/kotlinc.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="KotlinJpsPluginSettings">
-    <option name="version" value="1.9.0" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/migrations.xml b/.idea/migrations.xml
deleted file mode 100644
index f8051a6..0000000
--- a/.idea/migrations.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectMigrations">
-    <option name="MigrateToGradleLocalJavaHome">
-      <set>
-        <option value="$PROJECT_DIR$" />
-      </set>
-    </option>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 8978d23..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<project version="4">
-  <component name="ExternalStorageConfigurationManager" enabled="true" />
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/build/classes" />
-  </component>
-  <component name="ProjectType">
-    <option name="id" value="Android" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index 16660f1..0000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="RunConfigurationProducerService">
-    <option name="ignoredProducers">
-      <set>
-        <option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
-        <option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
-        <option value="com.intellij.execution.junit.PatternConfigurationProducer" />
-        <option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
-        <option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
-        <option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
-        <option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
-        <option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
-      </set>
-    </option>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$" vcs="Git" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/README.md b/README.md
index 2c07e83..eef1159 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,9 @@
 ## FirstApp2
 
-短信平台
+# 短信平台
+
+# 密码
+
 
 # md5
 ADC67C7C8E0BE3829D34E976D8EFCC9B
diff --git a/app/build.gradle b/app/build.gradle
index 3afa1de..efce529 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -14,7 +14,8 @@
     compileSdk 34
 
     defaultConfig {
-        applicationId "com.example.firstapp"
+//        applicationId "com.example.firstapp"
+        applicationId "net.sourceforge.simcpux"
         minSdk 24
         targetSdk 34
         versionCode 1
@@ -27,7 +28,15 @@
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+            signingConfig signingConfigs.debug
         }
+        debug {
+            minifyEnabled false
+            debuggable true
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+            signingConfig signingConfigs.debug
+        }
+
     }
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_17
@@ -109,6 +118,23 @@
             excludes += ["META-INF/*.kotlin_module", "META-INF/*.version", "kotlin/**", "DebugProbesKt.bin"]
         }
     }
+
+    signingConfigs {
+        release {
+            storeFile file('../keystore/sms-manager.jks')
+            storePassword 'Cloudroam!@#123'
+            keyAlias 'sm'
+            keyPassword 'Cloudroam!@#123'
+        }
+
+        debug {
+            storeFile file('../keystore/keystore.jks')
+            storePassword 'android'
+            keyAlias 'android'
+        }
+    }
+
+
 }
 
 dependencies {
@@ -123,6 +149,7 @@
     implementation libs.androidx.navigation.ui.ktx
     implementation libs.androidx.legacy.support.v4
     implementation libs.androidx.recyclerview
+    implementation libs.androidx.activity
     testImplementation libs.junit
     androidTestImplementation libs.androidx.junit
     androidTestImplementation libs.androidx.espresso.core
@@ -294,4 +321,7 @@
     implementation 'de.hdodenhof:circleimageview:3.1.0'
 
     implementation 'com.github.castorflex:SmoothProgressBar:1.1.0'
+
+    api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
+
 }
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5e9d88c..cae52af 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -83,16 +83,29 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/Theme.FirstApp"
-        tools:targetApi="31"
         android:usesCleartextTraffic="true"
-        >
+        tools:targetApi="31">
+        <activity
+            android:name=".activity.SettingActivity"
+            android:configChanges="orientation|keyboardHidden|screenSize"
+            android:exported="false"
+            android:label="@string/title_activity_setting"
+            android:theme="@style/Theme.FirstApp.Fullscreen" />
+        <activity
+            android:name=".pay.wxpay.WXPayEntryActivity"
+            android:exported="true"
+            android:launchMode="singleTop" /> <!-- 微信支付回调组件别名 -->
+        <activity-alias
+            android:name="${applicationId}.wxapi.WXPayEntryActivity"
+            android:exported="true"
+            android:targetActivity=".pay.wxpay.WXPayEntryActivity"
+            android:theme="@android:style/Theme.NoDisplay" />
 
         <provider
             android:name="androidx.startup.InitializationProvider"
             android:authorities="${applicationId}.androidx-startup"
             android:exported="false"
             tools:node="remove" />
-
 
         <activity
             android:name=".activity.VipActivity"
@@ -127,11 +140,10 @@
             android:theme="@style/Theme.ContentDetail" />
         <activity
             android:name=".ui.profile.EditProfileActivity"
-            android:exported="false"/>
+            android:exported="false" />
         <activity
             android:name=".ui.invitation.InvitationActivity"
-            android:exported="false"/>
-
+            android:exported="false" />
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt b/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt
index 3516e12..36ac653 100644
--- a/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt
+++ b/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt
@@ -1,9 +1,24 @@
 package com.example.firstapp.activity
+import android.app.AlertDialog
 import android.os.Bundle
 import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
 import android.content.Intent
+import android.graphics.Color
+import android.text.SpannableString
+import android.text.Spanned
+import android.text.TextPaint
+import android.text.method.LinkMovementMethod
+import android.text.style.ClickableSpan
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.Button
+import android.widget.CheckBox
+import android.widget.TextView
+import com.example.firstapp.R
 import com.example.firstapp.databinding.ActivityLoginBinding
+import com.example.firstapp.utils.PreferencesManager
+import kotlin.system.exitProcess
 
 class LoginActivity : AppCompatActivity() {
     private lateinit var binding: ActivityLoginBinding
@@ -13,6 +28,12 @@
         binding = ActivityLoginBinding.inflate(layoutInflater)
         setContentView(binding.root)
         setupViews()
+
+        val phone=PreferencesManager.getLastLoginPhone()
+        // 如果phone不存在则展示弹框
+        if (phone.isNullOrEmpty()) {
+            showConfirmDialog()
+        }
     }
 
     private fun setupViews() {
@@ -41,4 +62,99 @@
         }
     }
 
+    private fun showConfirmDialog() {
+        val dialogView = LayoutInflater.from(this).inflate(R.layout.login_protocol_dialog_custom, null)
+
+        val dialog = AlertDialog.Builder(this)
+            .setView(dialogView)
+            .create()
+
+        dialog.window?.setBackgroundDrawableResource(R.drawable.dialog_background)
+
+        val btnConfirm = dialogView.findViewById<Button>(R.id.btnConfirm)
+        btnConfirm.setOnClickListener {
+            dialog.dismiss()
+        }
+        val btnCancel = dialogView.findViewById<Button>(R.id.btnCancel)
+        btnCancel.setOnClickListener {
+            dialog.dismiss()
+            // 退出整个应用
+            finishAffinity() // 关闭当前Activity和它之上的所有Activity
+            exitProcess(0)   // 终止应用进程(需要引入 kotlin.system.exitProcess)
+        }
+
+        // 👇 设置可点击文字逻辑
+        val textView = dialogView.findViewById<TextView>(R.id.dialogMessage2)
+        val content = "您可以阅读「服务使用协议」和「隐私保护政策」了解相关信息。如果您同意,请点击同意,开始使用我们的服务。"
+        val spannableString = SpannableString(content)
+
+        val serviceStart = content.indexOf("「服务使用协议」")
+        val serviceEnd = serviceStart + "「服务使用协议」".length
+        val privacyStart = content.indexOf("「隐私保护政策」")
+        val privacyEnd = privacyStart + "「隐私保护政策」".length
+
+        spannableString.setSpan(object : ClickableSpan() {
+            override fun onClick(widget: View) {
+                startContentActivity("用户协议", "服务使用协议")
+//                Toast.makeText(this@LoginActivity, "点击了服务使用协议", Toast.LENGTH_SHORT).show()
+                // 可跳转 WebViewActivity 或打开链接
+            }
+
+            override fun updateDrawState(ds: TextPaint) {
+                super.updateDrawState(ds)
+                ds.color = Color.parseColor("#1E88E5")
+                ds.isUnderlineText = false
+            }
+        }, serviceStart, serviceEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+
+        spannableString.setSpan(object : ClickableSpan() {
+            override fun onClick(widget: View) {
+                startContentActivity("隐私协议", "隐私保护政策")
+//                Toast.makeText(this@LoginActivity, "点击了隐私保护政策", Toast.LENGTH_SHORT).show()
+            }
+
+            override fun updateDrawState(ds: TextPaint) {
+                super.updateDrawState(ds)
+                ds.color = Color.parseColor("#1E88E5")
+                ds.isUnderlineText = false
+            }
+        }, privacyStart, privacyEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+
+        textView.text = spannableString
+        textView.movementMethod = LinkMovementMethod.getInstance()
+
+        dialog.show()
+    }
+
+
+    /*    private fun showConfirmDialog() {
+
+            val dialogView = LayoutInflater.from(this).inflate(R.layout.login_protocol_dialog_custom, null)
+
+            val dialog = AlertDialog.Builder(this)
+                .setView(dialogView)
+                .create()
+
+            // 设置自定义背景
+            dialog.window?.setBackgroundDrawableResource(R.drawable.dialog_background)
+
+            // 获取按钮并设置点击事件
+            val btnConfirm = dialogView.findViewById<Button>(R.id.btnConfirm)
+            btnConfirm.setOnClickListener {
+                // 将协议勾选上
+                dialog.dismiss()
+            }
+
+            // 显示对话框
+            dialog.show()
+        }*/
+
+    private fun startContentActivity(id: String, title: String) {
+        val intent = Intent(this, ContentDetailActivity::class.java).apply {
+            putExtra(ContentDetailActivity.ID, id)
+            putExtra(ContentDetailActivity.EXTRA_TITLE, title)
+        }
+        startActivity(intent)
+    }
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt b/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt
new file mode 100644
index 0000000..017f581
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt
@@ -0,0 +1,141 @@
+package com.example.firstapp.activity
+
+import androidx.appcompat.app.AppCompatActivity
+import android.annotation.SuppressLint
+import android.app.AlertDialog
+import android.content.Intent
+import android.os.Build
+import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
+import android.view.Gravity
+import android.view.MenuItem
+import android.view.MotionEvent
+import android.view.View
+import android.view.WindowInsets
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.appcompat.widget.Toolbar
+import androidx.lifecycle.ViewModelProvider
+import com.example.firstapp.databinding.ActivitySettingBinding
+import com.example.firstapp.R
+import com.example.firstapp.ui.home.HomeViewModel
+
+/**
+ * An example full-screen activity that shows and hides the system UI (i.e.
+ * status bar and navigation/system bar) with user interaction.
+ */
+class SettingActivity : AppCompatActivity() {
+
+    private lateinit var binding: ActivitySettingBinding
+    private val homeViewModel: HomeViewModel by lazy {
+        ViewModelProvider(this).get(HomeViewModel::class.java)
+    }
+    private var isFullscreen: Boolean = false
+
+    @SuppressLint("ClickableViewAccessibility")
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        binding = ActivitySettingBinding.inflate(layoutInflater)
+        setContentView(binding.root)
+
+        var toolbar=binding.settingToolbar
+
+        // 获取 Toolbar 并设置为 ActionBar
+        setSupportActionBar(toolbar)
+
+        // 显示返回按钮
+        supportActionBar?.setDisplayHomeAsUpEnabled(true)
+        supportActionBar?.setDisplayShowHomeEnabled(true)
+
+        // 设置标题(如果没有在 XML 中设置标题,可以在代码中动态设置)
+        supportActionBar?.title = ""
+
+
+
+
+
+//        binding.settingExit.setOnClickListener(View.OnClickListener {
+//
+//            homeViewModel.logout()
+//            // 跳转到vipActivity
+//            val intent = Intent(this, LoginActivity::class.java)
+//            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+//            startActivity(intent)
+//
+//        })
+
+        binding.settingExit.setOnClickListener {
+            // 弹出确认退出的对话框
+            val alertDialog = AlertDialog.Builder(this)
+                .setTitle("确认退出")
+                .setMessage("您确定要退出吗?")
+                .setPositiveButton("确认") { dialog, _ ->
+                    // 确认退出
+                    homeViewModel.logout()
+
+                    // 跳转到 LoginActivity 并清除之前的任务栈
+                    val intent = Intent(this, LoginActivity::class.java)
+                    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+                    startActivity(intent)
+
+                    // 关闭当前页面
+                    finish()
+                }
+                .setNegativeButton("取消") { dialog, _ ->
+                    // 取消退出操作
+                    dialog.dismiss()
+                }
+                .create()
+
+            // 显示对话框
+            alertDialog.show()
+        }
+
+
+
+    }
+
+    // 点击返回按钮时调用
+    override fun onOptionsItemSelected(item: MenuItem): Boolean {
+        if (item.itemId == android.R.id.home) {
+            onBackPressed()
+            return true
+        }
+        return super.onOptionsItemSelected(item)
+    }
+
+    override fun onPostCreate(savedInstanceState: Bundle?) {
+        super.onPostCreate(savedInstanceState)
+
+        // Trigger the initial hide() shortly after the activity has been
+        // created, to briefly hint to the user that UI controls
+        // are available.
+        delayedHide(100)
+    }
+
+    private fun toggle() {
+        if (isFullscreen) {
+            hide()
+        } else {
+            show()
+        }
+    }
+
+    private fun hide() {
+        // Hide UI first
+        supportActionBar?.hide()
+
+    }
+
+    private fun show() {
+
+
+    }
+
+    private fun delayedHide(delayMillis: Int) {
+
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/activity/VipActivity.kt b/app/src/main/java/com/example/firstapp/activity/VipActivity.kt
index 9cf1f11..34a255c 100644
--- a/app/src/main/java/com/example/firstapp/activity/VipActivity.kt
+++ b/app/src/main/java/com/example/firstapp/activity/VipActivity.kt
@@ -252,8 +252,9 @@
                         Toast.makeText(this@VipActivity, "请勾选协议", Toast.LENGTH_LONG).show()
                         return@launch // 直接 return,不往下执行
                     }
-                    Toast.makeText(this@VipActivity, "功能暂未开放", Toast.LENGTH_LONG).show()
-                    return@launch
+//                    Toast.makeText(this@VipActivity, "功能暂未开放", Toast.LENGTH_LONG).show()
+//                    return@launch
+                    doWechatPay()
 
 
                 } catch (e: Exception) {
@@ -266,6 +267,23 @@
 
     }
 
+    private fun doWechatPay() {
+        val map=HashMap<String,String>()
+        map["appId"]="wxb4ba3c02aa476ea1"
+        map["partnerid"]="1900006771"
+        map["package"]="Sign=WXPay"
+        map["noncestr"]="2ac6c60ebfe7e549fbbc922ac54269bb"
+        map["timeStamp"]="1606317975"
+        map["prepayid"]="wx25232614962974fb29d1227819cc3e000g"
+        map["sign"]="wx25232614962974fb29d1227819cc3e000g"
+        PayAbility.wxPay(this, map, Observer { success ->
+            if (success == 0) {
+                Toast.makeText(this@VipActivity, "支付失败", Toast.LENGTH_LONG).show()
+            } else {
+                Toast.makeText(this@VipActivity, "支付成功", Toast.LENGTH_LONG).show()
+            }
+        })
+    }
 
     private fun vipCardInit() {
         val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
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 6be57ba..3da71cb 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
@@ -62,7 +62,7 @@
     suspend fun getUserInfo(@Path("phone") phone: String): ApiResponse<UserInfo>
 
     @Multipart
-    @POST("flower/api/supplier/operation/update")
+    @POST("api/supplier/operation/update")
     suspend fun updateProfile(
         @Part("nickname") nickname: RequestBody,
         @Part avatar: MultipartBody.Part?
@@ -78,8 +78,8 @@
 // 创建Retrofit实例(单例)
 object RetrofitClient{
 
-//    private const val BASE_URL ="http://192.168.1.198:8080/flower/"
-    private const val BASE_URL ="http://14.103.144.28:8080/flower/"
+    private const val BASE_URL ="http://192.168.1.198:8080/flower/"
+//    private const val BASE_URL ="http://14.103.144.28:8080/flower/"
 
 
     // 创建OkHttpClient,配置拦截器和超时时间
diff --git a/app/src/main/java/com/example/firstapp/pay/PayAbility.kt b/app/src/main/java/com/example/firstapp/pay/PayAbility.kt
deleted file mode 100644
index 5f2b35e..0000000
--- a/app/src/main/java/com/example/firstapp/pay/PayAbility.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.example.firstapp.pay
-
-import android.app.Activity
-import androidx.lifecycle.Observer
-
-object PayAbility {
-
-
-    /**
-     * 支付宝支付方法
-     */
-    fun aliPay(activity: Activity, orderInfo: String, observer: Observer<PayResult>) {
-        AliPayHelper.pay(activity, orderInfo, observer)
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt b/app/src/main/java/com/example/firstapp/pay/alipay/AliPayHelper.kt
similarity index 100%
rename from app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt
rename to app/src/main/java/com/example/firstapp/pay/alipay/AliPayHelper.kt
diff --git a/app/src/main/java/com/example/firstapp/pay/alipay/PayAbility.kt b/app/src/main/java/com/example/firstapp/pay/alipay/PayAbility.kt
new file mode 100644
index 0000000..af84965
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/pay/alipay/PayAbility.kt
@@ -0,0 +1,35 @@
+package com.example.firstapp.pay
+
+import android.app.Activity
+import androidx.fragment.app.FragmentActivity
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.Observer
+
+object PayAbility {
+
+
+    private val wxPayResultLiveData = MutableLiveData<Int?>()
+    /**
+     * 支付宝支付方法
+     */
+    fun aliPay(activity: Activity, orderInfo: String, observer: Observer<PayResult>) {
+        AliPayHelper.pay(activity, orderInfo, observer)
+    }
+
+    /**
+     * 微信支付方法
+     */
+    fun wxPay(activity: Activity, orderInfo: Map<String,String>, observer: Observer<Int?>) {
+        if(activity is FragmentActivity){
+            wxPayResultLiveData.observe(activity, observer)
+        }
+        WxPayHelper.pay(activity, orderInfo, observer)
+    }
+
+    internal fun postWXPayResult(result: Int) {
+        wxPayResultLiveData.postValue(result)
+        wxPayResultLiveData.value= null
+    }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/pay/PayResult.kt b/app/src/main/java/com/example/firstapp/pay/alipay/PayResult.kt
similarity index 100%
rename from app/src/main/java/com/example/firstapp/pay/PayResult.kt
rename to app/src/main/java/com/example/firstapp/pay/alipay/PayResult.kt
diff --git a/app/src/main/java/com/example/firstapp/pay/wxpay/WXPayEntryActivity.java b/app/src/main/java/com/example/firstapp/pay/wxpay/WXPayEntryActivity.java
new file mode 100644
index 0000000..de25a1b
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/pay/wxpay/WXPayEntryActivity.java
@@ -0,0 +1,44 @@
+package com.example.firstapp.pay.wxpay;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.tencent.mm.opensdk.constants.ConstantsAPI;
+import com.tencent.mm.opensdk.modelbase.BaseReq;
+import com.tencent.mm.opensdk.modelbase.BaseResp;
+import com.tencent.mm.opensdk.openapi.IWXAPI;
+import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
+import com.tencent.mm.opensdk.openapi.WXAPIFactory;
+
+public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
+
+    private static final String TAG = "WXPayEntryActivity";
+
+    private IWXAPI api;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+       getWindow().setBackgroundDrawable(null);
+       super.onCreate(savedInstanceState);
+
+        api= WXAPIFactory.createWXAPI(this,"wxb4ba302aa476ea1");
+        api.handleIntent(getIntent(),this);
+
+    }
+
+    @Override
+    public void onReq(BaseReq baseReq) {
+
+    }
+
+    @Override
+    public void onResp(BaseResp baseResp) {
+        Log.d(TAG,"onPayFinish,errCode="+baseResp.errCode);
+
+        if(baseResp.getType()== ConstantsAPI.COMMAND_PAY_BY_WX){
+            finish();
+        }
+
+
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/pay/wxpay/WxPayHelper.kt b/app/src/main/java/com/example/firstapp/pay/wxpay/WxPayHelper.kt
new file mode 100644
index 0000000..0b96082
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/pay/wxpay/WxPayHelper.kt
@@ -0,0 +1,42 @@
+package com.example.firstapp.pay
+
+import android.app.Activity
+import android.text.TextUtils
+import androidx.lifecycle.Observer
+import com.alipay.sdk.app.PayTask
+import com.example.firstapp.utils.AppGlobals
+import com.example.firstapp.utils.Log
+import com.tencent.mm.opensdk.modelpay.PayReq
+import com.tencent.mm.opensdk.openapi.WXAPIFactory
+
+
+object WxPayHelper {
+
+    private val api=WXAPIFactory.createWXAPI(AppGlobals.get(), "wx4f794c0f0f0f0f0f",true)
+    init {
+        api.registerApp("wx4f794c0f0f0f0f0f")
+    }
+    fun pay(activity: Activity, params:Map<String,String>,observer:Observer<Int?>) {
+
+        // 开启线程
+        Thread {
+            try {
+                val req=PayReq()
+                req.appId=params["appid"]
+                req.partnerId=params["partnerid"]
+                req.prepayId=params["prepayid"]
+                req.nonceStr=params["noncestr"]
+                req.timeStamp=params["timestamp"]
+                req.packageValue=params["package"]
+                req.sign=params["sign"]
+                req.signType=params["signType"]
+                req.extData=params["extData"]
+
+                api.sendReq(req)
+
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }.start()
+    }
+}
\ 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 91fcafb..1eea5ce 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
@@ -31,6 +31,7 @@
 import com.google.android.material.snackbar.Snackbar
 import kotlinx.coroutines.launch
 import com.bumptech.glide.Glide
+import com.example.firstapp.activity.SettingActivity
 import com.example.firstapp.activity.VipActivity
 import com.example.firstapp.database.response.UserInfo
 import com.example.firstapp.ui.invitation.InvitationActivity
@@ -95,6 +96,14 @@
         }
 
         return binding.root
+    }
+
+    override fun onResume() {
+        super.onResume()
+        // 加载用户信息
+        lifecycleScope.launch {
+            loadUserInfo()
+        }
     }
 
     private suspend fun loadConfigurations() {
@@ -217,6 +226,13 @@
             startActivity(intent)
         }
 
+        // 设置按钮点击
+        binding.ivSetting.setOnClickListener {
+            // 跳转到
+            val intent = Intent(requireContext(), SettingActivity::class.java)
+            startActivity(intent)
+        }
+
 
     }
 
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 49d435c..a7f4af1 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
@@ -18,8 +18,11 @@
 import androidx.core.content.ContextCompat
 import androidx.lifecycle.lifecycleScope
 import com.bumptech.glide.Glide
+import com.example.firstapp.database.response.UserInfo
 import com.example.firstapp.databinding.ActivityEditProfileBinding
 import com.example.firstapp.database.service.ApiService
+import com.example.firstapp.database.service.RetrofitClient
+import com.example.firstapp.utils.PreferencesManager
 import kotlinx.coroutines.launch
 import java.io.File
 import okhttp3.MediaType.Companion.toMediaType
@@ -31,7 +34,6 @@
 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 ->
@@ -114,12 +116,38 @@
                 }
 
                 // 调用更新接口
-                apiService.updateProfile(
+                RetrofitClient.apiService.updateProfile(
                     nickname = nicknameBody,
                     avatar = avatarPart
                 )
 
                 Toast.makeText(this@EditProfileActivity, "保存成功", Toast.LENGTH_SHORT).show()
+                // 更新用户信息
+                // 从本地获取保存的手机号
+                val savedPhone = PreferencesManager.getPhone()
+                if (savedPhone.isNullOrEmpty()) {
+                    Toast.makeText(this@EditProfileActivity, "用户未登录", Toast.LENGTH_SHORT).show()
+                    return@launch
+                }
+                val response = RetrofitClient.apiService.getUserInfo(savedPhone)
+                if (response.code == "0" && response.data != null) {
+                    // 保存用户信息
+                    val userInfo:UserInfo = response.data
+                    // 获取传入的数据
+                    val currentNickname = userInfo.name
+                    val currentAvatarUrl = userInfo.cover
+
+                    // 设置当前数据
+                    binding.etNickname.setText(currentNickname)
+                    if (!currentAvatarUrl.isNullOrEmpty()) {
+                        Glide.with(this@EditProfileActivity)
+                            .load(currentAvatarUrl)
+                            .circleCrop()
+                            .into(binding.ivAvatar)
+                    }
+
+                }
+
                 finish()
 
             } catch (e: Exception) {
diff --git a/app/src/main/java/com/example/firstapp/ui/vip/MemberInfoCardFragment.kt b/app/src/main/java/com/example/firstapp/ui/vip/MemberInfoCardFragment.kt
index 405783d..2166148 100644
--- a/app/src/main/java/com/example/firstapp/ui/vip/MemberInfoCardFragment.kt
+++ b/app/src/main/java/com/example/firstapp/ui/vip/MemberInfoCardFragment.kt
@@ -53,6 +53,7 @@
 
         Glide.with(this)
             .load(viewModel.cover)
+            .circleCrop()
             .transform(RoundedCorners(100))  // 设置圆角
 //            .error(R.drawable.error_placeholder) // 如果加载失败,显示占位图
             .error(R.mipmap.avatar_default)
@@ -118,6 +119,7 @@
             viewModel.cover.collect { coverUrl ->
                 Glide.with(this@MemberInfoCardFragment)
                     .load(coverUrl)
+                    .circleCrop()
                     .transform(RoundedCorners(100))
                     .error(R.drawable.error_placeholder)
                     .into(binding.memberAvatarView)
@@ -132,6 +134,7 @@
                     .transform(RoundedCorners(100))
                     .error(R.drawable.error_placeholder)
                     .into(binding.memberImageView)
+
             }
         }
 
diff --git a/app/src/main/java/com/example/firstapp/utils/AppGlobals.kt b/app/src/main/java/com/example/firstapp/utils/AppGlobals.kt
new file mode 100644
index 0000000..0ca5f39
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/utils/AppGlobals.kt
@@ -0,0 +1,29 @@
+package com.example.firstapp.utils
+
+import android.app.Application
+import java.lang.Exception
+
+/**
+ * 这种方式获取全局的Application 是一种拓展思路。
+ *
+ *
+ * 对于组件化项目,不可能把项目实际的Application下沉到Base,而且各个module也不需要知道Application真实名字
+ *
+ *
+ * 这种一次反射就能获取全局Application对象的方式相比于在Application#OnCreate保存一份的方式显示更加通用了
+ */
+object AppGlobals {
+    private var application: Application? = null
+    fun get(): Application? {
+        if (application == null) {
+            try {
+                application = Class.forName("android.app.ActivityThread")
+                    .getMethod("currentApplication")
+                    .invoke(null) as Application
+            } catch (ex: Exception) {
+                ex.printStackTrace()
+            }
+        }
+        return application
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml
new file mode 100644
index 0000000..a0ccc5f
--- /dev/null
+++ b/app/src/main/res/layout/activity_setting.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#F0F2F5"
+    tools:context=".activity.SettingActivity">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <!-- Toolbar (标题栏) -->
+        <androidx.appcompat.widget.Toolbar
+            android:id="@+id/setting_toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="#F9F9F9"
+            android:elevation="4dp"
+            android:layout_gravity="center"
+            android:gravity="center">
+
+            <!-- 自定义标题 TextView -->
+            <TextView
+                android:id="@+id/toolbar_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="设置"
+                android:textColor="@android:color/black"
+                android:textSize="18sp"
+                android:layout_gravity="center"
+                android:gravity="center" /> <!-- 确保标题居中 -->
+
+        </androidx.appcompat.widget.Toolbar>
+
+
+        <LinearLayout
+            android:id="@+id/setting_exit"
+            android:layout_width="match_parent"
+            android:layout_height="50dp"
+            android:gravity="center"
+            android:orientation="vertical"
+            android:background="#F9F9F9"
+            android:layout_marginTop="20dp"
+            >
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:padding="5dp"
+                android:text="退出登录"
+                android:textColor="#E23C2F" />
+        </LinearLayout>
+
+
+
+    </LinearLayout>
+
+
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_wxpay_entry.xml b/app/src/main/res/layout/activity_wxpay_entry.xml
new file mode 100644
index 0000000..877caaf
--- /dev/null
+++ b/app/src/main/res/layout/activity_wxpay_entry.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".pay.wxpay.WXPayEntryActivity">
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_member_info_card.xml b/app/src/main/res/layout/fragment_member_info_card.xml
index 46571a7..96585ae 100644
--- a/app/src/main/res/layout/fragment_member_info_card.xml
+++ b/app/src/main/res/layout/fragment_member_info_card.xml
@@ -36,15 +36,26 @@
                 android:background="@android:color/transparent"
                 >
 
-                <ImageView
+<!--                <ImageView-->
+<!--                    android:id="@+id/memberAvatarView"-->
+<!--                    android:layout_width="25dp"-->
+<!--                    android:layout_height="27dp"-->
+<!--                    android:layout_marginLeft="10dp"-->
+<!--                    android:scaleType="centerCrop"-->
+<!--                    app:layout_constraintStart_toStartOf="parent"-->
+<!--                    app:layout_constraintTop_toTopOf="parent"-->
+
+<!--                    />-->
+                <com.google.android.material.imageview.ShapeableImageView
                     android:id="@+id/memberAvatarView"
                     android:layout_width="40dp"
                     android:layout_height="40dp"
                     android:layout_marginLeft="10dp"
-                    android:layout_marginRight="10dp"
                     android:scaleType="centerCrop"
                     app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent" />
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:shapeAppearanceOverlay="@style/CircleImageView" />
+
 
                 <TextView
                     android:id="@+id/phoneNumberText"
diff --git a/app/src/main/res/layout/fragment_notifications.xml b/app/src/main/res/layout/fragment_notifications.xml
index e176684..82ad433 100644
--- a/app/src/main/res/layout/fragment_notifications.xml
+++ b/app/src/main/res/layout/fragment_notifications.xml
@@ -19,6 +19,27 @@
             android:layout_height="32dp"
             android:scaleType="centerCrop" />
 
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="25dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+            <View
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1" />
+
+            <ImageView
+                android:id="@+id/iv_setting"
+                android:layout_width="28dp"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="8dp"
+                android:contentDescription="设置"
+                android:src="@mipmap/setting" />
+        </LinearLayout>
+
+
         <!-- 用户信息区域 - 减小padding -->
         <RelativeLayout
             android:id="@+id/layout_user_info"
diff --git a/app/src/main/res/layout/login_protocol_dialog_custom.xml b/app/src/main/res/layout/login_protocol_dialog_custom.xml
new file mode 100644
index 0000000..8e97cf1
--- /dev/null
+++ b/app/src/main/res/layout/login_protocol_dialog_custom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:background="@drawable/dialog_background"
+    android:padding="20dp"
+    android:gravity="center"
+
+    >
+
+    <!-- 标题 -->
+    <TextView
+        android:id="@+id/dialogTitle"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="服务协议和隐私政策"
+        android:textSize="20sp"
+        android:textColor="#000000"
+        android:gravity="center"
+        android:paddingBottom="10dp" />
+
+    <View
+        android:id="@+id/divider"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="#E2E2E2"
+        android:layout_marginTop="5dp"
+        android:layout_marginHorizontal="0dp" />
+
+
+
+    <!-- 内容 -->
+    <TextView
+        android:id="@+id/dialogMessage"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="请您务必阅读、理解「服务协议】和「隐私政策」,我们仅会收集提供服务必要的信息:未经您同意,我们不会与第三方共享与披露您的个人隐私信息。"
+        android:textSize="16sp"
+        android:textColor="#000000"
+        android:gravity="left"
+        android:layout_marginTop="5dp"
+        android:paddingBottom="20dp" />
+
+
+    <TextView
+        android:id="@+id/dialogMessage2"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="您可以阅读「服务使用协议」和「隐私保护政策」了解相关信息。如果您同意,请点击「同意,开始使用我们的服务。"
+        android:textSize="16sp"
+        android:textColor="#000000"
+        android:gravity="left"
+        android:paddingBottom="20dp" />
+
+
+    <!-- 按钮 -->
+    <Button
+        android:id="@+id/btnConfirm"
+        android:layout_width="200dp"
+        android:layout_height="wrap_content"
+        android:text="同意"
+        android:textColor="@android:color/white"
+        android:backgroundTint="#000000"
+        android:gravity="center" />
+
+<!--    <Button-->
+<!--        android:id="@+id/btnCancel"-->
+<!--        android:layout_width="200dp"-->
+<!--        android:layout_height="wrap_content"-->
+<!--        android:text="不同意"-->
+<!--        android:textColor="@android:color/white"-->
+
+<!--        android:backgroundTint="#000000"-->
+<!--        android:gravity="center" />-->
+    <Button
+        android:id="@+id/btnCancel"
+        android:layout_width="200dp"
+        android:layout_height="wrap_content"
+        android:text="不同意"
+        android:textColor="#999999"
+        android:background="@android:color/transparent"
+        android:gravity="center"
+        android:elevation="0dp"
+        android:stateListAnimator="@null" />
+
+</LinearLayout>
diff --git a/app/src/main/res/mipmap/setting.png b/app/src/main/res/mipmap/setting.png
new file mode 100644
index 0000000..e28bb84
--- /dev/null
+++ b/app/src/main/res/mipmap/setting.png
Binary files differ
diff --git a/app/src/main/res/navigation/nav_graph2.xml b/app/src/main/res/navigation/nav_graph2.xml
new file mode 100644
index 0000000..0a273d3
--- /dev/null
+++ b/app/src/main/res/navigation/nav_graph2.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/nav_graph2"
+    app:startDestination="@id/First2Fragment">
+
+    <fragment
+        android:id="@+id/First2Fragment"
+        android:name="com.example.firstapp.pay.wxpay.First2Fragment"
+        android:label="@string/first_fragment_label"
+        tools:layout="@layout/fragment_first2">
+
+        <action
+            android:id="@+id/action_First2Fragment_to_Second2Fragment"
+            app:destination="@id/Second2Fragment" />
+    </fragment>
+    <fragment
+        android:id="@+id/Second2Fragment"
+        android:name="com.example.firstapp.pay.wxpay.Second2Fragment"
+        android:label="@string/second_fragment_label"
+        tools:layout="@layout/fragment_second2">
+
+        <action
+            android:id="@+id/action_Second2Fragment_to_First2Fragment"
+            app:destination="@id/First2Fragment" />
+    </fragment>
+</navigation>
\ No newline at end of file
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..f242c89
--- /dev/null
+++ b/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,12 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Base.Theme.FirstApp" parent="Theme.Material3.DayNight.NoActionBar">
+        <!-- Customize your dark theme here. -->
+        <!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
+    </style>
+
+    <style name="ThemeOverlay.FirstApp.FullscreenContainer" parent="">
+        <item name="fullscreenBackgroundColor">@color/light_blue_900</item>
+        <item name="fullscreenTextColor">@color/light_blue_A400</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values-v23/themes.xml b/app/src/main/res/values-v23/themes.xml
index 940849b..1553ce1 100644
--- a/app/src/main/res/values-v23/themes.xml
+++ b/app/src/main/res/values-v23/themes.xml
@@ -1,9 +1,16 @@
 <resources xmlns:tools="http://schemas.android.com/tools">
 
-<!--    <style name="Theme.FirstApp" parent="Base.Theme.FirstApp">-->
-<!--        &lt;!&ndash; Transparent system bars for edge-to-edge. &ndash;&gt;-->
-<!--        <item name="android:navigationBarColor">@android:color/transparent</item>-->
-<!--        <item name="android:statusBarColor">@android:color/transparent</item>-->
-<!--        <item name="android:windowLightStatusBar">?attr/isLightTheme</item>-->
-<!--    </style>-->
+    <!--    <style name="Theme.FirstApp" parent="Base.Theme.FirstApp">-->
+    <!--        &lt;!&ndash; Transparent system bars for edge-to-edge. &ndash;&gt;-->
+    <!--        <item name="android:navigationBarColor">@android:color/transparent</item>-->
+    <!--        <item name="android:statusBarColor">@android:color/transparent</item>-->
+    <!--        <item name="android:windowLightStatusBar">?attr/isLightTheme</item>-->
+    <!--    </style>-->
+
+    <style name="Theme.FirstApp" parent="Base.Theme.FirstApp">
+        <!-- Transparent system bars for edge-to-edge. -->
+        <item name="android:navigationBarColor">@android:color/transparent</item>
+        <item name="android:statusBarColor">@android:color/transparent</item>
+        <item name="android:windowLightStatusBar">?attr/isLightTheme</item>
+    </style>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 2a680b2..9404fac 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -16,5 +16,6 @@
     <color name="light_blue_50">#E1F5FE</color>
     <color name="tab_selected">#FF039BE5</color>
     <color name="light_blue_new">#02A7F0</color>
-    <color name="light_grey">#F6F7FB </color> 灰色主题
+    <color name="light_grey">#F6F7FB</color>
+    灰色主题
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d4e14b0..484f157 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -94,5 +94,6 @@
     <string name="invite_reward_text"><![CDATA[
     每邀请1位新用户<font color="#FF0000"><b><i><u>可得</u></i></b></font>
 ]]></string>
+    <string name="title_activity_setting">SettingActivity</string>
 
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 2d7a78f..7611b17 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -55,4 +55,12 @@
         <item name="cornerFamily">rounded</item>
         <item name="cornerSize">50%</item>
     </style>
+
+    <!-- 自定义标题样式 -->
+    <style name="ToolbarTitleStyle">
+        <item name="android:textSize">18sp</item> <!-- 设置标题字体大小 -->
+        <item name="android:gravity">center</item> <!-- 设置标题居中 -->
+        <item name="android:textColor">#000000</item> <!-- 设置标题颜色 -->
+    </style>
+
 </resources>
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 37db13c..8c8308b 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -23,9 +23,9 @@
     </style>
 
     <style name="Theme.FirstApp.Fullscreen" parent="Theme.FirstApp">
-<!--        <item name="android:actionBarStyle">@style/Widget.Theme.FirstApp.ActionBar.Fullscreen</item>-->
-<!--        <item name="android:windowActionBarOverlay">true</item>-->
-<!--        <item name="android:windowBackground">@null</item>-->
+        <!--        <item name="android:actionBarStyle">@style/Widget.Theme.FirstApp.ActionBar.Fullscreen</item>-->
+        <!--        <item name="android:windowActionBarOverlay">true</item>-->
+        <!--        <item name="android:windowBackground">@null</item>-->
     </style>
 
     <style name="ThemeOverlay.FirstApp.FullscreenContainer" parent="">
diff --git a/gradle.properties b/gradle.properties
index 15a3aae..f0b87a1 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -35,5 +35,8 @@
 android.precompileDependenciesResources=false
 android.enableJetifier=true
 #android.enableD8=true
-org.gradle.java.home=D\:\\tanjiyaun\\jdk\\jdk1.8\\jdk-17.0.12
+org.gradle.java.home=D\:\\devInstall\\java\\jdk-17.0.12
+
+# ??????
+WX_PAY_APP_ID=wxb4ba302aa476ea1
 
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index cf13be6..654127e 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -15,6 +15,7 @@
 legacySupportV4 = "1.0.0"
 fragmentKtx = "1.5.6"
 recyclerview = "1.3.0"
+activity = "1.8.0"
 
 [libraries]
 androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@@ -31,6 +32,7 @@
 androidx-legacy-support-v4 = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "legacySupportV4" }
 androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragmentKtx" }
 androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" }
+androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
 
 [plugins]
 android-application = { id = "com.android.application", version.ref = "agp" }
diff --git a/keystore/keystore.jks b/keystore/keystore.jks
new file mode 100644
index 0000000..bd1fd7f
--- /dev/null
+++ b/keystore/keystore.jks
Binary files differ
diff --git a/sms-manager.jks b/keystore/sms-manager.jks
similarity index 100%
rename from sms-manager.jks
rename to keystore/sms-manager.jks
Binary files differ
diff --git a/keytool b/keytool
deleted file mode 100644
index e69de29..0000000
--- a/keytool
+++ /dev/null

--
Gitblit v1.9.3