Merge remote-tracking branch 'origin/master'
| | |
| | | } |
| | | buildFeatures { |
| | | viewBinding true |
| | | dataBinding true |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | 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' |
| | | |
| | | |
| | | } |
对比新文件 |
| | |
| | | package com.example.firstapp.database.response |
| | | |
| | | data class AlipayOrderInfoResponse( |
| | | val code: Int, |
| | | val msg: String, |
| | | val data: String |
| | | ) |
| | |
| | | |
| | | 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 |
| | |
| | | @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> |
| | | |
| | |
| | | // 创建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() |
对比新文件 |
| | |
| | | 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() |
| | | } |
| | | } |
对比新文件 |
| | |
| | | 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) |
| | | } |
| | | |
| | | } |
对比新文件 |
| | |
| | | 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") // 错误信息提示 |
| | | } |
| | |
| | | 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 |
| | |
| | | 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 |
| | |
| | | } |
| | | |
| | | 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) |
| | |
| | | .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 |
| | |
| | | |
| | | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
| | | super.onViewCreated(view, savedInstanceState) |
| | | |
| | | |
| | | // 加载用户信息 |
| | | lifecycleScope.launch { |
| | | loadUserInfo() |
| | |
| | | <?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> |
| | |
| | | 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" |
| | |
| | | <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> |
对比新文件 |
| | |
| | | <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> |
| | |
| | | <string name="title_activity_reminder_other_add2">添加纪念日</string> |
| | | |
| | | |
| | | |
| | | <string-array name="day_types"> |
| | | <item>纪念日</item> |
| | | <item>生日</item> |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | <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>--> |