From 7f55711fd88ff5dc67bbd386fbecc7bd50bd98c2 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期四, 06 三月 2025 14:44:04 +0800
Subject: [PATCH] feat(generallibrary): 新增制卡管理功能

---
 generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt                             |   14 
 qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/RetrofitClient.java           |    1 
 generallibrary/src/main/java/com/dayu/general/activity/BaseNfcActivity.kt                    |    8 
 baselibrary/src/main/java/com/dayu/baselibrary/net/BaseApiService.java                       |    7 
 generallibrary/src/main/res/drawable/ic_arrow_right.xml                                      |   10 
 generallibrary/src/main/res/layout/dialog_search.xml                                         |  142 +++++
 generallibrary/src/main/java/com/dayu/general/dialog/SearchDialog.kt                         |   76 +++
 generallibrary/src/main/res/layout/fragment_card.xml                                         |   25 
 baselibrary/src/main/res/layout/custom_titlebar.xml                                          |    7 
 generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt                   |   48 +
 generallibrary/src/main/res/layout/fragment_my.xml                                           |   20 
 generallibrary/src/main/java/com/dayu/general/net/ApiService.kt                              |   32 +
 generallibrary/src/main/res/drawable/card_ripple_effect.xml                                  |   11 
 qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/MyIntercepterApplication.java |    9 
 generallibrary/src/main/AndroidManifest.xml                                                  |    4 
 generallibrary/src/main/java/com/dayu/general/activity/ManageListActivity.kt                 |   15 
 generallibrary/src/main/java/com/dayu/general/net/BaseResponse.kt                            |   16 
 generallibrary/src/main/java/com/dayu/general/net/MyInercepterApplication.kt                 |   84 +++
 qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/ApiService.java               |    7 
 generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt                     |   11 
 generallibrary/src/main/res/layout/activity_new_user_card_ge.xml                             |   21 
 generallibrary/src/main/res/layout/activity_manage_list_ge.xml                               |  156 ++++++
 generallibrary/src/main/java/com/dayu/general/bean/card/CardCommon.kt                        |  184 +++----
 generallibrary/src/main/res/layout/activity_nfc_write_ge.xml                                 |  131 +++++
 generallibrary/src/main/java/com/dayu/general/net/RetrofitClient.kt                          |   68 ++
 /dev/null                                                                                    |   13 
 generallibrary/src/main/java/com/dayu/general/activity/SearchUserActivity.kt                 |   74 ++
 generallibrary/src/main/res/layout/fragment_recharge.xml                                     |   31 
 baselibrary/src/main/res/values/colors.xml                                                   |    1 
 generallibrary/src/main/res/drawable/bg_card.xml                                             |    9 
 generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt                              |  176 +++++++
 generallibrary/src/main/res/layout/activity_search_user_ge.xml                               |   41 +
 32 files changed, 1,272 insertions(+), 180 deletions(-)

diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/net/BaseApiService.java b/baselibrary/src/main/java/com/dayu/baselibrary/net/BaseApiService.java
new file mode 100644
index 0000000..f6f8882
--- /dev/null
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/net/BaseApiService.java
@@ -0,0 +1,7 @@
+package com.dayu.baselibrary.net;
+
+public interface BaseApiService {
+
+
+
+}
diff --git a/baselibrary/src/main/res/layout/custom_titlebar.xml b/baselibrary/src/main/res/layout/custom_titlebar.xml
index 693296c..ca1e8c3 100644
--- a/baselibrary/src/main/res/layout/custom_titlebar.xml
+++ b/baselibrary/src/main/res/layout/custom_titlebar.xml
@@ -84,14 +84,14 @@
             android:layout_weight="2"
             android:background="@null"
             android:gravity="center_vertical|right"
-            android:orientation="horizontal"
-            android:paddingRight="15dp">
+            android:orientation="horizontal">
 
 
             <TextView
                 android:id="@+id/tv_titlebar_right"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginRight="15dp"
                 android:background="@null"
                 android:text="瀹屾垚"
                 android:textColor="#ffffff"
@@ -103,6 +103,9 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:background="@null"
+                android:paddingLeft="5dp"
+                android:paddingTop="10dp"
+                android:paddingBottom="10dp"
                 android:src="@null"
                 android:visibility="visible" />
         </LinearLayout>
diff --git a/baselibrary/src/main/res/values/colors.xml b/baselibrary/src/main/res/values/colors.xml
index 948f6bd..af528ef 100644
--- a/baselibrary/src/main/res/values/colors.xml
+++ b/baselibrary/src/main/res/values/colors.xml
@@ -40,4 +40,5 @@
 
     <color name="button_text_color">#555</color>
     <color name="button_select_text_color">#0aa666</color>
+    <color name="title_bar_text">#333333</color>
 </resources>
\ No newline at end of file
diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml
index 9db0f55..593d0cb 100644
--- a/generallibrary/src/main/AndroidManifest.xml
+++ b/generallibrary/src/main/AndroidManifest.xml
@@ -48,6 +48,10 @@
         <!--            </intent-filter>-->
         <!--        </activity>-->
         <activity android:name="com.dayu.general.activity.NewCardActivity" />
+        <activity android:name="com.dayu.general.activity.ManageListActivity" />
+        <activity android:name="com.dayu.general.activity.SearchUserActivity"/>
+        <activity android:name="com.dayu.general.activity.NfcWreatActivity" />
+        <activity android:name="com.dayu.general.activity.NewCardActivity"/>
 
 
         <meta-data
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
index e19da99..806c03e 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
@@ -9,6 +9,11 @@
 import com.dayu.general.databinding.FragmentCardBinding
 import com.tencent.bugly.proguard.v
 
+/**
+ * @author: zuo
+ * @desc: 鍒跺崱棣栭〉
+ * @since:2025/3/6
+ */
 class BSCardFragment :Fragment() {
 
     private var binding: FragmentCardBinding? = null
@@ -28,7 +33,11 @@
 
     private fun initView() {
         binding?.homeNewCard?.setOnClickListener {
-            val intent = Intent(context, NewCardActivity::class.java)
+            val intent = Intent(context, SearchUserActivity::class.java)
+            startActivity(intent)
+        }
+        binding?.homeManage?.setOnClickListener {
+            val intent = Intent(context, ManageListActivity::class.java)
             startActivity(intent)
         }
     }
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/BaseNfcActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/BaseNfcActivity.kt
new file mode 100644
index 0000000..b00bef6
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/activity/BaseNfcActivity.kt
@@ -0,0 +1,8 @@
+package com.dayu.general.activity
+
+import android.content.Intent
+import com.dayu.baselibrary.activity.BaseNfcActivity
+
+abstract class BaseNfcActivity:BaseNfcActivity() {
+
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/ManageListActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/ManageListActivity.kt
new file mode 100644
index 0000000..e612834
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/activity/ManageListActivity.kt
@@ -0,0 +1,15 @@
+package com.dayu.general.activity
+
+import android.os.Bundle
+import com.dayu.general.databinding.ActivityManageListGeBinding
+
+class ManageListActivity : BaseActivity() {
+
+    var binding: ActivityManageListGeBinding? = null
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityManageListGeBinding.inflate(layoutInflater)
+        setContentView(binding?.root)
+    }
+
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
new file mode 100644
index 0000000..202d43b
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -0,0 +1,48 @@
+package com.dayu.general.activity
+
+import android.content.Intent
+import android.os.Bundle
+import com.dayu.general.bean.card.CardCommon
+import com.dayu.general.databinding.ActivityNfcWriteGeBinding
+
+/**
+ * @author: zuo
+ * @date: 2021/3/30
+ * @description:鍐欏崱鐣岄潰
+ */
+class NfcWreatActivity:BaseNfcActivity() {
+
+    var binding:ActivityNfcWriteGeBinding? = null
+
+    var cardType = ""
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityNfcWriteGeBinding.inflate(layoutInflater)
+        setContentView(binding?.root)
+        getInitData()
+    }
+
+    /**
+     * 鑾峰彇鏁版嵁
+     */
+    private fun getInitData(){
+        cardType= intent?.getStringExtra("cardType")?:""
+    }
+
+    private fun setTextData(){
+        when(cardType){
+            CardCommon.CHECK_CARD->{
+                binding?.cardData?.text = "鍐欑敤鎴峰崱"
+            }
+
+        }
+    }
+    override fun onNfcBack(intent: Intent?) {
+        TODO("Not yet implemented")
+
+
+
+
+    }
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/SearchUserActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/SearchUserActivity.kt
new file mode 100644
index 0000000..c0fb6d5
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/activity/SearchUserActivity.kt
@@ -0,0 +1,74 @@
+package com.dayu.general.activity
+
+import android.os.Bundle
+import android.widget.Toast
+import com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE
+import com.dayu.baselibrary.view.TitleBar.ClickType_RIGHT_IMAGE
+import com.dayu.general.databinding.ActivitySearchUserGeBinding
+import com.dayu.general.dialog.SearchDialog
+
+/**
+ * @author: zuo
+ * @date: 2023/6/26 16:09
+ * @description:鎼滅储鐢ㄦ埛
+ */
+class SearchUserActivity : BaseActivity() {
+
+    var binding: ActivitySearchUserGeBinding? = null
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivitySearchUserGeBinding.inflate(layoutInflater)
+        setContentView(binding?.root)
+        initView()
+    }
+
+
+    fun initView() {
+        binding?.titleBar?.setOnItemclickListner(ClickType_LEFT_IMAGE) { this.finish() }
+        binding?.titleBar?.setOnItemclickListner(ClickType_RIGHT_IMAGE) {
+            // 鍒涘缓鎼滅储瀵硅瘽妗�
+            val searchDialog = SearchDialog(this)
+
+            // 璁剧疆鎼滅储鐩戝惉鍣�
+            searchDialog.setOnSearchListener(object : SearchDialog.OnSearchListener {
+                override fun onSearch(farmerId: String, farmerName: String, cardNumber: String) {
+                    // 澶勭悊鎼滅储缁撴灉
+                    // 杩欓噷鍙槸绀轰緥锛屽疄闄呭簲鐢ㄤ腑鍙兘闇�瑕佽皟鐢ˋPI鎴栨煡璇㈡暟鎹簱
+                    val message =
+                        "鎼滅储鏉′欢锛歕n鍐滄埛缂栧彿锛�$farmerId\n鍐滄埛鍚嶇О锛�$farmerName\n鍗″彿锛�$cardNumber"
+                    // 鎵ц瀹為檯鐨勬悳绱㈤�昏緫
+                    performSearch(farmerId, farmerName, cardNumber)
+                }
+            })
+            // 鏄剧ず瀵硅瘽妗�
+            searchDialog.show()
+        }
+    }
+    /**
+     * 鎵ц鎼滅储閫昏緫
+     * 杩欓噷鍙槸涓�涓ず渚嬫柟娉曪紝瀹為檯搴旂敤涓渶瑕佹牴鎹叿浣撻渶姹傚疄鐜�
+     */
+    private fun performSearch(farmerId: String, farmerName: String, cardNumber: String) {
+        // 杩欓噷鍙互瀹炵幇瀹為檯鐨勬悳绱㈤�昏緫
+        // 渚嬪锛氳皟鐢ˋPI銆佹煡璇㈡暟鎹簱绛�
+
+        // 绀轰緥锛氭瀯寤烘悳绱㈡潯浠�
+        val searchConditions = mutableMapOf<String, String>()
+
+        if (farmerId.isNotEmpty()) {
+            searchConditions["farmerId"] = farmerId
+        }
+
+        if (farmerName.isNotEmpty()) {
+            searchConditions["farmerName"] = farmerName
+        }
+
+        if (cardNumber.isNotEmpty()) {
+            searchConditions["cardNumber"] = cardNumber
+        }
+
+        // 鏍规嵁鎼滅储鏉′欢鎵ц鎼滅储
+        // 瀹為檯搴旂敤涓紝杩欓噷鍙兘鏄綉缁滆姹傛垨鏁版嵁搴撴煡璇�
+        // searchRepository.search(searchConditions)
+    }
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/CardCommon.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/CardCommon.kt
index fac205c..9031af7 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/CardCommon.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/CardCommon.kt
@@ -7,106 +7,6 @@
 
     val ERROR_MOVE: Int = -2
 
-    /**
-     * 鐢ㄦ埛鍒峰崱寮�娉靛墠
-     */
-
-    val USER_CARD_TYPE_1: String = "A1"
-
-    /**
-     * 鐢ㄦ埛鍒峰崱寮�娉靛悗
-     */
-
-    val USER_CARD_TYPE_2: String = "A8"
-
-    /**
-     * 鐢ㄦ埛鍙犲姞鍏呭��
-     */
-
-    val USER_CARD_TYPE_3: String = "A2"
-
-
-    /**
-     * 璁剧疆鍖哄煙琛ㄥ彿鍗�
-     */
-
-    val REGION: String = "B0"
-
-
-    /**
-     * 璁剧疆鐢ㄦ埛鐢甸噺鍗曚环鍗�
-     */
-
-    val ELECTRIC_PRICE: String = "B1"
-
-
-    /**
-     * 绠$悊鍗�
-     */
-
-    val MANAGE_CRAD: String = "B2"
-
-
-    /**
-     * 娓呴浂鍗�
-     */
-
-    val CLEAN_CARD_TYPE: String = "C8"
-
-
-    /**
-     * 瀵嗙爜鍗�
-     */
-
-    val PASS_WORD_CRAD_TYPE: String = "B3"
-
-
-    /**
-     * 閰嶇疆榛戝崱  褰撶敤鎴蜂涪澶卞崱鏃讹紝闇�瑕佸湪瀵瑰簲鐨勬帶鍒跺櫒鎶婃鐢ㄦ埛閰嶇疆涓洪粦鎴凤紝闃叉闈炴硶鐢ㄦ按
-     */
-
-    val BLACK: String = "B4"
-
-
-    /**
-     * 浠ヤ笅鏈敤鍒�
-     * *****************************************************************************************************************************************
-     */
-    /**
-     * 閲嶆柊娉ㄥ唽璁惧鍗�
-     */
-
-    val REGISTERED_CARD_TYPE: String = "BA"
-
-    /**
-     * 鍒犻櫎鍏ㄩ儴鐢ㄦ埛鍗�
-     */
-
-    val CLEAN_ALL_USER_CARD_TYPE: String = "BB"
-
-    /**
-     * 璁剧疆鍩熷悕鍗�
-     */
-
-    val DOMAIN_CARD_TYPE: String = "C1"
-
-    /**
-     * 娴嬭瘯鍗�
-     */
-
-    val TEST_CARD_TYPE: String = "A4"
-
-    /**
-     * 閰嶇疆璁惧娉ㄥ唽淇℃伅鍗�
-     */
-
-    val CONFIGURATION_CARD_TYPE: String = "BC"
-
-    /**
-     * 閰嶇疆姘存车鍔熺巼鍗�
-     */
-
-    val CONFIGURATION_POWER_CARD_TYPE: String = "BD"
 
     /**
      * 鑾峰彇榛樿鐨勫崱鏍囪瘑
@@ -118,15 +18,97 @@
         var cardData = ""
         when (cardType) {
             CLEAN_CARD_TYPE -> cardData = "3668F7A30119"
-            MANAGE_CRAD, REGISTERED_CARD_TYPE, CLEAN_ALL_USER_CARD_TYPE, TEST_CARD_TYPE, CONFIGURATION_CARD_TYPE, CONFIGURATION_POWER_CARD_TYPE, PASS_WORD_CRAD_TYPE, BLACK, ELECTRIC_PRICE -> cardData =
+            MANAGE_CRAD, USER_CARD_TYPE_1, USER_CARD_TYPE_2, USER_CARD_TYPE_3, REGION_CARD, ELECTRIC_PRICE_CARD, MANAGE_CRAD, VALVE_TIME_CARD, GPS_CARD, AREA_CARD, IP_CARD, CHECK_CARD, DEBUG_CARD, CLEAN_CARD_TYPE -> cardData =
                 "A0B1C289"
         }
         return cardData
     }
 
     companion object {
+
+
+        /**
+         * 鐢ㄦ埛鍒峰崱寮�娉靛墠
+         */
+
+        const val USER_CARD_TYPE_1: String = "A1"
+
+        /**
+         * 鐢ㄦ埛鍒峰崱寮�娉靛悗
+         */
+
+        const val USER_CARD_TYPE_2: String = "A8"
+
+        /**
+         * 鐢ㄦ埛鍙犲姞鍏呭��
+         */
+
+        const val USER_CARD_TYPE_3: String = "A2"
+
+
+        /**
+         * 璁剧疆鍖哄煙琛ㄥ彿鍗�
+         */
+
+        const val REGION_CARD: String = "B0"
+
+
+        /**
+         * 鍙栨暟鍗★紙闇�瑕佸埛鍗″彇鏁帮級
+         */
+
+        const val ELECTRIC_PRICE_CARD: String = "B1"
+
+
+        /**
+         * 鍙栨暟鍗★紙鍒峰崱鍙栨暟杩斿啓鎴愬姛锛�
+         */
+
+        const val MANAGE_CRAD: String = "B2"
+
+
+        /**
+         * 妫�鏌ュ崱
+         */
+        const val CHECK_CARD: String = "B3"
+
+        /**
+         * 璋冭瘯鍗�
+         */
+        const val DEBUG_CARD = "B4"
+
+        /**
+         * 娓呴浂鍗�
+         */
+
+        const val CLEAN_CARD_TYPE: String = "C1"
+
+        /**
+         * IP鍦板潃璁剧疆鍗�
+         */
+
+        const val IP_CARD: String = "B5"
+
+        /**
+         * 鍖哄煙璁剧疆鍗�
+         */
+        const val AREA_CARD: String = "B6"
+
+
+        /**
+         * GPS璁剧疆鍗�
+         */
+        const val GPS_CARD: String = "B7"
+
+        /**
+         * 閰嶇疆寮�鍏抽榾鏃堕棿
+         */
+        const val VALVE_TIME_CARD: String = "B8"
+
+
         fun getDefaultCardData(cardType: String?): String? {
             return getDefaultCardData(cardType)
         }
+
     }
 }
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/dialog/SearchDialog.kt b/generallibrary/src/main/java/com/dayu/general/dialog/SearchDialog.kt
new file mode 100644
index 0000000..a97f913
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/dialog/SearchDialog.kt
@@ -0,0 +1,76 @@
+package com.dayu.general.dialog
+
+import android.app.Dialog
+import android.content.Context
+import android.os.Bundle
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import android.view.WindowManager
+import com.dayu.general.R
+import com.dayu.general.databinding.DialogSearchBinding
+
+/**
+ * 鎼滅储瀵硅瘽妗�
+ * 鐢ㄤ簬鎼滅储鍐滄埛缂栧彿銆佸啘鎴峰悕绉般�佸崱鍙�
+ */
+class SearchDialog(context: Context) : Dialog(context) {
+
+    private lateinit var binding: DialogSearchBinding
+    private var onSearchListener: OnSearchListener? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = DialogSearchBinding.inflate(LayoutInflater.from(context))
+        setContentView(binding.root)
+
+        // 璁剧疆瀵硅瘽妗嗗搴︿负灞忓箷瀹藉害鐨�85%
+        window?.apply {
+            val params = attributes
+            params.width = (context.resources.displayMetrics.widthPixels * 0.85).toInt()
+            params.height = ViewGroup.LayoutParams.WRAP_CONTENT
+            params.gravity = Gravity.CENTER
+            attributes = params
+            setBackgroundDrawableResource(android.R.color.transparent)
+        }
+
+        // 璁剧疆鐐瑰嚮澶栭儴涓嶅彇娑堝璇濇
+        setCanceledOnTouchOutside(false)
+
+        // 璁剧疆鎼滅储鎸夐挳鐐瑰嚮浜嬩欢
+        binding.btnSearch.setOnClickListener {
+            val farmerId = binding.etFarmerId.text.toString().trim()
+            val farmerName = binding.etFarmerName.text.toString().trim()
+            val cardNumber = binding.etCardNumber.text.toString().trim()
+            
+            // 鍥炶皟鎼滅储浜嬩欢
+            onSearchListener?.onSearch(farmerId, farmerName, cardNumber)
+            dismiss()
+        }
+        
+        // 璁剧疆鍙栨秷鎸夐挳鐐瑰嚮浜嬩欢
+        binding.tvCancel.setOnClickListener {
+            dismiss()
+        }
+    }
+
+    /**
+     * 璁剧疆鎼滅储鐩戝惉鍣�
+     */
+    fun setOnSearchListener(listener: OnSearchListener) {
+        this.onSearchListener = listener
+    }
+
+    /**
+     * 鎼滅储鐩戝惉鍣ㄦ帴鍙�
+     */
+    interface OnSearchListener {
+        /**
+         * 鎼滅储鍥炶皟鏂规硶
+         * @param farmerId 鍐滄埛缂栧彿
+         * @param farmerName 鍐滄埛鍚嶇О
+         * @param cardNumber 鍗″彿
+         */
+        fun onSearch(farmerId: String, farmerName: String, cardNumber: String)
+    }
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt b/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
new file mode 100644
index 0000000..6dab3dc
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
@@ -0,0 +1,176 @@
+package com.dayu.general.net
+
+import android.content.Context
+import android.text.TextUtils
+import com.dayu.baselibrary.business.BusinessProvider
+import com.dayu.baselibrary.net.subscribers.BaseProgressSubscriber
+import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
+import io.reactivex.rxjava3.core.Observable
+import io.reactivex.rxjava3.functions.Function
+import io.reactivex.rxjava3.schedulers.Schedulers
+
+/**
+ * Description:
+ * Author: zuo
+ * Date: 2025-03-06
+ */
+class ApiManager {
+
+    var apiService: ApiService? = null
+
+    fun init() {
+        if (apiManager == null) {
+            apiManager =
+                com.dayu.qiheonlinelibrary.net.ApiManager()
+        }
+    }
+
+    fun ApiManager() {
+        apiService = RetrofitClient.getInstance().getApiService()
+    }
+
+    fun getInstance(): com.dayu.qiheonlinelibrary.net.ApiManager {
+        return apiManager
+    }
+
+
+    fun <T> requestPostLoading(
+        context: Context?,
+        path: String?,
+        tClass: Class<T>?,
+        params: Map<String?, Any?>?,
+        listener: SubscriberListener<*>?
+    ) {
+        request(context, false, path, false, tClass, params, listener)
+    }
+
+    fun <T> requestPostHideLoading(
+        context: Context?,
+        path: String?,
+        tClass: Class<T>?,
+        params: Map<String?, Any?>?,
+        listener: SubscriberListener<*>?
+    ) {
+        request(context, true, path, false, tClass, params, listener)
+    }
+
+    fun <T> requestPost(
+        context: Context?,
+        path: String?,
+        tClass: Class<T>?,
+        params: Map<String?, Any?>?,
+        listener: SubscriberListener<*>?
+    ) {
+        request(context, false, path, false, tClass, params, listener)
+    }
+
+    /**
+     * 鍙戦�佽姹�
+     *
+     * @param context
+     * @param hideLoading 鏄惁鏄剧ず鍔犺浇妗�  false锛氭樉绀�  true锛氶殣钘�
+     * @param path        璇锋眰璺緞锛屽湪UrlConfig涓畾涔�
+     * @param isGet       鏄惁鏄疓et璇锋眰 true锛歡et 璇锋眰
+     * @param tClass      瀵瑰簲鐨勬暟鎹被鍨�
+     * @param params      Post璇锋眰鏃讹紝瀵瑰簲鐨勫弬鏁�
+     * @param listener    鍥炶皟璇锋眰
+     * @param <T>
+    </T> */
+    fun <T> request(
+        context: Context?,
+        hideLoading: Boolean,
+        path: String?,
+        isGet: Boolean,
+        tClass: Class<T>?,
+        params: Map<String?, Any?>?,
+        listener: SubscriberListener<*>?
+    ) {
+        val observable: Observable<*>=if (isGet) {
+            if (params == null) {
+                apiService.requestGet(path)
+            } else {
+                apiService.requestGet(path, params)
+            }
+        } else {
+            if (params != null) {
+                apiService.requestPost(path, params)
+            } else {
+                apiService.requestPost(path)
+            }
+        }
+
+        val mySubscriber: BaseProgressSubscriber<*>=ProgressSubscriber<Any?>(context, hideLoading, listener)
+        observable.subscribeOn(Schedulers.io()).map
+        object : Function<Any?, com.dayu.qiheonlinelibrary.net.BaseResponse<T>?> {
+            override fun apply(o: Any): com.dayu.qiheonlinelibrary.net.BaseResponse<T> {
+                if (o is com.dayu.qiheonlinelibrary.net.BaseResponse) {
+                    val tem: com.dayu.qiheonlinelibrary.net.BaseResponse =
+                        o as com.dayu.qiheonlinelibrary.net.BaseResponse
+                    val response: com.dayu.qiheonlinelibrary.net.BaseResponse<T> =
+                        com.dayu.qiheonlinelibrary.net.BaseResponse<T>()
+                    //鏈櫥褰曟垨鐧诲綍瓒呮椂锛岃閲嶆柊鐧诲綍
+                    if (tem.getCode() == 100401) {
+                        if (BusinessProvider.getBusinessProvider() != null) {
+                            BusinessProvider.getBusinessProvider().startLoginNavigotor.navigateToLogin(
+                                context
+                            )
+                        }
+                    }
+                    response.setCode(tem.getCode())
+                    response.setMsg(tem.getMsg())
+                    if (tClass != null) {
+                        if (TextUtils.isEmpty(
+                                tem.getData().toString()
+                            ) && BaseResult::class.java.isAssignableFrom(tClass)
+                        ) {
+                            response.setData(null)
+                            return response
+                        }
+                        if (tem.getData() is Map<*, *>) {
+                            try {
+//                                    response.setData(MyJsonParser.getBeanFromMap((Map<String, Object>) tem.getData(), tClass));
+                                val jsonData: String =
+                                    MyJsonParser.getJsontoMap(tem.getData() as Map<*, *>)
+                                response.setData(MyJsonParser.getBeanFromJson<T>(jsonData, tClass))
+                            } catch (e: Exception) {
+                                e.printStackTrace()
+                            }
+                        } else if (tem.getData() is List<*>) {
+                            try {
+                                response.setData(
+                                    MyJsonParser.getListByJson<T>(
+                                        MyJsonParser.getJsonbyList<Any>(
+                                            tem.getData() as List<*>
+                                        ), tClass
+                                    ) as T
+                                )
+                            } catch (e: Exception) {
+                                e.printStackTrace()
+                            }
+                        } else if (tem.getData() is Int) {
+                            response.setData(tem.getData() as T)
+                        } else if (tem.getData() is Boolean) {
+                            response.setData(tem.getData() as T)
+                        }
+                        if (tClass.name is String && tem.getData() is String) {
+                            try {
+                                response.setData(tem.getData() as T)
+                            } catch (e: Exception) {
+                                e.printStackTrace()
+                            }
+                        }
+                        return response
+                    }
+                }
+
+                return null
+            }
+        }
+            .unsubscribeOn(Schedulers.newThread())
+            .observeOn(AndroidSchedulers.mainThread())
+            .subscribe(mySubscriber)
+    }
+    
+    
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/ApiService.kt b/generallibrary/src/main/java/com/dayu/general/net/ApiService.kt
new file mode 100644
index 0000000..3992cc1
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/net/ApiService.kt
@@ -0,0 +1,32 @@
+package com.dayu.general.net
+
+import com.dayu.baselibrary.net.BaseApiService
+import io.reactivex.rxjava3.core.Observable
+import retrofit2.http.Body
+import retrofit2.http.GET
+import retrofit2.http.POST
+import retrofit2.http.Path
+import retrofit2.http.QueryMap
+import retrofit2.http.Url
+
+interface ApiService : BaseApiService {
+
+    @POST
+    fun requestPost(
+        @Url url: String?,
+        @Body params: Map<String?, Any?>?
+    ): Observable<BaseResponse<Any?>>?
+
+    @POST
+    fun requestPost(@Url url: String?): Observable<BaseResponse<Any?>>?
+
+    @GET("{url}")
+    fun requestGet(
+        @Path("url") url: String?,
+        @QueryMap params: Map<String?, Any?>?
+    ): Observable<BaseResponse<Any?>>?
+
+    @GET("{url}")
+    fun requestGet(@Path("url") url: String?): Observable<BaseResponse<Any?>>?
+
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/BaseResponse.kt b/generallibrary/src/main/java/com/dayu/general/net/BaseResponse.kt
new file mode 100644
index 0000000..3097c10
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/net/BaseResponse.kt
@@ -0,0 +1,16 @@
+package com.dayu.general.net
+
+/**
+ * Description:
+ * Author: zuo
+ * Date: 2025-03-06
+ */
+class BaseResponse<T> {
+    var code: Int = 0
+    var msg: String? = null
+    var content: T? = null
+    var success:Boolean = false
+
+    companion object
+
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/MyInercepterApplication.kt b/generallibrary/src/main/java/com/dayu/general/net/MyInercepterApplication.kt
new file mode 100644
index 0000000..95beb88
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/net/MyInercepterApplication.kt
@@ -0,0 +1,84 @@
+package com.dayu.general.net
+
+import android.text.TextUtils
+import com.dayu.qiheonlinelibrary.QHOnLineApplication
+import com.tencent.bugly.crashreport.CrashReport
+import okhttp3.Interceptor
+import okhttp3.Protocol
+import okhttp3.Request
+import okhttp3.Response
+import okhttp3.ResponseBody
+import java.io.IOException
+import java.net.ConnectException
+
+/**
+ * Description:
+ * Author: zuo
+ * Date: 2025-03-06
+ */
+class MyInercepterApplication :Interceptor{
+
+    @Throws(IOException::class)
+    override fun intercept(chain: Interceptor.Chain): Response {
+        val request: Request = chain.request()
+        try {
+            val myRequest = createRequest(chain.request())
+            if (myRequest != null) {
+                var response: Response? = null
+                try {
+                    response = chain.proceed(myRequest)
+                } catch (e: ConnectException) {
+                    e.printStackTrace()
+                    return getNullResponse(request)
+                }
+                return response
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            CrashReport.postCatchedException(e)
+        }
+        return getNullResponse(request)
+    }
+
+    protected fun createRequest(request: Request): Request? {
+        try {
+            val builder: Request.Builder = request.newBuilder()
+            val params: Map<*, *> = HashMap<Any?, Any?>()
+            if (request.method == "GET") {
+                builder.url(request.url.toString())
+            } else {
+                if (!TextUtils.isEmpty(QHOnLineApplication.getInstance().tokenStr)) {
+                    builder.addHeader("Token-Cloud", QHOnLineApplication.getInstance().tokenStr)
+                }
+            }
+            return builder.build()
+        } catch (e: Exception) {
+            e.printStackTrace()
+            CrashReport.postCatchedException(e)
+        }
+        return null
+    }
+
+    /**
+     * 缃戠粶閿欒鏃剁殑寮傚父澶勭悊
+     *
+     * @param request
+     * @return
+     */
+    fun getNullResponse(request: Request?): Response {
+        val code = 20010
+        val message = "鍜︼紝璇锋鏌ョ綉缁�"
+        val errJson = "{\"code\":$code,\"message\":\"$message\"}"
+        val responseBody = ResponseBody.create(null, errJson)
+        return Response.Builder()
+            .request(request!!)
+            .protocol(Protocol.HTTP_1_1)
+            .code(200)
+            .message(message)
+            .body(responseBody)
+            .build()
+    }
+
+
+
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt b/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
new file mode 100644
index 0000000..0c0e7f2
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
@@ -0,0 +1,14 @@
+package com.dayu.general.net
+
+/**
+ * @author zuo
+ * @date 2025/3/6
+ * @description
+ */
+class NetConstans {
+    companion object {
+        const val BASE_URL: String = "http://120.46.45.35:20081/api/sjgg/"
+
+    }
+
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/RetrofitClient.kt b/generallibrary/src/main/java/com/dayu/general/net/RetrofitClient.kt
new file mode 100644
index 0000000..97bdbeb
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/net/RetrofitClient.kt
@@ -0,0 +1,68 @@
+package com.dayu.general.net
+
+import com.dayu.baselibrary.BuildConfig
+import com.dayu.qiheonlinelibrary.net.MyIntercepterApplication
+import okhttp3.OkHttpClient
+import okhttp3.logging.HttpLoggingInterceptor
+import retrofit2.Retrofit
+import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory
+import retrofit2.converter.gson.GsonConverterFactory
+import java.util.concurrent.TimeUnit
+
+/**
+ * Description:
+ * Author: zuo
+ * Date: 2025-03-06
+ */
+class RetrofitClient {
+
+
+
+    private var retrofit: Retrofit? = null
+    val READ_TIME_OUT: Int = 10
+    val CONNECT_TIME_OUT: Int = 10
+
+    private fun RetrofitClient() {
+        val loggingInterceptor = HttpLoggingInterceptor()
+        // 鍖呭惈header銆乥ody鏁版嵁
+        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
+        //        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
+        val builder:  OkHttpClient.Builder = OkHttpClient().newBuilder()
+        //璁剧疆杩炴帴鍜岃鍙栨椂闂�
+        builder.readTimeout(READ_TIME_OUT.toLong(), TimeUnit.SECONDS)
+        builder.connectTimeout(CONNECT_TIME_OUT.toLong(), TimeUnit.SECONDS)
+        builder.writeTimeout(CONNECT_TIME_OUT.toLong(), TimeUnit.SECONDS)
+        //娣诲姞缁熶竴鐨刪eader
+        builder.addInterceptor(MyIntercepterApplication())
+        //娣诲姞鏃ュ織鎷︽埅鍣�
+        //娣诲姞鏁版嵁璇锋眰缁熶竴澶勭悊鎷︽埅鍣�
+        if (BuildConfig.DEBUG) {
+            builder.addInterceptor(loggingInterceptor)
+        }
+
+        val client: OkHttpClient = builder.build()
+
+        retrofit = Retrofit.Builder()
+            .baseUrl(NetConstans.BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create())
+            .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
+            .client(client).build()
+    }
+
+    @Synchronized
+
+
+    fun getApiService(): ApiService {
+        return retrofit?.create(ApiService::class.java) ?:  throw IllegalStateException("Retrofit instance is not initialized")
+    }
+
+    companion object{
+        var mInstance: RetrofitClient? = null
+        fun getInstance(): RetrofitClient {
+            if (mInstance == null) {
+                mInstance = RetrofitClient()
+            }
+            return mInstance as RetrofitClient
+        }
+    }
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/bg_card.xml b/generallibrary/src/main/res/drawable/bg_card.xml
new file mode 100644
index 0000000..fbb40e0
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/bg_card.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#FFFFFF" />
+    <corners android:radius="8dp" />
+    <stroke
+        android:width="1dp"
+        android:color="#E0E0E0" />
+</shape> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/card_ripple_effect.xml b/generallibrary/src/main/res/drawable/card_ripple_effect.xml
new file mode 100644
index 0000000..81964ac
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/card_ripple_effect.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="#20000000">
+    <item android:id="@android:id/mask">
+        <shape android:shape="rectangle">
+            <solid android:color="#000000" />
+            <corners android:radius="8dp" />
+        </shape>
+    </item>
+    <item android:drawable="@drawable/bg_card" />
+</ripple> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/ic_arrow_right.xml b/generallibrary/src/main/res/drawable/ic_arrow_right.xml
new file mode 100644
index 0000000..e83929b
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/ic_arrow_right.xml
@@ -0,0 +1,10 @@
+<?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.0"
+    android:viewportHeight="24.0">
+    <path
+        android:fillColor="#AAAAAA"
+        android:pathData="M8.59,16.34l4.58,-4.59 -4.58,-4.59L10,5.75l6,6 -6,6z"/>
+</vector> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/activity_manage_list_ge.xml b/generallibrary/src/main/res/layout/activity_manage_list_ge.xml
new file mode 100644
index 0000000..ca29cf0
--- /dev/null
+++ b/generallibrary/src/main/res/layout/activity_manage_list_ge.xml
@@ -0,0 +1,156 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="@color/white"
+   >
+
+    <com.dayu.baselibrary.view.TitleBar
+        android:id="@+id/titleBar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dimen_title_height"
+        android:background="@color/title_bar_bg"
+        app:centerText="鍒朵綔绠$悊鍗�"
+        app:leftImage="@mipmap/icon_back" />
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        >
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="16dp"
+            android:orientation="vertical">
+            <TextView
+                android:id="@+id/tv_area_card"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="璁剧疆鍖哄煙琛ㄥ彿鍗�"
+                android:textSize="16sp"
+                android:textColor="#333333"
+                android:padding="16dp"
+                android:layout_marginBottom="12dp"
+                android:background="@drawable/card_ripple_effect"
+                android:elevation="2dp"
+                android:drawableEnd="@drawable/ic_arrow_right"
+                android:gravity="center_vertical"
+                android:clickable="true"
+                android:focusable="true" />
+            <TextView
+                android:id="@+id/tv_check_card"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="妫�鏌ュ崱"
+                android:textSize="16sp"
+                android:textColor="#333333"
+                android:padding="16dp"
+                android:layout_marginBottom="12dp"
+                android:background="@drawable/card_ripple_effect"
+                android:elevation="2dp"
+                android:drawableEnd="@drawable/ic_arrow_right"
+                android:gravity="center_vertical"
+                android:clickable="true"
+                android:focusable="true" />
+
+            <TextView
+                android:id="@+id/tv_debug_card"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="璋冭瘯鍗�"
+                android:textSize="16sp"
+                android:textColor="#333333"
+                android:padding="16dp"
+                android:layout_marginBottom="12dp"
+                android:background="@drawable/card_ripple_effect"
+                android:elevation="2dp"
+                android:drawableEnd="@drawable/ic_arrow_right"
+                android:gravity="center_vertical"
+                android:clickable="true"
+                android:focusable="true" />
+
+            <TextView
+                android:id="@+id/tv_clean_card"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="娓呯悊鍗�"
+                android:textSize="16sp"
+                android:textColor="#333333"
+                android:padding="16dp"
+                android:layout_marginBottom="12dp"
+                android:background="@drawable/card_ripple_effect"
+                android:elevation="2dp"
+                android:drawableEnd="@drawable/ic_arrow_right"
+                android:gravity="center_vertical"
+                android:clickable="true"
+                android:focusable="true" />
+
+            <TextView
+                android:id="@+id/tv_ip_setting_card"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="IP鍦板潃璁剧疆鍗�"
+                android:textSize="16sp"
+                android:textColor="#333333"
+                android:padding="16dp"
+                android:layout_marginBottom="12dp"
+                android:background="@drawable/card_ripple_effect"
+                android:elevation="2dp"
+                android:drawableEnd="@drawable/ic_arrow_right"
+                android:gravity="center_vertical"
+                android:clickable="true"
+                android:focusable="true" />
+
+            <TextView
+                android:id="@+id/tv_domain_setting_card"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="鍩熷悕璁剧疆鍗�"
+                android:textSize="16sp"
+                android:textColor="#333333"
+                android:padding="16dp"
+                android:layout_marginBottom="12dp"
+                android:background="@drawable/card_ripple_effect"
+                android:elevation="2dp"
+                android:drawableEnd="@drawable/ic_arrow_right"
+                android:gravity="center_vertical"
+                android:clickable="true"
+                android:focusable="true" />
+
+            <TextView
+                android:id="@+id/tv_gps_card"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="GPS瀹氫綅鍗�"
+                android:textSize="16sp"
+                android:textColor="#333333"
+                android:padding="16dp"
+                android:layout_marginBottom="12dp"
+                android:background="@drawable/card_ripple_effect"
+                android:elevation="2dp"
+                android:drawableEnd="@drawable/ic_arrow_right"
+                android:gravity="center_vertical"
+                android:clickable="true"
+                android:focusable="true" />
+
+            <TextView
+                android:id="@+id/tv_valve_time_card"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="閰嶇疆寮�鍏抽榾鏃堕棿鍗�"
+                android:textSize="16sp"
+                android:textColor="#333333"
+                android:padding="16dp"
+                android:layout_marginBottom="12dp"
+                android:background="@drawable/card_ripple_effect"
+                android:elevation="2dp"
+                android:drawableEnd="@drawable/ic_arrow_right"
+                android:gravity="center_vertical"
+                android:clickable="true"
+                android:focusable="true" />
+        </LinearLayout>
+    </ScrollView>
+</LinearLayout>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/activity_new_user_card_ge.xml b/generallibrary/src/main/res/layout/activity_new_user_card_ge.xml
new file mode 100644
index 0000000..449a955
--- /dev/null
+++ b/generallibrary/src/main/res/layout/activity_new_user_card_ge.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#F5F7FA">
+
+    <com.dayu.baselibrary.view.TitleBar
+        android:id="@+id/titleBar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dimen_title_height"
+        android:background="@color/title_bar_bg"
+        android:elevation="4dp"
+        app:centerText="鍐滄埛鍒楄〃"
+        app:leftImage="@mipmap/icon_back" />
+
+
+
+
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/activity_nfc_write_ge.xml b/generallibrary/src/main/res/layout/activity_nfc_write_ge.xml
new file mode 100644
index 0000000..e3287b7
--- /dev/null
+++ b/generallibrary/src/main/res/layout/activity_nfc_write_ge.xml
@@ -0,0 +1,131 @@
+<?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"
+    android:id="@+id/activity_main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/colorBackground">
+
+    <com.dayu.baselibrary.view.TitleBar
+        android:id="@+id/titleBar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dimen_title_height"
+        android:background="@color/title_bar_bg"
+        android:elevation="4dp"
+        app:centerText="鍐欏崱"
+        app:leftImage="@mipmap/icon_back"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.cardview.widget.CardView
+        android:id="@+id/cardInfoContainer"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="24dp"
+        android:layout_marginEnd="16dp"
+        app:cardBackgroundColor="@android:color/white"
+        app:cardCornerRadius="12dp"
+        app:cardElevation="4dp"
+        android:visibility="visible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/titleBar">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:padding="16dp">
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="鍐欏崱淇℃伅"
+                android:textColor="@color/title_bar_text"
+                android:textSize="18sp"
+                android:textStyle="bold" />
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_marginTop="8dp"
+                android:layout_marginBottom="8dp"
+                android:background="#E0E0E0" />
+
+            <TextView
+                android:id="@+id/cardData"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:padding="8dp"
+                android:textColor="#333333"
+                android:textSize="@dimen/text_size" />
+        </LinearLayout>
+    </androidx.cardview.widget.CardView>
+
+    <androidx.cardview.widget.CardView
+        android:id="@+id/nfcContainer"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="24dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginBottom="24dp"
+        app:cardBackgroundColor="@android:color/white"
+        app:cardCornerRadius="12dp"
+        app:cardElevation="4dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/cardInfoContainer">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:orientation="vertical"
+            android:padding="16dp">
+
+            <TextView
+                android:id="@+id/textView"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="璇峰皢鍗¤创鍦ㄨ澶囦笂杩涜鍐欏崱"
+                android:textColor="#333333"
+                android:textSize="18sp"
+                android:textStyle="bold" />
+
+            <ImageView
+                android:id="@+id/nfcImageView"
+                android:layout_width="200dp"
+                android:layout_height="200dp"
+                android:layout_marginTop="24dp"
+                android:scaleType="fitCenter"
+                android:src="@mipmap/nfc_write" />
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp"
+                android:gravity="center"
+                android:text="璇蜂繚鎸佹墜鏈哄拰鍗$墖涓嶈绉诲姩"
+                android:textColor="#666666"
+                android:textSize="14sp" />
+        </LinearLayout>
+    </androidx.cardview.widget.CardView>
+
+    <com.wang.avi.AVLoadingIndicatorView
+        android:id="@+id/avi"
+        style="@style/AVLoadingIndicatorView"
+        android:layout_width="80dp"
+        android:layout_height="80dp"
+        android:visibility="gone"
+        app:indicatorColor="@color/title_bg"
+        app:indicatorName="BallClipRotatePulseIndicator"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/generallibrary/src/main/res/layout/activity_search_user_ge.xml b/generallibrary/src/main/res/layout/activity_search_user_ge.xml
new file mode 100644
index 0000000..307148e
--- /dev/null
+++ b/generallibrary/src/main/res/layout/activity_search_user_ge.xml
@@ -0,0 +1,41 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <com.dayu.baselibrary.view.TitleBar
+        android:id="@+id/titleBar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dimen_title_height"
+        android:background="@color/title_bar_bg"
+        android:elevation="4dp"
+        app:centerText="鎼滅储鐢ㄦ埛"
+        app:layout_constraintTop_toTopOf="parent"
+        app:leftImage="@mipmap/icon_back"
+        app:rightImage="@mipmap/icon_search"/>
+
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refreshLayout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/titleBar">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="#ffffff"
+            android:overScrollMode="never"
+            android:padding="10dp" />
+
+        <com.scwang.smart.refresh.footer.ClassicsFooter
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+
+
+</LinearLayout>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/dialog_search.xml b/generallibrary/src/main/res/layout/dialog_search.xml
new file mode 100644
index 0000000..5c4382a
--- /dev/null
+++ b/generallibrary/src/main/res/layout/dialog_search.xml
@@ -0,0 +1,142 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/search_dialog_bg"
+    android:padding="20dp">
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="鎼滅储"
+        android:textColor="@color/black"
+        android:textSize="20sp"
+        android:textStyle="bold"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <View
+        android:id="@+id/divider"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginTop="12dp"
+        android:background="#E0E0E0"
+        app:layout_constraintTop_toBottomOf="@id/tv_title" />
+
+    <TextView
+        android:id="@+id/tv_farmer_name_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:text="鍐滄埛鍚嶇О"
+        android:textColor="#666666"
+        android:textSize="14sp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/divider" />
+
+    <EditText
+        android:id="@+id/et_farmer_name"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="6dp"
+        android:background="@drawable/edit_text_bg"
+        android:hint="璇疯緭鍏ュ啘鎴峰悕绉帮紙閫夊~锛�"
+        android:inputType="text"
+        android:singleLine="true"
+        android:textColorHint="#BBBBBB"
+        android:textSize="15sp"
+        app:layout_constraintTop_toBottomOf="@id/tv_farmer_name_label" />
+
+    <TextView
+        android:id="@+id/tv_farmer_id_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="14dp"
+        android:text="鍐滄埛缂栧彿"
+        android:textColor="#666666"
+        android:textSize="14sp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/et_farmer_name" />
+
+    <EditText
+        android:id="@+id/et_farmer_id"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="6dp"
+        android:background="@drawable/edit_text_bg"
+        android:hint="璇疯緭鍏ュ啘鎴风紪鍙凤紙閫夊~锛�"
+        android:inputType="text"
+        android:singleLine="true"
+        android:textColorHint="#BBBBBB"
+        android:textSize="15sp"
+        app:layout_constraintTop_toBottomOf="@id/tv_farmer_id_label" />
+
+    <TextView
+        android:id="@+id/tv_card_number_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="14dp"
+        android:text="鍗″彿"
+        android:textColor="#666666"
+        android:textSize="14sp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/et_farmer_id" />
+
+    <EditText
+        android:id="@+id/et_card_number"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="6dp"
+        android:background="@drawable/edit_text_bg"
+        android:hint="璇疯緭鍏ュ崱鍙凤紙閫夊~锛�"
+        android:inputType="text"
+        android:singleLine="true"
+        android:textColorHint="#BBBBBB"
+        android:textSize="15sp"
+        app:layout_constraintTop_toBottomOf="@id/tv_card_number_label" />
+
+    <Button
+        android:id="@+id/tv_cancel"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="24dp"
+        android:layout_marginEnd="6dp"
+        android:background="@drawable/cancel_button_ripple"
+        android:clickable="true"
+        android:focusable="true"
+        android:paddingTop="10dp"
+        android:paddingBottom="10dp"
+        android:stateListAnimator="@null"
+        android:text="鍙栨秷"
+        android:textColor="#666666"
+        android:textSize="15sp"
+        app:layout_constraintEnd_toStartOf="@id/btn_search"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintHorizontal_weight="1"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/et_card_number" />
+
+    <Button
+        android:id="@+id/btn_search"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="6dp"
+        android:background="@drawable/search_button_ripple"
+        android:clickable="true"
+        android:elevation="2dp"
+        android:focusable="true"
+        android:paddingTop="12dp"
+        android:paddingBottom="12dp"
+        android:stateListAnimator="@null"
+        android:text="鎼滅储"
+        android:textColor="@android:color/white"
+        android:textSize="16sp"
+        android:textStyle="bold"
+        app:layout_constraintBaseline_toBaselineOf="@id/tv_cancel"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_weight="1"
+        app:layout_constraintStart_toEndOf="@id/tv_cancel" />
+
+</androidx.constraintlayout.widget.ConstraintLayout> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/fragment_card.xml b/generallibrary/src/main/res/layout/fragment_card.xml
index 71aee45..d09e603 100644
--- a/generallibrary/src/main/res/layout/fragment_card.xml
+++ b/generallibrary/src/main/res/layout/fragment_card.xml
@@ -5,23 +5,14 @@
     android:layout_height="match_parent"
     android:background="@color/white">
 
-    <androidx.appcompat.widget.Toolbar
+
+    <com.dayu.baselibrary.view.TitleBar
         android:id="@+id/titleBar"
         android:layout_width="match_parent"
         android:layout_height="@dimen/dimen_title_height"
-        android:background="@color/bottom_color"
+        android:background="@color/title_bar_bg"
         android:elevation="4dp"
-        app:layout_constraintTop_toTopOf="parent">
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:text="鍒跺崱"
-            android:textColor="@color/white"
-            android:textSize="@dimen/title_text_size"
-            android:textStyle="bold" />
-    </androidx.appcompat.widget.Toolbar>
+        app:centerText="鍒跺崱" />
 
     <ScrollView
         android:layout_width="match_parent"
@@ -68,7 +59,7 @@
                         android:layout_height="wrap_content"
                         android:layout_marginTop="8dp"
                         android:gravity="center"
-                        android:text="鏂板崱寮�鎴�"
+                        android:text="寮�鍗�"
                         android:textColor="@color/text_selecter_color"
                         android:textSize="@dimen/home_text_size" />
                 </LinearLayout>
@@ -147,7 +138,7 @@
                         android:layout_height="wrap_content"
                         android:layout_marginTop="8dp"
                         android:gravity="center"
-                        android:text="璇诲彇鍗$墖"
+                        android:text="璇诲崱"
                         android:textColor="@color/text_selecter_color"
                         android:textSize="@dimen/home_text_size" />
                 </LinearLayout>
@@ -244,7 +235,7 @@
             </androidx.cardview.widget.CardView>
 
             <androidx.cardview.widget.CardView
-                android:id="@+id/home_admin"
+                android:id="@+id/home_manage"
                 android:layout_width="0dp"
                 android:layout_height="wrap_content"
                 android:layout_marginStart="8dp"
@@ -279,7 +270,7 @@
                         android:layout_height="wrap_content"
                         android:layout_marginTop="8dp"
                         android:gravity="center"
-                        android:text="绠$悊绯荤粺"
+                        android:text="鍒朵綔绠$悊鍗�"
                         android:textColor="@color/text_selecter_color"
                         android:textSize="@dimen/home_text_size" />
                 </LinearLayout>
diff --git a/generallibrary/src/main/res/layout/fragment_my.xml b/generallibrary/src/main/res/layout/fragment_my.xml
index ede78b3..014772c 100644
--- a/generallibrary/src/main/res/layout/fragment_my.xml
+++ b/generallibrary/src/main/res/layout/fragment_my.xml
@@ -6,23 +6,13 @@
     android:orientation="vertical"
     android:background="#F5F5F5">
 
-    <RelativeLayout
-        android:id="@+id/header_layout"
+    <com.dayu.baselibrary.view.TitleBar
+        android:id="@+id/titleBar"
         android:layout_width="match_parent"
         android:layout_height="@dimen/dimen_title_height"
-        android:background="@color/bottom_color"
-        android:elevation="4dp">
-
-        <TextView
-            android:id="@+id/titleBar"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_centerInParent="true"
-            android:text="鎴戠殑"
-            android:textColor="@color/white"
-            android:textSize="@dimen/title_text_size"
-            android:textStyle="bold" />
-    </RelativeLayout>
+        android:background="@color/title_bar_bg"
+        android:elevation="4dp"
+        app:centerText="鎴戠殑" />
 
     <ScrollView
         android:layout_width="match_parent"
diff --git a/generallibrary/src/main/res/layout/fragment_recharge.xml b/generallibrary/src/main/res/layout/fragment_recharge.xml
index 197c37a..e9971e8 100644
--- a/generallibrary/src/main/res/layout/fragment_recharge.xml
+++ b/generallibrary/src/main/res/layout/fragment_recharge.xml
@@ -5,29 +5,19 @@
     android:layout_height="match_parent"
     android:background="#F5F5F5">
 
-    <RelativeLayout
-        android:id="@+id/header_layout"
+    <com.dayu.baselibrary.view.TitleBar
+        android:id="@+id/titleBar"
         android:layout_width="match_parent"
         android:layout_height="@dimen/dimen_title_height"
-        android:background="@color/bottom_color"
-        android:elevation="4dp">
-
-        <TextView
-            android:id="@+id/titleBar"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_centerInParent="true"
-            android:text="鍏呭��"
-            android:textColor="@color/white"
-            android:textSize="@dimen/title_text_size"
-            android:textStyle="bold" />
-    </RelativeLayout>
+        android:background="@color/title_bar_bg"
+        android:elevation="4dp"
+        app:centerText="鎴戠殑" />
 
     <LinearLayout
         android:id="@+id/recharge_read_LL"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_below="@+id/header_layout"
+        android:layout_below="@+id/titleBar"
         android:orientation="vertical"
         android:visibility="visible">
 
@@ -83,6 +73,7 @@
                 android:layout_height="wrap_content"
                 android:orientation="vertical"
                 android:visibility="gone">
+
                 <androidx.cardview.widget.CardView
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -96,7 +87,6 @@
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
                         android:padding="16dp">
-
 
 
                         <TextView
@@ -113,8 +103,8 @@
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
                             android:background="#F9F9F9"
-                            android:padding="12dp"
-                            android:orientation="vertical">
+                            android:orientation="vertical"
+                            android:padding="12dp">
 
                             <TextView
                                 android:id="@+id/recharge_tx"
@@ -138,11 +128,12 @@
                         </LinearLayout>
                     </LinearLayout>
                 </androidx.cardview.widget.CardView>
+
                 <androidx.cardview.widget.CardView
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginBottom="16dp"
                     android:layout_marginTop="15dp"
+                    android:layout_marginBottom="16dp"
                     app:cardCornerRadius="8dp"
                     app:cardElevation="2dp">
 
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/ApiCallback.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/ApiCallback.java
deleted file mode 100644
index 51d7b59..0000000
--- a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/ApiCallback.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.dayu.qiheonlinelibrary.net;
-
-/**
- * Copyright (C), 2023,
- * Author: zuo
- * Date: 2023-03-27 14:59
- * Description:
- */
-public interface ApiCallback<T> {
-    void onSuccess(T data);
-    void onFailure(String message);
-}
-
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/ApiService.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/ApiService.java
index 0e2b367..762c545 100644
--- a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/ApiService.java
+++ b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/ApiService.java
@@ -1,6 +1,8 @@
 package com.dayu.qiheonlinelibrary.net;
 
 
+import com.dayu.baselibrary.net.BaseApiService;
+
 import java.util.Map;
 
 import io.reactivex.rxjava3.core.Observable;
@@ -25,15 +27,16 @@
  * Date: 2023-03-27 14:56
  * Description:
  */
-public interface ApiService {
-
+public interface ApiService extends BaseApiService {
 
 
     //    @FormUrlEncoded
     @POST()
     Observable<BaseResponse> requestPost(@Url String url, @Body Map<String, Object> params);
+
     @POST()
     Observable<BaseResponse> requestPost(@Url String url);
+
     @GET("{url}")
     Observable<BaseResponse> requestGet(@Path("url") String url, @QueryMap Map<String, Object> params);
 
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/MyIntercepterApplication.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/MyIntercepterApplication.java
index f2a777a..a4c9531 100644
--- a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/MyIntercepterApplication.java
+++ b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/MyIntercepterApplication.java
@@ -1,11 +1,8 @@
 package com.dayu.qiheonlinelibrary.net;
 
-import android.os.Handler;
-import android.os.Looper;
 import android.text.TextUtils;
 
 import com.dayu.qiheonlinelibrary.QHOnLineApplication;
-import com.dayu.qiheonlinelibrary.utils.ToastUtil;
 import com.tencent.bugly.crashreport.CrashReport;
 
 import java.io.IOException;
@@ -78,12 +75,6 @@
      */
     public Response getNullResponse(Request request) {
         // 鏄剧ずToast鎻愮ず
-        new Handler(Looper.getMainLooper()).post(new Runnable() {
-            @Override
-            public void run() {
-                ToastUtil.showToastLong(QHOnLineApplication.getInstance().application.getApplicationContext(), "璇锋鏌ョ綉缁�!!!");
-            }
-        });
         int code = 20010;
         String message = "鍜︼紝璇锋鏌ョ綉缁�";
         String errJson = "{\"code\":" + code + ",\"message\":\"" + message + "\"}";
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/RetrofitClient.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/RetrofitClient.java
index 2f3e431..7fdaf6e 100644
--- a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/RetrofitClient.java
+++ b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/net/RetrofitClient.java
@@ -66,4 +66,5 @@
     }
 
 
+
 }

--
Gitblit v1.8.0