From 9cffe03d76840520bfbfeaf85933fcb2ed8385b8 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期三, 05 三月 2025 10:19:46 +0800
Subject: [PATCH] feat(generallibrary): 新增主界面和相关功能模块 - 新增 MainActivity 作为主界面,包含三个底部导航栏选项卡- 新增 BSCardFragment、RechargeFragment 和 MyFragment 作为三个选项卡对应的页面 - 新增 NewCardActivity 用于新建卡片 - 新增 AreaCard 类用于处理区域表号卡数据 - 新增 BaseCard 类作为卡片数据的基础类 - 新增 TabAdapter 用于管理选项卡页面 - 更新 AndroidManifest.xml 设置主活动为 MainActivity - 更新 build.gradle 添加 generallibrary 依赖

---
 generallibrary/src/main/java/com/dayu/general/bean/db/PassWordCardBean.java        |   36 
 generallibrary/src/main/res/drawable/rounded_button_bg.xml                         |    6 
 generallibrary/src/main/java/com/dayu/general/bean/card/IpSettingCard.kt           |  219 +++
 generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt             |   98 +
 generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt               |   18 
 generallibrary/src/main/res/layout/fragment_card.xml                               |  341 +++++
 generallibrary/src/main/res/drawable/ripple_effect.xml                             |   10 
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java      |   27 
 generallibrary/src/main/java/com/dayu/general/activity/BaseActivity.kt             |    2 
 generallibrary/src/main/res/layout/activity_main.xml                               |   12 
 generallibrary/src/main/res/drawable/bottom_circle_bg.xml                          |    2 
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java  |    6 
 generallibrary/build.gradle                                                        |   32 
 generallibrary/src/main/java/com/dayu/general/bean/card/ClearCard.kt               |   93 +
 generallibrary/src/main/java/com/dayu/general/bean/card/DebugCard.kt               |  157 ++
 generallibrary/src/main/res/drawable/nav_item_color.xml                            |    5 
 generallibrary/src/main/res/values/colors.xml                                      |    3 
 generallibrary/src/main/java/com/dayu/general/bean/card/BaseCard.kt                |   48 
 generallibrary/src/main/java/com/dayu/general/bean/card/CheckCard.kt               |   93 +
 generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt                |  105 +
 app/build.gradle                                                                   |    1 
 generallibrary/src/main/java/com/dayu/general/bean/card/FetchDataCard.kt           |  132 ++
 generallibrary/src/main/java/com/dayu/general/bean/card/GpsCard.kt                 |   93 +
 generallibrary/CMakeLists.txt                                                      |   44 
 generallibrary/src/main/res/layout/activity_new_card_ge.xml                        |  311 ++++
 generallibrary/src/main/res/drawable/shadow_gradient.xml                           |    8 
 generallibrary/src/main/res/drawable/tab_ripple_effect.xml                         |   10 
 generallibrary/src/main/java/com/dayu/general/activity/NewCardActivity.kt          |   16 
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java |   74 +
 generallibrary/src/main/java/com/dayu/general/bean/card/CardCommon.kt              |  132 ++
 generallibrary/src/main/res/drawable/fab_background.xml                            |   21 
 generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt                |  199 +++
 generallibrary/src/main/cpp/general-native-lib.cpp                                 |  135 ++
 generallibrary/src/main/java/com/dayu/general/adapter/TabAdapter.kt                |   21 
 generallibrary/src/main/java/com/dayu/general/dao/CardDataDao.kt                   |   20 
 generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt                 |   43 
 generallibrary/src/main/java/com/dayu/general/activity/RechargeFragment.kt         |   17 
 generallibrary/src/main/res/layout/fragment_my.xml                                 |  355 +++++
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcWriteHelper.java   |    2 
 henanlibrary/src/main/java/com/dayu/henanlibrary/tools/NFCWriteHelper.java         |    7 
 generallibrary/src/main/java/com/dayu/general/bean/card/ValveTimeCard.kt           |  118 +
 generallibrary/src/main/AndroidManifest.xml                                        |   56 
 generallibrary/src/main/java/com/dayu/general/bean/db/CardData.kt                  |   21 
 generallibrary/src/main/res/drawable/tab_indicator.xml                             |    7 
 generallibrary/src/main/res/drawable/bottom_nav_background.xml                     |   39 
 generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt                   |    5 
 generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt           |   30 
 app/src/main/AndroidManifest.xml                                                   |   11 
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NFCCallBack.java          |   17 
 generallibrary/src/main/res/values/dimens.xml                                      |    6 
 generallibrary/src/main/res/drawable/shadow_gradient_strong.xml                    |    8 
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNFCHelper.java        |    6 
 generallibrary/src/main/res/layout/fragment_recharge.xml                           |  400 ++++++
 generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt              |   10 
 generallibrary/src/main/java/com/dayu/general/bean/card/DomainSettingCard.kt       |  213 +++
 55 files changed, 3,847 insertions(+), 54 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 9abadcd..0d96122 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -75,6 +75,7 @@
     implementation project(':baselibrary')
     implementation project(':qihealonelibrary')
     implementation project(':qiheonlinelibrary')
+    implementation project(':generallibrary')
 
     implementation 'com.tencent.bugly:crashreport:4.1.9.3'
 //    澶勭悊鍥剧墖
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 32c6434..451c135 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -41,15 +41,22 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
 
+<!--        <activity-->
+<!--            android:name="com.dayu.recharge.activity.LoginActivity"-->
+<!--            android:exported="true">-->
+<!--            <intent-filter>-->
+<!--                <action android:name="android.intent.action.MAIN" />-->
+<!--                <category android:name="android.intent.category.LAUNCHER" />-->
+<!--            </intent-filter>-->
+<!--        </activity>-->
         <activity
-            android:name="com.dayu.recharge.activity.LoginActivity"
+            android:name="com.dayu.general.activity.MainActivity"
             android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-
         <meta-data
             android:name="BUGLY_APP_VERSION"
             android:value="7.1" />
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNFCHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNFCHelper.java
index 249b1b0..d344342 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNFCHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNFCHelper.java
@@ -22,10 +22,14 @@
     public static byte[] companyKey;
 
     /**
-     * 瀵嗙爜闆嗗悎
+     * 鎵囧尯閮戒负缁熶竴瀵嗙爜鏃堕泦鍚�
      */
     public static List<byte[]> listKeyA = new ArrayList<>();
 
+    /**
+     * 姣忎釜鎵囧尯瀵嗙爜涓嶅悓鏃堕泦鍚�
+     */
+    public static List<byte[]> listA_PS=new ArrayList<>();
 
     //瀵嗙爜a鍖�
     public static String companyKeyA;
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcWriteHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcWriteHelper.java
index 20ee427..4c7d684 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcWriteHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcWriteHelper.java
@@ -30,6 +30,8 @@
     public abstract boolean writeData(byte[] str, int a, int b);
 
 
+    public abstract boolean writeData(byte[] str, int a, int b,NFCCallBack callBack);
+
     /**
      * 淇敼瀵嗙爜
      *
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NFCCallBack.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NFCCallBack.java
new file mode 100644
index 0000000..8ca623c
--- /dev/null
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NFCCallBack.java
@@ -0,0 +1,17 @@
+package com.dayu.baselibrary.tools.nfc;
+
+/**
+ * NFCCallBack -
+ *
+ * @author zuoxiao
+ * @version 1.0
+ * @since 2025-03-03
+ */
+public interface NFCCallBack {
+    /**
+     * 杩斿洖鏄惁鎴愬姛
+     *
+     * @param msg
+     */
+    void isSusses(boolean flag,String msg);
+}
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
index bcad792..95ac200 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
@@ -53,6 +53,7 @@
      *
      * @return
      */
+    @Override
     public BaseUserCardCard getUserCardData(BaseUserCardCard userCardCard) {
         if (userCardCard!=null){
             BaseUserCardCard userCard = null;
@@ -117,6 +118,7 @@
         return null;
     }
 
+    @Override
     public String getCradType() {
 
         MifareClassic mfc = MifareClassic.get(tag);
@@ -161,6 +163,7 @@
      *
      * @param callback
      */
+    @Override
     public void getAllData(final NFCCallMapback callback) {
         Map<String, List<byte[]>> map = new HashMap<>();
         MifareClassic mfc = MifareClassic.get(tag);
@@ -232,6 +235,7 @@
      *
      * @param callback
      */
+    @Override
     public void getOneSectorData(NFCCallListback callback) {
 
 
@@ -305,6 +309,7 @@
      * @param b        鍧�
      * @param callback
      */
+    @Override
     public void getData(final int a, final int b, final NFCCallByteback callback) {
         new Thread(new Runnable() {
             @Override
@@ -543,6 +548,7 @@
      *
      * @return
      */
+    @Override
     public BaseManagerToUserCard getManagerToUserCardData(BaseManagerToUserCard baseManagerToUserCard) {
 
         BaseManagerToUserCard managerToUserCard = null;
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
index ef15209..525b5aa 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
@@ -47,6 +47,7 @@
      * @param userCard 鐢ㄦ埛鍗″唴瀹�
      * @param
      */
+    @Override
     public boolean writeUserData(BaseUserCardCard userCard) {
         if (userCard != null) {
             int a = 1;
@@ -113,7 +114,13 @@
      * @param b   涔﹀啓鐨勫潡(浠�0寮�濮嬫暟)
      * @param
      */
+    @Override
     public boolean writeData(byte[] str, int a, int b) {
+        return writeData(str, a, b, null);
+    }
+
+    @Override
+    public boolean writeData(byte[] str, int a, int b, NFCCallBack callBack) {
         Log.i("NFCWreatActivity", "writeData: a=" + a + " b=" + b);
         if (str.length <= 16) {
             try {
@@ -126,35 +133,87 @@
                         int count = mfc.getSectorCount();
                         //濡傛灉浼犺繘鏉ョ殑鎵囧尯澶т簡鎴栬�呭皬浜嗙洿鎺ラ��鍑烘柟娉�
                         if (a > count - 1 || a < 0) {
+                            if (callBack != null) {
+                                callBack.isSusses(false, "鎵囧尯閿欒--" + a);
+                            }
                             return false;
                         }
                         //鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
                         int bCount = mfc.getBlockCountInSector(a);
                         //濡傛灉杈撳叆鐨勫潡澶т簡鎴栬�呭皬浜嗕篃鏄洿鎺ラ��鍑�
                         if (b > bCount - 1 || b < 0) {
+                            if (callBack != null) {
+                                callBack.isSusses(false, "鍧楀尯閿欒--" + b);
+                            }
                             return false;
                         }
                         //楠岃瘉鎵囧尯瀵嗙爜
                         boolean isOpen = false;
-                        for (int i = 0; i < listKeyA.size(); i++) {
-                            if (mfc.authenticateSectorWithKeyA(0, listKeyA.get(i))) {
+                        if (listKeyA.size() != 0) {
+                            for (int i = 0; i < listKeyA.size(); i++) {
+                                if (mfc.authenticateSectorWithKeyA(0, listKeyA.get(i))) {
+                                    isOpen = true;
+                                    if (listKeyA.get(i).equals(defauleKey)) {
+                                        //褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
+                                        changePasword(a, mfc);
+                                    }
+                                    break;
+                                }
+                            }
+                        } else if (listA_PS.size() != 0 && listA_PS.size() > a) {
+                            if (mfc.authenticateSectorWithKeyA(0, listA_PS.get(a))) {
                                 isOpen = true;
-                                if (listKeyA.get(i).equals(defauleKey)) {
+                                if (listKeyA.get(a).equals(defauleKey)) {
                                     //褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
                                     changePasword(a, mfc);
                                 }
-                                break;
                             }
                         }
+
+
                         if (isOpen) {
                             int bIndex = mfc.sectorToBlock(a);
                             //鍐欏崱
                             mfc.writeBlock(bIndex + b, str);
-                            return true;
+                            // 鏍¢獙鍐欏叆鏁版嵁鏄惁姝g‘
+                            boolean isVerified = true;
+                            // 璇诲彇鏁版嵁楠岃瘉
+                            byte[] readResult = mfc.readBlock(bIndex + b);
+                            if (readResult == null) {
+                                if (callBack != null) {
+                                    callBack.isSusses(false, a + "鎵囧尯鍐欏崱鏃跺啀娆¤鍙栭獙璇佹椂澶辫触");
+                                }
+                                return false;
+                            }
+                            for (int i = 0; i < str.length; i++) {
+                                if (str[i] != readResult[i]) {
+                                    isVerified = false;
+                                    break;
+                                }
+                            }
+                            if (isVerified) {
+                                if (callBack != null) {
+                                    callBack.isSusses(true, "鍐欏叆鎴愬姛骞堕獙璇侀�氳繃");
+                                }
+                                return true;
+
+                            } else {
+                                if (callBack != null) {
+                                    callBack.isSusses(false, "鍐欏叆楠岃瘉澶辫触");
+                                }
+                                return false;
+                            }
+                        }
+                        if (callBack != null) {
+                            callBack.isSusses(false, a + "鎵囧尯瀵嗙爜閿欒");
                         }
                         return false;
                     } catch (Exception e) {
                         e.printStackTrace();
+                        if (callBack != null) {
+                            callBack.isSusses(false, a + "鎵囧尯鍐欏崱鎶ラ敊" + e.getMessage());
+
+                        }
                         return false;
                     } finally {
                         try {
@@ -179,12 +238,12 @@
      * @param a 涔﹀啓鐨勬墖鍖�
      *          //     * @param callback 杩斿洖鐩戝惉
      */
+    @Override
     public boolean changePasword(int a, MifareClassic mfc) {
 
         byte[] data = new byte[16];
         if (null != mfc) {
             try {
-
                 //灏嗗瘑鐮佽浆鎹负keyA
                 byte[] dataA = HexUtil.hexToByteArray(companyKeyA);
                 for (int i = 0; i < dataA.length; i++) {
@@ -218,6 +277,7 @@
      *
      * @return
      */
+    @Override
     public boolean initCard() {
         try {
             MifareClassic mfc = MifareClassic.get(tag);
@@ -278,4 +338,6 @@
         }
         return false;
     }
+
+
 }
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
index 8eab97b..e8230c9 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
@@ -16,19 +16,20 @@
  */
 public class NfcWriteAdapter extends BaseNfcWriteHelper {
     NativeNfcWriteHelper nativeNfcWriteHelper;
+
     public NfcWriteAdapter(Intent intent, Activity activity) {
-        switch (BaseNfcActivity.adapterType){
+        switch (BaseNfcActivity.adapterType) {
             case ModelUtils.defaultType:
-                nativeNfcWriteHelper=new NativeNfcWriteHelper(intent,activity);
+                nativeNfcWriteHelper = new NativeNfcWriteHelper(intent, activity);
                 break;
         }
     }
 
     @Override
     public boolean writeUserData(BaseUserCardCard userCard) {
-        switch (BaseNfcActivity.adapterType){
+        switch (BaseNfcActivity.adapterType) {
             case ModelUtils.defaultType:
-                return  nativeNfcWriteHelper.writeUserData(userCard);
+                return nativeNfcWriteHelper.writeUserData(userCard);
 
         }
         return false;
@@ -36,9 +37,19 @@
 
     @Override
     public boolean writeData(byte[] str, int a, int b) {
-        switch (BaseNfcActivity.adapterType){
+        switch (BaseNfcActivity.adapterType) {
             case ModelUtils.defaultType:
-                return  nativeNfcWriteHelper.writeData(str,a,b);
+                return nativeNfcWriteHelper.writeData(str, a, b);
+
+        }
+        return false;
+    }
+
+    @Override
+    public boolean writeData(byte[] str, int a, int b, NFCCallBack callBack) {
+        switch (BaseNfcActivity.adapterType) {
+            case ModelUtils.defaultType:
+                return nativeNfcWriteHelper.writeData(str, a, b,callBack);
 
         }
         return false;
@@ -46,9 +57,9 @@
 
     @Override
     public boolean changePasword(int a, MifareClassic mfc) {
-        switch (BaseNfcActivity.adapterType){
+        switch (BaseNfcActivity.adapterType) {
             case ModelUtils.defaultType:
-                return  nativeNfcWriteHelper.changePasword(a,mfc);
+                return nativeNfcWriteHelper.changePasword(a, mfc);
 
         }
         return false;
diff --git a/generallibrary/CMakeLists.txt b/generallibrary/CMakeLists.txt
new file mode 100644
index 0000000..ffa3e45
--- /dev/null
+++ b/generallibrary/CMakeLists.txt
@@ -0,0 +1,44 @@
+# For more information about using CMake with Android Studio, read the
+# documentation: https://d.android.com/studio/projects/add-native-code.html
+
+# Sets the minimum version of CMake required to build the native library.
+
+cmake_minimum_required(VERSION 3.4.1)
+
+# Creates and names a library, sets it as either STATIC
+# or SHARED, and provides the relative paths to its source code.
+# You can define multiple libraries, and CMake builds them for you.
+# Gradle automatically packages shared libraries with your APK.
+
+add_library( # Sets the name of the library.
+        general-native-lib
+
+             # Sets the library as a shared library.
+             SHARED
+
+             # Provides a relative path to your source file(s).
+             src/main/cpp/general-native-lib.cpp )
+
+# Searches for a specified prebuilt library and stores the path as a
+# variable. Because CMake includes system libraries in the search path by
+# default, you only need to specify the name of the public NDK library
+# you want to add. CMake verifies that the library exists before
+# completing its build.
+
+find_library( # Sets the name of the path variable.
+              log-lib
+
+              # Specifies the name of the NDK library that
+              # you want CMake to locate.
+              log )
+
+# Specifies libraries CMake should link to your target library. You
+# can link multiple libraries, such as libraries you define in this
+# build script, prebuilt third-party libraries, or system libraries.
+
+target_link_libraries( # Specifies the target library.
+        general-native-lib
+
+                       # Links the target library to the log library
+                       # included in the NDK.
+                       ${log-lib} )
\ No newline at end of file
diff --git a/generallibrary/build.gradle b/generallibrary/build.gradle
index cf692d6..80bf8d8 100644
--- a/generallibrary/build.gradle
+++ b/generallibrary/build.gradle
@@ -8,7 +8,7 @@
     compileSdk 34
 
     defaultConfig {
-        minSdk 24
+        minSdk 23
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         consumerProguardFiles "consumer-rules.pro"
@@ -27,14 +27,25 @@
     kotlinOptions {
         jvmTarget = '1.8'
     }
+    dataBinding {
+        enabled = true;
+    }
+    viewBinding {
+        enabled = true;
+    }
+    externalNativeBuild {
+        cmake {
+            path "CMakeLists.txt"
+        }
+    }
 }
 
 dependencies {
 
     implementation project(":baselibrary")
-    implementation 'androidx.core:core-ktx:1.15.0'
-    implementation 'androidx.appcompat:appcompat:1.7.0'
-    implementation 'com.google.android.material:material:1.12.0'
+    implementation 'androidx.core:core-ktx:1.12.0'
+    implementation 'androidx.appcompat:appcompat:1.6.1'
+    implementation 'com.google.android.material:material:1.11.0'
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.2.1'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
@@ -62,7 +73,14 @@
     implementation 'com.pnikosis:materialish-progress:1.7'
 
     //鍒楄〃
-    compileOnly 'io.github.scwang90:refresh-layout-kernel:2.0.5'
-    compileOnly 'io.github.scwang90:refresh-header-classics:2.0.5'
-    compileOnly 'androidx.recyclerview:recyclerview:1.2.0'//缁忓吀鍒锋柊澶�
+    implementation 'io.github.scwang90:refresh-layout-kernel:2.0.5'
+    implementation 'io.github.scwang90:refresh-header-classics:2.0.5'
+    implementation 'androidx.recyclerview:recyclerview:1.3.2'
+
+    //寤鸿娣诲姞 ViewPager2 鐨勬槑纭緷璧�
+    implementation "androidx.viewpager2:viewpager2:1.1.0-beta01"
+    implementation "androidx.fragment:fragment:1.6.2"
+    implementation files('../baselibrary/libs/avi.library-2.1.3.aar')
+
+    implementation 'com.tencent.bugly:crashreport:4.1.9.3'
 }
\ No newline at end of file
diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml
index a5918e6..9db0f55 100644
--- a/generallibrary/src/main/AndroidManifest.xml
+++ b/generallibrary/src/main/AndroidManifest.xml
@@ -1,4 +1,58 @@
 <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.dayu.henanlibrary">
+
+    <uses-permission android:name="android.permission.NFC" />
+    <!--鐢ㄤ簬璁块棶缃戠粶锛岀綉缁滃畾浣嶉渶瑕佷笂缃�-->
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.BLUETOOTH" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <!-- 瑕佹眰褰撳墠璁惧蹇呴』瑕佹湁NFC鑺墖 -->
+    <uses-feature
+        android:name="android.hardware.nfc"
+        android:required="true" />
+
+    <!--    <intent-filter>-->
+    <!--        <action android:name="android.nfc.action.TAG_DISCOVERED" />-->
+    <!--        <data android:mimeType="text/plain" />-->
+    <!--    </intent-filter>-->
+    <!--鐢ㄤ簬杩涜缃戠粶瀹氫綅-->
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
+    <!--鐢ㄤ簬璁块棶GPS瀹氫綅-->
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
+    <!--鐢ㄤ簬鑾峰彇杩愯惀鍟嗕俊鎭紝鐢ㄤ簬鏀寔鎻愪緵杩愯惀鍟嗕俊鎭浉鍏崇殑鎺ュ彛-->
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
+    <!--鐢ㄤ簬璁块棶wifi缃戠粶淇℃伅锛寃ifi淇℃伅浼氱敤浜庤繘琛岀綉缁滃畾浣�-->
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
+    <!--鐢ㄤ簬鑾峰彇wifi鐨勮幏鍙栨潈闄愶紝wifi淇℃伅浼氱敤鏉ヨ繘琛岀綉缁滃畾浣�-->
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
+    <!--鐢ㄤ簬璇诲彇鎵嬫満褰撳墠鐨勭姸鎬�-->
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
+    <!--鐢ㄤ簬鍐欏叆缂撳瓨鏁版嵁鍒版墿灞曞瓨鍌ㄥ崱-->
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
+    <!--鐢ㄤ簬鐢宠璋冪敤A-GPS妯″潡-->
+    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
+
+    <application
+        android:allowBackup="true"
+        android:label="@string/app_name"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+
+        <!--        <activity-->
+        <!--            android:name="com.dayu.recharge.activity.LoginActivity"-->
+        <!--            android:exported="true">-->
+        <!--            <intent-filter>-->
+        <!--                <action android:name="android.intent.action.MAIN" />-->
+        <!--                <category android:name="android.intent.category.LAUNCHER" />-->
+        <!--            </intent-filter>-->
+        <!--        </activity>-->
+        <activity android:name="com.dayu.general.activity.NewCardActivity" />
+
+
+        <meta-data
+            android:name="BUGLY_APP_VERSION"
+            android:value="7.1" />
+    </application>
 
 </manifest>
\ No newline at end of file
diff --git a/generallibrary/src/main/cpp/general-native-lib.cpp b/generallibrary/src/main/cpp/general-native-lib.cpp
new file mode 100644
index 0000000..fad41ad
--- /dev/null
+++ b/generallibrary/src/main/cpp/general-native-lib.cpp
@@ -0,0 +1,135 @@
+#include <jni.h>
+#include <string>
+#include <android/log.h>
+#include <string.h>
+#include <jni.h>
+
+static jclass contextClass;
+static jclass signatureClass;
+static jclass packageNameClass;
+static jclass packageInfoClass;
+
+const char *RELEASE_SIGN = "308202b8308201a0020101300d06092a864886f70d01010b05003022310f300d06035504030c06e5a4a7e7a6b9310f300d06035504070c06e5a4a9e6b4a5301e170d3233313132303035333131325a170d3438313131333035333131325a3022310f300d06035504030c06e5a4a7e7a6b9310f300d06035504070c06e5a4a9e6b4a530820122300d06092a864886f70d01010105000382010f003082010a0282010100a0924f3d618e4a622def691e16e54ce5bdfd035bd73e7cb947d2bf3bd0c00afa26e52963e0299fc06d76d153be696c5285d630577e1dcb2b740a72b6d904482217de308fb91c8435441ed05e844ced1e5c3446d82cb8f38751049df26a42adcfc33f1f12c2ce03f676e5d148aad800ace89670b87835e2c02a8570a0b6740d9c0669d4cb3c597d0b2dd49fc0904e885773b6d3a87d9f1e73eb526e0d1a9e9e3c48d986938286cd824151b5a6214faf89d3e699524511b23c86d3b110a7f0bb56a6d2436f69816538a62a38cb1fee6eb685d267cc200df8af51b936bd280beaa2023f75678d77a11ac6de734b30af63d394c8b63bccf2115a47ea15c9212c740d0203010001300d06092a864886f70d01010b05000382010100307cafa9b14be91ba6424cfcc6aed75b069a1c4d6eb646eab0de93f372f236f5f0a6097499df99391075d6ced18d419a2b15adb041890e2b56a3bfbd6be40efee99c5c713ba8ea1d45da09b67916106116e96eb735271c4d53e0739f753145cbc42e149ad3d9507d422ec1c6f1a7f792a4542f9a64f0de3d4f4af69f0fb3390ef3577dcf8844cf744426d173b0934d879148062c5ca64022dc99af370dbfeaf2b5d4a279b20c54a361bca12c25bf185c2885519bbbc36e46ddb083080f0cc5b1f2eafe964ebce5071b0ae7d92a34a9193861b996d2c0299b1993f41063a27038199365a6e3cb27a02ffa9facdc48a63713eb5fbf90e9fd73056aba16b28e5fee";
+
+
+// 鍔犲瘑瀵嗛挜
+const unsigned char XOR_KEY[] = {0x7A, 0xB3, 0xC9, 0xD5, 0xE1, 0xF8, 0x42, 0x91, 0x37, 0x8F, 0x5D,
+                                 0x2E};
+
+// 鍔犲瘑鍚庣殑M1鍗″瘑鐮佹暟缁�
+const unsigned char ENCRYPTED_SECTOR_KEYS[] = {
+        // 鎵囧尯0瀵嗙爜 (鍔犲瘑鍚�)
+        0x9C, 0x45, 0x36, 0x55, 0x8C, 0x7F, 0x35, 0x93, 0x4B, 0x78, 0x2A, 0x79,
+        // 鎵囧尯1瀵嗙爜 (鍔犲瘑鍚�)
+        0xB4, 0x52, 0x91, 0x45, 0x99, 0x87, 0x3C, 0xA3, 0x6E, 0x5F, 0x1D, 0x5E,
+        // 浠ヤ笅绫讳技鏍煎紡瀛樺偍鍏朵粬鎵囧尯瀵嗙爜...
+        0x1E, 0x85, 0xEB, 0x51, 0xB9, 0x39, 0x02, 0x2E, 0x77, 0x1F, 0x3E, 0x93,
+        0x22, 0x62, 0xBD, 0x83, 0x99, 0x2A, 0x2F, 0x19, 0x95, 0x07, 0x29, 0x2E,
+        0x90, 0x18, 0xE0, 0x6A, 0xB7, 0x68, 0x34, 0x89, 0x42, 0x5B, 0x16, 0x47,
+        0xA8, 0x0B, 0xB5, 0x97, 0xB4, 0x43, 0x1D, 0x62, 0x89, 0x73, 0x33, 0x2E,
+        0x24, 0x9D, 0xB7, 0x46, 0x8D, 0x64, 0x49, 0x7A, 0x52, 0x41, 0x1C, 0x91,
+        0x31, 0x78, 0x95, 0x52, 0x95, 0x39, 0x19, 0x4C, 0x81, 0x2A, 0x0D, 0x47,
+        0xF5, 0x64, 0xA7, 0x93, 0xB9, 0x51, 0x27, 0x82, 0x43, 0x68, 0x31, 0x3F,
+        0x55, 0x93, 0xB7, 0x68, 0x97, 0x9A, 0x37, 0x71, 0x52, 0x49, 0x17, 0x1E,
+        0x8E, 0x93, 0xB5, 0x44, 0x8D, 0x42, 0x22, 0x84, 0x95, 0x33, 0x22, 0x93,
+        0x42, 0x82, 0xA3, 0x35, 0x91, 0x33, 0x13, 0x93, 0x71, 0x21, 0x01, 0x71,
+        0x37, 0x9F, 0xA6, 0x68, 0x92, 0x86, 0x46, 0x72, 0x43, 0x62, 0x12, 0x52,
+        0x5D, 0x85, 0x93, 0x86, 0x82, 0x46, 0x31, 0x86, 0x57, 0x48, 0x16, 0x88,
+        0x97, 0x73, 0xB5, 0x47, 0x95, 0x55, 0x36, 0x69, 0x49, 0x58, 0x18, 0x6A,
+        0xEA, 0x46, 0x84, 0x93, 0x82, 0x19, 0x29, 0x91, 0x31, 0x1C, 0x0C, 0x7D
+};
+
+// 瑙e瘑鍑芥暟
+void decrypt_key(const unsigned char *encrypted, char *decrypted, size_t len) {
+    for (size_t i = 0; i < len; i++) {
+        decrypted[i] = encrypted[i] ^ XOR_KEY[i % sizeof(XOR_KEY)];
+    }
+    decrypted[len] = '\0';
+}
+
+//extern "C" JNIEXPORT jstring
+//
+//JNICALL
+//Java_com_yglx_testjni_MainActivity_getKey(
+//        JNIEnv *env,
+//        jobject /* this */) {
+//    return env->NewStringUTF(AUTH_KEY);
+//}
+
+JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
+
+    JNIEnv *env = NULL;
+    jint result = -1;
+    if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK)
+        return result;
+
+    contextClass = (jclass) env->NewGlobalRef((env)->FindClass("android/content/Context"));
+    signatureClass = (jclass) env->NewGlobalRef((env)->FindClass("android/content/pm/Signature"));
+    packageNameClass = (jclass) env->NewGlobalRef(
+            (env)->FindClass("android/content/pm/PackageManager"));
+    packageInfoClass = (jclass) env->NewGlobalRef(
+            (env)->FindClass("android/content/pm/PackageInfo"));
+
+    __android_log_print(ANDROID_LOG_DEBUG, "jw", "sss");
+    return JNI_VERSION_1_4;
+}
+
+
+extern "C"
+JNIEXPORT jstring JNICALL
+Java_com_dayu_general_tool_GeBaseHelper_getM1SectorKeySecure(JNIEnv *env, jobject instance,
+                                                             jobject contextObject,
+                                                             jint sectorIndex) {
+    // 鑾峰彇鍖呯鐞嗗櫒鐩稿叧鏂规硶ID
+    jmethodID getPackageManagerId = (env)->GetMethodID(contextClass, "getPackageManager",
+                                                       "()Landroid/content/pm/PackageManager;");
+    jmethodID getPackageNameId = (env)->GetMethodID(contextClass, "getPackageName",
+                                                    "()Ljava/lang/String;");
+    jmethodID signToStringId = (env)->GetMethodID(signatureClass, "toCharsString",
+                                                  "()Ljava/lang/String;");
+    jmethodID getPackageInfoId = (env)->GetMethodID(packageNameClass, "getPackageInfo",
+                                                    "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
+
+    // 鑾峰彇搴旂敤绛惧悕淇℃伅
+    jobject packageManagerObject = (env)->CallObjectMethod(contextObject, getPackageManagerId);
+    jstring packNameString = (jstring) (env)->CallObjectMethod(contextObject, getPackageNameId);
+    jobject packageInfoObject = (env)->CallObjectMethod(packageManagerObject, getPackageInfoId,
+                                                        packNameString, 64);
+    jfieldID signaturefieldID = (env)->GetFieldID(packageInfoClass, "signatures",
+                                                  "[Landroid/content/pm/Signature;");
+    jobjectArray signatureArray = (jobjectArray) (env)->GetObjectField(packageInfoObject,
+                                                                       signaturefieldID);
+    jobject signatureObject = (env)->GetObjectArrayElement(signatureArray, 0);
+
+    // 鑾峰彇绛惧悕瀛楃涓�
+    const char *signStrng = (env)->GetStringUTFChars(
+            (jstring) (env)->CallObjectMethod(signatureObject, signToStringId), 0);
+
+    // 璋冭瘯鏃ュ織杈撳嚭
+    __android_log_print(ANDROID_LOG_DEBUG, "M1Card", "Current signature: %s", signStrng);
+
+    // 楠岃瘉绛惧悕骞惰繑鍥炴墍鏈夋墖鍖哄瘑鐮�
+    if (strcmp(signStrng, RELEASE_SIGN) == 0) {
+        size_t numKeys = sizeof(ENCRYPTED_SECTOR_KEYS) / 12; // 姣忎釜瀵嗛挜12瀛楄妭
+        char *allKeys = new char[numKeys * 13]; // 涓烘瘡涓瘑閽ラ鐣�12涓瓧绗�+1涓垎闅旂
+        allKeys[0] = '\0';
+
+        for (size_t i = 0; i < numKeys; i++) {
+            char decrypted[13];
+            decrypt_key(ENCRYPTED_SECTOR_KEYS + (i * 12), decrypted, 12);
+
+            strcat(allKeys, decrypted);
+            if (i < numKeys - 1) {
+                strcat(allKeys, ",");
+            }
+        }
+
+        jstring result = (env)->NewStringUTF(allKeys);
+        delete[] allKeys;
+        return result;
+    } else {
+        return (env)->NewStringUTF("signature_verification_failed");
+    }
+}
+
+
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 b6ac5c1..e19da99 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
@@ -1,9 +1,37 @@
 package com.dayu.general.activity
 
+import android.content.Intent
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
 import androidx.fragment.app.Fragment
+import com.dayu.general.databinding.FragmentCardBinding
+import com.tencent.bugly.proguard.v
 
 class BSCardFragment :Fragment() {
 
+    private var binding: FragmentCardBinding? = null
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+    }
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        binding = FragmentCardBinding.inflate(LayoutInflater.from(context), container, false)
+        initView()
+        return binding?.root
+    }
+
+    private fun initView() {
+        binding?.homeNewCard?.setOnClickListener {
+            val intent = Intent(context, NewCardActivity::class.java)
+            startActivity(intent)
+        }
+    }
+}
 
 
-}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/BaseActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/BaseActivity.kt
index 2cc77ae..ea3ac13 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/BaseActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/BaseActivity.kt
@@ -12,7 +12,7 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        asynchBaseDao=BaseDaoSingleton.getAsynchInstance(this);
+//        asynchBaseDao=BaseDaoSingleton.getAsynchInstance(this);
     }
 
 
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt
index d30a700..0f8a324 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt
@@ -1,28 +1,118 @@
 package com.dayu.general.activity
 
 import android.os.Bundle
+import android.view.LayoutInflater
+import androidx.core.content.ContextCompat
 import androidx.fragment.app.Fragment
+import com.dayu.general.R
+import com.dayu.general.adapter.TabAdapter
+import com.dayu.general.databinding.ActivityMainBinding
 
-class MainActivity : BaseActivity(){
+class MainActivity : BaseActivity() {
 
-
+    var binding: ActivityMainBinding? = null
     private val fragments: ArrayList<Fragment> = ArrayList()
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setupFragments();
+        binding = ActivityMainBinding.inflate(LayoutInflater.from(this))
+        setContentView(binding?.root)
+        setupFragments()
+        initView()
+        initTab()
+
+
     }
 
 
+    private fun initView() {
+        binding!!.BSCardLL.setOnClickListener { v -> changeBottomState(Tab.BSC) }
+        binding!!.rechargeLL.setOnClickListener { v -> changeBottomState(Tab.RECHARGE) }
+        binding!!.myLL.setOnClickListener { v -> changeBottomState(Tab.MY) }
+    }
 
 
     private fun setupFragments() {
         fragments.add(BSCardFragment())
         fragments.add(RechargeFragment())
-        fragments.add(BSCardFragment())
+        fragments.add(MyFragment())
     }
 
+    private fun initTab() {
+        binding?.viewPager?.adapter = TabAdapter(this, fragments)
+        binding?.viewPager?.currentItem = (1)
+        binding?.viewPager?.offscreenPageLimit = 3
+        binding?.viewPager?.isUserInputEnabled = false
+    }
 
+    private enum class Tab {
+        BSC, RECHARGE, MY
+    }
 
+    /**
+     * 淇敼搴曢儴鐘舵��
+     */
+    private fun changeBottomState(tab: Tab) {
+        resetTabState()
+        when (tab) {
+            Tab.BSC -> updateTabUI(0, R.drawable.bottom_card_white, R.color.white)
+            Tab.RECHARGE -> updateTabUI(1, R.drawable.bottom_recharge_white, R.color.white)
+            Tab.MY -> updateTabUI(2, R.drawable.bottom_my_white, R.color.white)
+        }
+    }
 
+    /**
+     * 閲嶇疆鎵�鏈� Tab 鐨勯粯璁ょ姸鎬�
+     */
+    private fun resetTabState() {
+        binding!!.BSCardImg.setImageDrawable(
+            ContextCompat.getDrawable(
+                this,
+                R.drawable.bottom_card_black
+            )
+        )
+        binding!!.BSCardText.setTextColor(ContextCompat.getColor(this, R.color.black))
 
+        binding!!.rechargeImg.setImageDrawable(
+            ContextCompat.getDrawable(
+                this,
+                R.drawable.bottom_recharge_black
+            )
+        )
+        binding!!.rechargeText.setTextColor(ContextCompat.getColor(this, R.color.black))
+
+        binding!!.myImg.setImageDrawable(
+            ContextCompat.getDrawable(
+                this,
+                R.drawable.bottom_my_black
+            )
+        )
+        binding!!.myText.setTextColor(ContextCompat.getColor(this, R.color.black))
+    }
+
+    /**
+     * 鏇存柊鏌愪釜 Tab 鐨� UI 鐘舵��
+     */
+    private fun updateTabUI(position: Int, iconResId: Int, textColorResId: Int) {
+        if (position == 1) {
+            binding!!.viewPager.setCurrentItem(position, true)
+        } else {
+            binding!!.viewPager.setCurrentItem(position, false)
+        }
+        when (position) {
+            0 -> {
+                binding!!.BSCardImg.setImageDrawable(ContextCompat.getDrawable(this, iconResId))
+                binding!!.BSCardText.setTextColor(ContextCompat.getColor(this, textColorResId))
+            }
+
+            1 -> {
+                binding!!.rechargeImg.setImageDrawable(ContextCompat.getDrawable(this, iconResId))
+                binding!!.rechargeText.setTextColor(ContextCompat.getColor(this, textColorResId))
+            }
+
+            2 -> {
+                binding!!.myImg.setImageDrawable(ContextCompat.getDrawable(this, iconResId))
+                binding!!.myText.setTextColor(ContextCompat.getColor(this, textColorResId))
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt b/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt
index 53ea87e..cafd478 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt
@@ -1,8 +1,20 @@
 package com.dayu.general.activity
 
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
 import androidx.fragment.app.Fragment
+import com.dayu.general.databinding.FragmentMyBinding
 
-class MyFragment:Fragment() {
-
-
+class MyFragment : Fragment() {
+    var binding: FragmentMyBinding? = null;
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        binding = FragmentMyBinding.inflate(inflater, container, false)
+        return binding?.root
+    }
 }
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NewCardActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NewCardActivity.kt
new file mode 100644
index 0000000..1108cfc
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NewCardActivity.kt
@@ -0,0 +1,16 @@
+package com.dayu.general.activity
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import com.dayu.baselibrary.activity.BaseActivity
+import com.dayu.general.databinding.ActivityNewCardGeBinding
+
+class NewCardActivity:BaseActivity() {
+    var binding:ActivityNewCardGeBinding? = null
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding=  ActivityNewCardGeBinding.inflate(LayoutInflater.from(this))
+        setContentView(binding?.root)
+    }
+
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/RechargeFragment.kt b/generallibrary/src/main/java/com/dayu/general/activity/RechargeFragment.kt
index 04ad5c5..d1c6a49 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/RechargeFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/RechargeFragment.kt
@@ -1,6 +1,21 @@
 package com.dayu.general.activity
 
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
 import androidx.fragment.app.Fragment
+import com.dayu.general.databinding.FragmentRechargeBinding
 
-class RechargeFragment:Fragment() {
+class RechargeFragment : Fragment() {
+    var binding: FragmentRechargeBinding? = null
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        binding = FragmentRechargeBinding.inflate(inflater, container, false)
+        return binding?.root;
+    }
 }
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/adapter/TabAdapter.kt b/generallibrary/src/main/java/com/dayu/general/adapter/TabAdapter.kt
new file mode 100644
index 0000000..6bd73af
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/adapter/TabAdapter.kt
@@ -0,0 +1,21 @@
+package com.dayu.general.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentActivity
+import androidx.viewpager2.adapter.FragmentStateAdapter
+
+/**
+ * author: zuo
+ * Date: 2023/12/19
+ * Time: 17:53
+ * 澶囨敞锛�
+ */
+class TabAdapter(
+    fragmentActivity: FragmentActivity,
+    private val fragments: List<Fragment>
+) : FragmentStateAdapter(fragmentActivity) {
+
+    override fun createFragment(position: Int): Fragment = fragments[position]
+
+    override fun getItemCount(): Int = fragments.size
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt
new file mode 100644
index 0000000..4684ee3
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt
@@ -0,0 +1,105 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.tools.BcdUtil
+import com.dayu.baselibrary.tools.HexUtil
+import java.io.Serializable
+
+/**
+ * 鍖哄煙琛ㄥ彿鍗�
+ * 鐢ㄤ簬閰嶇疆鎺у埗鍣ㄧ殑琛屾斂鍖哄煙鍙凤紝杈惧埌鍙湁鍖哄煙鍐呯敤鎴锋墠鑳藉埛鍗℃搷浣滅殑鐩殑
+ */
+class AreaCard : BaseCard(), Serializable {
+    companion object {
+        const val CARD_TYPE = "B0"  // 鍗$被鍨嬪浐瀹氫负0xB0
+        const val IDENTIFY_CODE_A0 = 0xA0.toByte()  // 璇嗗埆鐮丄0
+        const val IDENTIFY_CODE_B1 = 0xB1.toByte()  // 璇嗗埆鐮丅1
+        const val IDENTIFY_CODE_C2 = 0xC2.toByte()  // 璇嗗埆鐮丆2
+        const val IDENTIFY_CODE_89 = 0x89.toByte()  // 璇嗗埆鐮�89
+    }
+
+    var areaNumber: Int = 0     // 鍥藉琛屾斂鍖哄煙鍙�(12浣岯CD,绮剧‘鍒版潙)
+    var projectCode: Int = 0    // 椤圭洰缂栫爜(HEX 1-255)
+
+    /**
+     * 鍐欏崱瀹屾垚鍚庢牎楠屾槸鍚﹀啓鍗℃垚鍔�
+     */
+    fun equalsAreaCard(data: List<ByteArray>?): Boolean {
+        if (data == null || data.isEmpty()) {
+            return false
+        }
+        return data[0].contentEquals(getZeroBytes())
+    }
+
+    /**
+     * 閫氳繃byte杞琤ean
+     */
+    fun getBean(data: List<ByteArray>): AreaCard? {
+        try {
+            val areaCard = AreaCard()
+            // 瑙f瀽绗�0鍧�
+            val zero = data[0]
+            
+            // 瑙f瀽鍥藉琛屾斂鍖哄煙鍙�(0-5浣�)
+            val areaCodeBytes = zero.copyOfRange(0, 6)
+            areaCard.areaNumber = BcdUtil.bcdToStr(areaCodeBytes).toInt()
+            
+            // 瑙f瀽椤圭洰缂栫爜(6浣�)
+            areaCard.projectCode = HexUtil.get16To10LowHightByBytes(byteArrayOf(zero[6]))
+            
+            // 楠岃瘉鍗$被鍨嬪拰璇嗗埆鐮�
+            if (HexUtil.byteToHex(zero[8]) != CARD_TYPE ||
+                zero[9] != IDENTIFY_CODE_A0 ||
+                zero[10] != IDENTIFY_CODE_B1 ||
+                zero[11] != IDENTIFY_CODE_C2 ||
+                zero[12] != IDENTIFY_CODE_89) {
+                return null
+            }
+
+            return areaCard
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�0鍧楁暟鎹�
+     */
+    inner class Zero : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 璁剧疆鍥藉琛屾斂鍖哄煙鍙�(BCD鏍煎紡锛�6瀛楄妭锛�0-5浣�)
+                val areaCodeBytes = BcdUtil.strToBcd(String.format("%012d", areaNumber))
+                System.arraycopy(areaCodeBytes, 0, data, 0, 6)
+                
+                // 璁剧疆椤圭洰缂栫爜(6浣�)
+                data[6] = projectCode.toByte()
+                
+                // 璁剧疆澶囩敤浣�(7浣�)
+                data[7] = 0x00
+                
+                // 璁剧疆鍗$被鍨�(8浣�)
+                data[8] = HexUtil.hexToByte(CARD_TYPE)
+                
+                // 璁剧疆璇嗗埆鐮�(9-12浣�)
+                data[9] = IDENTIFY_CODE_A0
+                data[10] = IDENTIFY_CODE_B1
+                data[11] = IDENTIFY_CODE_C2
+                data[12] = IDENTIFY_CODE_89
+                
+                // 璁剧疆澶囩敤浣�(13-14浣�)
+                data[13] = 0x00
+                data[14] = 0x00
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    fun getZeroBytes(): ByteArray = Zero().toBytes()
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/BaseCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/BaseCard.kt
new file mode 100644
index 0000000..7e17509
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/BaseCard.kt
@@ -0,0 +1,48 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.dao.AppDatabase
+import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.bean.db.CardData
+import com.dayu.general.dao.AppDataBase
+import com.tencent.bugly.crashreport.CrashReport
+
+open class BaseCard {
+    var cardData: String? = null //鏍囪瘑鐮�
+
+    fun setCardData(baseDao: AppDataBase, cardType: String?) {
+        try {
+            val cardDataBean: CardData =
+                baseDao.cardDataDao().findFirst(cardType)
+            cardData = if (cardDataBean != null) {
+                cardDataBean.cardIdentifying
+            } else {
+                CardCommon.getDefaultCardData(cardType)
+            }
+        } catch (e: Exception) {
+            CrashReport.postCatchedException(e)
+        }
+    }
+
+
+    /**
+     * 鍓�15涓瓧鑺傜畻鏈疮鍔犲拰 涓嶅惈杩涗綅
+     *
+     * @param data 婧愭暟鎹�
+     * @return 16杩涘埗
+     */
+    fun getByteSum(data: ByteArray?): Byte {
+        if (data != null) {
+            var sum = 0
+            for (b in data) {
+                sum += b.toInt() and 0xFF // & 0xFF 鍙互灏嗗瓧鑺傛墿灞曚负姝f暣鏁帮紝閬垮厤绗﹀彿浣嶇殑褰卞搷
+            }
+            var hex = HexUtil.get10to16CompleteHex(sum)
+            hex = HexUtil.spaceHex(hex)
+            val hexArr = hex.split(" ".toRegex()).dropLastWhile { it.isEmpty() }
+                .toTypedArray()
+            return HexUtil.hexToByte(hexArr[hexArr.size - 1])
+        }
+        return 0
+    }
+
+}
\ 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
new file mode 100644
index 0000000..fac205c
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/CardCommon.kt
@@ -0,0 +1,132 @@
+package com.dayu.general.bean.card
+
+class CardCommon {
+
+    val ERROR: Int = -1
+    //杩炴帴涓柇 鎻愮ず鐢ㄦ埛閲嶆柊杩炴帴鎴栨彁绀虹敤鎴烽噸鏂伴潬杩戝崱鐗�
+
+    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"
+
+    /**
+     * 鑾峰彇榛樿鐨勫崱鏍囪瘑
+     *
+     * @param cardType 鍗$墖绫诲瀷
+     * @return 鍗″唴瀹�
+     */
+    fun getDefaultCardData(cardType: String?): String {
+        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 =
+                "A0B1C289"
+        }
+        return cardData
+    }
+
+    companion object {
+        fun getDefaultCardData(cardType: String?): String? {
+            return getDefaultCardData(cardType)
+        }
+    }
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/CheckCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/CheckCard.kt
new file mode 100644
index 0000000..728dba8
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/CheckCard.kt
@@ -0,0 +1,93 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.tools.HexUtil
+import java.io.Serializable
+
+/**
+ * 妫�鏌ュ崱
+ * 鐢ㄤ簬鍒峰崱鏄剧ず鎺у埗鍣ㄥ熀鏈俊鎭細鎺у埗鍣↖D鍙枫�佹按閲忓崟浣嶃�佺數閲忓崟浠凤紝鏈笂鎶ョ殑鏁版嵁鏉℃暟绛変俊鎭�
+ */
+class CheckCard : BaseCard(), Serializable {
+    companion object {
+        const val CARD_TYPE = "B3"              // 鍗$被鍨嬶細妫�鏌ュ崱
+        const val IDENTIFY_CODE_A0 = 0xA0.toByte()  // 璇嗗埆鐮丄0
+        const val IDENTIFY_CODE_B1 = 0xB1.toByte()  // 璇嗗埆鐮丅1
+        const val IDENTIFY_CODE_C2 = 0xC2.toByte()  // 璇嗗埆鐮丆2
+        const val IDENTIFY_CODE_89 = 0x89.toByte()  // 璇嗗埆鐮�89
+    }
+
+    /**
+     * 鍐欏崱瀹屾垚鍚庢牎楠屾槸鍚﹀啓鍗℃垚鍔�
+     */
+    fun equalsCheckCard(data: List<ByteArray>?): Boolean {
+        if (data == null || data.isEmpty()) {
+            return false
+        }
+        return data[0].contentEquals(getZeroBytes())
+    }
+
+    /**
+     * 閫氳繃byte杞琤ean
+     */
+    fun getBean(data: List<ByteArray>): CheckCard? {
+        try {
+            val checkCard = CheckCard()
+            // 瑙f瀽绗�0鍧�
+            val zero = data[0]
+            
+            // 楠岃瘉鍗$被鍨�(8浣�)
+            if (HexUtil.byteToHex(zero[8]) != CARD_TYPE) {
+                return null
+            }
+            
+            // 楠岃瘉璇嗗埆鐮�(9-12浣�)
+            if (zero[9] != IDENTIFY_CODE_A0 ||
+                zero[10] != IDENTIFY_CODE_B1 ||
+                zero[11] != IDENTIFY_CODE_C2 ||
+                zero[12] != IDENTIFY_CODE_89) {
+                return null
+            }
+
+            return checkCard
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�0鍧楁暟鎹�
+     */
+    inner class Zero : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 璁剧疆澶囩敤浣�(0-7浣�)
+                for (i in 0..7) {
+                    data[i] = 0x00
+                }
+                
+                // 璁剧疆鍗$被鍨�(8浣�)
+                data[8] = HexUtil.hexToByte(CARD_TYPE)
+                
+                // 璁剧疆璇嗗埆鐮�(9-12浣�)
+                data[9] = IDENTIFY_CODE_A0
+                data[10] = IDENTIFY_CODE_B1
+                data[11] = IDENTIFY_CODE_C2
+                data[12] = IDENTIFY_CODE_89
+                
+                // 璁剧疆澶囩敤浣�(13-14浣�)
+                data[13] = 0x00
+                data[14] = 0x00
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    fun getZeroBytes(): ByteArray = Zero().toBytes()
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/ClearCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/ClearCard.kt
new file mode 100644
index 0000000..938e8f2
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/ClearCard.kt
@@ -0,0 +1,93 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.tools.HexUtil
+import java.io.Serializable
+
+/**
+ * 娓呴浂鍗�
+ * 涓昏鐢ㄤ簬鍐呴儴鐢熶骇璋冭瘯鐢�
+ */
+class ClearCard : BaseCard(), Serializable {
+    companion object {
+        const val CARD_TYPE = "C1"              // 鍗$被鍨嬶細娓呴浂鍗�
+        const val IDENTIFY_CODE_A0 = 0xA0.toByte()  // 璇嗗埆鐮丄0
+        const val IDENTIFY_CODE_B1 = 0xB1.toByte()  // 璇嗗埆鐮丅1
+        const val IDENTIFY_CODE_C2 = 0xC2.toByte()  // 璇嗗埆鐮丆2
+        const val IDENTIFY_CODE_89 = 0x89.toByte()  // 璇嗗埆鐮�89
+    }
+
+    /**
+     * 鍐欏崱瀹屾垚鍚庢牎楠屾槸鍚﹀啓鍗℃垚鍔�
+     */
+    fun equalsClearCard(data: List<ByteArray>?): Boolean {
+        if (data == null || data.isEmpty()) {
+            return false
+        }
+        return data[0].contentEquals(getZeroBytes())
+    }
+
+    /**
+     * 閫氳繃byte杞琤ean
+     */
+    fun getBean(data: List<ByteArray>): ClearCard? {
+        try {
+            val clearCard = ClearCard()
+            // 瑙f瀽绗�0鍧�
+            val zero = data[0]
+            
+            // 楠岃瘉鍗$被鍨�(8浣�)
+            if (HexUtil.byteToHex(zero[8]) != CARD_TYPE) {
+                return null
+            }
+            
+            // 楠岃瘉璇嗗埆鐮�(9-12浣�)
+            if (zero[9] != IDENTIFY_CODE_A0 ||
+                zero[10] != IDENTIFY_CODE_B1 ||
+                zero[11] != IDENTIFY_CODE_C2 ||
+                zero[12] != IDENTIFY_CODE_89) {
+                return null
+            }
+
+            return clearCard
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�0鍧楁暟鎹�
+     */
+    inner class Zero : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 璁剧疆澶囩敤浣�(0-7浣�)
+                for (i in 0..7) {
+                    data[i] = 0x00
+                }
+                
+                // 璁剧疆鍗$被鍨�(8浣�)
+                data[8] = HexUtil.hexToByte(CARD_TYPE)
+                
+                // 璁剧疆璇嗗埆鐮�(9-12浣�)
+                data[9] = IDENTIFY_CODE_A0
+                data[10] = IDENTIFY_CODE_B1
+                data[11] = IDENTIFY_CODE_C2
+                data[12] = IDENTIFY_CODE_89
+                
+                // 璁剧疆澶囩敤浣�(13-14浣�)
+                data[13] = 0x00
+                data[14] = 0x00
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    fun getZeroBytes(): ByteArray = Zero().toBytes()
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/DebugCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/DebugCard.kt
new file mode 100644
index 0000000..845125c
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/DebugCard.kt
@@ -0,0 +1,157 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.tools.HexUtil
+import java.io.Serializable
+
+/**
+ * 璋冭瘯鍗�
+ * 涓昏鐢ㄤ簬瀹夎璋冭瘯鐢細
+ * 1. 绗竴娆″埛鍗℃椂寮�鍚按娉垫垨闃�闂�
+ * 2. 绗簩娆″埛鍗″叧闂按娉垫垨闃�闂�
+ * 3. 鍒峰崱寮�鍚悗1鍒嗛挓鍐呮病鏈夊埛鍗″叧闂紝鍒欒嚜鍔ㄥ叧闂按娉垫垨闃�闂�
+ */
+class DebugCard : BaseCard(), Serializable {
+    companion object {
+        const val CARD_TYPE = "B4"              // 鍗$被鍨嬶細璋冭瘯鍗�
+        const val IDENTIFY_CODE_A0 = 0xA0.toByte()  // 璇嗗埆鐮丄0
+        const val IDENTIFY_CODE_B1 = 0xB1.toByte()  // 璇嗗埆鐮丅1
+        const val IDENTIFY_CODE_C2 = 0xC2.toByte()  // 璇嗗埆鐮丆2
+        const val IDENTIFY_CODE_89 = 0x89.toByte()  // 璇嗗埆鐮�89
+        
+        const val AUTO_CLOSE_TIMEOUT = 60_000L  // 鑷姩鍏抽棴瓒呮椂鏃堕棿锛�1鍒嗛挓锛�
+    }
+
+    private var pumpOpenTime: Long = 0L  // 姘存车寮�鍚椂闂�
+    private var isPumpOpen: Boolean = false  // 姘存车鐘舵��
+
+    /**
+     * 鍐欏崱瀹屾垚鍚庢牎楠屾槸鍚﹀啓鍗℃垚鍔�
+     */
+    fun equalsDebugCard(data: List<ByteArray>?): Boolean {
+        if (data == null || data.isEmpty()) {
+            return false
+        }
+        return data[0].contentEquals(getZeroBytes())
+    }
+
+    /**
+     * 閫氳繃byte杞琤ean
+     */
+    fun getBean(data: List<ByteArray>): DebugCard? {
+        try {
+            val debugCard = DebugCard()
+            // 瑙f瀽绗�0鍧�
+            val zero = data[0]
+            
+            // 楠岃瘉鍗$被鍨�(8浣�)
+            if (HexUtil.byteToHex(zero[8]) != CARD_TYPE) {
+                return null
+            }
+            
+            // 楠岃瘉璇嗗埆鐮�(9-12浣�)
+            if (zero[9] != IDENTIFY_CODE_A0 ||
+                zero[10] != IDENTIFY_CODE_B1 ||
+                zero[11] != IDENTIFY_CODE_C2 ||
+                zero[12] != IDENTIFY_CODE_89) {
+                return null
+            }
+
+            return debugCard
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�0鍧楁暟鎹�
+     */
+    inner class Zero : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 璁剧疆澶囩敤浣�(0-7浣�)
+                for (i in 0..7) {
+                    data[i] = 0x00
+                }
+                
+                // 璁剧疆鍗$被鍨�(8浣�)
+                data[8] = HexUtil.hexToByte(CARD_TYPE)
+                
+                // 璁剧疆璇嗗埆鐮�(9-12浣�)
+                data[9] = IDENTIFY_CODE_A0
+                data[10] = IDENTIFY_CODE_B1
+                data[11] = IDENTIFY_CODE_C2
+                data[12] = IDENTIFY_CODE_89
+                
+                // 璁剧疆澶囩敤浣�(13-14浣�)
+                data[13] = 0x00
+                data[14] = 0x00
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    /**
+     * 鍒囨崲姘存车鐘舵��
+     * @return 褰撳墠姘存车鐘舵��
+     */
+    fun togglePumpState(): Boolean {
+        val currentTime = System.currentTimeMillis()
+        
+        if (!isPumpOpen) {
+            // 寮�鍚按娉�
+            isPumpOpen = true
+            pumpOpenTime = currentTime
+        } else {
+            // 鍏抽棴姘存车
+            isPumpOpen = false
+            pumpOpenTime = 0L
+        }
+        
+        return isPumpOpen
+    }
+
+    /**
+     * 妫�鏌ユ槸鍚﹂渶瑕佽嚜鍔ㄥ叧闂按娉�
+     * @return true 濡傛灉闇�瑕佽嚜鍔ㄥ叧闂紝false 鍚﹀垯
+     */
+    fun shouldAutoClose(): Boolean {
+        if (!isPumpOpen) return false
+        
+        val currentTime = System.currentTimeMillis()
+        return currentTime - pumpOpenTime >= AUTO_CLOSE_TIMEOUT
+    }
+
+    /**
+     * 鑷姩鍏抽棴姘存车
+     */
+    fun autoClosePump() {
+        isPumpOpen = false
+        pumpOpenTime = 0L
+    }
+
+    /**
+     * 鑾峰彇姘存车鐘舵��
+     */
+    fun isPumpOpen(): Boolean = isPumpOpen
+
+    /**
+     * 鑾峰彇姘存车寮�鍚墿浣欐椂闂达紙姣锛�
+     * @return 鍓╀綑鏃堕棿锛屽鏋滄按娉靛叧闂垯杩斿洖0
+     */
+    fun getRemainingTime(): Long {
+        if (!isPumpOpen) return 0L
+        
+        val currentTime = System.currentTimeMillis()
+        val remainingTime = AUTO_CLOSE_TIMEOUT - (currentTime - pumpOpenTime)
+        return if (remainingTime > 0) remainingTime else 0L
+    }
+
+    fun getZeroBytes(): ByteArray = Zero().toBytes()
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/DomainSettingCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/DomainSettingCard.kt
new file mode 100644
index 0000000..c337761
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/DomainSettingCard.kt
@@ -0,0 +1,213 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.tools.HexUtil
+import java.io.Serializable
+
+/**
+ * 鍩熷悕璁剧疆鍗�
+ * 鐢ㄤ簬椤圭洰鐜板満淇敼鍩熷悕锛岄�氳繃鍒峰崱鏂瑰紡淇敼鍩熷悕
+ */
+class DomainSettingCard : BaseCard(), Serializable {
+    companion object {
+        const val CARD_TYPE = "B6"              // 鍗$被鍨嬶細鍩熷悕璁剧疆鍗�
+        const val IDENTIFY_CODE_A0 = 0xA0.toByte()  // 璇嗗埆鐮丄0
+        const val IDENTIFY_CODE_B1 = 0xB1.toByte()  // 璇嗗埆鐮丅1
+        const val IDENTIFY_CODE_C2 = 0xC2.toByte()  // 璇嗗埆鐮丆2
+        const val IDENTIFY_CODE_89 = 0x89.toByte()  // 璇嗗埆鐮�89
+        
+        const val MAX_DOMAIN_ROUTE = 4          // 鏈�澶у煙鍚嶈矾鏁�
+        const val MAX_DOMAIN_LENGTH = 38        // 鏈�澶у煙鍚嶉暱搴�
+    }
+
+    var domainRouteNumber: Int = 1  // 鍩熷悕搴忓垪鍙�(1-4)
+    var domain: String = ""         // 鍩熷悕
+    var domainLength: Int = 0       // 鍩熷悕闀垮害
+
+    /**
+     * 鍐欏崱瀹屾垚鍚庢牎楠屾槸鍚﹀啓鍗℃垚鍔�
+     */
+    fun equalsDomainSettingCard(data: List<ByteArray>?): Boolean {
+        if (data == null || data.size < 3) {
+            return false
+        }
+        return data[0].contentEquals(getZeroBytes()) &&
+               data[1].contentEquals(getOneBytes()) &&
+               data[2].contentEquals(getTwoBytes())
+    }
+
+    /**
+     * 閫氳繃byte杞琤ean
+     */
+    fun getBean(data: List<ByteArray>): DomainSettingCard? {
+        try {
+            val domainSettingCard = DomainSettingCard()
+            
+            // 瑙f瀽绗�0鍧�
+            val zero = data[0]
+            
+            // 楠岃瘉鍗$被鍨�(8浣�)
+            if (HexUtil.byteToHex(zero[8]) != CARD_TYPE) {
+                return null
+            }
+            
+            // 楠岃瘉璇嗗埆鐮�(9-12浣�)
+            if (zero[9] != IDENTIFY_CODE_A0 ||
+                zero[10] != IDENTIFY_CODE_B1 ||
+                zero[11] != IDENTIFY_CODE_C2 ||
+                zero[12] != IDENTIFY_CODE_89) {
+                return null
+            }
+            
+            // 瑙f瀽鍩熷悕璺暟(13浣�)
+            val routeNumber = zero[13].toInt()
+            if (routeNumber !in 1..MAX_DOMAIN_ROUTE) {
+                return null
+            }
+            domainSettingCard.domainRouteNumber = routeNumber
+            
+            // 瑙f瀽鍩熷悕闀垮害(14浣�)
+            domainSettingCard.domainLength = zero[14].toInt()
+
+            // 瑙f瀽鍩熷悕鍓�8涓瓧绗�(0-7浣�)
+            val domainBuilder = StringBuilder()
+            for (i in 0..7) {
+                if (zero[i] != 0.toByte()) {
+                    domainBuilder.append(zero[i].toInt().toChar())
+                }
+            }
+
+            // 瑙f瀽绗�1鍧� - 鍩熷悕涓棿15涓瓧绗�
+            val one = data[1]
+            for (i in 0..14) {
+                if (one[i] != 0.toByte()) {
+                    domainBuilder.append(one[i].toInt().toChar())
+                }
+            }
+
+            // 瑙f瀽绗�2鍧� - 鍩熷悕鍓╀綑15涓瓧绗�
+            val two = data[2]
+            for (i in 0..14) {
+                if (two[i] != 0.toByte()) {
+                    domainBuilder.append(two[i].toInt().toChar())
+                }
+            }
+
+            domainSettingCard.domain = domainBuilder.toString()
+
+            return domainSettingCard
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�0鍧楁暟鎹�
+     */
+    inner class Zero : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 鍐欏叆鍩熷悕鍓�8涓瓧绗�(0-7浣�)
+                domain.take(8).forEachIndexed { index, char ->
+                    data[index] = char.code.toByte()
+                }
+                // 琛�0
+                for (i in domain.length.coerceAtMost(8) until 8) {
+                    data[i] = 0
+                }
+                
+                // 璁剧疆鍗$被鍨�(8浣�)
+                data[8] = HexUtil.hexToByte(CARD_TYPE)
+                
+                // 璁剧疆璇嗗埆鐮�(9-12浣�)
+                data[9] = IDENTIFY_CODE_A0
+                data[10] = IDENTIFY_CODE_B1
+                data[11] = IDENTIFY_CODE_C2
+                data[12] = IDENTIFY_CODE_89
+                
+                // 璁剧疆鍩熷悕璺暟(13浣�)
+                data[13] = domainRouteNumber.toByte()
+                
+                // 璁剧疆鍩熷悕闀垮害(14浣�)
+                data[14] = domain.length.toByte()
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�1鍧楁暟鎹� - 鍩熷悕涓棿閮ㄥ垎
+     */
+    inner class One : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 鍐欏叆鍩熷悕涓棿15涓瓧绗�(0-14浣�)
+                domain.drop(8).take(15).forEachIndexed { index, char ->
+                    data[index] = char.code.toByte()
+                }
+                // 琛�0
+                for (i in (domain.length - 8).coerceAtMost(15) until 15) {
+                    data[i] = 0
+                }
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�2鍧楁暟鎹� - 鍩熷悕缁撳熬閮ㄥ垎
+     */
+    inner class Two : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 鍐欏叆鍩熷悕鏈�鍚�15涓瓧绗�(0-14浣�)
+                domain.drop(23).take(15).forEachIndexed { index, char ->
+                    data[index] = char.code.toByte()
+                }
+                // 琛�0
+                for (i in (domain.length - 23).coerceAtMost(15) until 15) {
+                    data[i] = 0
+                }
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    /**
+     * 楠岃瘉鍩熷悕鏍煎紡鏄惁姝g‘
+     */
+    fun isValidDomain(): Boolean {
+        return domain.isNotEmpty() && 
+               domain.length <= MAX_DOMAIN_LENGTH && 
+               domain.matches(Regex("^[a-zA-Z0-9.-]+$"))
+    }
+
+    /**
+     * 楠岃瘉鍩熷悕璺暟鏄惁姝g‘
+     */
+    fun isValidRouteNumber(): Boolean {
+        return domainRouteNumber in 1..MAX_DOMAIN_ROUTE
+    }
+
+    fun getZeroBytes(): ByteArray = Zero().toBytes()
+    fun getOneBytes(): ByteArray = One().toBytes()
+    fun getTwoBytes(): ByteArray = Two().toBytes()
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/FetchDataCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/FetchDataCard.kt
new file mode 100644
index 0000000..3d5d658
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/FetchDataCard.kt
@@ -0,0 +1,132 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.tools.BcdUtil
+import com.dayu.baselibrary.tools.HexUtil
+import java.io.Serializable
+
+/**
+ * 鍙栨暟鍗�
+ * 鐢ㄤ簬鍦ㄧ敤鎴峰崱涓㈠け鍚庯紝璇诲彇褰撳墠鐢ㄦ埛鎴栨寕璧风敤鎴风殑鍗″唴淇℃伅锛屼綔涓鸿ˉ鍗′緷鎹�
+ */
+class FetchDataCard : BaseCard(), Serializable {
+    companion object {
+        const val CARD_TYPE_NEED_FETCH = "B1"    // 闇�瑕佸埛鍗″彇鏁�
+        const val CARD_TYPE_FETCH_SUCCESS = "B2"  // 鍒峰崱鍙栨暟杩斿啓鎴愬姛
+        const val IDENTIFY_CODE_A0 = 0xA0.toByte()  // 璇嗗埆鐮丄0
+        const val IDENTIFY_CODE_B1 = 0xB1.toByte()  // 璇嗗埆鐮丅1
+        const val IDENTIFY_CODE_C2 = 0xC2.toByte()  // 璇嗗埆鐮丆2
+        const val IDENTIFY_CODE_89 = 0x89.toByte()  // 璇嗗埆鐮�89
+    }
+
+    var areaNumber: Int = 0      // 鍥藉琛屾斂鍖哄煙鍙�(12浣岯CD,绮剧‘鍒版潙)
+    var userNumber: Int = 0      // 鐢ㄦ埛缂栧彿(HEX)
+    var cardType: String = CARD_TYPE_NEED_FETCH  // 鍗$被鍨嬶細B1闇�瑕佸埛鍗″彇鏁帮紝B2鍒峰崱鍙栨暟杩斿啓鎴愬姛
+    var projectCode: Int = 0     // 椤圭洰缂栫爜(HEX 1-255)
+
+    /**
+     * 鍐欏崱瀹屾垚鍚庢牎楠屾槸鍚﹀啓鍗℃垚鍔�
+     */
+    fun equalsFetchDataCard(data: List<ByteArray>?): Boolean {
+        if (data == null || data.isEmpty()) {
+            return false
+        }
+        return data[0].contentEquals(getZeroBytes())
+    }
+
+    /**
+     * 閫氳繃byte杞琤ean
+     */
+    fun getBean(data: List<ByteArray>): FetchDataCard? {
+        try {
+            val fetchDataCard = FetchDataCard()
+            // 瑙f瀽绗�0鍧�
+            val zero = data[0]
+            
+            // 瑙f瀽鍥藉琛屾斂鍖哄煙鍙�(0-5浣�)
+            val areaCodeBytes = zero.copyOfRange(0, 6)
+            fetchDataCard.areaNumber = BcdUtil.bcdToStr(areaCodeBytes).toInt()
+            
+            // 瑙f瀽鐢ㄦ埛缂栧彿(6-7浣�)
+            val userNumberBytes = zero.copyOfRange(6, 8)
+            fetchDataCard.userNumber = HexUtil.get16To10LowHightByBytes(userNumberBytes)
+            
+            // 瑙f瀽鍗$被鍨�(8浣�)
+            val cardType = HexUtil.byteToHex(zero[8])
+            if (cardType != CARD_TYPE_NEED_FETCH && cardType != CARD_TYPE_FETCH_SUCCESS) {
+                return null
+            }
+            fetchDataCard.cardType = cardType
+            
+            // 楠岃瘉璇嗗埆鐮�(9-12浣�)
+            if (zero[9] != IDENTIFY_CODE_A0 ||
+                zero[10] != IDENTIFY_CODE_B1 ||
+                zero[11] != IDENTIFY_CODE_C2 ||
+                zero[12] != IDENTIFY_CODE_89) {
+                return null
+            }
+            
+            // 瑙f瀽椤圭洰缂栫爜(13浣�)
+            fetchDataCard.projectCode = HexUtil.get16To10LowHightByBytes(byteArrayOf(zero[13]))
+
+            return fetchDataCard
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�0鍧楁暟鎹�
+     */
+    inner class Zero : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 璁剧疆鍥藉琛屾斂鍖哄煙鍙�(BCD鏍煎紡锛�6瀛楄妭锛�0-5浣�)
+                val areaCodeBytes = BcdUtil.strToBcd(String.format("%012d", areaNumber))
+                System.arraycopy(areaCodeBytes, 0, data, 0, 6)
+                
+                // 璁剧疆鐢ㄦ埛缂栧彿(6-7浣�)
+                val userNumberBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(userNumber))
+                System.arraycopy(userNumberBytes, 0, data, 6, 2)
+                
+                // 璁剧疆鍗$被鍨�(8浣�)
+                data[8] = HexUtil.hexToByte(cardType)
+                
+                // 璁剧疆璇嗗埆鐮�(9-12浣�)
+                data[9] = IDENTIFY_CODE_A0
+                data[10] = IDENTIFY_CODE_B1
+                data[11] = IDENTIFY_CODE_C2
+                data[12] = IDENTIFY_CODE_89
+                
+                // 璁剧疆椤圭洰缂栫爜(13浣�)
+                data[13] = projectCode.toByte()
+                
+                // 璁剧疆澶囩敤浣�(14浣�)
+                data[14] = 0x00
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    /**
+     * 灏嗗崱鐗囩姸鎬佹洿鏂颁负鍙栨暟鎴愬姛
+     */
+    fun markAsFetchSuccess() {
+        cardType = CARD_TYPE_FETCH_SUCCESS
+    }
+
+    /**
+     * 妫�鏌ユ槸鍚﹀凡缁忓彇鏁版垚鍔�
+     */
+    fun isFetchSuccess(): Boolean {
+        return cardType == CARD_TYPE_FETCH_SUCCESS
+    }
+
+    fun getZeroBytes(): ByteArray = Zero().toBytes()
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/GpsCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/GpsCard.kt
new file mode 100644
index 0000000..cb6edbf
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/GpsCard.kt
@@ -0,0 +1,93 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.tools.HexUtil
+import java.io.Serializable
+
+/**
+ * GPS瀹氫綅鍗�
+ * 涓昏鐢ㄤ簬鍐呴儴鐢熶骇璋冭瘯鐢�
+ */
+class GpsCard : BaseCard(), Serializable {
+    companion object {
+        const val CARD_TYPE = "B7"              // 鍗$被鍨嬶細GPS瀹氫綅鍗�
+        const val IDENTIFY_CODE_A0 = 0xA0.toByte()  // 璇嗗埆鐮丄0
+        const val IDENTIFY_CODE_B1 = 0xB1.toByte()  // 璇嗗埆鐮丅1
+        const val IDENTIFY_CODE_C2 = 0xC2.toByte()  // 璇嗗埆鐮丆2
+        const val IDENTIFY_CODE_89 = 0x89.toByte()  // 璇嗗埆鐮�89
+    }
+
+    /**
+     * 鍐欏崱瀹屾垚鍚庢牎楠屾槸鍚﹀啓鍗℃垚鍔�
+     */
+    fun equalsGpsCard(data: List<ByteArray>?): Boolean {
+        if (data == null || data.isEmpty()) {
+            return false
+        }
+        return data[0].contentEquals(getZeroBytes())
+    }
+
+    /**
+     * 閫氳繃byte杞琤ean
+     */
+    fun getBean(data: List<ByteArray>): GpsCard? {
+        try {
+            val gpsCard = GpsCard()
+            // 瑙f瀽绗�0鍧�
+            val zero = data[0]
+            
+            // 楠岃瘉鍗$被鍨�(8浣�)
+            if (HexUtil.byteToHex(zero[8]) != CARD_TYPE) {
+                return null
+            }
+            
+            // 楠岃瘉璇嗗埆鐮�(9-12浣�)
+            if (zero[9] != IDENTIFY_CODE_A0 ||
+                zero[10] != IDENTIFY_CODE_B1 ||
+                zero[11] != IDENTIFY_CODE_C2 ||
+                zero[12] != IDENTIFY_CODE_89) {
+                return null
+            }
+
+            return gpsCard
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�0鍧楁暟鎹�
+     */
+    inner class Zero : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 璁剧疆澶囩敤浣�(0-7浣�)
+                for (i in 0..7) {
+                    data[i] = 0x00
+                }
+                
+                // 璁剧疆鍗$被鍨�(8浣�)
+                data[8] = HexUtil.hexToByte(CARD_TYPE)
+                
+                // 璁剧疆璇嗗埆鐮�(9-12浣�)
+                data[9] = IDENTIFY_CODE_A0
+                data[10] = IDENTIFY_CODE_B1
+                data[11] = IDENTIFY_CODE_C2
+                data[12] = IDENTIFY_CODE_89
+                
+                // 璁剧疆澶囩敤浣�(13-14浣�)
+                data[13] = 0x00
+                data[14] = 0x00
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    fun getZeroBytes(): ByteArray = Zero().toBytes()
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/IpSettingCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/IpSettingCard.kt
new file mode 100644
index 0000000..7d52309
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/IpSettingCard.kt
@@ -0,0 +1,219 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.tools.HexUtil
+import java.io.Serializable
+
+/**
+ * IP鍦板潃璁剧疆鍗�
+ * 鐢ㄤ簬椤圭洰鐜板満淇敼IP鍦板潃锛岄�氳繃鍒峰崱鏂瑰紡淇敼IP鍦板潃
+ */
+class IpSettingCard : BaseCard(), Serializable {
+    companion object {
+        const val CARD_TYPE = "B5"              // 鍗$被鍨嬶細IP璁剧疆鍗�
+        const val IDENTIFY_CODE_A0 = 0xA0.toByte()  // 璇嗗埆鐮丄0
+        const val IDENTIFY_CODE_B1 = 0xB1.toByte()  // 璇嗗埆鐮丅1
+        const val IDENTIFY_CODE_C2 = 0xC2.toByte()  // 璇嗗埆鐮丆2
+        const val IDENTIFY_CODE_89 = 0x89.toByte()  // 璇嗗埆鐮�89
+        
+        const val MAX_IP_ROUTE = 4              // 鏈�澶P璺暟
+    }
+
+    var ipRouteNumber: Int = 1    // IP鍦板潃搴忓垪鍙�(1-4)
+    var ipAddress: String = ""    // IP鍦板潃
+    var port: Int = 0            // 绔彛鍙�
+
+    /**
+     * 鍐欏崱瀹屾垚鍚庢牎楠屾槸鍚﹀啓鍗℃垚鍔�
+     */
+    fun equalsIpSettingCard(data: List<ByteArray>?): Boolean {
+        if (data == null || data.size < 3) {
+            return false
+        }
+        return data[0].contentEquals(getZeroBytes()) &&
+               data[1].contentEquals(getOneBytes()) &&
+               data[2].contentEquals(getTwoBytes())
+    }
+
+    /**
+     * 閫氳繃byte杞琤ean
+     */
+    fun getBean(data: List<ByteArray>): IpSettingCard? {
+        try {
+            val ipSettingCard = IpSettingCard()
+            
+            // 瑙f瀽绗�0鍧�
+            val zero = data[0]
+            
+            // 楠岃瘉鍗$被鍨�(8浣�)
+            if (HexUtil.byteToHex(zero[8]) != CARD_TYPE) {
+                return null
+            }
+            
+            // 楠岃瘉璇嗗埆鐮�(9-12浣�)
+            if (zero[9] != IDENTIFY_CODE_A0 ||
+                zero[10] != IDENTIFY_CODE_B1 ||
+                zero[11] != IDENTIFY_CODE_C2 ||
+                zero[12] != IDENTIFY_CODE_89) {
+                return null
+            }
+            
+            // 瑙f瀽IP璺暟(13浣�)
+            val routeNumber = zero[13].toInt()
+            if (routeNumber !in 1..MAX_IP_ROUTE) {
+                return null
+            }
+            ipSettingCard.ipRouteNumber = routeNumber
+
+            // 瑙f瀽绗�1鍧� - IP鍦板潃
+            val one = data[1]
+            val ipBuilder = StringBuilder()
+            for (i in 0..14) {
+                ipBuilder.append(one[i].toInt().toChar())
+            }
+            ipSettingCard.ipAddress = ipBuilder.toString()
+
+            // 瑙f瀽绗�2鍧� - 绔彛鍙�
+            val two = data[2]
+            val portBuilder = StringBuilder()
+            for (i in 0..4) {
+                portBuilder.append(two[i].toInt().toChar())
+            }
+            ipSettingCard.port = portBuilder.toString().toInt()
+
+            return ipSettingCard
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�0鍧楁暟鎹�
+     */
+    inner class Zero : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 璁剧疆澶囩敤浣�(0-7浣�)
+                for (i in 0..7) {
+                    data[i] = 0x00
+                }
+                
+                // 璁剧疆鍗$被鍨�(8浣�)
+                data[8] = HexUtil.hexToByte(CARD_TYPE)
+                
+                // 璁剧疆璇嗗埆鐮�(9-12浣�)
+                data[9] = IDENTIFY_CODE_A0
+                data[10] = IDENTIFY_CODE_B1
+                data[11] = IDENTIFY_CODE_C2
+                data[12] = IDENTIFY_CODE_89
+                
+                // 璁剧疆IP璺暟(13浣�)
+                data[13] = ipRouteNumber.toByte()
+                
+                // 璁剧疆澶囩敤浣�(14浣�)
+                data[14] = 0x00
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�1鍧楁暟鎹� - IP鍦板潃
+     */
+    inner class One : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 鏍煎紡鍖朓P鍦板潃
+                val formattedIp = formatIpAddress(ipAddress)
+                
+                // 鍐欏叆IP鍦板潃(0-14浣�)
+                formattedIp.forEachIndexed { index, char ->
+                    data[index] = char.code.toByte()
+                }
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�2鍧楁暟鎹� - 绔彛鍙�
+     */
+    inner class Two : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 鏍煎紡鍖栫鍙e彿
+                val formattedPort = String.format("%05d", port)
+                
+                // 鍐欏叆绔彛鍙�(0-4浣�)
+                formattedPort.forEachIndexed { index, char ->
+                    data[index] = char.code.toByte()
+                }
+                
+                // 璁剧疆澶囩敤浣�(5-14浣�)
+                for (i in 5..14) {
+                    data[i] = 0x00
+                }
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    /**
+     * 鏍煎紡鍖朓P鍦板潃
+     * 灏咺P鍦板潃鏍煎紡鍖栦负鏍囧噯鏍煎紡锛氭瘡缁�3浣嶏紝涓嶈冻琛�0
+     */
+    private fun formatIpAddress(ip: String): String {
+        val parts = ip.split(".")
+        if (parts.size != 4) throw IllegalArgumentException("Invalid IP address format")
+        
+        return parts.joinToString(".") { part ->
+            String.format("%03d", part.toInt())
+        }
+    }
+
+    /**
+     * 楠岃瘉IP鍦板潃鏍煎紡鏄惁姝g‘
+     */
+    fun isValidIpAddress(): Boolean {
+        return try {
+            val parts = ipAddress.split(".")
+            if (parts.size != 4) return false
+            
+            parts.all { part ->
+                val num = part.toInt()
+                num in 0..255
+            }
+        } catch (e: Exception) {
+            false
+        }
+    }
+
+    /**
+     * 楠岃瘉绔彛鍙锋槸鍚︽纭�
+     */
+    fun isValidPort(): Boolean {
+        return port in 1..65535
+    }
+
+    fun getZeroBytes(): ByteArray = Zero().toBytes()
+    fun getOneBytes(): ByteArray = One().toBytes()
+    fun getTwoBytes(): ByteArray = Two().toBytes()
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt
new file mode 100644
index 0000000..7aa0eed
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt
@@ -0,0 +1,199 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.bean.BaseUserCardCard
+import com.dayu.baselibrary.tools.BcdUtil
+import com.dayu.baselibrary.tools.HexUtil
+import java.io.Serializable
+import java.util.*
+
+/**
+ * 閫氱敤椤圭洰鐢ㄦ埛鍗$粨鏋�
+ */
+class UserCard : BaseCard(), Serializable {
+    var cardType: String = "A1" // 鍗$被鍨嬶細A1缁堢鍐欏崱 A8鍒峰崱寮�娉靛悗鍊� A2鍙犲姞鍏呭��
+    var areaNumber: Int = 0 // 鍥藉琛屾斂鍖哄煙鍙�(12浣岯CD,绮剧‘鍒版潙)
+    var userCode: String = "" // 鐢ㄦ埛缂栧彿BCD
+    var userCodeNumber: Int = 0 // 鐢ㄦ埛鍗$紪鍙�(HEX)
+    var phoneNumber: String = "" // 鎵嬫満鍙�(BCD)
+    var projectCode: Int = 0 // 椤圭洰缂栫爜(HEX 1-255)
+    var balance: Int = 0 // 鍓╀綑閲戦(2浣嶅皬鏁扮偣锛屽崟浣嶅厓)
+    var surplusWater: Int = 0 // 鍓╀綑姘撮噺(2浣嶅皬鏁扮偣锛屽崟浣嶇珛鏂圭背)
+    var waterPrice: Float = 0f // 姘撮噺鍗曚环(鏈�澶�655.35锛�2浣嶅皬鏁扮偣銆傚崟浣嶏細m3/鍏�)
+    var electricPrice: Float = 0f // 鐢甸噺鍗曚环(鏈�澶�655.35锛�2浣嶅皬鏁扮偣銆傚崟浣�: 鍏�/搴�)
+    var rechargeDate: Calendar? = null // 鍏呭�兼椂闂�
+
+    /**
+     * 鍐欏崱瀹屾垚鍚庢牎楠屾槸鍚﹀啓鍗℃垚鍔�
+     */
+    fun equalsUserCard(data: List<ByteArray>?): Boolean {
+        if (data == null || data.size < 3) {
+            return false
+        }
+        
+        val expectedBytes = arrayOf(getZeroBytes(), getOneBytes(), getTwoBytes())
+        return data.zip(expectedBytes.toList()).all { (actual, expected) -> 
+            actual.contentEquals(expected) 
+        }
+    }
+
+    /**
+     * 杩斿洖瀹屾暣鐨勭敤鎴风紪鍙�
+     */
+    fun getMyUserCode(): String {
+        return userCode + String.format("%04d", userCodeNumber)
+    }
+
+    /**
+     * 閫氳繃byte杞琤ean
+     */
+     fun getBean(data: List<ByteArray>): UserCard? {
+        try {
+            val userCard = UserCard()
+            // 瑙f瀽绗�0鍧�
+            val zero = data[0]
+            userCard.apply {
+                // 瑙f瀽鍥藉琛屾斂鍖哄煙鍙�(0-5浣�)
+                val areaCodeBytes = zero.copyOfRange(0, 6)
+                areaNumber = BcdUtil.bcdToStr(areaCodeBytes).toInt()
+
+                // 瑙f瀽鐢ㄦ埛鍗$紪鍙�(6-7浣�)
+                val userCodeNumberBytes = zero.copyOfRange(6, 8)
+                userCodeNumber = HexUtil.get16To10LowHightByBytes(userCodeNumberBytes)
+
+                // 瑙f瀽鍗$被鍨�(8浣�)
+                cardType = HexUtil.byteToHex(zero[8])
+
+                // 瑙f瀽鎵嬫満鍙�(9-14浣�)
+                phoneNumber = BcdUtil.bcdToStr(zero.copyOfRange(9, 15))
+            }
+
+            // 瑙f瀽绗�1鍧�
+            val one = data[1]
+            userCard.apply {
+                projectCode = HexUtil.get16To10LowHightByBytes(byteArrayOf(one[0]))
+                balance = HexUtil.get16To10LowHightByBytes(one.copyOfRange(1, 5))
+                surplusWater = HexUtil.get16To10LowHightByBytes(one.copyOfRange(5, 9))
+                electricPrice = HexUtil.hexToFloatLowHigh(one.copyOfRange(9, 11))
+                
+                // 瑙f瀽鍏呭�兼椂闂�
+                val year = HexUtil.getBcdToInt(one[11])
+                val month = HexUtil.getBcdToInt(one[12])
+                val day = HexUtil.getBcdToInt(one[13])
+                val hour = HexUtil.getBcdToInt(one[14])
+                Calendar.getInstance().apply {
+                    set(2000 + year, month - 1, day, hour, 0, 0)
+                    rechargeDate = this
+                }
+            }
+
+            // 瑙f瀽绗�2鍧�
+            val two = data[2]
+            userCard.apply {
+                waterPrice = HexUtil.hexToFloatLowHigh(two.copyOfRange(9, 11))
+            }
+
+            return userCard
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+    }
+
+    // 鍐呴儴绫荤敤浜庣敓鎴愬悇涓暟鎹潡
+    inner class Zero : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 璁剧疆鍥藉琛屾斂鍖哄煙鍙�(BCD鏍煎紡锛�6瀛楄妭锛�0-5浣�)
+                val areaCodeBytes = BcdUtil.strToBcd(String.format("%012d", areaNumber))
+                System.arraycopy(areaCodeBytes, 0, data, 0, 6)
+
+                // 璁剧疆鐢ㄦ埛鍗$紪鍙�(HEX鏍煎紡锛�2瀛楄妭锛�6-7浣�)
+                val userCodeBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(userCodeNumber))
+                System.arraycopy(userCodeBytes, 0, data, 6, 2)
+
+                // 璁剧疆鍗$被鍨�(8浣�)
+                data[8] = HexUtil.hexToByte(cardType)
+
+                // 璁剧疆鎵嬫満鍙�(BCD鏍煎紡锛�6瀛楄妭锛�9-14浣�)
+                val phoneBytes = BcdUtil.strToBcd(phoneNumber.padStart(12, '0'))
+                System.arraycopy(phoneBytes, 0, data, 9, 6)
+
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    inner class One : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                data[0] = projectCode.toByte()
+                
+                // 璁剧疆浣欓
+                val balanceBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance))
+                System.arraycopy(balanceBytes, 0, data, 1, 4)
+                
+                // 璁剧疆鍓╀綑姘撮噺
+                val waterBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusWater))
+                System.arraycopy(waterBytes, 0, data, 5, 4)
+                
+                // 璁剧疆鐢典环
+                val priceBytes = HexUtil.hexToByteArray(HexUtil.floatToHexLowHigh(electricPrice))
+                System.arraycopy(priceBytes, 0, data, 9, 2)
+                
+                // 璁剧疆鍏呭�兼椂闂�
+                rechargeDate?.let {
+                    data[11] = HexUtil.getIntToBCD(it.get(Calendar.YEAR) % 100)[0]
+                    data[12] = HexUtil.getIntToBCD(it.get(Calendar.MONTH) + 1)[0]
+                    data[13] = HexUtil.getIntToBCD(it.get(Calendar.DAY_OF_MONTH))[0]
+                    data[14] = HexUtil.getIntToBCD(it.get(Calendar.HOUR_OF_DAY))[0]
+                }
+                
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    inner class Two : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 澶囦唤浣欓鍜屾按閲忔暟鎹�
+                val balanceBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance))
+                System.arraycopy(balanceBytes, 0, data, 1, 4)
+                
+                val waterBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusWater))
+                System.arraycopy(waterBytes, 0, data, 5, 4)
+                
+                // 璁剧疆姘翠环
+                val priceBytes = HexUtil.hexToByteArray(HexUtil.floatToHexLowHigh(waterPrice))
+                System.arraycopy(priceBytes, 0, data, 9, 2)
+                
+                // 璁剧疆鍏呭�兼椂闂�
+                rechargeDate?.let {
+                    data[11] = HexUtil.getIntToBCD(it.get(Calendar.YEAR) % 100)[0]
+                    data[12] = HexUtil.getIntToBCD(it.get(Calendar.MONTH) + 1)[0]
+                    data[13] = HexUtil.getIntToBCD(it.get(Calendar.DAY_OF_MONTH))[0]
+                    data[14] = HexUtil.getIntToBCD(it.get(Calendar.HOUR_OF_DAY))[0]
+                }
+                
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    fun getZeroBytes(): ByteArray = Zero().toBytes()
+    fun getOneBytes(): ByteArray = One().toBytes()
+    fun getTwoBytes(): ByteArray = Two().toBytes()
+}
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/ValveTimeCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/ValveTimeCard.kt
new file mode 100644
index 0000000..a54298a
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/ValveTimeCard.kt
@@ -0,0 +1,118 @@
+package com.dayu.general.bean.card
+
+import com.dayu.baselibrary.tools.HexUtil
+import java.io.Serializable
+
+/**
+ * 閰嶇疆寮�鍏抽榾鏃堕棿鍗�
+ * 涓昏鐢ㄤ簬鍐呴儴鐢熶骇璋冭瘯鐢紝璁剧疆寮�鍏抽榾鏃堕棿
+ */
+class ValveTimeCard : BaseCard(), Serializable {
+    companion object {
+        const val CARD_TYPE = "B8"              // 鍗$被鍨嬶細閰嶇疆寮�鍏抽榾鏃堕棿鍗�
+        const val IDENTIFY_CODE_A0 = 0xA0.toByte()  // 璇嗗埆鐮丄0
+        const val IDENTIFY_CODE_B1 = 0xB1.toByte()  // 璇嗗埆鐮丅1
+        const val IDENTIFY_CODE_C2 = 0xC2.toByte()  // 璇嗗埆鐮丆2
+        const val IDENTIFY_CODE_89 = 0x89.toByte()  // 璇嗗埆鐮�89
+    }
+
+    var valveTime: Int = 0    // 寮�鍏抽榾鏃堕棿(绉�)
+
+    /**
+     * 鍐欏崱瀹屾垚鍚庢牎楠屾槸鍚﹀啓鍗℃垚鍔�
+     */
+    fun equalsValveTimeCard(data: List<ByteArray>?): Boolean {
+        if (data == null || data.isEmpty()) {
+            return false
+        }
+        return data[0].contentEquals(getZeroBytes())
+    }
+
+    /**
+     * 閫氳繃byte杞琤ean
+     */
+    fun getBean(data: List<ByteArray>): ValveTimeCard? {
+        try {
+            val valveTimeCard = ValveTimeCard()
+            // 瑙f瀽绗�0鍧�
+            val zero = data[0]
+            
+            // 楠岃瘉鍗$被鍨�(8浣�)
+            if (HexUtil.byteToHex(zero[8]) != CARD_TYPE) {
+                return null
+            }
+            
+            // 楠岃瘉璇嗗埆鐮�(9-12浣�)
+            if (zero[9] != IDENTIFY_CODE_A0 ||
+                zero[10] != IDENTIFY_CODE_B1 ||
+                zero[11] != IDENTIFY_CODE_C2 ||
+                zero[12] != IDENTIFY_CODE_89) {
+                return null
+            }
+
+            // 瑙f瀽寮�鍏抽榾鏃堕棿(13-14浣�)
+            val timeBytes = byteArrayOf(zero[13], zero[14])
+            valveTimeCard.valveTime = HexUtil.get16To10LowHightByBytes(timeBytes)
+
+            return valveTimeCard
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+    }
+
+    /**
+     * 鐢熸垚绗�0鍧楁暟鎹�
+     */
+    inner class Zero : BaseCard() {
+        fun toBytes(): ByteArray {
+            val data = ByteArray(16)
+            try {
+                // 璁剧疆澶囩敤浣�(0-7浣�)
+                for (i in 0..7) {
+                    data[i] = 0x00
+                }
+                
+                // 璁剧疆鍗$被鍨�(8浣�)
+                data[8] = HexUtil.hexToByte(CARD_TYPE)
+                
+                // 璁剧疆璇嗗埆鐮�(9-12浣�)
+                data[9] = IDENTIFY_CODE_A0
+                data[10] = IDENTIFY_CODE_B1
+                data[11] = IDENTIFY_CODE_C2
+                data[12] = IDENTIFY_CODE_89
+                
+                // 璁剧疆寮�鍏抽榾鏃堕棿(13-14浣�)锛屼綆浣嶅湪鍓嶉珮浣嶅湪鍚�
+                val timeBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(valveTime))
+                if (timeBytes.size >= 2) {
+                    data[13] = timeBytes[0]  // 浣庝綅
+                    data[14] = timeBytes[1]  // 楂樹綅
+                }
+                
+                // 璁剧疆鏍¢獙鍜�(15浣�)
+                data[15] = getByteSum(data)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            return data
+        }
+    }
+
+    /**
+     * 楠岃瘉寮�鍏抽榾鏃堕棿鏄惁鏈夋晥
+     * @return true 濡傛灉鏃堕棿鏈夋晥锛宖alse 鍚﹀垯
+     */
+    fun isValidValveTime(): Boolean {
+        return valveTime > 0 && valveTime <= 65535  // 涓や釜瀛楄妭鏈�澶у��
+    }
+
+    /**
+     * 鑾峰彇寮�鍏抽榾鏃堕棿鐨勫崄鍏繘鍒跺瓧绗︿覆琛ㄧず
+     * @return 鍗佸叚杩涘埗瀛楃涓诧紝濡�"0087"琛ㄧず135绉�
+     */
+    fun getValveTimeHex(): String {
+        return String.format("%04X", valveTime)
+    }
+
+    fun getZeroBytes(): ByteArray = Zero().toBytes()
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/db/CardData.kt b/generallibrary/src/main/java/com/dayu/general/bean/db/CardData.kt
new file mode 100644
index 0000000..f094337
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/db/CardData.kt
@@ -0,0 +1,21 @@
+package com.dayu.general.bean.db
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity
+class CardData {
+    @PrimaryKey(autoGenerate = true)
+    var id: Long = 0
+
+    /**
+     * 鍗$墖绫诲瀷
+     */
+    var cardType: String? = null
+
+    /**
+     * 鍗℃爣璇�
+     */
+    var cardIdentifying: String? = null
+
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/db/PassWordCardBean.java b/generallibrary/src/main/java/com/dayu/general/bean/db/PassWordCardBean.java
new file mode 100644
index 0000000..99acc29
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/db/PassWordCardBean.java
@@ -0,0 +1,36 @@
+package com.dayu.general.bean.db;
+
+import androidx.room.Entity;
+import androidx.room.PrimaryKey;
+
+/**
+ * author: zuo
+ * Date: 2024-03-01
+ * Time: 17:56
+ * 澶囨敞锛氬瘑鐮佸崱瀵嗙爜
+ */
+@Entity
+public class PassWordCardBean {
+
+    @PrimaryKey(autoGenerate = true)
+    public long id;
+    private String passWord = "";
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getPassWord() {
+        return passWord;
+    }
+
+    public void setPassWord(String passWord) {
+        this.passWord = passWord;
+    }
+
+
+}
diff --git a/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt b/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt
index dc87c91..ec1b574 100644
--- a/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt
+++ b/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt
@@ -1,6 +1,11 @@
 package com.dayu.general.dao
 
+import androidx.room.Database
 import androidx.room.RoomDatabase
+import com.dayu.general.bean.db.CardData
+import com.dayu.general.bean.db.PassWordCardBean
 
+@Database(entities = [PassWordCardBean::class, CardData::class], version = 1, exportSchema = false)
 abstract class AppDataBase : RoomDatabase() {
+    abstract fun cardDataDao(): CardDataDao
 }
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt b/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt
index 610bcdc..825209a 100644
--- a/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt
+++ b/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt
@@ -38,9 +38,9 @@
         return AsynchBaseDao
     }
 
-    companion object {
-        fun getAsynchInstance(baseActivity: BaseActivity): AppDataBase? {
-           return getAsynchInstance(baseActivity)
-        }
-    }
+//    companion object {
+//        fun getAsynchInstance(baseActivity: BaseActivity): AppDataBase? {
+//           return getAsynchInstance(baseActivity)
+//        }
+//    }
 }
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/dao/CardDataDao.kt b/generallibrary/src/main/java/com/dayu/general/dao/CardDataDao.kt
new file mode 100644
index 0000000..270b59a
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/dao/CardDataDao.kt
@@ -0,0 +1,20 @@
+package com.dayu.general.dao
+
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import androidx.room.Query
+import androidx.room.Update
+import com.dayu.general.bean.db.CardData
+
+@Dao
+interface CardDataDao {
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun insert(cardData: CardData)
+
+    @Update
+    fun update(cardData: CardData)
+
+    @Query("select  * from CardData where cardType=:cardType limit 1")
+    fun findFirst(cardType: String?): CardData
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt b/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt
new file mode 100644
index 0000000..c3e0916
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt
@@ -0,0 +1,43 @@
+package com.dayu.general.tool
+
+import android.content.Context
+import android.util.Base64
+import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.baselibrary.tools.nfc.BaseNFCHelper
+import java.nio.charset.StandardCharsets
+import javax.crypto.Cipher
+import javax.crypto.spec.SecretKeySpec
+
+class GeBaseHelper(private val context: Context) : BaseNFCHelper() {
+
+
+    companion object {
+        init {
+            System.loadLibrary("general-native-lib")
+        }
+    }
+
+    private external fun getM1SectorKeySecure(context: Context, sectorIndex: Int): String
+
+    init {
+        try {
+            // 鑾峰彇鎵�鏈夋墖鍖哄瘑閽�
+            val allKeys: String = getM1SectorKeySecure(context, 0)
+            val keys: Array<String> =
+                allKeys.split(",").dropLastWhile { it.isEmpty() }.toTypedArray()
+            for (i in keys.indices) {
+                val key = keys[i]
+                listA_PS.add(HexUtil.hexToByteArray(key))
+            }
+            defauleKey = HexUtil.hexToByteArray("FFFFFFFFFFFF")
+
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    fun getKeyList(): List<ByteArray> {
+        return listKeyA
+    }
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/bottom_circle_bg.xml b/generallibrary/src/main/res/drawable/bottom_circle_bg.xml
index 4045ed5..5249622 100644
--- a/generallibrary/src/main/res/drawable/bottom_circle_bg.xml
+++ b/generallibrary/src/main/res/drawable/bottom_circle_bg.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="@color/bottom_color" /> <!-- 鎸夐挳鐨勮儗鏅壊 -->
-    <corners android:radius="90dp" /> <!-- 璁╂寜閽殑鍥涗釜瑙掑彉鎴愬渾褰� -->
+    <corners android:radius="100dp" /> <!-- 璁╂寜閽殑鍥涗釜瑙掑彉鎴愬渾褰� -->
     <size android:width="100dp" android:height="100dp" /> <!-- 璁剧疆鎸夐挳鐨勫楂� -->
 </shape>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/bottom_nav_background.xml b/generallibrary/src/main/res/drawable/bottom_nav_background.xml
new file mode 100644
index 0000000..82853ac
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/bottom_nav_background.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- 闃村奖灞� -->
+    <item>
+        <shape>
+            <padding
+                android:bottom="0dp"
+                android:left="0dp"
+                android:right="0dp"
+                android:top="2dp" />
+            <solid android:color="#10000000" />
+            <corners
+                android:topLeftRadius="18dp"
+                android:topRightRadius="18dp" />
+        </shape>
+    </item>
+    <item>
+        <shape>
+            <padding
+                android:bottom="0dp"
+                android:left="0dp"
+                android:right="0dp"
+                android:top="2dp" />
+            <solid android:color="#15000000" />
+            <corners
+                android:topLeftRadius="18dp"
+                android:topRightRadius="18dp" />
+        </shape>
+    </item>
+    <!-- 涓昏儗鏅� -->
+    <item>
+        <shape>
+            <solid android:color="#FFFFFF" />
+            <corners
+                android:topLeftRadius="18dp"
+                android:topRightRadius="18dp" />
+        </shape>
+    </item>
+</layer-list> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/fab_background.xml b/generallibrary/src/main/res/drawable/fab_background.xml
new file mode 100644
index 0000000..2739156
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/fab_background.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- 闃村奖灞� -->
+    <item>
+        <shape android:shape="oval">
+            <solid android:color="#30000000" />
+            <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
+        </shape>
+    </item>
+    <!-- 涓昏儗鏅� -->
+    <item>
+        <shape android:shape="oval">
+            <gradient
+                android:angle="135"
+                android:endColor="#1E88E5"
+                android:centerColor="#4285F4"
+                android:startColor="#5C9CE6"
+                android:type="linear" />
+        </shape>
+    </item>
+</layer-list> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/nav_item_color.xml b/generallibrary/src/main/res/drawable/nav_item_color.xml
new file mode 100644
index 0000000..089e808
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/nav_item_color.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="#4285F4" android:state_selected="true" />
+    <item android:color="#555555" />
+</selector> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/ripple_effect.xml b/generallibrary/src/main/res/drawable/ripple_effect.xml
new file mode 100644
index 0000000..84b0e71
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/ripple_effect.xml
@@ -0,0 +1,10 @@
+<?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="4dp" />
+        </shape>
+    </item>
+</ripple> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/rounded_button_bg.xml b/generallibrary/src/main/res/drawable/rounded_button_bg.xml
new file mode 100644
index 0000000..17924ca
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/rounded_button_bg.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="16dp" />
+    <solid android:color="@color/bottom_color" />
+</shape> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/shadow_gradient.xml b/generallibrary/src/main/res/drawable/shadow_gradient.xml
new file mode 100644
index 0000000..f3beda5
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/shadow_gradient.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient
+        android:angle="90"
+        android:endColor="#00000000"
+        android:startColor="#20000000"
+        android:type="linear" />
+</shape> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/shadow_gradient_strong.xml b/generallibrary/src/main/res/drawable/shadow_gradient_strong.xml
new file mode 100644
index 0000000..b3515b8
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/shadow_gradient_strong.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient
+        android:angle="90"
+        android:endColor="#00000000"
+        android:startColor="#30000000"
+        android:type="linear" />
+</shape> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/tab_indicator.xml b/generallibrary/src/main/res/drawable/tab_indicator.xml
new file mode 100644
index 0000000..ebc4a03
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/tab_indicator.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#4285F4" />
+    <corners android:radius="2dp" />
+    <size android:height="3dp" android:width="20dp" />
+</shape> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/tab_ripple_effect.xml b/generallibrary/src/main/res/drawable/tab_ripple_effect.xml
new file mode 100644
index 0000000..85e424b
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/tab_ripple_effect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="#1A4285F4">
+    <item android:id="@android:id/mask">
+        <shape android:shape="rectangle">
+            <solid android:color="#000000" />
+            <corners android:radius="8dp" />
+        </shape>
+    </item>
+</ripple> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/activity_main.xml b/generallibrary/src/main/res/layout/activity_main.xml
index 44cf5eb..e655d2c 100644
--- a/generallibrary/src/main/res/layout/activity_main.xml
+++ b/generallibrary/src/main/res/layout/activity_main.xml
@@ -24,7 +24,7 @@
         android:orientation="horizontal">
 
         <LinearLayout
-            android:id="@+id/orderLL"
+            android:id="@+id/BSCardLL"
             android:layout_width="0dp"
             android:layout_height="50dp"
             android:layout_weight="1"
@@ -37,7 +37,7 @@
                 android:layout_height="33dp">
 
                 <ImageView
-                    android:id="@+id/orderImg"
+                    android:id="@+id/BSCardImg"
                     android:layout_width="wrap_content"
                     android:layout_height="25dp"
                     android:layout_marginTop="8dp"
@@ -47,7 +47,7 @@
             </RelativeLayout>
 
             <TextView
-                android:id="@+id/orderText"
+                android:id="@+id/BSCardText"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginBottom="3dp"
@@ -58,7 +58,7 @@
         </LinearLayout>
 
         <FrameLayout
-            android:id="@+id/mapLL"
+            android:id="@+id/rechargeLL"
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_weight="1"
@@ -81,14 +81,14 @@
                 android:orientation="vertical">
 
                 <ImageView
-                    android:id="@+id/mapImg"
+                    android:id="@+id/rechargeImg"
                     android:layout_width="40dp"
                     android:layout_height="40dp"
                     android:layout_marginTop="8dp"
                     android:src="@drawable/bottom_recharge_white" />
 
                 <TextView
-                    android:id="@+id/mapText"
+                    android:id="@+id/rechargeText"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="鍏呭��"
diff --git a/generallibrary/src/main/res/layout/activity_new_card_ge.xml b/generallibrary/src/main/res/layout/activity_new_card_ge.xml
new file mode 100644
index 0000000..84560ca
--- /dev/null
+++ b/generallibrary/src/main/res/layout/activity_new_card_ge.xml
@@ -0,0 +1,311 @@
+<?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" />
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@+id/newCard_registBtn"
+        android:layout_below="@+id/titleBar"
+        android:fillViewport="true"
+        android:scrollbars="none">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:padding="16dp">
+
+            <androidx.cardview.widget.CardView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="16dp"
+                app:cardCornerRadius="8dp"
+                app:cardElevation="2dp">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:text="鍩烘湰淇℃伅"
+                        android:textColor="#333333"
+                        android:textSize="18sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/eq_no"
+                            android:textColor="#666666"
+                            android:textSize="@dimen/new_card_size" />
+
+                        <TextView
+                            android:id="@+id/newCard_arerNumber"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginStart="8dp"
+                            android:inputType="number"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/new_card_size" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="80dp"
+                            android:layout_height="wrap_content"
+                            android:text="濮撳悕"
+                            android:textColor="#666666"
+                            android:textSize="@dimen/new_card_size" />
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"
+                            android:background="#FFFFFF"
+                            android:orientation="vertical">
+
+                            <EditText
+                                android:id="@+id/newCard_name"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:background="@null"
+                                android:hint="璇疯緭鍏ュ鍚�"
+                                android:inputType="textPersonName"
+                                android:padding="12dp"
+                                android:textSize="@dimen/new_card_size" />
+                        </LinearLayout>
+
+                        <ImageView
+                            android:id="@+id/newCard_scanBtn"
+                            android:layout_width="45dp"
+                            android:layout_height="45dp"
+                            android:background="?attr/selectableItemBackgroundBorderless"
+                            android:padding="10dp"
+                            android:src="@mipmap/icon_scan"
+                            android:tint="#4285F4" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="80dp"
+                            android:layout_height="wrap_content"
+                            android:text="韬唤璇佸彿"
+                            android:textColor="#666666"
+                            android:textSize="@dimen/new_card_size" />
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:background="#FFFFFF"
+                            android:orientation="vertical">
+
+                            <EditText
+                                android:id="@+id/newCard_id"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:background="@null"
+                                android:digits="0123456789Xx"
+                                android:hint="璇疯緭鍏ヨ韩浠借瘉鍙�"
+                                android:inputType="text"
+                                android:maxLength="18"
+                                android:padding="12dp"
+                                android:textSize="@dimen/new_card_size" />
+                        </LinearLayout>
+                    </LinearLayout>
+
+                    <TextView
+                        android:id="@+id/newCard_idTip"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:text="鎵弿鍚庤鏍稿韬唤淇℃伅鏃犺"
+                        android:textColor="#FF4500"
+                        android:visibility="gone" />
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <androidx.cardview.widget.CardView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="16dp"
+                app:cardCornerRadius="8dp"
+                app:cardElevation="2dp">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:text="鑱旂郴鏂瑰紡"
+                        android:textColor="#333333"
+                        android:textSize="18sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="80dp"
+                            android:layout_height="wrap_content"
+                            android:text="鐢佃瘽"
+                            android:textColor="#666666"
+                            android:textSize="@dimen/new_card_size" />
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:background="#FFFFFF"
+                            android:orientation="vertical">
+
+                            <EditText
+                                android:id="@+id/newCard_phone"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:background="@null"
+                                android:hint="璇疯緭鍏ユ墜鏈哄彿鐮�"
+                                android:inputType="phone"
+                                android:maxLength="11"
+                                android:padding="12dp"
+                                android:textSize="@dimen/new_card_size" />
+                        </LinearLayout>
+                    </LinearLayout>
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <androidx.cardview.widget.CardView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                app:cardCornerRadius="8dp"
+                app:cardElevation="2dp">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:text="璐圭敤淇℃伅"
+                        android:textColor="#333333"
+                        android:textSize="18sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="80dp"
+                            android:layout_height="wrap_content"
+                            android:text="宸ユ湰璐�(鍏�)"
+                            android:textColor="#666666"
+                            android:textSize="@dimen/new_card_size" />
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:background="#FFFFFF"
+                            android:orientation="vertical">
+
+                            <EditText
+                                android:id="@+id/newCard_morny"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:background="@null"
+                                android:hint="璇疯緭鍏ュ伐鏈垂"
+                                android:inputType="numberDecimal"
+                                android:padding="12dp"
+                                android:textSize="@dimen/new_card_size" />
+                        </LinearLayout>
+                    </LinearLayout>
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <!-- 闅愯棌鐨勬按鏉冨唴姘撮噺閮ㄥ垎 -->
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:visibility="gone">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="姘存潈鍐呮按閲忥細"
+                    android:textSize="@dimen/new_card_size" />
+
+                <EditText
+                    android:id="@+id/newCard_water"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:inputType="number"
+                    android:maxLength="5"
+                    android:textSize="@dimen/new_card_size" />
+            </LinearLayout>
+        </LinearLayout>
+    </ScrollView>
+
+    <TextView
+        android:id="@+id/newCard_registBtn"
+        android:layout_width="match_parent"
+        android:layout_height="56dp"
+        android:layout_alignParentBottom="true"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginBottom="16dp"
+        android:background="#4285F4"
+        android:gravity="center"
+        android:text="纭寮�鎴�"
+        android:textColor="#FFFFFF"
+        android:textSize="16sp" />
+</RelativeLayout>
\ 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
new file mode 100644
index 0000000..71aee45
--- /dev/null
+++ b/generallibrary/src/main/res/layout/fragment_card.xml
@@ -0,0 +1,341 @@
+<?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="match_parent"
+    android:background="@color/white">
+
+    <androidx.appcompat.widget.Toolbar
+        android:id="@+id/titleBar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dimen_title_height"
+        android:background="@color/bottom_color"
+        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>
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:fillViewport="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/titleBar">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="16dp">
+
+            <androidx.cardview.widget.CardView
+                android:id="@+id/home_newCard"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="16dp"
+                android:layout_marginEnd="8dp"
+                android:clickable="true"
+                android:focusable="true"
+                android:foreground="?android:attr/selectableItemBackground"
+                app:cardCornerRadius="12dp"
+                app:cardElevation="4dp"
+                app:layout_constraintEnd_toStartOf="@+id/home_redCard"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <ImageView
+                        android:layout_width="70dp"
+                        android:layout_height="70dp"
+                        android:src="@drawable/home_add" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="8dp"
+                        android:gravity="center"
+                        android:text="鏂板崱寮�鎴�"
+                        android:textColor="@color/text_selecter_color"
+                        android:textSize="@dimen/home_text_size" />
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <androidx.cardview.widget.CardView
+                android:id="@+id/home_recharge"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="16dp"
+                android:layout_marginEnd="8dp"
+                android:clickable="true"
+                android:focusable="true"
+                android:foreground="?android:attr/selectableItemBackground"
+                android:visibility="gone"
+                app:cardCornerRadius="12dp"
+                app:cardElevation="4dp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <ImageView
+                        android:layout_width="70dp"
+                        android:layout_height="70dp"
+                        android:src="@drawable/home_recharge" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="8dp"
+                        android:gravity="center"
+                        android:text="鍏呭��"
+                        android:textColor="@color/text_selecter_color"
+                        android:textSize="@dimen/home_text_size" />
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <androidx.cardview.widget.CardView
+                android:id="@+id/home_redCard"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="16dp"
+                android:layout_marginEnd="8dp"
+                android:clickable="true"
+                android:focusable="true"
+                android:foreground="?android:attr/selectableItemBackground"
+                app:cardCornerRadius="12dp"
+                app:cardElevation="4dp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/home_newCard"
+                app:layout_constraintTop_toTopOf="parent">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <ImageView
+                        android:layout_width="70dp"
+                        android:layout_height="70dp"
+                        android:src="@drawable/home_read" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="8dp"
+                        android:gravity="center"
+                        android:text="璇诲彇鍗$墖"
+                        android:textColor="@color/text_selecter_color"
+                        android:textSize="@dimen/home_text_size" />
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <androidx.cardview.widget.CardView
+                android:id="@+id/home_loss"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:layout_marginEnd="8dp"
+                android:clickable="true"
+                android:focusable="true"
+                android:foreground="?android:attr/selectableItemBackground"
+                app:cardCornerRadius="12dp"
+                app:cardElevation="4dp"
+                app:layout_constraintEnd_toStartOf="@+id/home_replacement"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/home_newCard">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <ImageView
+                        android:layout_width="70dp"
+                        android:layout_height="70dp"
+                        android:src="@drawable/home_report" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="8dp"
+                        android:gravity="center"
+                        android:text="鎸傚け"
+                        android:textColor="@color/text_selecter_color"
+                        android:textSize="@dimen/home_text_size" />
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <TextView
+                android:id="@+id/home_reportLoss"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="瑙i櫎鎸傚け"
+                android:textColor="@color/text_selecter_color"
+                android:textSize="@dimen/home_text_size"
+                android:visibility="gone"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <androidx.cardview.widget.CardView
+                android:id="@+id/home_replacement"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:layout_marginEnd="8dp"
+                android:clickable="true"
+                android:focusable="true"
+                android:foreground="?android:attr/selectableItemBackground"
+                app:cardCornerRadius="12dp"
+                app:cardElevation="4dp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/home_loss"
+                app:layout_constraintTop_toBottomOf="@+id/home_redCard">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <ImageView
+                        android:layout_width="70dp"
+                        android:layout_height="70dp"
+                        android:src="@drawable/home_replacement" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="8dp"
+                        android:gravity="center"
+                        android:text="琛ュ崱"
+                        android:textColor="@color/text_selecter_color"
+                        android:textSize="@dimen/home_text_size" />
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <androidx.cardview.widget.CardView
+                android:id="@+id/home_admin"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:layout_marginEnd="8dp"
+                android:layout_marginBottom="16dp"
+                android:clickable="true"
+                android:focusable="true"
+                android:foreground="?android:attr/selectableItemBackground"
+                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/home_loss"
+                app:layout_constraintVertical_bias="0.0">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <ImageView
+                        android:layout_width="70dp"
+                        android:layout_height="70dp"
+                        android:src="@drawable/home_system" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="8dp"
+                        android:gravity="center"
+                        android:text="绠$悊绯荤粺"
+                        android:textColor="@color/text_selecter_color"
+                        android:textSize="@dimen/home_text_size" />
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <TextView
+                android:id="@+id/home_parameter"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="鍙傛暟璁剧疆"
+                android:textColor="@color/text_selecter_color"
+                android:textSize="@dimen/home_text_size"
+                android:visibility="gone"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <androidx.cardview.widget.CardView
+                android:id="@+id/home_my"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:layout_marginEnd="8dp"
+                android:clickable="true"
+                android:focusable="true"
+                android:foreground="?android:attr/selectableItemBackground"
+                android:visibility="gone"
+                app:cardCornerRadius="12dp"
+                app:cardElevation="4dp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/home_admin">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <ImageView
+                        android:layout_width="70dp"
+                        android:layout_height="70dp"
+                        android:src="@drawable/home_my" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="8dp"
+                        android:gravity="center"
+                        android:text="涓汉涓績"
+                        android:textColor="@color/text_selecter_color"
+                        android:textSize="@dimen/home_text_size" />
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+        </androidx.constraintlayout.widget.ConstraintLayout>
+    </ScrollView>
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/fragment_my.xml b/generallibrary/src/main/res/layout/fragment_my.xml
new file mode 100644
index 0000000..ede78b3
--- /dev/null
+++ b/generallibrary/src/main/res/layout/fragment_my.xml
@@ -0,0 +1,355 @@
+<?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="#F5F5F5">
+
+    <RelativeLayout
+        android:id="@+id/header_layout"
+        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>
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fillViewport="true">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:padding="16dp">
+
+            <!-- 鐢ㄦ埛淇℃伅鍗$墖 -->
+            <androidx.cardview.widget.CardView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="16dp"
+                app:cardCornerRadius="8dp"
+                app:cardElevation="2dp"
+                app:contentPadding="16dp">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:text="鍩烘湰淇℃伅"
+                        android:textColor="#333333"
+                        android:textSize="16sp"
+                        android:textStyle="bold"
+                        android:layout_marginBottom="12dp"/>
+
+                    <LinearLayout
+                        android:id="@+id/my_village"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal"
+                        android:visibility="gone"
+                        android:layout_marginBottom="8dp">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="璁惧缂栧彿锛�"
+                            android:textSize="@dimen/text_size"
+                            android:textColor="#666666" />
+
+                        <TextView
+                            android:id="@+id/my_villageNum"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:textSize="@dimen/text_size"
+                            android:textColor="#333333" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="8dp">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="鍖哄煙鍚嶇О锛�"
+                            android:textColor="#666666"
+                            android:textSize="@dimen/text_size" />
+
+                        <TextView
+                            android:id="@+id/my_adName"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/my_admin"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="8dp"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="鍖哄煙鍙凤細"
+                            android:textColor="#666666"
+                            android:textSize="@dimen/text_size" />
+
+                        <TextView
+                            android:id="@+id/my_adminName"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/my_waterPriceLL"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="鐢靛崟浠�(鍏�/搴�)锛�"
+                            android:textColor="#666666"
+                            android:textSize="@dimen/text_size" />
+
+                        <TextView
+                            android:id="@+id/my_waterPrice"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size" />
+                    </LinearLayout>
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <!-- 璁板綍绠$悊鍗$墖 -->
+            <androidx.cardview.widget.CardView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="16dp"
+                app:cardCornerRadius="8dp"
+                app:cardElevation="2dp"
+                app:contentPadding="16dp">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:text="璁板綍绠$悊"
+                        android:textColor="#333333"
+                        android:textSize="16sp"
+                        android:textStyle="bold"
+                        android:layout_marginBottom="12dp"/>
+
+                    <RelativeLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="12dp"
+                        android:padding="8dp"
+                        android:background="#F9F9F9">
+
+                        <ImageView
+                            android:id="@+id/card_icon"
+                            android:layout_width="24dp"
+                            android:layout_height="24dp"
+                            android:layout_centerVertical="true"
+                            android:src="@android:drawable/ic_menu_agenda"
+                            android:tint="#666666" />
+
+                        <TextView
+                            android:id="@+id/my_newCardList_ll"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_centerVertical="true"
+                            android:layout_marginStart="8dp"
+                            android:layout_toEndOf="@+id/card_icon"
+                            android:layout_toStartOf="@+id/my_newCardOut"
+                            android:text="寮�鍗¤褰�"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size" />
+
+                        <TextView
+                            android:id="@+id/my_newCardOut"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_alignParentEnd="true"
+                            android:layout_centerVertical="true"
+                            android:background="@drawable/rounded_button_bg"
+                            android:paddingStart="12dp"
+                            android:paddingEnd="12dp"
+                            android:paddingTop="4dp"
+                            android:paddingBottom="4dp"
+                            android:text="瀵煎嚭璁板綍"
+                            android:textColor="@color/white"
+                            android:textSize="12sp" />
+                    </RelativeLayout>
+
+                    <RelativeLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:padding="8dp"
+                        android:background="#F9F9F9">
+
+                        <ImageView
+                            android:id="@+id/recharge_icon"
+                            android:layout_width="24dp"
+                            android:layout_height="24dp"
+                            android:layout_centerVertical="true"
+                            android:src="@android:drawable/ic_menu_recent_history"
+                            android:tint="#666666" />
+
+                        <TextView
+                            android:id="@+id/my_rechargeList_ll"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_centerVertical="true"
+                            android:layout_marginStart="8dp"
+                            android:layout_toEndOf="@+id/recharge_icon"
+                            android:layout_toStartOf="@+id/my_rechargeOut"
+                            android:text="鍏呭�艰褰�"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size" />
+
+                        <TextView
+                            android:id="@+id/my_rechargeOut"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_alignParentEnd="true"
+                            android:layout_centerVertical="true"
+                            android:background="@drawable/rounded_button_bg"
+                            android:paddingStart="12dp"
+                            android:paddingEnd="12dp"
+                            android:paddingTop="4dp"
+                            android:paddingBottom="4dp"
+                            android:text="瀵煎嚭璁板綍"
+                            android:textColor="@color/white"
+                            android:textSize="12sp" />
+                    </RelativeLayout>
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+
+            <!-- 璁剧疆鍗$墖 -->
+            <androidx.cardview.widget.CardView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                app:cardCornerRadius="8dp"
+                app:cardElevation="2dp"
+                app:contentPadding="16dp">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:text="绯荤粺璁剧疆"
+                        android:textColor="#333333"
+                        android:textSize="16sp"
+                        android:textStyle="bold"
+                        android:layout_marginBottom="12dp"/>
+
+                    <TextView
+                        android:id="@+id/sys_ip"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="12dp"
+                        android:background="#F9F9F9"
+                        android:padding="12dp"
+                        android:drawableStart="@android:drawable/ic_menu_manage"
+                        android:drawablePadding="8dp"
+                        android:drawableTint="#666666"
+                        android:text="IP璁剧疆"
+                        android:textColor="#333333"
+                        android:textSize="@dimen/text_size"
+                        android:visibility="gone" />
+
+                    <TextView
+                        android:id="@+id/card_replacement"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="12dp"
+                        android:background="#F9F9F9"
+                        android:padding="12dp"
+                        android:drawableStart="@android:drawable/ic_menu_edit"
+                        android:drawablePadding="8dp"
+                        android:drawableTint="#666666"
+                        android:text="鐢ㄦ埛琛ュ崱"
+                        android:textColor="#333333"
+                        android:textSize="@dimen/text_size"
+                        android:visibility="gone" />
+
+                    <TextView
+                        android:id="@+id/my_psw"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="12dp"
+                        android:background="#F9F9F9"
+                        android:padding="12dp"
+                        android:drawableStart="@android:drawable/ic_lock_lock"
+                        android:drawablePadding="8dp"
+                        android:drawableTint="#666666"
+                        android:text="鐧诲綍瀵嗙爜璁剧疆"
+                        android:textColor="#333333"
+                        android:textSize="@dimen/text_size"
+                        android:visibility="gone" />
+
+                    <TextView
+                        android:id="@+id/my_testConnect"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:background="#F9F9F9"
+                        android:padding="12dp"
+                        android:drawableStart="@android:drawable/ic_menu_compass"
+                        android:drawablePadding="8dp"
+                        android:drawableTint="#666666"
+                        android:text="鏈繛鎺ユ暟鎹腑蹇�"
+                        android:textColor="#333333"
+                        android:textSize="@dimen/text_size"
+                        android:visibility="gone" />
+                </LinearLayout>
+            </androidx.cardview.widget.CardView>
+        </LinearLayout>
+    </ScrollView>
+
+    <com.wang.avi.AVLoadingIndicatorView
+        android:id="@+id/avi"
+        style="@style/AVLoadingIndicatorView"
+        android:layout_width="80dp"
+        android:layout_height="80dp"
+        android:layout_centerHorizontal="true"
+        android:layout_centerVertical="true"
+        android:visibility="gone"
+        app:indicatorColor="@color/title_bg"
+        app:indicatorName="BallClipRotatePulseIndicator" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/fragment_recharge.xml b/generallibrary/src/main/res/layout/fragment_recharge.xml
new file mode 100644
index 0000000..197c37a
--- /dev/null
+++ b/generallibrary/src/main/res/layout/fragment_recharge.xml
@@ -0,0 +1,400 @@
+<?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="#F5F5F5">
+
+    <RelativeLayout
+        android:id="@+id/header_layout"
+        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>
+
+    <LinearLayout
+        android:id="@+id/recharge_read_LL"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/header_layout"
+        android:orientation="vertical"
+        android:visibility="visible">
+
+        <androidx.cardview.widget.CardView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp"
+            app:cardCornerRadius="8dp"
+            app:cardElevation="2dp">
+
+            <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:layout_marginBottom="16dp"
+                    android:gravity="center"
+                    android:text="璇峰皢鍗¤创鍦ㄨ澶囦笂杩涜璇诲崱"
+                    android:textColor="#333333"
+                    android:textSize="@dimen/text_size"
+                    android:textStyle="bold" />
+
+                <ImageView
+                    android:layout_width="200dp"
+                    android:layout_height="200dp"
+                    android:layout_gravity="center"
+                    android:scaleType="fitCenter"
+                    android:src="@mipmap/nfc_write" />
+            </LinearLayout>
+        </androidx.cardview.widget.CardView>
+    </LinearLayout>
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@+id/recharge_registBtn"
+        android:layout_below="@+id/header_layout"
+        android:fillViewport="true">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:padding="16dp">
+
+            <LinearLayout
+                android:id="@+id/recharge_text_LL"
+                android:layout_width="match_parent"
+                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"
+
+                    app:cardCornerRadius="8dp"
+                    app:cardElevation="2dp">
+
+                    <LinearLayout
+                        android:id="@+id/recharge_LL"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:padding="16dp">
+
+
+
+                        <TextView
+                            android:id="@+id/red_recharge_water"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:text="鍏呭�兼按閲忥細"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size"
+                            android:visibility="gone" />
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:background="#F9F9F9"
+                            android:padding="12dp"
+                            android:orientation="vertical">
+
+                            <TextView
+                                android:id="@+id/recharge_tx"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:layout_marginBottom="8dp"
+                                android:text="鍏呭�奸噾棰濓紙鍏冿級锛�"
+                                android:textColor="@color/red"
+                                android:textSize="@dimen/new_card_size"
+                                android:textStyle="bold" />
+
+                            <EditText
+                                android:id="@+id/recharge_water"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:background="@android:color/white"
+                                android:hint="璇疯緭鍏ュ厖鍊肩殑閲戦"
+                                android:inputType="numberDecimal"
+                                android:padding="12dp"
+                                android:textSize="@dimen/new_card_size" />
+                        </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"
+                    app:cardCornerRadius="8dp"
+                    app:cardElevation="2dp">
+
+                    <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:layout_marginBottom="12dp"
+                            android:text="鍗$墖淇℃伅"
+                            android:textColor="#333333"
+                            android:textSize="16sp"
+                            android:textStyle="bold" />
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="鍗$姸鎬侊細"
+                                android:textColor="#666666"
+                                android:textSize="@dimen/text_size" />
+
+                            <TextView
+                                android:id="@+id/red_statu"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:textColor="@color/red"
+                                android:textSize="@dimen/new_card_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="濮撳悕锛�"
+                                android:textColor="#666666"
+                                android:textSize="@dimen/new_card_size" />
+
+                            <TextView
+                                android:id="@+id/userName"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:textColor="#333333"
+                                android:textSize="@dimen/new_card_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="鍗″彿锛�"
+                                android:textColor="#666666"
+                                android:textSize="@dimen/text_size" />
+
+                            <TextView
+                                android:id="@+id/red_initCode"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:text=""
+                                android:textColor="#333333"
+                                android:textSize="@dimen/new_card_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:orientation="horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="鐢ㄦ埛缂栧彿锛�"
+                                android:textColor="#666666"
+                                android:textSize="@dimen/text_size" />
+
+                            <TextView
+                                android:id="@+id/red_userCode"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:text=""
+                                android:textColor="#333333"
+                                android:textSize="@dimen/new_card_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:orientation="horizontal"
+                            android:visibility="visible">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="鍏呭�煎悗鍓╀綑閲戦锛�"
+                                android:textColor="#666666"
+                                android:textSize="@dimen/text_size" />
+
+                            <TextView
+                                android:id="@+id/red_remainder_blance"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:textColor="#333333"
+                                android:textSize="@dimen/new_card_size" />
+                        </LinearLayout>
+                    </LinearLayout>
+                </androidx.cardview.widget.CardView>
+
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="16dp"
+                    app:cardCornerRadius="8dp"
+                    app:cardElevation="2dp">
+
+                    <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:layout_marginBottom="12dp"
+                            android:text="鐢甸噺淇℃伅"
+                            android:textColor="#333333"
+                            android:textSize="16sp"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:id="@+id/red_balance_electric"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:background="#F9F9F9"
+                            android:padding="12dp"
+                            android:text="鍓╀綑鐢甸噺锛�"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size"
+                            android:visibility="visible" />
+
+                        <TextView
+                            android:id="@+id/red_rechargeDate"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:background="#F9F9F9"
+                            android:padding="12dp"
+                            android:text="鏈�鍚庤喘姘存棩鏈燂細"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size"
+                            android:visibility="visible" />
+
+                        <TextView
+                            android:id="@+id/red_rechargeElectric"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:background="#F9F9F9"
+                            android:padding="12dp"
+                            android:text="鐢甸噺鍗曚环锛�"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size"
+                            android:visibility="visible" />
+
+                        <TextView
+                            android:id="@+id/red_rechargeNumber"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:background="#F9F9F9"
+                            android:padding="12dp"
+                            android:text="鍏呭�兼鏁帮細"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size"
+                            android:visibility="gone" />
+
+                        <TextView
+                            android:id="@+id/red_total_water"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:background="#F9F9F9"
+                            android:padding="12dp"
+                            android:text="鎬荤敤姘撮噺锛�"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size"
+                            android:visibility="gone" />
+
+                        <TextView
+                            android:id="@+id/red_total_power"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:background="#F9F9F9"
+                            android:padding="12dp"
+                            android:text="鎬荤敤鐢甸噺锛�"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size"
+                            android:visibility="gone" />
+
+                        <TextView
+                            android:id="@+id/red_waterPrice"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:background="#F9F9F9"
+                            android:padding="12dp"
+                            android:text="姣忕珛鏂圭背姘翠环鏍硷細"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size"
+                            android:visibility="gone" />
+                    </LinearLayout>
+                </androidx.cardview.widget.CardView>
+
+
+            </LinearLayout>
+        </LinearLayout>
+    </ScrollView>
+
+    <Button
+        android:id="@+id/recharge_registBtn"
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        android:layout_alignParentBottom="true"
+        android:layout_margin="16dp"
+        android:background="@drawable/rounded_button_bg"
+        android:elevation="2dp"
+        android:gravity="center"
+        android:text="鍏呭��"
+        android:textColor="@color/white"
+        android:textSize="@dimen/new_card_size"
+        android:textStyle="bold"
+        android:visibility="gone" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/values/colors.xml b/generallibrary/src/main/res/values/colors.xml
index 0700b3a..f6ccfac 100644
--- a/generallibrary/src/main/res/values/colors.xml
+++ b/generallibrary/src/main/res/values/colors.xml
@@ -1,5 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
     <color name="bottom_color">#3D8BFF</color>
+    <color name="black">#333</color>
+    <color name="white">#fff</color>
+    <color name="nav_item_color">#555555</color>
 
 </resources>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/values/dimens.xml b/generallibrary/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..73a870b
--- /dev/null
+++ b/generallibrary/src/main/res/values/dimens.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <dimen name="title_text_size">20sp</dimen>
+
+</resources>
\ No newline at end of file
diff --git a/henanlibrary/src/main/java/com/dayu/henanlibrary/tools/NFCWriteHelper.java b/henanlibrary/src/main/java/com/dayu/henanlibrary/tools/NFCWriteHelper.java
index 2b71814..4185498 100644
--- a/henanlibrary/src/main/java/com/dayu/henanlibrary/tools/NFCWriteHelper.java
+++ b/henanlibrary/src/main/java/com/dayu/henanlibrary/tools/NFCWriteHelper.java
@@ -2,17 +2,10 @@
 
 import android.app.Activity;
 import android.content.Intent;
-import android.nfc.NfcAdapter;
-import android.nfc.Tag;
 import android.nfc.tech.MifareClassic;
-import android.util.Log;
 
-import com.dayu.baselibrary.tools.HexUtil;
-import com.dayu.baselibrary.tools.nfc.BaseNfcWriteHelper;
 import com.dayu.baselibrary.tools.nfc.NfcWriteAdapter;
 import com.dayu.henanlibrary.card.UserCardHN;
-
-import java.io.IOException;
 
 /**
  * @author zx

--
Gitblit v1.8.0