From 28dc6d062a4ce27441b7923e921a1e7ee7abc154 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期三, 26 三月 2025 14:22:21 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- app/src/main/res/values-v23/themes.xml | 9 + app/src/main/res/values/styles.xml | 9 + app/src/main/res/drawable/ic_back.xml | 10 + app/src/main/res/values/strings.xml | 44 ++++++++ app/src/main/res/values/themes.xml | 5 + app/src/main/res/xml/network_security_config.xml | 2 app/src/main/java/com/example/firstapp/database/service/ApiService.kt | 6 + app/src/main/java/com/example/firstapp/pay/PayResult.kt | 7 + app/src/main/res/layout/fragment_notifications.xml | 44 ++++++++ app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt | 35 +++++++ app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt | 7 + app/src/main/java/com/example/firstapp/pay/PayAbility.kt | 16 +++ app/src/main/res/values-night/themes.xml | 5 + app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | 45 ++++++++ app/build.gradle | 7 + 15 files changed, 242 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6ae6903..3257afb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,7 @@ } buildFeatures { viewBinding true + dataBinding true } } @@ -279,4 +280,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.9.0' + // 支付宝支付SDK + api 'com.alipay.sdk:alipaysdk-android:+@aar' + + implementation 'com.google.android.material:material:1.4.0' + + } \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt b/app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt new file mode 100644 index 0000000..0872566 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt @@ -0,0 +1,7 @@ +package com.example.firstapp.database.response + +data class AlipayOrderInfoResponse( + val code: Int, + val msg: String, + val data: String +) 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 691f7ab..d38137e 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 @@ -2,6 +2,7 @@ import com.example.firstapp.database.entity.ApiResponse import com.example.firstapp.database.entity.KeywordConfig +import com.example.firstapp.database.response.AlipayOrderInfoResponse import com.example.firstapp.database.response.ContentResponse import com.example.firstapp.database.response.DictResponse import com.example.firstapp.database.response.LoginResponse @@ -41,6 +42,9 @@ @GET("config-security/enable-list-all") suspend fun getSecurityList(): SecurityResponse + @GET("alipay/pay-order-info") + suspend fun getPayOrderInfo(): AlipayOrderInfoResponse + @GET("flower/api/supplier/info/{phone}") suspend fun getUserInfo(@Path("phone") phone: String): ApiResponse<UserInfo> @@ -55,7 +59,7 @@ // 创建Retrofit实例(单例) object RetrofitClient{ - private const val BASE_URL ="http://192.168.1.213:8080/" + private const val BASE_URL ="http://192.168.1.198:8888/jshERP-boot/" //添加Gson解析器,用于自动将JSON响应转换为Kotlin/Java对象 private val retrofit = Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build() diff --git a/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt b/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt new file mode 100644 index 0000000..0e5bcc3 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt @@ -0,0 +1,35 @@ +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.Log + +object AliPayHelper { + fun pay(activity: Activity, orderInfo: String,observer:Observer<PayResult>) { + + // 开启线程 + Thread { + try { + var alipayTask = PayTask(activity) + var payV2 = alipayTask.payV2(orderInfo, true) + Log.d("AliPayHelper", "payV2: $payV2") + val payResult = PayResult(payV2) + + var result = payV2.get("result") // 支付结果信息 + var resultStatus = payV2.get("resultStatus") // 支付结果状态码 + var memo = payV2.get("memo") // 错误信息提示 + + Log.d("AliPayHelper", "result: $result") + Log.d("AliPayHelper", "resultStatus: $resultStatus") + Log.d("AliPayHelper", "memo: $memo") + + observer.onChanged(payResult) + + } catch (e: Exception) { + e.printStackTrace() + } + }.start() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/pay/PayAbility.kt b/app/src/main/java/com/example/firstapp/pay/PayAbility.kt new file mode 100644 index 0000000..5f2b35e --- /dev/null +++ b/app/src/main/java/com/example/firstapp/pay/PayAbility.kt @@ -0,0 +1,16 @@ +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/PayResult.kt b/app/src/main/java/com/example/firstapp/pay/PayResult.kt new file mode 100644 index 0000000..9f4d941 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/pay/PayResult.kt @@ -0,0 +1,7 @@ +package com.example.firstapp.pay + +class PayResult constructor(payV2: Map<String,String>) { + val result = payV2.get("result") // 支付结果信息 + val resultStatus = payV2.get("resultStatus") // 支付结果状态码 + val memo = payV2.get("memo") // 错误信息提示 +} \ 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 ea75a47..ef69523 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 @@ -15,6 +15,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -22,9 +23,12 @@ import com.example.firstapp.activity.ContentDetailActivity import com.example.firstapp.database.service.RetrofitClient import com.example.firstapp.databinding.FragmentNotificationsBinding +import com.example.firstapp.pay.PayAbility import com.example.firstapp.ui.reminderOther.ReminderOtherAddActivity2 import com.example.firstapp.ui.reminderOther.ReminderSettingsFragmentOther import com.example.firstapp.ui.profile.EditProfileActivity +import com.example.firstapp.utils.Log +import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.launch import com.bumptech.glide.Glide import com.example.firstapp.database.response.UserInfo @@ -124,6 +128,41 @@ } private fun setupClickListeners() { + + // 支付插件 + binding.payPlugin.setOnClickListener { + // 跳转到支付插件页面 + lifecycleScope.launch { + try { + val response = RetrofitClient.apiService.getPayOrderInfo() + var orderInfo=response.data + Log.d("AliPayHelper","获取订单信息时: ${response}") + // 这里调用支付宝 + PayAbility.aliPay(requireActivity(), orderInfo, Observer { + when (it.resultStatus) { + "9000" -> { +// Snackbar.make(binding.root, "支付成功", Snackbar.LENGTH_LONG).show() + requireActivity().runOnUiThread { + Toast.makeText(requireContext(), "支付成功", Toast.LENGTH_LONG).show() + } + } + else -> { +// Snackbar.make(binding.root, "支付失败", Snackbar.LENGTH_LONG).show() + requireActivity().runOnUiThread { + Toast.makeText(requireContext(), "支付失败", Toast.LENGTH_LONG).show() + } + + } + } + }) + + } catch (e: Exception) { + Log.d("AliPayHelper","获取订单信息时发生错误: ${e.message}") + } + } + } + + // 设置提醒 binding.layoutReminder.setOnClickListener { findNavController().navigate(R.id.action_navigation_notifications_to_reminderSettingsFragment) @@ -270,11 +309,11 @@ .load(userInfo.cover) .placeholder(R.drawable.default_avatar) .into(binding.ivAvatar) - + // 设置昵称和账号 binding.tvNickname.text = userInfo.name binding.tvUserId.text = "个人账号:${userInfo.contactTel}" - + // 设置VIP信息 if (userInfo.showed) { binding.ivVip.visibility = View.VISIBLE @@ -295,7 +334,7 @@ override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - + // 加载用户信息 lifecycleScope.launch { loadUserInfo() diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml index b0ce776..af91489 100644 --- a/app/src/main/res/drawable/ic_back.xml +++ b/app/src/main/res/drawable/ic_back.xml @@ -1,9 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> + <path - android:fillColor="#000000" - android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/> -</vector> \ No newline at end of file + android:strokeColor="#FFFFFF" + android:strokeWidth="2" + android:fillColor="@android:color/transparent" + android:pathData="M15,19l-7-7 7-7" /> +</vector> diff --git a/app/src/main/res/layout/fragment_notifications.xml b/app/src/main/res/layout/fragment_notifications.xml index d0b76ad..6e60a3b 100644 --- a/app/src/main/res/layout/fragment_notifications.xml +++ b/app/src/main/res/layout/fragment_notifications.xml @@ -156,6 +156,50 @@ android:paddingHorizontal="8dp" android:paddingVertical="4dp"> + <!-- 会员 --> + <RelativeLayout + android:id="@+id/memberVip" + style="@style/PluginPay" + android:padding="16dp"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="会员" + android:textColor="@android:color/black" + android:textSize="16sp" /> + + <ImageView + android:layout_width="24dp" + android:layout_height="24dp" + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" + android:src="@drawable/right_forward" /> + </RelativeLayout> + + <!-- 支付 --> + <RelativeLayout + android:id="@+id/payPlugin" + style="@style/PluginPay" + android:padding="16dp"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="支付" + android:textColor="@android:color/black" + android:textSize="16sp" /> + + <ImageView + android:layout_width="24dp" + android:layout_height="24dp" + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" + android:src="@drawable/right_forward" /> + </RelativeLayout> + <!-- 设置提醒 --> <LinearLayout android:id="@+id/layout_reminder" diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 39e726f..4925b55 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -21,4 +21,9 @@ <item name="fullscreenBackgroundColor">@color/light_blue_900</item> <item name="fullscreenTextColor">@color/light_blue_A400</item> </style> + <!-- 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> </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 new file mode 100644 index 0000000..b806642 --- /dev/null +++ b/app/src/main/res/values-v23/themes.xml @@ -0,0 +1,9 @@ +<resources xmlns:tools="http://schemas.android.com/tools"> + + <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/strings.xml b/app/src/main/res/values/strings.xml index feb8be6..f507e55 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,7 +12,6 @@ <string name="title_activity_reminder_other_add2">添加纪念日</string> - <string-array name="day_types"> <item>纪念日</item> <item>生日</item> @@ -48,8 +47,49 @@ <item>月</item> <item>年</item> </string-array> + <string name="title_activity_member">MemberActivity</string> + <!-- Strings used for fragments for navigation --> + <string name="first_fragment_label">First Fragment</string> + <string name="second_fragment_label">Second Fragment</string> + <string name="next">Next</string> + <string name="previous">Previous</string> - + <string name="lorem_ipsum"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris + volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus + dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad + litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend + diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a, + ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.\n\n + Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus + egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed + neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada + fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae, + molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor + bibendum, vel congue leo egestas.\n\n + Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit + amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel, + molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer + interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at + lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula, + in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque + est.\n\n + Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh. + Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui + non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In + eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc, + quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra + ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a + placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus + convallis.\n\n + Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et + malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa + gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper, + libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper + sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus + libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus + vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim. + </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 b325d99..2d7a78f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -9,6 +9,15 @@ <item name="android:focusable">true</item> </style> + <style name="PluginPay"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:padding">16dp</item> + <item name="android:background">?android:attr/selectableItemBackground</item> + <item name="android:clickable">true</item> + <item name="android:focusable">true</item> + </style> + <style name="Widget.Theme.FirstApp.ActionBar.Fullscreen" parent="Widget.AppCompat.ActionBar"> <item name="android:background">@color/black_overlay</item> </style> diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index b8ebbff..02c10a9 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -34,4 +34,9 @@ <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style> + <!-- Base application theme. --> + <style name="Base.Theme.FirstApp" parent="Theme.Material3.DayNight.NoActionBar"> + <!-- Customize your light theme here. --> + <!-- <item name="colorPrimary">@color/my_light_primary</item> --> + </style> </resources> \ 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 f0f1944..d1689af 100644 --- a/app/src/main/res/xml/network_security_config.xml +++ b/app/src/main/res/xml/network_security_config.xml @@ -3,6 +3,8 @@ <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">47.96.225.205</domain> <domain includeSubdomains="true">192.168.1.213</domain> + <domain includeSubdomains="true">192.168.1.198</domain> + <domain includeSubdomains="true">192.168.1.199</domain> <!-- 可添加其他域名或IP(如192.168.0.101) --> <!-- 如果本地服务使用自签名证书,需在 network_security_config.xml 中信任该证书:--> <!-- <trust-anchors>--> -- Gitblit v1.9.3