cloudroam
2025-03-26 28dc6d062a4ce27441b7923e921a1e7ee7abc154
Merge remote-tracking branch 'origin/master'
已修改10个文件
已添加5个文件
251 ■■■■■ 文件已修改
app/build.gradle 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/service/ApiService.kt 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/pay/PayAbility.kt 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/pay/PayResult.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/ic_back.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_notifications.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-night/themes.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-v23/themes.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/strings.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/styles.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/themes.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/xml/network_security_config.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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'
}
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
)
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()
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()
    }
}
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)
    }
}
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") // 错误信息提示
}
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()
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>
        android:strokeColor="#FFFFFF"
        android:strokeWidth="2"
        android:fillColor="@android:color/transparent"
        android:pathData="M15,19l-7-7 7-7" />
</vector>
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"
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>
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>
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>
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>
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>
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>-->